- ๋ฏธ์ ์ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ, ๋ฏธ์ ์งํ ์๊ตฌ ์ฌํญ ๋ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ๋ ๊ฐ์ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค. ํนํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ง๋ ๋ค.
- ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์ ๊ธฐ์ฌ๋์ง ์์ ๋ด์ฉ์ ์ค์ค๋ก ํ๋จํ์ฌ ๊ตฌํํ๋ค.
๊ฐ๋จํ HTTP ์๋ฒ๋ฅผ ๋ง๋ค์ด๋ณด์.
์ ์ฅ์์์ ์์ค์ฝ๋๋ฅผ ๋ฐ์์์ ๋ฉ์ธ ํด๋์ค๋ฅผ ์คํํ๋ฉด HTTP ์๋ฒ๊ฐ ์คํ๋๋ค.
์น๋ธ๋ผ์ฐ์ ๋ก ๋ก์ปฌ ์๋ฒ(http://localhost:8080)์ ์ ์ํ๋ฉด Hello world!๊ฐ ๋ณด์ธ๋ค.
์ ์ ๋์์ ํ์ธํ์ผ๋ฉด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์.
์ธ๋ฑ์ค ํ์ด์ง(http://localhost:8080/index.html)์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค์.
Http11ProcessorTest ํ ์คํธ ํด๋์ค์ ๋ชจ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ฉด ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์์ฒญํ HTTP Request Header๋ ๋ค์๊ณผ ๊ฐ๋ค.
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
์ธ๋ฑ์ค ํ์ด์ง์ ์ ์ํ๋๊น ํ๋ฉด์ด ์ด์ํ๊ฒ ๋ณด์ธ๋ค.
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ฒดํฌํด๋ณด๋ ๋ธ๋ผ์ฐ์ ๊ฐ CSS๋ฅผ ๋ชป ์ฐพ๊ณ ์๋ค.
์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ด์์ ๋ CSS ํ์ผ๋ ํธ์ถํ๋๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ์.
GET /css/styles.css HTTP/1.1
Host: localhost:8080
Accept: text/css,*/*;q=0.1
Connection: keep-alive
http://localhost:8080/login?account=gugu&password=password์ผ๋ก ์ ์ํ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง(login.html)๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ง๋ค์.
๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์ธ ํ์ด์ง์ ์ ์ํ์ ๋ Query String์ ํ์ฑํด์ ์์ด๋, ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋ฉด ํ์์ ์กฐํํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ๋ง๋ค์.
- ๋ฏธ์ ์ jwp-dashboard-http-mission ์ ์ฅ์๋ฅผ Fork & Cloneํด ์์ํ๋ค.
- ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์
README.md
์ ๊ตฌํํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํด ์ถ๊ฐํ๋ค.
- request path๋ฅผ ํตํด ๋ฆฌ์์ค ์ฐพ๊ธฐ
- ์ ์ ์์ ์ฒ๋ฆฌ : file์ byte ๋จ์๋ก ์ฝ๊ธฐ
- response๋ก ์ฒ๋ฆฌํ ํ์ผ ๋ณด๋ด๊ธฐ
- index.html์์ css ํธ์ถ ํ์ธ
- response Content-Type ๋ณ๊ฒฝ
- parameter ์ถ์ถ
- db ์กฐํ๋ฅผ ํตํด ์ถ์ถ๋ parameter์ ํด๋นํ๋ user ์กด์ฌ ์ฌ๋ถ ํ์ธ
- response๋ก ์กฐํํ ๊ฒฐ๊ณผ ๋ณด๋ด๊ธฐ
์๋ธ๋ฆฟ์ ๋์ ํด์ ๋์ ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์๋ค.
์ด์ ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์.
๋ก๊ทธ์ธ์ ํ์ํ ์ฟ ํค์ ์ธ์ ๋ ๊ฐ์ด ๊ตฌํํด๋ณด์.
๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์์ผ๋ณด์.
/login ํ์ด์ง์์ ์์ด๋๋ gugu, ๋น๋ฐ๋ฒํธ๋ password๋ฅผ ์ ๋ ฅํ์.
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ต ํค๋์ http status code๋ฅผ 302๋ก ๋ฐํํ๊ณ /index.html๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๋ค. ๋ก๊ทธ์ธ์ ์คํจํ๋ฉด 401.html๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค.
http://localhost:8080/register์ผ๋ก ์ ์ํ๋ฉด ํ์๊ฐ์ ํ์ด์ง(register.html)๋ฅผ ๋ณด์ฌ์ค๋ค.
ํ์๊ฐ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค ๋๋ GET์ ์ฌ์ฉํ๋ค.
ํ์๊ฐ์ ์ ๋ฒํผ์ ๋๋ฅด๋ฉด HTTP method๋ฅผ GET์ด ์๋ POST๋ฅผ ์ฌ์ฉํ๋ค.
ํ์๊ฐ์ ์ ์๋ฃํ๋ฉด index.html๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค.
๋ก๊ทธ์ธ ํ์ด์ง๋ ๋ฒํผ์ ๋๋ ์ ๋ GET ๋ฐฉ์์์ POST ๋ฐฉ์์ผ๋ก ์ ์กํ๋๋ก ๋ณ๊ฒฝํ์.
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ฟ ํค์ ์ธ์ ์ ํ์ฉํด์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค.
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;
์ฟ ํค์์ ์ ๋ฌ ๋ฐ์ JSESSIONID์ ๊ฐ์ผ๋ก ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ์ ์์ด์ผ ํ๋ค. ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด Session ๊ฐ์ฒด์ ๊ฐ์ผ๋ก User ๊ฐ์ฒด๋ฅผ ์ ์ฅํด๋ณด์.
๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์ธ๋ ์ํ์์ /login ํ์ด์ง์ HTTP GET method๋ก ์ ๊ทผํ๋ฉด ์ด๋ฏธ ๋ก๊ทธ์ธํ ์ํ๋ index.html ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ฒ๋ฆฌํ๋ค.
HTTP ์๋ฒ๋ฅผ ๊ตฌํํ ์ฝ๋์ ๋ณต์ก๋๊ฐ ๋์์ก๋ค. ์ ์ ํ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ญํ ์ ๋งก๊ฒจ์ ์ฝ๋ ๋ณต์ก๋๋ฅผ ๋ฎ์ถฐ๋ณด์.
HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค. HTTP ์์ฒญ์ ์ด๋ค ํํ๋ก ๊ตฌ์ฑ๋์ด ์๋๊ฐ? ํด๋์ค๋ก HTTP ์์ฒญ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋ฉด ์ข์๊น? HTTP ์์ฒญ ์ด๋ฏธ์ง๋ฅผ ์ฐธ๊ณ ํด์ ๊ตฌํํด๋ณด์
HTTP ์๋ต์ ์ฒ๋ฆฌํ๋ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค. HTTP ์๋ต์ ์ด๋ค ํํ๋ก ๊ตฌ์ฑ๋์ด ์๋๊ฐ? ํด๋ผ์ด์ธํธ์๊ฒ ์ด๋ค ํํ๋ก HTTP๋ฅผ ์๋ตํ๋ฉด ์ข์๊น?
HTTP ์์ฒญ, ์๋ต์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ญํ ์ ๋งก๊ธฐ๊ณ ๋๋๊น uri ๊ฒฝ๋ก์ ๋ฐ๋ฅธ if์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋จ๋๋ค. if์ ๋ถ๊ธฐ๋ ์ด๋ป๊ฒ ๋ฆฌํฉํฐ๋งํ๋๊ฒ ์ข์๊น? ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ ๋ถ๊ธฐ์ ์๋ ๋ก์ง๋ง๋ค AbstractController๋ฅผ ์์ํ ๊ตฌํ์ฒด๋ก ๋ง๋ค์ด๋ณด์.
HTTP ์๋ฒ๋ฅผ ๊ตฌํํ ์ฝ๋์ ๋ณต์ก๋๊ฐ ๋์์ก๋ค. ์ ์ ํ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ญํ ์ ๋งก๊ฒจ์ ์ฝ๋ ๋ณต์ก๋๋ฅผ ๋ฎ์ถฐ๋ณด์.
Connector ํด๋์ค์ void process(final Socket connection) ๋ฉ์๋์์ ์์ฒญ๋ง๋ค ์ค๋ ๋๋ฅผ ์๋ก ์์ฑํ๊ณ ์๋ค. Connector ํด๋์ค์์ Executors ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ExecutorService ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ณด์. ์ค๋ ๋ ๊ฐฏ์๋ maxThreads ๋ผ๋ ๋ณ์๋ก ์ง์ ํ๋ค.
SessionManager ํด๋์ค์์ Session ์ปฌ๋ ์ ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ Session ์ปฌ๋ ์ ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ์ฌ ์ฝ๊ณ ์ฐ๋ค๋ณด๋ฉด ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ด๋ ต๋ค. ๋์์ฑ ์ปฌ๋ ์ (Concurrent Collections)์ ์ ์ฉํด์ ์ค๋ ๋ ์์ ์ฑ๊ณผ ์์์ฑ์ ๋ณด์ฅํด๋ณด์.