๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ/์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค

BufferedReader์˜ readLine()์œผ๋กœ HTTP ์š”์ฒญ ํŒŒ์‹ฑ ์ค‘ ์ƒ๊ธด ๋ฌธ์ œ

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค ๋ ˆ๋ฒจ 4 ๋ฏธ์…˜ ์ค‘ ์š”์ฒญ์˜ ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ํŒŒ์‹ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ž˜์„œ HTTP ์š”์ฒญ์˜ ์ฒซ ์ค„์ธ ์š”์ฒญ ๋ผ์ธ(Request Line)์„ ํŒŒ์‹ฑํ•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ BufferedReader์˜ readLine()์„ ๋ฐ˜๋ณตํ•ด์„œ ํŒŒ์‹ฑํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ด์ƒํ•˜๊ฒŒ ์ž๊พธ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌดํ•œ ๋กœ๋”ฉ์— ๋น ์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

// ํŒŒ์‹ฑ์„ ์œ„ํ•œ ์ฝ”๋“œ ์ผ๋ถ€
String tmp;
while ((tmp = bufferedReader.readLine()) != null) {
	// ํŒŒ์‹ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ ...
}

 


๊ทธ๋ž˜์„œ ์ด๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์— ํŒŒ์‹ฑ์ด ์ž˜ ๋˜๊ณ  ์žˆ๋Š”์ง€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ ํ™•์ธํ•ด๋ดค๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒŒ์‹ฑ ๊ด€๋ จ ๋กœ๊ทธ๊ฐ€ ๋‚จ์ง€๋„ ์•Š๋Š” ๊ฒƒ์ด๋‹ค! ์žฌ๋ฐŒ๋Š” ์ ์€ ๋‹ค์‹œ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๊ทธ์ œ์„œ์•ผ ํŒŒ์‹ฑ ๊ด€๋ จ ๋กœ๊ทธ๊ฐ€ ์ซ˜๋ฅด๋ฅต ๋‚˜์™”๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. ๋ถ„๋ช… ์ฒซ ์ค„์ธ ์š”์ฒญ ๋ผ์ธ์„ ํŒŒ์‹ฑํ•  ๋•Œ๋Š” ๋ฌธ์ œ์—†์—ˆ๋˜ ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ํŒŒ์‹ฑํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€?

๊ทธ๋ž˜์„œ while ๋ฌธ์„ ์ž ์‹œ ์ง€์šฐ๊ณ , ์—ฐ์†ํ•ด์„œ 3๊ฐœ๋งŒ ์ฝ์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.


์˜ˆ์ƒ์™ธ๋กœ ๋ฌธ์ œ์—†์ด ์ž˜ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ ํ—ค๋”๊นŒ์ง€๋Š” ์ž˜ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ธก์„ ํ–ˆ๊ณ , ์š”์ฒญ ๋ฐ”๋””๋ฅผ ์ฝ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ € readLine()์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•œ ์ค„์„ ์ฝ๋Š”์ง€ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค.

 

 

์„ค๋ช…์„ ํ•ด์„ํ•ด๋ณด๋ฉด, readLine()์€ ์ค„์˜ ๋์„ LF(’\n’), CR(’\r’) ๋˜๋Š” CRLF(’\r\n’)๋กœ ํŒ๋‹จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ—ค๋”์˜ ๊ฒฝ์šฐ์—๋Š” CR, LF ๋˜๋Š” CRLF๊ฐ€ ์ค„ ๋์— ๋ถ™์ง€๋งŒ Body์˜ ๊ฒฝ์šฐ์—๋Š” ๋ญ”๊ฐ€ ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ ๊ฐ€์ง€ ์‹คํ—˜์„ ์‹œ๋„ํ•ด๋ดค๋‹ค. ๋ฐ”๋กœ Body์— ์˜๋„์ ์œผ๋กœ ์ค„์˜ ๋์„ ์˜๋ฏธํ•˜๋Š” ๋ฌธ์ž๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์—ญ์‹œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ–ˆ๊ณ , ์ด๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋งค๋“ญ์ง“๊ธฐ ์œ„ํ•ด์„œ HTTP ๋ช…์„ธ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค.

 

 

๋ฏธ์…˜์—์„œ HTTP/1.1์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ์— ์ด์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ๋ดค๋Š”๋ฐ, Message Format์ด ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋˜์–ด์žˆ์—ˆ๋‹ค. ํ•ด์„ํ•ด๋ณด๋ฉด ํ—ค๋”์˜ ๊ฐ ์ค„์—๋Š” ๋์— ๊ฐœํ–‰์„ ์˜๋ฏธํ•˜๋Š” CRLF๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ—ค๋”์™€ ๋ฐ”๋”” ์‚ฌ์ด์—๋Š” CRLF๋กœ ์„œ๋กœ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ๊ทธ ํ›„ message-body๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์—ฌ๊ธฐ์—๋Š” CRLF๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์—†๋‹ค! ๊ทธ๋ ‡๋‹ค๋ฉด, HTTP์˜ ๊ฐ ํ—ค๋”๋“ค์€ CRLF๊ฐ€ ๋ช…์„ธ์— ์ง€์ •๋˜์–ด ์žˆ์–ด ํ•œ ์ค„์„ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, HTTP ๋ฐ”๋””๋Š” ๋ฐ”๋”” ๊ฐ’์— ๋”ฐ๋ผ CR, LF ํ˜น์€ CRLF๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— BufferedReader ์ž…์žฅ์—์„œ๋Š” ์–ด๋””๊นŒ์ง€ ์ฝ์–ด์•ผ ํ• ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๋น ์ง€๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” BufferedReader์˜ read() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ํŠนํžˆ, Body๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด Content-Length๋„ ํ•จ๊ป˜ ๋„˜๊ฒจ์ฃผ๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•ด ํŒŒ์‹ฑํ•˜๋„๋ก ํ–ˆ๋‹ค.

String length = requestHeader.getHeader("Content-Length");
int contentLength = Integer.parseInt(length);
char[] buffer = new char[contentLength];
bufferedReader.read(buffer, 0, contentLength);
String requestBody = new String(buffer);



HTTP์— ๋Œ€ํ•œ ์ง€์‹์ด ์ •๋ง ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.