springframework.http.ResponseEntity

๐Ÿ”” ResponseEntity ๊ฐœ์š” ๐Ÿ”” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ต What? Why? ์Šคํ”„๋ง 3 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์Šคํ”„๋ง MVC์—์„œ HTTP ์‘๋‹ต์„ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์ด๋‹ค. HTTP ์‘๋‹ต์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ (HTTP Status Code) : 200 OK, 404 Not Found, 500 Internal Server Error ๋“ฑ ํ—ค๋” (Headers) : ์‘๋‹ต ํ—ค๋”์— ํŠน์ • ๊ฐ’์„ ์ถ”๊ฐ€/์ˆ˜์ • ๋ณธ๋ฌธ (Body) : ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋  ๋ฐ์ดํ„ฐ @GetMapping("/example") public ResponseEntity<String> getExample() { String body = "Hello, World!"; HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "CustomValue"); return new ResponseEntity<>(body, headers, HttpStatus.OK); } @ResponseBody ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์ด๊ฒƒ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ—ค๋”๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. @ResopnseStatus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋”๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ...

January 24, 2025 11:05 ยท 1 min ยท 195 words ยท nakji

HttpClient Deepdive

๐Ÿ”” BodyPublisher, BodyHandler ์—ญํ•  ๐Ÿ”” HttpClient ์‹ค์Šต BodyPublisher? BodyHandler? BodyPublisher์™€ BodyHandlers๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค. BodyPublisher๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ , BodyHandlers๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด, HTTP ํ†ต์‹ ์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. BodyPublisher HTTP ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ์ œ๊ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ• ์ง€ ์ •์˜ BodyPublishers.ofString(String): ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ BodyPublishers.ofByteArray(byte[]): ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ BodyPublishers.ofFile(Path): ํŒŒ์ผ ๋ฐ์ดํ„ฐ BodyPublishers.ofInputStream(Supplier<InputStream>): ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ BodyHandler HTTP ์‘๋‹ต์˜ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ BodyHandlers.ofString(): ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ BodyHandlers.ofByteArray(): ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ BodyHandlers.ofFile(Path): ํŒŒ์ผ ๋ฐ์ดํ„ฐ BodyHandlers.ofInputStream(): InputStream์œผ๋กœ ๋ฐ์ดํ„ฐ ์ œ๊ณต HttpResponse.BodyHandler ํด๋ž˜์Šค๋Š” BodyHandler๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŽธ๋ฆฌํ•œ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋“ค ์ค‘ ๋‹ค์ˆ˜๋Š” ์‘๋‹ต ๋ฐ”์ดํŠธ๊ฐ€ ์™„์ „ํžˆ ์ˆ˜์‹ ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ์ถ•์ ๋˜๋ฉฐ, ๊ทธ ํ›„ ์‘๋‹ต ๋ฐ”์ดํŠธ๋Š” ์ƒ์œ„ ์ˆ˜์ค€์˜ Java ์œ ํ˜•(ofString, ofByteArray ๋“ฑ)์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ...

January 12, 2025 17:37 ยท 2 min ยท 386 words ยท nakji

java.net.http.HttpClient

๐Ÿ”” HttpClient ๊ฐœ์š” ๐Ÿ”” HttpClient ๊ฐœ์„  ๊ณผ์ • ๐Ÿ”” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต What? Why? ์ž๋ฐ”์—์„œ HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ , ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉฐ, ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ API Java 11์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ด์ „์˜ HttpURLConnection๋ณด๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•˜๋‹ค. ๋นŒ๋” ํŒจํ„ด ๋„์ž…: HttpRequest.newBuilder() ์—ญํ•  ๋ถ„๋ฆฌ: HttpClient, HttpRequest, HttpResponse ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์›: HttpClient.sendAsync() ์ฃผ์š” ํด๋ž˜์Šค HttpClient: HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ HttpRequest: HTTP ์š”์ฒญ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ(URI, ๋ฉ”์„œ๋“œ, ํ—ค๋” ๋“ฑ) HttpResponse: ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTTP ์‘๋‹ต ์ฃผ์š” ๋ฉ”์„œ๋“œ HttpClient.newHttpClient() ๊ธฐ๋ณธ ์„ค์ •์„ ์‚ฌ์šฉํ•œ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ - ์š”์ฒญ(GET), ํ”„๋กœํ† ์ฝœ(HTTP/2), ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(NEVER), SSL(Default) ...

January 10, 2025 16:43 ยท 2 min ยท 272 words ยท nakji

HTTPS

HTTPS (HTTP Secure) : HTTP์˜ ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ๋ฒ„์ „์ด๋‹ค. ์†Œ์ผ“ ํ†ต์‹ ์—์„œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๋Œ€์‹ ์—, SSL์ด๋‚˜ TLS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•œ๋‹ค. 1. HTTP์™€์˜ ์ฐจ์ด์  ์š”์•ฝํ•˜๋ฉด HTTPS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๋ณด์•ˆ์„ฑ: ๋ณด์•ˆ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™” ๋ฌด๊ฒฐ์„ฑ: ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅ ์‹ ๋ขฐ์„ฑ: ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์šฐ๋Œ€๋ฐ›์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ์‹ ๋ขฐ๊ฐ์„ ๋ณด์žฅ 2. ๋™์ž‘ ์›๋ฆฌ 1) URL ํŒŒ์‹ฑ ๋ฐ DNS ์กฐํšŒ ๋ธŒ๋ผ์šฐ์ €๋Š” URL์„ ํ™•์ธํ•˜๊ณ  DNS๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ์„ IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค. 2) ๋ณด์•ˆ ์—ฐ๊ฒฐ ์„ค์ • ์„œ๋ฒ„๋Š” TLS handshake๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•œ๋‹ค. ์ด ์ธ์ฆ์„œ์—๋Š” ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‚ค์™€ ์ธ์ฆ๊ธฐ๊ด€(CA)์˜ ์„œ๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. 3) ์„œ๋ฒ„ ์ฒ˜๋ฆฌ ๋ฐ ์‘๋‹ต ์ƒ์„ฑ ๋ณด์•ˆ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋ฉด ์•”ํ˜ธํ™”๋œ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ํ•ด๋…ํ•˜์—ฌ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ, ์ƒํƒœ์ฝ”๋“œ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ HTTPS ์‘๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 4) ์‘๋‹ต ์•”ํ˜ธํ™” ๋ฐ ์ „์†ก ์„œ๋ฒ„๋Š” TLS๋ฅผ ์ด์šฉํ•˜์—ฌ ์‘๋‹ต์„ ์•”ํ˜ธํ™”ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋‹ค์‹œ ์ „์†กํ•œ๋‹ค. ์ด ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ์ด ์œ ์ง€๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ์ฑ„๋”๋ผ๋„ ๋‚ด์šฉ์„ ํ•ด๋…ํ•  ์ˆ˜ ์—†๋‹ค. 5) ํด๋ผ์ด์–ธํŠธ์—์„œ์˜ ์ฒ˜๋ฆฌ ์•”ํ˜ธํ™”๋œ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ํ•ด๋…ํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ๋ Œ๋”๋งํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ์ „์†ก๋˜๊ณ  ๋ Œ๋”๋ง๋˜๋ฉด TLS ์—ฐ๊ฒฐ์€ ์ข…๋ฃŒ๋œ๋‹ค. 3. ์ „๋‹ฌ ๋‚ด์šฉ ๋น„๊ต ex) HTTP ์š”์ฒญ (ํ‰๋ฌธ ์ „์†ก) ...

November 6, 2024 18:32 ยท 2 min ยท 402 words ยท nakji

HTTP

HTTP (HyperText Transfer Protocol) : ์›น์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์‹  ๊ทœ์•ฝ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์ด๋ฃจ์–ด์ง€๋Š” ์š”์ฒญ/์‘๋‹ต ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์ธ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTTP๋ฅผ ํ†ตํ•˜์—ฌ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์›น ํŽ˜์ด์ง€(HTML) ๋“ฑ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์— ์‘๋‹ตํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ๐Ÿ”” HTTPS๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์ „, ์ตœ์†Œํ•œ์˜ HTTP ์ •๋ณด๋งŒ ์ •๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ์ผ๋ถ€ ๊ฐœ๋…์ด ์ƒ๋žต๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. HTTP ์š”์ฒญ : HTTP ์š”์ฒญ์„ ํ•  ๋•Œ, ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ผ๋ จ์˜ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 1. HTTP ๋ฒ„์ „ ์œ ํ˜• HTTP ๋ฒ„์ „์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€๋ฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ RFC ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ...

November 4, 2024 14:46 ยท 3 min ยท 624 words ยท nakji