3 tier architecture
docs.aws - 3 tier architecture
โ Client(๋ธ๋ผ์ฐ์ ) : ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ์กฐ์ํ์ฌ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ(Request), ์๋ต(response)
- ๊ด๋ จ : HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ
- Presentation Tier ๋ผ๊ณ ๋ ํ๋ค.
โก ์น ์๋ฒ ํน์ WAS(Web Application Server) :
โถ ์น ์๋ฒ(Web Server) : ์ด๋ฏธ์ง์ ๊ฐ์ ๊ณ ์ ๋ ๋ฐ์ดํฐ ์ ๊ณต (์น ์๋ฒ)
โท WAS (Web Application Server) : ๋์ ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํด ๋งค๋ฒ ์๋ก์ด ๋ฐ์ดํฐ ์ ์
- ๋๋ถ๋ถ์ WAS๋ ์น ์๋ฒ ๊ธฐ๋ฅ๋ ๊ฒธํ๋ค. ( ์ ์ ์ด๋ฏธ์ง + ๋์ ๋น์ฆ๋์ค ๋ก์ง ์คํ )
- ๐ท ๊ทธ๋ ๋ค๋ฉด Web Server๋ WAS์ ํ์ํธํ์ธ๊ฐ? No!
- ์ฑ ์ ๋ถํ ์ ํตํ ์๋ฒ ๋ถํ ๋ฐฉ์ง / ๋ก๋๋ฐธ๋ฐ์ฑ , WAS ํฌ์ค ์ฒดํฌ / ๋ณด์ (DB๋ ธ์ถ ๋ฐฉ์ง) ๋ฑ
์น ์๋ฒ์ WAS๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ !
โข ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB) :
์๊ตฌ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์ด์ํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ. ๊ธฐ๋ณธ์ ์ผ๋ก Relational DB ์ฌ์ฉ
ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๋ฐ์ดํฐ ๊ตํ ๊ตฌ์กฐ
์ถ์ฒ: [JSP/Servlet] Servlet์ ๊ดํ ๋ชจ๋ ๊ฒ
์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๊ฐ ์ ์ ๋ฐ์ดํฐ์ธ์ง ๋์ ๋ฐ์ดํฐ์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค.
- ์ ์ (static) ๋ฐ์ดํฐ : ํญ์ ๋์ผํ๊ฒ ๊ณ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์
- ์ฃผ๋ก ํ์ผ๋ก ๊ณ ์ ๋ HTML, CSS, ์ด๋ฏธ์ง ํ์ผ- ๋์ (dynamic) ๋ฐ์ดํฐ : ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ ์กํ๋ ๋ฐฉ์
- Server Side Programming : ์๋ฒ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ ๋ณด๋ด๊ธฐ
- ex) ๋ฉ์ผํจ.
์น ์๋ฒ : ํญ์ ๊ฐ์ ์ ์ (static) ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ์ญํ ๋ง์ ์ํํ๋ ์๋ฒ
์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ : ๋์ (dynamic) ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ณด๋ด๋ ๊ฒฝ์ฐ
- ํฐ์บฃ์ ๊ฒฝ์ฐ WAS์ ํ ์ข ๋ฅ์ด์ง๋ง, ์ฌ์ค์ ๋๋ถ๋ถ์ WAS๋ ์น ์๋ฒ์ ๊ธฐ๋ฅ๋ ๊ฐ์ด ํฌํจํ๋ฏ๋ก ์ด๋ฏธ์ง, CSS/JS์ ๊ฐ์ ์ ์ ์ธ ์์๊ณผ ์๋ธ๋ฆฟ/JSP ๊ฐ์ ๋์ ์์ ๋ชจ๋ ์ฒ๋ฆฌ ๊ฐ๋ฅ!
Amazone Corretto version
์ด ์๋ zulu-11
์ด๋ค.VM option
์ด ๊ธฐ์กด์ ์์ ๋์ด ์์๋ค.ํฐ์บฃ์ ์ฌ์์์ ์ต์ํํ๊ธฐ ์ํด์ Edit Configurations
- On Update action
๊ณผ On frame deactivation
์ค์ ์กฐ์ . (ํฐ์บฃ ํ๊ธ ์ค์ ๋ VM options
๋ฅผ ์ด์ฉํ์ฌ ์กฐ์ )์ด์ jsp ํ์ผ์ ๋ณ๊ฒฝ ํ ๊ฐ๋ ์๋ฒ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ๋ณ๋์ ์์
์์ด๋ ๋ณ๊ฒฝ๋ ์ฝ๋๊ฐ ๋ฐ์๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅ
๋จ, HelloServlet๊ณผ ๊ฐ์ ์๋ฐ ์ฝ๋์ ๋ณ๊ฒฝ์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋จ.
3ํฐ์ด ์ํคํ
์ฒ์์ ์ด๋ค์ง๋ ์์ฒญ(Request)๊ณผ ์๋ต(Response)
์์ฒญ : ํด๋ผ์ด์ธํธ (์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ )๊ฐ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๊ฒ
์๋ต : ์๋ฒ๊ฐ ๋ฆฌ์์ค๋ฅผ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์๋ง์ ํํ๋ก ์ ๊ณตํ๋ ๊ฒ
์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํ๋ค!
์ด๋ป๊ฒ?
- HTTP(S)๋ผ๋ ํต์ ๊ท์ฝ์ ํตํด์!
๋ธ๋ผ์ฐ์ ์ ์์ฒญ๊ณผ ์๋ฒ ์๋ต ์ฌ์ด์๋ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ์ฝ์์ด ํ์ํ๋ค.
์ด๋ฅผ, ํ๋กํ ์ฝ(Protocol)โญ์ด๋ผ๊ณ ํ๋ค.
์น์์๋ HTTP(Hyper Text Transfer Protocol)โญ ๋ผ๋ ํต์ ๊ท์ฝ์ ์ฌ์ฉํ๋ค.
URL, URI์ ๊ฐ์ฅ ์ฒ์ ์ฃผ์๋ก๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๋ฐ์ดํฐ ๊ตํ์ ์ด๋ค ํ๋กํ ์ฝ์ ํ ๊ฒ์ธ์ง ๊ทธ ์คํค๋ง๊ฐ ๋ช
๊ธฐ๋์ด ์๋ค.
HTTPS๋ HTTP์ ๋ณด์์ฑ์ด ๊ฐํ๋ ํ๋กํ ์ฝ์ผ๋ก, ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์์ ํ๊ณ ์ํธํ๋ ์ฐ๊ฒฐ์ ์ค์ ํ๋ค.
HTTP ๋ฉ์๋โญ : ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ด๋ฃจ์ด์ง๋ ์์ฒญ(Request)โก๊ณผ ์๋ต(Response)โก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์
์ฃผ์ HTTP ๋ฉ์๋
- GET ๋ฐฉ์ : ํน์ ๋ฆฌ์์ค ์กฐํ
- ์ฃผ์์ฐฝ์ ์ง์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ๋ ๋งํฌ๋ฅผ ํด๋ฆญํด์ ํธ์ถ
- ์ฃผ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๊ฐ์ด ๋ณด๋ธ๋ค. ํน์ ์ ๋ณด๋ฅผ ์กฐํ. (body ๊ฐ ์๋ค.)
- ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋?
์&
,=
๋ฑ์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ํตํด์ ์ ๋ฌ ํ๋ค.
-GET /members/100?username=inpa&height=200
- ์กฐํ๋ POST๋ ๊ฐ๋ฅํ์ง๋ง ์บ์ฑ์ด ๊ฐ๋ฅํ GET์ ๊ถ์ฅ
- POST ๋ฐฉ์ : ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
- ์ ๋ ฅ ํ๋ฉด์์ ํ์ํ ๋ด์ฉ์ ์์ฑํ ํ์ '์ ์ก'๊ณผ ๊ฐ์ ๋ฒํผ ๋ฑ์ ํด๋ฆญ, ํธ์ถ
- ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ณด๋ด๋ ๋ฐฉ์
- ์น ํ๋ฉด์ ํตํด์ ์ค์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์์ ์ ํจ.
- PUT ๋ฐฉ์ : ๋ชฉ์ ๋ฆฌ์์ค๋ฅผ ๋์ฒด(๋ฎ์ด์ฐ๊ธฐ), ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
- ๋ชฉ์ ๋ฆฌ์์ค ๋ชจ๋ ํ์ฌ ํ์๋ฅผ ์์ฒญ payload๋ก ๋ฐ๊พผ๋ค.
- ๋ฉฑ๋ฑ์ฑ(Idempotent : ์ฌ๋ฌ ๋ฒ ์ฐ์ฐ์ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง)์ ๊ฐ์ง
(GET, PUT, DELETE)
- PATCH ๋ฐฉ์ : ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ(PUT์ด ์ ์ฒด ๋ณ๊ฒฝ, PATCH๋ ์ผ๋ถ ๋ณ๊ฒฝ)
- ๋ฆฌ์์ค์ ๋ถ๋ถ๋ง์ ์์ ํ๋ค.
- DELETE ๋ฐฉ์ : ํน์ ๋ฆฌ์์ค๋ฅผ ์ญ์
๊ธฐํ ๋ฉ์๋
- HEAD : GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ(body ๋ถ๋ถ)์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
- OPTIONS : ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช (์ฃผ๋ก CORS์์ ์ฌ์ฉ)
- CONNECT : ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์
- TRACE : ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํ
HTTP ๋ฉ์๋์ ํน์ฑ
- ์์ ์ฑ(Safe) : ํธ์ถํด๋ ๋ฆฌ์์ค ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง ์๋ ์์ฑ (
GET
,HEAD
)- ๋ฉฑ๋ฑ์ฑ(Idempotent) : ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ๋ณด๋ด๋ ํ ๋ฒ ๋ณด๋ธ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ (
GET
,PUT
,DELETE
)- ์บ์ ๊ฐ๋ฅ(Cacheable) : ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์บ์ํด ์ฌ์ฉํ ์ ์๋ ์์ฑ (
GET
,HEAD
)
- POST, PATCH ๋ ์บ์ ๊ฐ๋ฅํ๋, Message Body ์บ์ ํค ๋ณต์ก์ฑ ๋ฌธ์ ๋ก ์ฌ์ฉ X
HTTP ๋ฉ์์ง๋ โถstart-line ์์ ๋ผ์ธ โทheader ํค๋ โธ empty line(๊ณต๋ฐฑ ๋ผ์ธ, CRLF) โน message body๋ก ๊ตฌ์ฑ๋๋ค.
- ๊ณต๋ฐฑ ๋ผ์ธ์ HTTP ๋ฉ์ธ์ง ๊ฐ ๊ตฌ๋ถ์ ํ๊ธฐ ์ํ ๋ผ์ธ์ด๋ฏ๋ก, ๋จ์ํ ๋ณด๊ธฐ ํธํ๊ฒ ๋ฃ๋ ๊ฒ์ ๋์ด์ ๋ฐ๋์ ์์ด์ผ ํ๋ค. ๋ง์ฝ ๋ณด๋ผ ๋ฉ์ธ์ง ๋ฐ๋๊ฐ ์๋ค๋ฉด ๊ณต๋ฐฑ๋ง ๋ฃ๊ณ ๋๋ด๋ฉด ๋๋ค.
HTTP ์์ฒญ ์ข ๋ฅ์ ๋ฐ๋ผ Message Body๊ฐ ํฌํจ๋ ์๋ ์๊ณ ์๋ ์๋ ์๋ค.
HTTP ์์ฒญ ๋ฉ์์ง์ ์๋ต ๋ฉ์์ง [์ถ์ฒ: ์ธํ ๋ธ๋ก๊ทธ]
๊ฐ๋ฐ์ ๋๊ตฌ([F12]
)
์ผ์ชฝ(232 requests
)์ ํ์ฌ๊น์ง ๋ช ๋ฒ์ด๋ ์๋ฒ๋ฅผ ํธ์ถํ๋์ง ๋ณด์ฌ์ฃผ๋ฉฐ, ๊ฐ ํญ๋ชฉ ํ๋๋น ์์ฒญ๊ณผ ์๋ต์ด ํ๋์ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ค.
๋ฌด์ํ(Stateless) : ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ํ๋ฅผ ์ ์งํ์ง ์๋๋ค.
- ์๋ฒ๋ ๋จ์ํ ์์ฒญ์ด ์ค๋ฉด ์๋ต์ ๋ณด๋ด๋ ์ญํ ๋ง ์ํํ๋ค.
ํต์ ์ ํ์ํ ๋ชจ๋ ์ํ ์ ๋ณด๋ค์ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์๋ฒ์ ํต์ ํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ด ๋ณด๋ธ๋ค.- ์ฅ์ : ์๋ฒ ์ํ ์ ์ง์ ๋ํ ๋ถํ๊ฐ ํ์ ํ ์ ๋ค. / ์๋ฒ ํ์ฅ์ฑ ๋๋ค. (์ค์ผ์ผ ์์)
์ํ ํ์ฅ์ ์ ๋ฆฌํ๋ค.- ๋จ์ : ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ ๋ฐ์ดํฐ ์ ์ก (๋ฉ๋ชจ๋ฆฌ) / ๋ก๊ทธ์ธ ์ํ ์ ์ง X
- UDP์ HTTP๊ฐ Statelessํ ํ๋กํ ์ฝ์ด๋ค.
์ฐธ๊ณ : ๋ฌด์ํ์ ์ํ ์ ์ง- ์ํ ์ ์ง(Stateful) : ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๋ณด์กดํ๋ค.
- ๋ก๊ทธ์ธ ์ํ ์ ์ง ๋ฑ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๋ณด์กดํด์ผ ํ ํ์์ฑ์ด ์๋ค.
- Statefulํ ํ๋กํ ์ฝ : TCP์ 3-way handshaking
๋น์ฐ๊ฒฐ์ฑ(Connectionless) : ์๋ฒ์ ํด๋ผ์ด์ธํธ์ Connection ์ฐ๊ฒฐ์ ์ง์ํ์ง ์๋๋ค.
(ํ๋์ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ ํ์ ์ฐ๊ฒฐ์ ์ข
๋ฃํ๋ค.)
- 1์๊ฐ๋์ ์์ฒ๋ช ์ด์์ด ์๋น์ค๋ฅผ ์ฌ์ฉํด๋ ์ค์ ์๋ฒ์์ ๋์์ ์ฒ๋ฆฌํ๋ ์์ฒญ์ ์์ญ๊ฐ ์ดํ๋ก ์ ๋ค.
์๋ฅผ๋ค์ด ์น ๋ธ๋ผ์ฐ์ ๊ฒ์ํ์ด์ง์์ ๊ฒ์๋ฒํผ๋ง ์ฐํํ๋ฉด์ ์ด์ฉํ์ง๋ ์๋๋ฏ์ด ๋ง์ด๋ค.- ์ฅ์ : ์ด๋ฌํ ๋น์ฐ๊ฒฐ์ฑ ํน์ฑ ๋๋ฌธ์ ์๋ฒ ์์์ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์ด์ฉํ ์ ์๋ค.
- ํ๊ณ : ๋จ๊ธฐ ์ปค๋ฅ์ - HTTP ์ด๊ธฐ์๋ ๋ชจ๋ ์ฐ๊ฒฐ, ์ข ๋ฃ์ TCP Handshake๊ฐ ๋ฐ์ํจ.
- ๊ทน๋ณต : HTTP ์ง์ ์ฐ๊ฒฐ(Persistent Connections) - ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ผ ์ฐ๊ฒฐ์ ํ ๋ค์ ํ์ํ ์์์ ์์ฒญ/์๋ต์ผ๋ก ๋ค์ด๋ก๋ ๋ฐ๋๋ค. ์์ผ ์ฐ๊ฒฐ์ ์ผ์ ์๊ฐ ๋์ ๋ ์ ์งํจ์ผ๋ก์จ, ํ์ํ ์์๋ค์ ๋ชจ๋ ๋ค์ด ๋ฐ์ ๋๊น์ง ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋์ง ์๊ณ ์์ฒญ/์๋ต์ด ๋ฐ๋ณต๋ ๋ค ์ข ๋ฃ๋จ.
์๋ฒ ์ฌ์ด๋ ํ๋ก๊ทธ๋๋ฐ : ์๋ฒ ์ชฝ์์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ
- ๊ณ ๋ ค์ :
- ๋์์ ์ฌ๋ฌ ์์ฒญ(Request)์ด ๋ค์ด์จ๋ค๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋๊ฐ
- ์๋ฒ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ด๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋๊ฐ?
- ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ ์ ์ก์ ์ต์ ํํ ์ ์์๊น?
- ๋ถ์ฐ ํ๊ฒฝ์ด๋ ๋ถ์ฐ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ฌธ์ ๋ค์?
JavaEE๋ผ๋ ๊ธฐ์ ์คํ์ผ๋ก ์์ ๊ฐ์ ๊ณ ๋ ค์ ๋ณด์
์๋ธ๋ฆฟ ๊ธฐ์ : ์๋ฒ์์ ๋์ ์ผ๋ก ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ API
- ์๋ธ๋ฆฟ์์ ์ ๊ณตํ๋ API๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ค์ ํ๋ ๋ฐฉ์์ผ๋ก ์๋ธ๋ฆฟ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ฒ ๋๋ค.[์ถ์ฒ: ์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ๋ถ 35p]
- ์๋ธ๋ฆฟ๊ณผ JSP๋ ๊ทผ๋ณธ์ ์ผ๋ก ๊ฐ์ ์๋ฆฌ์ด์ง๋ง,
JSP๋ HTML์ ์ข ๋ ์ฝ๊ฒ ์ด์ฉํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ '์๋ธ๋ฆฟ์ผ๋ก๋ ์ฝ๋๋ฅผ ์ด์ฉํ ์ฒ๋ฆฌ, JSP๋ก๋ ํ๋ฉด๊ฐ๋ฐ'๊ณผ ๊ฐ์ด ์ญํ ์ ๋ถ๋ดํด์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ์๋ธ๋ฆฟ์ ์คํ์ ํฐ์บฃ๊ณผ ๊ฐ์ด ์๋ธ๋ฆฟ์ ์คํํ ์ ์๋ ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅํ๋ฐ
์ด๋ฅผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)โญ๋ผ๊ณ ํ๋ฉฐ ๊ณผ๊ฑฐ์๋ ์๋ธ๋ฆฟ ์์ง(Servlet Engine)์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ค.
์น ์ปจํ
์ด๋(Web Container): ์น ์์ ๋์ ์ธ ๋ฐ์ดํฐ๋ค์ ์ฒ๋ฆฌํ์ฌ ์ ์ ์ธ ํ์ด์ง๋ก ์์ฑํด์ฃผ๋ ์ํํธ์จ์ด ๋ชจ๋
(๋์ ๋ฐ์ดํฐ๋ค์ ๋์ ์ฒ๋ฆฌํ์ฌ ์น ์๋ฒ์ ์ ์ ์ธ ํ์ผ๋ก ๋ง๋ค์ด์ ๋ณด๋ด์ค๋ค.)
- ์น์ปจํ ์ด๋์ ์๋
1) ํด๋ผ์ด์ธํธ๋ ์น์๋ฒ๋ก request(์์ฒญ)์ ๋ณด๋ธ๋ค.
2) ์๋ธ๋ฆฟ์ ํฌํจํ๋ WAS๋ ์ปจํ ์ด๋๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
3) ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ๊ฐ ์๋ธ๋ฆฟ์๊ฒ ์ ๋ฌํ๋ค.
4) ์๋ธ๋ฆฟ ๋ฉ์๋๊ฐ ๋ก๋๋๋ค.
5) ์๋ธ๋ฆฟ์ ์ปจํ ์ด๋์ ๊ด๋ จ response(์๋ต)์ ๋๊ฒจ์ค๋ค.
6) ์ปจํ ์ด๋๋ ์ด๋ฅผ ์๋ฒ์ ์ ๋ฌํ๋ค. ์๋ฒ๋ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
์๋ธ๋ฆฟ ์ฝ๋๋ฅผ ์คํํ๋ ์ฃผ์ฒด๋ ํฐ์บฃ๊ณผ ๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ด๋ฏ๋ก, ์ผ๋ฐ ์๋ฐ ํ๋ก๊ทธ๋จ๊ณผ ๋น๊ตํ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ด ๋ค๋ฅด๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ ํธ์ถํ๋ ์ฃผ์ฒด๋ ์ฌ์ฉ์๊ฐ ์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํ๊ฒ ๋๋ค.
- ์๋ธ๋ฆฟ ํด๋์ค์์ ์์ฑํ๋ ๊ฐ์ฒด์ ๊ด๋ฆฌ ์์ฒด๊ฐ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ดํด์ ๊ด๋ฆฌ๋๋ค.
- ์๋ธ๋ฆฟ/JSP ์ฝ๋ ๊ฐ๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ์๋ฐ API์ ๋๋ถ์ด ์๋ธ๋ฆฟ API๋ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
(๐ค Spring ์ผ๊ฐํ ์ค POJO์ ์์น์ ์ด๊ธฐ๊ฒ ๋๋ ๊ฒ ์๋๊ฐ?)
import์ ๊ฒฝ์ฐ javax๋ก ์์ํ๋ ์๋ธ๋ฆฟ ๊ด๋ จ API๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
๋ํ, HelloServlet ํด๋์ค์ ์ ์ธ์ด HttpServlet์ด๋ผ๋ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
๋ด๋ถ์๋ init()
, doGet()
, destroy()
๊ฐ ์์ฑ๋์ด ์๋๋ฐ ์ด๋ ์๋ธ๋ฆฟ API์์ ์ง์ ๋ ๋ฉ์๋์ด๋ค.
init()
, doGet()
, destroy()
์ ํธ์ถ ์ฃผ์ฒด๋ ๊ฐ๋ฐ์๊ฐ ์๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๋ฉฐ ํธ์ถํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๋ฉ์๋๋ฅผ ์๋ธ๋ฆฟ์ ๋ผ์ดํ ์ฌ์ดํด(life cycle)์ด๋ผ๊ณ ํ๋ค.
JSP๋ ์๋ฐ ์๋ฒ ํ์ด์ง(JavaServer Pages)์ ์ฝ์๋ก์, ์๋ธ๋ฆฟ ๊ธฐ์ ๊ณผ ๋์ผํ๊ฒ ์๋ฒ์์ ๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ์ ์ด๋ค.
โ๏ธ์๋ธ๋ฆฟ๊ณผ JSP๋ ๊ธฐ๋ฅ์ ์ฐจ์ด๋ ์๊ณ ์ญํ ์ ์ฐจ์ด๋ง ์กด์ฌํ๋ค.
1. Servlet
โฆ Java ์ฝ๋ ์์ HTML ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
โฆ Data Processing(Controller)์ ์ข๋ค.
โฆ ์ฆ DB์์ ํต์ , ๋น์ฆ๋์ค ๋ก์ง ํธ์ถ, ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ํ์ธํ๋ ์์
๋ฑ์ ์ ์ฉํ๋ค.
โฆ Servlet์ด ์์ ๋ ๊ฒฝ์ฐ Java ์ฝ๋๋ฅผ ์ปดํ์ผํ ํ ๋์ ์ธ ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
์ ์ฒด ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๋ค์ ์ปดํ์ผํ ํ ์ฌ๋ฐฐํฌํ๋ ์์
์ด ํ์ํ๋ค. (๊ฐ๋ฐ ์์ฐ์ฑ ์ ํ)
2. JSP
โฆ HTML ์ฝ๋ ์์ Java ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
โฆ HTML์ ์์ฑํ๊ธฐ ํธํ๊ธฐ ๋๋ฌธ์ View๋ฅผ ๊ตฌํํ๊ธฐ ์ข๋ค.
โฆ JSP๊ฐ ์์ ๋ ๊ฒฝ์ฐ ์ฌ๋ฐฐํฌํ ํ์๊ฐ ์์ด WAS๊ฐ ์์์ ์ฒ๋ฆฌํ๋ค. (์ฌ์ด ๋ฐฐํฌ)
JSP ์ฝ๋๋ ์๋ฐ ์ฝ๋๊ฐ ์๋์๋ ์๋ธ๋ฆฟ๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋๋ค. ๊ทธ ์ด์ ๋ JSP ํ์ผ ์ญ์ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํ๋์ด์ ์ปดํ์ผ๋๊ณ ์คํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
JSP ํ์ผ์ ํ์ํ ์๊ฐ์ ์๋ฐ ํ์ผ๋ก ์์ฑ๋๊ณ , ์ด๋ฅผ ์ปดํ์ผํด์ class ํ์ผ๋ก๋ ๋ง๋ค์ด ์ง๋ค.
C:\Users\์ฌ์ฉ์๋ช \AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat\59e36525-b4fa-443c-8544-1defaa71be21\work\Catalina\localhost\ROOT\org\apache\jsp
JSP๋ ์๋ธ๋ฆฟ ๊ธฐ์ ๊ณผ ๊ฐ์ ๋ชฉ์ ์ด์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ด๋ HTML ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฐ ์ข ๋ ํนํ๋ ๊ธฐ์ ์ด๋ค.
- ์๋ธ๋ฆฟ/JSP ๋ชจ๋ Java EE ์คํ์ ์ผ๋ถ์ด๋ฉฐ, ์คํ์ ์ํด ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ํ์
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ/JSP ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌ
- JSP๋ ๋ด๋ถ์ ์ผ๋ก ์๋ธ๋ฆฟ๊ณผ ๊ฐ์ ๋ฐฉ์์ ์ฝ๋๋ก ๋ณํ๋จ.
- JSP๋ HTML ๋ด์ ์๋ฐ ์ฝ๋ ์ถ๊ฐ / ์๋ธ๋ฆฟ์ ์๋ฐ ์ฝ๋ ์์ HTML ์ฝ๋ ์ถ๊ฐ
๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ฃผ์์ฐฝ์ ์ ๋ ฅํ๊ฑฐ๋ ๋งํฌ๋ฅผ ํตํด์ ์ ๊ทผํ๋ GET ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ์ํ๋ ๋ฐ์ดํฐ ์กฐํ
- ์ฌ์ฉ์ ์ ๋ ฅํ ์ ์๋ ํ๋ฉด
webapp[/calc/input.jsp]
์์ฑ
<body>
<form>
<input type="number" name="num1"><br/>
<input type="number" name="num2">
<button type="submit">SEND</button>
</form>
</body>
form
ํ๊ทธ : ์ ๋ ฅ ์์. form์ ์ด์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋ด์ฉ๋ค์ ์ ์กinput
ํ๊ทธ : ๋ฌธ์, ์ซ์ ์ ๋ ฅ (type
์ด๋ผ๋ ์์ฑ ์ด์ฉ)button
ํ๊ทธ : ํ๋ฉด์ ๋ฒํผ ์ถ๋ ฅ. (type=submit
์์ฑ์ ์ด์ฉํ๋ฉดform
ํ๊ทธ ๋ด์ฉ ์ ์ก ๊ฐ๋ฅ)
/calc/input.jsp
์
๋ ฅ โก๏ธ <form>
์ action
์์ฑ์ด ์์ผ๋ฏ๋ก ์๊ธฐ ์์ ํธ์ถSEND
๋ฒํผ์ ์์ฑ์ด type = "button"
์ผ๋ก ๋์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ input
ํ๊ทธ์ name
์์ฑ๊ฐ๊ณผ ํจ๊ป ๋ฌธ์์ด์ ํํ๋ก ์ ์กํ๊ฒ๋จ)์ง์ ๋ฌธ์์ด
๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์๊ตฌํ๊ฑฐ๋ ๋ฌผ์ด๋ณด๋ ์ฉ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด๋ค.
- ์ฟผ๋ฆฌ ์คํธ๋ง์ 'ํค=๊ฐ' ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
- ์ด๋ฌํ 'ํค=๊ฐ' ํํ๋ฅผ ํํ ํ๋ผ๋ฏธํฐ(parameter)์ด๋ฆ๊ณผ ๊ฐ์ด๋ผ๊ณ ํ๋ค.
?
์ดํ๋ก ์์๋๋ ๋ถ๋ถ์ด ์ฟผ๋ฆฌ ์คํธ๋ง์ด๋ฉฐ,&
์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๊ตฌ๋ถํ๋ค.- ์ฐธ๊ณ : ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ - ์ฟผ๋ฆฌ ์คํธ๋ง VS Path Variable
<form>
ํ๊ทธ๋ action
๊ณผ method
์์ฑ์ ์ด์ฉํ์ฌ, ์์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ด๋๋ก ์ ์กํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ ์ ์๋ค.
action = "calcResult.jsp"
๋ก ์ฒ๋ฆฌํ๊ณ method
๋ post
๋ฐฉ์์ผ๋ก ํ๊ฒ ๋ค๊ณ ๋ณ๊ฒฝ
์ ์ก์ ๋๋ฅด๋ฉด 404(ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป๋ URL ์์ฒญ์ ํ์์) ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋น์ฐํ๋ค, ํ์ฌ calcResult.jsp
๋ ๊ตฌํ๋์ด ์์ง ์๋ค.
๐์ฃผ์์ฐฝ์ (์ฃผ์๊ณผ ๋ฐ์ดํฐ๋ฅผ) ์ง์ ์
๋ ฅํ๋ GET
๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ,
POST
๋ฐฉ์์ ์ฃผ์์ ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํด์ ์ ์กํ๋ค.GET
์ฒ๋ผ ์ฟผ๋ฆฌ์คํธ๋ง ํํ๋ก ์ฃผ์์ฐฝ์ ๋ฐ์ดํฐ๊ฐ ๋ณด์ด์ง ์๋๋ค.
POST
๋ ๊ฐ๋ฐ์ ๋๊ตฌ์์๋ง ์
๋ ฅ ๊ฐ์ ํ์ธํ ์ ์๋ค.
โญ POST
๋ฐฉ์์ '๋ฑ๋ก/์์ /์ญ์ ' ๊ฐ์ ์์
์ ์ํํ๋ค.
GET ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ ๋ณด์ ํ์ฐ์ด ๋ชฉ์ ์ด ์๋๋ฏ๋ก ํ๋์ ๋ฌธ์์ด๋ก ๋ชจ๋ ์ ๋ณด๋ฅผ ํํํ์ง ์๊ณ , URL๊ณผ ์ ๋ณด๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํด์ ์ ๋ฌํ๋ค.
calcResult.jsp
์์ฑ (input.jsp
์์ ์ ๋ฌ๋๋ num1, num2 ๋ฐ์์ ์ฒ๋ฆฌํ๋ ํ๋ฉด)
${}
๋ก ์์ฑ๋ ๋ถ๋ถ์ JSP์์ ์ฌ์ฉํ๋ EL(Expression Language)โญ์ด๋ค.System.out.println
๊ณผ ์ ์ฌํ ์ญํ ์ ํ๋ค.
- ์ฐธ๊ณ : JSP - EL ํํ์ ๋ฌธ๋ฒ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ๊ฐ์ฒด ํ๋กํผํฐ ๊ฐ์ ๊บผ๋ผ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- param์ด๋ผ๋ ์ด๋ฆ์ ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ์์ฒญ์ ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ๊ฒ ์ถ์ถํ ์ ์๋ค.(
${param.num1}
,${param.num2}
)
Integer.parseInt
๋ก ์ ๋ฌ๋ ๋ฌธ์์ด param.num[1|2]
๋ฅผ ์ ์๋ก ๋ฐ๊พธ์ด ๊ณ์ฐ ๊ฐ ์ถ๋ ฅcalcResult.jsp
๋ฅผ GET ๋ฐฉ์์ผ๋ก๋ ์ผ๋ง๋ ์ง ํธ์ถํ ์ ์๋ค.(๐ง ๋จ, GET ๋ฐฉ์์ผ๋ก ์ฃผ์์ฐฝ์ ์ง์ ํธ์ถํ๋ฉด Param.num1
์ด ๋น ๊ฐ์ด๊ธฐ ๋๋ฌธ์ Integer.parseInt
๋ฅผ ์ฌ์ฉํ ๋ ์์ธ๊ฐ ๋ฐ์ํ๊ธด ํ๋ค.)โท ์ ์ง ๋ณด์ ์ธก๋ฉด์์๋ ๋ฌธ์ ๊ฐ ์๋ค.
JSP ํ์ผ๋ช
์ ๋ฐ๊พธ๊ฑฐ๋ JSP ํ์ผ์ ๊ต์ฒดํ์ ๊ฒฝ์ฐ ์ด์ ์ฃผ์๋ก ๊ต์ฒด๋ ์ฃผ์๋ก์ ์ ๊ทผ์ ํ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ์ฌ์ฉ์๋ค์๊ฒ ๋ค์ ์๋ ค์ค์ผ ํ๋ค.
์ต๊ทผ JSP ์ฉ๋๋ ์ ํ์ ์ด๋ค.
- JSP์์ ์ฟผ๋ฆฌ ์คํธ๋ง์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค. - JSP ๋์ ์๋ธ๋ฆฟ์ ํตํด ์ฒ๋ฆฌ
- JSP๋ ์ ๋ ฅ ํ๋ฉด์ ๊ตฌ์ฑํ๊ฑฐ๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์ง์ JSP ๊ฒฝ๋ก๋ฅผ ํธ์ถํ์ง ์๊ณ ์๋ธ๋ฆฟ ๊ฒฝ๋ก๋ฅผ ํตํด์ JSP๋ฅผ ๋ณด๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ
โญ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฑ์ฅํ ๋ฐฉ์์ด '์น MVC' ๋ฐฉ์์ผ๋ก JSP๋ ๊ฒฐ๊ณผ๋ง ์ถ๋ ฅํ๊ณ , ์ฒ๋ฆฌ๋ ์๋ธ๋ฆฟ์ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ณํํ๋ค.