Skip to content

belowyoon/jwp-dashboard-http-mission

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

19 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿฑ ํ†ฐ์บฃ ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿฑ

๐Ÿ” ์ง„ํ–‰ ๋ฐฉ์‹

  • ๋ฏธ์…˜์€ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ, ๋ฏธ์…˜ ์ง„ํ–‰ ์š”๊ตฌ ์‚ฌํ•ญ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค. ํŠนํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ๋งŒ๋“ ๋‹ค.
  • ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ธฐ์žฌ๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๐Ÿš€ step1: ๋ฏธ์…˜ ์„ค๋ช…

๊ฐ„๋‹จํ•œ HTTP ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

์ €์žฅ์†Œ์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์™€์„œ ๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉด HTTP ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์›น๋ธŒ๋ผ์šฐ์ €๋กœ ๋กœ์ปฌ ์„œ๋ฒ„(http://localhost:8080)์— ์ ‘์†ํ•˜๋ฉด Hello world!๊ฐ€ ๋ณด์ธ๋‹ค.

์ •์ƒ ๋™์ž‘์„ ํ™•์ธํ–ˆ์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

โš™๏ธ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

1. GET /index.html ์‘๋‹ตํ•˜๊ธฐ

์ธ๋ฑ์Šค ํŽ˜์ด์ง€(http://localhost:8080/index.html)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์ž.

Http11ProcessorTest ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ๋œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญํ•œ HTTP Request Header๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*

2. CSS ์ง€์›ํ•˜๊ธฐ

์ธ๋ฑ์Šค ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋‹ˆ๊นŒ ํ™”๋ฉด์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ธ๋‹ค.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด์–ด์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒดํฌํ•ด๋ณด๋‹ˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CSS๋ฅผ ๋ชป ์ฐพ๊ณ  ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์—ด์—ˆ์„ ๋•Œ CSS ํŒŒ์ผ๋„ ํ˜ธ์ถœํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ž.

GET /css/styles.css HTTP/1.1
Host: localhost:8080
Accept: text/css,*/*;q=0.1
Connection: keep-alive

3. Query String ํŒŒ์‹ฑ

http://localhost:8080/login?account=gugu&password=password์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€(login.html)๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ๋งŒ๋“ค์ž.

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์ ‘์†ํ–ˆ์„ ๋•Œ Query String์„ ํŒŒ์‹ฑํ•ด์„œ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํšŒ์›์„ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ๋งŒ๋“ค์ž.

โœ๏ธ ๋ฏธ์…˜ ์ง„ํ–‰ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋ฏธ์…˜์€ jwp-dashboard-http-mission ์ €์žฅ์†Œ๋ฅผ Fork & Cloneํ•ด ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „ README.md์— ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ์ •๋ฆฌํ•ด ์ถ”๊ฐ€ํ•œ๋‹ค.

๐Ÿš€ step1: ๊ตฌํ˜„ ๊ธฐ๋Šฅ ๋ชฉ๋ก

1. GET /index.html ์‘๋‹ตํ•˜๊ธฐ

  1. request path๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ
  2. ์ •์  ์ž์› ์ฒ˜๋ฆฌ : file์„ byte ๋‹จ์œ„๋กœ ์ฝ๊ธฐ
  3. response๋กœ ์ฒ˜๋ฆฌํ•œ ํŒŒ์ผ ๋ณด๋‚ด๊ธฐ

2. CSS ์ง€์›ํ•˜๊ธฐ

  1. index.html์—์„œ css ํ˜ธ์ถœ ํ™•์ธ
  2. response Content-Type ๋ณ€๊ฒฝ

3. Query String ํŒŒ์‹ฑ

  1. parameter ์ถ”์ถœ
  2. db ์กฐํšŒ๋ฅผ ํ†ตํ•ด ์ถ”์ถœ๋œ parameter์— ํ•ด๋‹นํ•˜๋Š” user ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
  3. response๋กœ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ ๋ณด๋‚ด๊ธฐ


๐Ÿฑ ํ†ฐ์บฃ ๊ตฌํ˜„ํ•˜๊ธฐ 2๋‹จ๊ณ„ - ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿš€ ๋ฏธ์…˜ ์„ค๋ช…

์„œ๋ธ”๋ฆฟ์„ ๋„์ž…ํ•ด์„œ ๋™์  ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด์ œ ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

๋กœ๊ทธ์ธ์— ํ•„์š”ํ•œ ์ฟ ํ‚ค์™€ ์„ธ์…˜๋„ ๊ฐ™์ด ๊ตฌํ˜„ํ•ด๋ณด์ž.

โš™๏ธ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

1. HTTP Status Code 302

๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œ์ผœ๋ณด์ž.

/login ํŽ˜์ด์ง€์—์„œ ์•„์ด๋””๋Š” gugu, ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” password๋ฅผ ์ž…๋ ฅํ•˜์ž.

๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ์‘๋‹ต ํ—ค๋”์— http status code๋ฅผ 302๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  /index.html๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค. ๋กœ๊ทธ์ธ์— ์‹คํŒจํ•˜๋ฉด 401.html๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค.

2. POST ๋ฐฉ์‹์œผ๋กœ ํšŒ์›๊ฐ€์ž…

http://localhost:8080/register์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€(register.html)๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” GET์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํšŒ์›๊ฐ€์ž…์„ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด HTTP method๋ฅผ GET์ด ์•„๋‹Œ POST๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํšŒ์›๊ฐ€์ž…์„ ์™„๋ฃŒํ•˜๋ฉด index.html๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค.

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋„ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ GET ๋ฐฉ์‹์—์„œ POST ๋ฐฉ์‹์œผ๋กœ ์ „์†กํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์ž.

3. Cookie์— JSESSIONID ๊ฐ’ ์ €์žฅํ•˜๊ธฐ

๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ํ™œ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

HTTP ์„œ๋ฒ„๋Š” ์„ธ์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•œ๋‹ค. ์„ธ์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ฟ ํ‚ค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค.

์ž๋ฐ” ์ง„์˜์—์„œ ์„ธ์…˜ ์•„์ด๋””๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ JSESSIONID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์„œ๋ฒ„์—์„œ HTTP ์‘๋‹ต์„ ์ „๋‹ฌํ•  ๋•Œ ์‘๋‹ต ํ—ค๋”์— Set-Cookie๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  JSESSIONID=656cef62-e3c4-40bc-a8df-94732920ed46 ํ˜•ํƒœ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ํ—ค๋”์˜ Cookie ํ•„๋“œ์— ๊ฐ’์ด ์ถ”๊ฐ€๋œ๋‹ค.

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค ์„ค์ •๋œ ํด๋ผ์ด์–ธํŠธ์˜ HTTP Request Header ์˜ˆ์‹œ

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
Cookie: yummy_cookie=choco; tasty_cookie=strawberry; JSESSIONID=656cef62-e3c4-40bc-a8df-94732920ed46

Cookie ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  HTTP Request Header์˜ Cookie์— JSESSIONID๊ฐ€ ์—†์œผ๋ฉด HTTP Response Header์— Set-Cookie๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

HTTP/1.1 200 OK 
Set-Cookie: JSESSIONID=656cef62-e3c4-40bc-a8df-94732920ed46
Content-Length: 5571
Content-Type: text/html;charset=utf-8;

4. Session ๊ตฌํ˜„ํ•˜๊ธฐ

์ฟ ํ‚ค์—์„œ ์ „๋‹ฌ ๋ฐ›์€ JSESSIONID์˜ ๊ฐ’์œผ๋กœ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด Session ๊ฐ์ฒด์˜ ๊ฐ’์œผ๋กœ User ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ด๋ณด์ž.

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ์—์„œ /login ํŽ˜์ด์ง€์— HTTP GET method๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋‹ˆ index.html ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌํ•œ๋‹ค.



๐Ÿฑ ํ†ฐ์บฃ ๊ตฌํ˜„ํ•˜๊ธฐ 3๋‹จ๊ณ„ - ๋ฆฌํŒฉํ„ฐ๋ง

๐Ÿš€ ๋ฏธ์…˜ ์„ค๋ช…

HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์กŒ๋‹ค. ์ ์ ˆํ•œ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ญํ• ์„ ๋งก๊ฒจ์„œ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ๋ณด์ž.

โš™๏ธ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

1. HttpRequest ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. HTTP ์š”์ฒญ์€ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฐ€? ํด๋ž˜์Šค๋กœ HTTP ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ์ข‹์„๊นŒ? HTTP ์š”์ฒญ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์ž

2. HttpResponse ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

HTTP ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. HTTP ์‘๋‹ต์€ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฐ€? ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์–ด๋–ค ํ˜•ํƒœ๋กœ HTTP๋ฅผ ์‘๋‹ตํ•˜๋ฉด ์ข‹์„๊นŒ?

3. Controller ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€ํ•˜๊ธฐ

HTTP ์š”์ฒญ, ์‘๋‹ต์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์—ญํ• ์„ ๋งก๊ธฐ๊ณ  ๋‚˜๋‹ˆ๊นŒ uri ๊ฒฝ๋กœ์— ๋”ฐ๋ฅธ if์ ˆ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋‚จ๋Š”๋‹ค. if์ ˆ ๋ถ„๊ธฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ? ์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ ๋ถ„๊ธฐ์— ์žˆ๋Š” ๋กœ์ง๋งˆ๋‹ค AbstractController๋ฅผ ์ƒ์†ํ•œ ๊ตฌํ˜„์ฒด๋กœ ๋งŒ๋“ค์–ด๋ณด์ž.



๐Ÿฑ ํ†ฐ์บฃ ๊ตฌํ˜„ํ•˜๊ธฐ 4๋‹จ๊ณ„ - ๋™์‹œ์„ฑ ํ™•์žฅํ•˜๊ธฐ

๐Ÿš€ ๋ฏธ์…˜ ์„ค๋ช…

HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์กŒ๋‹ค. ์ ์ ˆํ•œ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ญํ• ์„ ๋งก๊ฒจ์„œ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ๋ณด์ž.

โš™๏ธ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

1. Executors ๋กœ Thread Pool ์ ์šฉ

Connector ํด๋ž˜์Šค์˜ void process(final Socket connection) ๋ฉ”์„œ๋“œ์—์„œ ์š”์ฒญ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. Connector ํด๋ž˜์Šค์—์„œ Executors ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ExecutorService ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋Š” maxThreads ๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•œ๋‹ค.

2. ๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉํ•˜๊ธฐ

SessionManager ํด๋ž˜์Šค์—์„œ Session ์ปฌ๋ ‰์…˜์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ Session ์ปฌ๋ ‰์…˜์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ์ฝ๊ณ  ์“ฐ๋‹ค๋ณด๋ฉด ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜(Concurrent Collections)์„ ์ ์šฉํ•ด์„œ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ๊ณผ ์›์ž์„ฑ์„ ๋ณด์žฅํ•ด๋ณด์ž.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • CSS 75.2%
  • Java 15.9%
  • HTML 7.4%
  • JavaScript 1.5%