๐ฅ ์๋ธ๋ฆฟ์ ์์ฒญ์๋ง๋ค ์์ฑ๋๋๊ฐ?
โ Question
์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์์ฒญ์ ํ๋ค๋ฉด ์ฐ๋ ๋ ์ฌ๋ฌ ๊ฐ๊ฐ ๊ฐ๊ฐ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ์์ฑํด์ ๋์์ service ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋น ๋ฅด๋ค.
์ฌ๋ฌ ์์ฒญ์ด A์๋ธ๋ฆฟ์ ์์ฒญํ๋ค๋ฉด A์๋ธ๋ฆฟ์ด ์ฌ๋ฌ๊ฐ ์์ฑ๋์ด ์๋ํ๋ ๊ฒ์ธ๊ฐ? init()์ด ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ ๊ฑด๊ฐ?
๐ Answer
์๋์, ์๋ธ๋ฆฟ(Servlet)์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํ์ง ์์ต๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)๋ ํน์ ์๋ธ๋ฆฟ ํด๋์ค์ ๋ํด ๋จ์ผ ์ธ์คํด์ค๋ง ์์ฑํ๊ณ , ์ด ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํด ๊ณต์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ํ๋๋ง ์์ฑ๋ฉ๋๋ค: ์๋ธ๋ฆฟ์ด ์ฒ์ ์์ฒญ๋ ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋น ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ๋ ์์ฑํ๊ณ , ๊ทธ ์ดํ์๋ ์ด ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- init() ๋ฉ์๋๋ ํ ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค: ์๋ธ๋ฆฟ์ init() ๋ฉ์๋๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์ฒ์ ์์ฑ๋ ๋ ๋จ ํ ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค. ์ดํ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ์์ ๋๋ init() ๋ฉ์๋๊ฐ ๋ค์ ํธ์ถ๋์ง ์์ต๋๋ค.
- ์ฌ๋ฌ ์์ฒญ์ ์ฌ๋ฌ ์ฐ๋ ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํ(pool)์์ ๊ฐ์ ธ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋, ๋์ผํ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๊ฐ ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋์์ ์คํ๋ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ์๋ธ๋ฆฟ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋๊ธฐํ ๋ฌธ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ํ๋๋ง ์์ฑ๋๊ณ , ์ด ์ธ์คํด์ค๋ ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋์์ ๊ณต์ ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ init() ๋ฉ์๋๋ ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ, service() ๋ฉ์๋๋ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์ต๋๋ค.
๐ฅ A ์ฐ๋ ๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค1์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๋ค์ ๋๊ธฐํ๋๊ฐ?
โ Question
์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ฐ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ์ฐ๋ ๋๊ฐ ๊ทธ๊ฒ์ ์ด์ฉํ ๋ ๋ค๋ฅธ ์ฐ๋ ๋๋ ๊ธฐ๋ค๋ฆฌ๋๊ฑฐ์ผ?
๐ Answer
์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ฐ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๊ฐ ์ฐ๋ ๋๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋์์ service() ๋ฉ์๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ฆ, ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๋์๋ ๊ฐ ์ฐ๋ ๋๋ ๋์์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฐ๋ ๋๋ค์ด ๊ฐ์ ๋ ๋ฆฝ์ ์ผ๋ก service() ๋ฉ์๋๋ฅผ ์คํํ๋ฉฐ, ์ด๋ฅผ "๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ"์ด๋ผ๊ณ ํฉ๋๋ค.
ํ์ง๋ง ์ค์ํ ์ ์, ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ณต์ ์์(์: ์๋ธ๋ฆฟ์ ์ธ์คํด์ค ๋ณ์, ๊ณต์ ๊ฐ์ฒด ๋ฑ)์ ์ ๊ทผํ ๋ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋์ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ค๋ฉด, ๊ทธ ๋ณ์๋ฅผ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์์ ํ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋๊ธฐํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
- ์๋ธ๋ฆฟ์ ์ธ์คํด์ค ๋ณ์ ์ฌ์ฉ ์์ : ์๋ธ๋ฆฟ ํด๋์ค์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ , ๊ฐ ์์ฒญ์ ๋ํด์๋ ์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋๊ธฐํ ๋ธ๋ก ์ฌ์ฉ: ๋ง์ฝ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๋ค๋ฅธ ๊ณต์ ์์์ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ, synchronized ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ํ์ง๋ง, ์ด๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ์ฐ๋ ๋ ์์ ํ ๊ฐ์ฒด ์ฌ์ฉ: ๊ณต์ ์์์ ์ ๊ทผํ ๋ ์ฐ๋ ๋ ์์ ํ ๊ฐ์ฒด(์: ConcurrentHashMap, CopyOnWriteArrayList ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
๋๊ธฐํ์ ๊ฒฝ์ฐ
์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฒด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐํ๊ฐ ์ ์ฉ๋์ง ์์ผ๋ฏ๋ก, ์ฐ๋ ๋๊ฐ ๊ฐ๊ฐ service() ๋ฉ์๋๋ฅผ ์คํํ ๋ ๋ค๋ฅธ ์ฐ๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ต๋๋ค. ์ฆ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ํ ์ฐ๋ ๋๊ฐ ๋ค๋ฅธ ์ฐ๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๋ค๋ง, ํน์ ์ํฉ์์ ๋๊ธฐํ๋ฅผ ์ ์ฉํ๋ฉด, ํด๋น ์ฝ๋ ๋ธ๋ก์ด ์คํ๋๋ ๋์ ๋ค๋ฅธ ์ฐ๋ ๋๋ ๊ธฐ๋ค๋ ค์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณต์ ์์์ ๋ณดํธํ๊ธฐ ์ํด synchronized ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น ๋ธ๋ก์ ๋ค์ด๊ฐ ์ฐ๋ ๋๊ฐ ์์ ์ ๋ง์น ๋๊น์ง ๋ค๋ฅธ ์ฐ๋ ๋๋ ๋๊ธฐํ๊ฒ ๋ฉ๋๋ค.
์์ฝํ์๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ธ๋ฆฟ์ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋์์ฑ์ ํ์ฉํ๋ฉฐ, ๋๊ธฐํ๊ฐ ์์ผ๋ฉด ๊ฐ ์ฐ๋ ๋๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์์ ์คํ๋ฉ๋๋ค. ๋๊ธฐํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์ง์ ์ฝ๋๋ฅผ ํตํด ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ด๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ฅ JSP๋ ๊ฒฐ๊ตญ Servlet์ผ๋ก ์คํ๋๋?
โ Question
Servlet๊ณผ JSP๋ ์๋ก ๋ค๋ฅธ ํํ์ด์ง๋ง, ์ฌ์ค ์ด๋ ์ชฝ์ด๋ ๊ฒฐ๊ตญ ์คํ๋๋ ๊ฒ์ Servlet์ด๋ค. ์ฆ, WAS๊ฐ(์ ํํ๋ JSP ์ปจํ ์ด๋๊ฐ) JSP๋ฅผ Servlet ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ๊ทธ ์๋ธ๋ฆฟ์ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
1. ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ์ ์์ฒญ
2. ์น ์๋ฒ๊ฐ JSP ์ปจํ ์ด๋์ ์์ฒญ
3. JSP ์ปจํ ์ด๋๋ ํด๋น JSP ํด๋์ค ํ์ผ์ด ์๋์ง ์ฐพ์๋ด
4. ์์ ๊ฒฝ์ฐ JSP ํ์ด์ง๋ฅผ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํํ์ฌ ์คํ
์ด๊ฑธ ์ข ์์ธํ ์ค๋ช ํด์ค๋? ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ๊ณผ์ ์ด ๊ถ๊ธํ๋ค
๐ Answer
JSP ํ์ด์ง๊ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋์ด ์คํ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๊ณผ์ ์ ์๋์ ๊ฐ์ต๋๋ค. ์ด ๊ณผ์ ์ JSP๊ฐ ์ด๋ป๊ฒ ์น ์๋ฒ์์ ์ฒ๋ฆฌ๋๊ณ , ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ํ์๋๋์ง๋ฅผ ์ค๋ช ํฉ๋๋ค.
1. ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ์ ์์ฒญ
- ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ํน์ URL์ ์ ๋ ฅํ๊ฑฐ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ HTTP ์์ฒญ์ ์์ฑํ์ฌ ํด๋น URL์ ํด๋นํ๋ ์น ์๋ฒ๋ก ์ ์กํฉ๋๋ค.
- ์ด ์์ฒญ์๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋ฆฌ์์ค(์: JSP ํ์ด์ง, ์ด๋ฏธ์ง ํ์ผ ๋ฑ)์ ํจ๊ป ์์ฒญ ๋ฐฉ์(GET, POST ๋ฑ)๋ ํฌํจ๋ฉ๋๋ค.
2. ์น ์๋ฒ๊ฐ JSP ์ปจํ ์ด๋์ ์์ฒญ ์ ๋ฌ
- ์น ์๋ฒ(์: Apache, Nginx)๋ ์์ฒญ๋ ๋ฆฌ์์ค์ ์ ํ์ ๋ฐ๋ผ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- JSP๋ ๋์ ์น ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ๊ธฐ์ ์ด๋ฏ๋ก, ์น ์๋ฒ๋ ์ด ์์ฒญ์ JSP๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์๋ธ๋ฆฟ/JSP ์ปจํ ์ด๋(์: Apache Tomcat)๋ก ์ ๋ฌํฉ๋๋ค.
- ์น ์๋ฒ๋ ์ด ์ปจํ ์ด๋์ ์์ฒญ์ ํฌ์๋ฉํ์ฌ JSP ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋๋ก ํฉ๋๋ค.
3. JSP ์ปจํ ์ด๋๊ฐ JSP ํ์ผ์ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํ
- JSP ํ์ผ ์กด์ฌ ์ฌ๋ถ ํ์ธ: JSP ์ปจํ
์ด๋๋ ํด๋น JSP ํ์ด์ง์ ๋ํ ์๋ธ๋ฆฟ ํด๋์ค ํ์ผ(.class)์ด ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
- ์กด์ฌํ๋ ๊ฒฝ์ฐ: ๊ธฐ์กด์ ์์ฑ๋ ์๋ธ๋ฆฟ ํด๋์ค ํ์ผ์ด ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ: JSP ์ปจํ
์ด๋๋ ๋ค์์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค:
- JSP๋ฅผ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํ: JSP ํ์ผ์ ์๋ธ๋ฆฟ ์๋ฐ ์ฝ๋(.java)๋ก ๋ณํ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ JSP ํ์ผ ๋ด์ HTML ์ฝ๋๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ผ๋ก ๋ณํ๋๊ณ , JSP ์คํฌ๋ฆฝํ๋ฆฟ(<% %>) ์์ ์๋ฐ ์ฝ๋๊ฐ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋ ์์ ํฌํจ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์๋ฐ ์ฝ๋ ์ปดํ์ผ: ๋ณํ๋ ์๋ธ๋ฆฟ ์๋ฐ ํ์ผ์ ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์๋ธ๋ฆฟ ํด๋์ค ํ์ผ(.class)๋ก ์ปดํ์ผ๋ฉ๋๋ค.
- ์ด ๋ณํ ๋ฐ ์ปดํ์ผ ๊ณผ์ ์ ํ ๋ฒ๋ง ์ํ๋๋ฉฐ, ์ดํ ๊ฐ์ JSP ํ์ด์ง์ ๋ํ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด๋ฏธ ์์ฑ๋ ์๋ธ๋ฆฟ ํด๋์ค ํ์ผ์ด ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
4. ์๋ธ๋ฆฟ์ ์คํ
- ์์ฑ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ JSP ์ปจํ ์ด๋์์ ๋ก๋๋๊ณ , ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด service() ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์ด ๋ฉ์๋๋ HTTP ์์ฒญ์ ๋ฐ์๋ค์ฌ, JSP์์ ์์ฑ๋ ์ฝ๋์ ๋ฐ๋ผ ๋์ ์ผ๋ก HTML, JSON, XML ๋ฑ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก, JSP์ HTML ์ฝ๋์ ์๋ฐ ์ฝ๋๊ฐ ๊ฒฐํฉ๋์ด ์ต์ข ์๋ต์ด ๋ง๋ค์ด์ง๋๋ค.
5. ๊ฒฐ๊ณผ๋ฅผ ์น ์๋ฒ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ ๋ฐํ
- JSP ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ์ ์คํ ๊ฒฐ๊ณผ(๋์ ์ผ๋ก ์์ฑ๋ HTML)๋ฅผ ์์ฑํ๋ฉด, ์ด ๊ฒฐ๊ณผ๋ฅผ ์น ์๋ฒ๋ก ๋ฐํํฉ๋๋ค.
- ์น ์๋ฒ๋ ์ด ์๋ต์ ํด๋ผ์ด์ธํธ(์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ )๋ก ์ ์กํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ HTML์ ๋ ๋๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ์น ํ์ด์ง๋ก ๋ณด์ฌ์ค๋๋ค.
๐ ์์ฝ
- ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์น ์๋ฒ๋ JSP ์์ฒญ์ ์๋ธ๋ฆฟ/JSP ์ปจํ ์ด๋์ ์ ๋ฌํฉ๋๋ค.
- JSP ์ปจํ ์ด๋๋ JSP ํ์ผ์ด ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋ ์ ์ด ์๋์ง ํ์ธํ๊ณ , ์๋ค๋ฉด JSP๋ฅผ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํํ๊ณ ์ปดํ์ผํฉ๋๋ค.
- ๋ณํ๋ ์๋ธ๋ฆฟ์ด ์คํ๋์ด ๋์ ์น ์ฝํ ์ธ ๋ฅผ ์์ฑํฉ๋๋ค.
- ์น ์๋ฒ๋ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋ฐํํ์ฌ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํฉ๋๋ค.
์ด ๊ณผ์ ๋๋ถ์ JSP๋ ์๋ฒ์์ ๋์ ์ผ๋ก ์น ํ์ด์ง๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ค์ ์คํ๋๋ ๊ฒ์ ์๋ธ๋ฆฟ์ด์ง๋ง ๊ฐ๋ฐ์๋ JSP ํ์ผ๋ก ์ฝ๊ฒ ์น ํ์ด์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ Java ํ์ผ์ธ๊ฐ
โ Question
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐํ์ผ์ธ๊ฐ?
๐ Answer
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ํ์ผ(Java ํ์ผ)์ด ์๋๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์๋ฐ ํ์ผ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์๋ธ๋ฆฟ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค
- ์๋ธ๋ฆฟ ์ธ์คํด์ค: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋๋ค. ์๋ธ๋ฆฟ ํด๋์ค๋ ์๋ฐ๋ก ์์ฑ๋๋ฉฐ, javax.servlet.http.HttpServlet ํด๋์ค๋ฅผ ์์๋ฐ์ doGet(), doPost() ๋ฑ์ ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ฌํ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์ญํ : ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , HTTP ์๋ต์ ์์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์๋ฐ ํ์ผ
- ์๋ฐ ํ์ผ: ์๋ฐ ํ์ผ(.java)์ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋ ํ์ผ์ ๋๋ค. ์ด ํ์ผ์ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์ ์ํ๋ ์๋ฐ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์๋ธ๋ฆฟ ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก .java ํ์ฅ์๋ฅผ ๊ฐ์ง๋ฉฐ, ์๋ธ๋ฆฟ์ ์ค์ ๊ตฌํ์ ๋ด๊ณ ์์ต๋๋ค.
- ์ปดํ์ผ: ์๋ฐ ํ์ผ์ ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ฐ์ดํธ์ฝ๋ ํ์ผ(.class)๋ก ๋ณํ๋ฉ๋๋ค. ์ด ๋ฐ์ดํธ์ฝ๋ ํ์ผ์ JVM(Java Virtual Machine)์์ ์คํ๋ ์ ์๋ ํ์์ ๋๋ค.
์๋ธ๋ฆฟ ์คํ ๊ณผ์
- ์๋ธ๋ฆฟ ์์ค ์ฝ๋ ์์ฑ: ์๋ธ๋ฆฟ์ ๊ตฌํํ๊ธฐ ์ํด .java ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์๋ ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์๋๊ฐ ๊ตฌํ๋ฉ๋๋ค.
- ์ปดํ์ผ: ์๋ฐ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ธ๋ฆฟ .java ํ์ผ์ ์ปดํ์ผํ์ฌ .class ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด .class ํ์ผ์ ์๋ธ๋ฆฟ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ก, JVM์์ ์คํ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ฑฐ๋ ์๋ธ๋ฆฟ์ ์ฒ์ ์์ฒญํ ๋, ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ฉฐ, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ด ์ธ์คํด์ค์ ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ปดํ์ผ๋ ์๋ฐ ํด๋์ค ํ์ผ์์ ์์ฑ๋ ๊ฐ์ฒด๋ก, ์ค์ ์คํ ์ค์ธ ์๋ธ๋ฆฟ์ ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ฐ ํ์ผ์ ์๋ธ๋ฆฟ์ ์์ค ์ฝ๋๊ฐ ๋ด๊ธด ํ์ผ๋ก, ์๋ธ๋ฆฟ ํด๋์ค์ ์ ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ฐ๋ผ์, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ํ์ผ์ด ์๋๋ผ ์ปดํ์ผ๋ ์๋ฐ ํด๋์ค ํ์ผ๋ก๋ถํฐ ์์ฑ๋ ์คํ ์ค์ธ ๊ฐ์ฒด์ ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๊ฐ์ฒด?
โ Question
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๊ฐ์ฒด๋ค
๐ Answer
๋ค, ๋ง์ต๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด์ ๋๋ค. ์ด ๊ฐ์ฒด๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ก, ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ์์ฑ๋์ด HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ์ข ๋ ์์ธํ ์ค๋ช ํ์๋ฉด:
์๋ธ๋ฆฟ ์ธ์คํด์ค
- ๊ฐ์ฒด์ ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์๋ธ๋ฆฟ ํด๋์ค๋ javax.servlet.http.HttpServlet์ ์์๋ฐ์ ๊ตฌํ๋๋ฉฐ, ์ด ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ญํ : ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ ์ฒ๋ฆฌํ๋ฉฐ, ์๋ต์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด doGet(), doPost() ๋ฑ์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ์๋ช
์ฃผ๊ธฐ: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ์ ์๋ช
์ฃผ๊ธฐ ๋์ ์ฌ๋ฌ ๋จ๊ณ์์ ๊ด๋ฆฌ๋ฉ๋๋ค:
- ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด๊ธฐํ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ init() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ ์ด๊ธฐํํฉ๋๋ค. ์ด ๋จ๊ณ์์ ์๋ธ๋ฆฟ์ด ํ์ํ ์์(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ)์ ์ด๊ธฐํํฉ๋๋ค.
- ์์ฒญ ์ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ข ๋ฃ: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ์ข ๋ฃ๋ ๋ destroy() ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ด ๋จ๊ณ์์ ์๋ธ๋ฆฟ์ด ์ฌ์ฉํ ์์(์: ์ด๋ฆฐ ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ)์ ์ ๋ฆฌํฉ๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์๋ธ๋ฆฟ ํด๋์ค
- ์๋ธ๋ฆฟ ํด๋์ค: ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์ ์ํ ์๋ฐ ํ์ผ(.java)์ ์๋ธ๋ฆฟ์ ๋ก์ง์ ํฌํจํ๊ณ ์์ต๋๋ค. ์๋ธ๋ฆฟ ํด๋์ค๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์๋(doGet(), doPost() ๋ฑ)๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด ์๋ฐ ํ์ผ์ ์ปดํ์ผ๋์ด .class ํ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค: ์๋ธ๋ฆฟ ํด๋์ค์ .class ํ์ผ๋ก๋ถํฐ ์์ฑ๋ ๊ฐ์ฒด์ ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์ด ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ํด๋์ค๋ก๋ถํฐ ์์ฑ๋ ๊ฐ์ฒด์ ๋๋ค.
- ์ด ๊ฐ์ฒด๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ฉฐ, ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์์ฒญ์ ๋ฐ๊ณ ์๋ต์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฐํํฉ๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ์ ๊ฐ์ฒด์งํฅ ์์น์ ๋ฐ๋ผ ์ค๊ณ๋ ๋ถ๋ถ์ผ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ ์์
โ Question
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ฑฐ๋ ์๋ธ๋ฆฟ์ ์ฒ์ ์์ฒญํ ๋, ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ํด๋์คํ์ผ์ ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค๋ฉด ์์ฒญํ ๋๋ ์์ฑํ ํ์ ์์์
๐ Answer
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋ํด ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋์ง๋ฅผ ์ค๋ช ํ๋ฉด, ํด๋์ค ํ์ผ๊ณผ ์ธ์คํด์ค ๊ฐ์ ์ฐจ์ด๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์
- ์๋ธ๋ฆฟ ํด๋์ค ๋ก๋ฉ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํฉ๋๋ค. ์ด ๋จ๊ณ์์ ์๋ธ๋ฆฟ ํด๋์ค์ .class ํ์ผ์ด ๋ก๋๋์ด ์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ์ํด ์คํ ๊ฐ๋ฅํ ์ํ๊ฐ ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ธ์คํด์ค๊ฐ ๋ฐ๋ก ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋์ง๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์์ฑ๋๊ฑฐ๋, ์ต์ด์ ์์ฒญ์ด ๋ฐ์ํ ๋ ์์ฑ๋ฉ๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํ ๊ณผ์ ์์ ์์ฑ๋ ์ ์์ง๋ง, ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์์ฑ๋์ง๋ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฒญ ์ฒ๋ฆฌ
- ์ด๊ธฐํ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ init() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํ ์์ ์ ์ํํฉ๋๋ค. ์ด๊ธฐํ ๋จ๊ณ์์ ์๋ธ๋ฆฟ์ ํ์ํ ์์(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ)์ ์ค์ ํ ์ ์์ต๋๋ค.
- ์์ฒญ ์ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ๊ฐ ์๋ธ๋ฆฟ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ธฐ์กด์ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ฏธ ์์ฑ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์๋ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ๊ด๋ฆฌ ์ ๋ต
- ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ : ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ต์ด ์์ฒญ ์์ ์์ฑํ ์๋ ์์ต๋๋ค. ์ด๋ ์๋ฒ์ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ์์ฒญ์ด ๋ฐ์ํ ๋๊น์ง ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ง์ฐ ์์ฑ(lazy initialization)ํ๋ ๋ฐฉ์์ ๋๋ค.
- ์๋ธ๋ฆฟ ํ: ์ผ๋ถ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ํ(pool)์์ ๊ด๋ฆฌํ์ฌ, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋์ , ๋ฏธ๋ฆฌ ์์ฑ๋ ์ธ์คํด์ค ์ค ํ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ํด๋์ค๋ .java ํ์ผ๋ก ์์ฑ๋๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๋ก๋๋์ด .class ํ์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ด .class ํ์ผ๋ก๋ถํฐ ์์ฑ๋ ๊ฐ์ฒด๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ฒญ์ด ๋ฐ์ํ ๋ ์์ฑํ ์ ์์ต๋๋ค.
- ์ด๋ฏธ ์์ฑ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ ๋ฐ๋ผ ์์ฑ๋๊ฑฐ๋ ์ฌ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์์์ ์ ์ฝํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ๊ฒฐ์ ํ๋ ๊ฒ
โ Question
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ธ์คํด์ค๊ฐ ๋ฐ๋ก ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋์ง๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์์ฑ๋๊ฑฐ๋, ์ต์ด์ ์์ฒญ์ด ๋ฐ์ํ ๋ ์์ฑ๋ฉ๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํ ๊ณผ์ ์์ ์์ฑ๋ ์ ์์ง๋ง, ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์์ฑ๋์ง๋ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์์ฑ๋๊ฑฐ๋, ์ต์ด์ ์์ฒญ์ด ๋ฐ์ํ ๋ ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋๋๋ ๊ธฐ์ค์ด ๋ญ๋ฐ
๐ Answer
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ ๊ณผ ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ์์ผ๋ก ๋๋ฉ๋๋ค:
1. ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ง์ฐ ์์ฑ (Lazy Initialization)
- ์ค๋ช : ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ต์ด ์์ฒญ์ด ๋ฐ์ํ ๋๊น์ง ์์ฑํ์ง ์๋ ๋ฐฉ์์ ๋๋ค. ์ด ๋ฐฉ์์ ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋๊ฐ ์๋๋ผ, ์ค์ ๋ก ํด๋น ์๋ธ๋ฆฟ์ ๋ํ ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์์ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฅ์ :
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก, ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค.
- ์๋: ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ถํ์ํ ์ธ์คํด์ค ์์ฑ ์์ด ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ต๋๋ค.
- ๋จ์ :
- ์ฒ์ ์์ฒญ ์ง์ฐ: ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฏ๋ก, ์ต์ด ์์ฒญ์ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.
2. ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ฌ์ ์์ฑ (Eager Initialization)
- ์ค๋ช : ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ ๋ฐฉ์์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ฉด ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง๊ณ ์ด๊ธฐํ๋ฉ๋๋ค.
- ์ฅ์ :
- ๋น ๋ฅธ ์๋ต ์๊ฐ: ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์ด๋ฏธ ์์ฑ๋์ด ์์ผ๋ฏ๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ์ฆ์ ์๋ตํ ์ ์์ต๋๋ค.
- ์ด๊ธฐํ ์๋ฃ: ์ด๊ธฐํ ๊ณผ์ ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์๋ฃ๋๋ฏ๋ก, ์์ฒญ ์ฒ๋ฆฌ ์ค์ ์ด๊ธฐํ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
- ๋จ์ :
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
- ๋๋ฆฐ ์์: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฏ๋ก, ์์ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ ์์ ๊ฒฐ์ ๊ธฐ์ค
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ๊ฒฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค:
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ : ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ ์ด๋ ๊ตฌํ์ ๋ฐ๋ผ ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ์ปจํ ์ด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ์ปจํ ์ด๋๋ ์ฌ์ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ฌํญ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ ์ ํํ ์ ์์ต๋๋ค. ๋์ ์ฑ๋ฅ๊ณผ ๋น ๋ฅธ ์๋ต์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ ํ๋ ๊ฒฝ์ฐ ์ง์ฐ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ฑ๋ฅ ์ต์ ํ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ค์ํ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ํ(pool)์์ ๊ด๋ฆฌํ๊ฑฐ๋, ์ต์ด ์์ฒญ ์ ์์ฑํ๋ ๋ฑ์ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
๐ ์์ฝ
- ์ง์ฐ ์์ฑ (Lazy Initialization): ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์ต์ด ์์ฒญ ์ ์์ฑ๋๋ ๋ฐฉ์์ผ๋ก, ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ๋น ๋ฅธ ์์์ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ ์์ฑ (Eager Initialization): ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ชจ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก, ๋น ๋ฅธ ์๋ต๊ณผ ์ด๊ธฐํ ์๋ฃ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
๐ฅ ์ง์ฐ ์์ฑ, ์ฌ์ ์์ฑ ์ค์ ๋ฐฉ๋ฒ
โ Question
๊ทธ๊ฑด ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์ ์๋๊ฑฐ๋ค ์ด๋ค๊ฑด ์ง์ฐ ์์ฑ์ผ๋ก ์ด๋ค๊ฑด ์ฌ์ ์์ฑ์ผ๋ก
๐ Answer
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ์ง์ฐ ์์ฑ(lazy initialization)๊ณผ ์ฌ์ ์์ฑ(eager initialization) ์ค์์ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์ ํ์ ์ ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ ์ด๋ ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ๋ฐฉ์์ ๋ฐ๋ผ ์ด ์์ฑ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ์ด๋ฅผ ์ง์ ์ค์ ํ์ง ์๊ณ ์ปจํ ์ด๋์ ๊ธฐ๋ณธ ๋์์ ๋ฐ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ๊ด๋ จ ๊ฐ๋ ๊ณผ ๋ฐฉ๋ฒ์ ์ดํดํ๋ฉด, ๊ฐ์ ์ ์ผ๋ก ์ด ๋์์ ์ ์ดํ ์ ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ ์์ ์ ์ด ๋ฐฉ๋ฒ
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์ค์
- ์ปจํ ์ด๋ ๊ธฐ๋ณธ ๋์: ๋๋ถ๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(์: Apache Tomcat, Jetty ๋ฑ)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ต์ด ์์ฒญ ์ ์์ฑํฉ๋๋ค. ์ผ๋ถ ์ปจํ ์ด๋๋ ํน์ ์ค์ ์ ํตํด ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ์ปจํ ์ด๋ ์ค์ ํ์ผ: ์ผ๋ถ ์ปจํ ์ด๋๋ ์ค์ ํ์ผ(์: server.xml ๋๋ context.xml)์์ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ด๊ธฐํ ๋์์ ์ ์ดํ ์ ์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ต์ ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ์ ์ฌ์ ์์ฑ ๋ฐฉ์์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์๋๋ผ, ์ด๊ธฐํ ์์ ์ ์กฐ์ ํ๊ฑฐ๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ํ๋ผ๋ฏธํฐ์ ์ค์
- web.xml์ <load-on-startup>: web.xml ํ์ผ์์ ์๋ธ๋ฆฟ์ load-on-startup ์ค์ ์ ์ฌ์ฉํ์ฌ ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ์์๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. load-on-startup ๊ฐ์ด 0 ์ด์์ ์ ์์ธ ๊ฒฝ์ฐ, ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค. ์ด ๋ฐฉ์์ ์ฌ์ ์์ฑ(eager initialization) ๋ฐฉ์์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
```xml
<servlet>
<servlet-name>exampleServlet</servlet-name>
<servlet-class>com.example.ExampleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
``` - load-on-startup ๊ฐ: ์ด ๊ฐ์ด -1์ธ ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์์ฒญ์ด ๋ฐ์ํ ๋๊น์ง ์ง์ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ์ 0 ์ด์์ ์ ์๋ก ์ค์ ํ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ์ค์ ์ ํตํด ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ฌ์ ์์ฑ ์ฌ๋ถ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
- web.xml์ <load-on-startup>: web.xml ํ์ผ์์ ์๋ธ๋ฆฟ์ load-on-startup ์ค์ ์ ์ฌ์ฉํ์ฌ ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ์์๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. load-on-startup ๊ฐ์ด 0 ์ด์์ ์ ์์ธ ๊ฒฝ์ฐ, ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค. ์ด ๋ฐฉ์์ ์ฌ์ ์์ฑ(eager initialization) ๋ฐฉ์์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์ฑ๋ฅ ์ต์ ํ
- ์๋ธ๋ฆฟ ํ ๊ด๋ฆฌ: ์ผ๋ถ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ํ(pool)์์ ๊ด๋ฆฌํ์ฌ, ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๋ฏธ๋ฆฌ ์์ฑ๋๊ฑฐ๋ ์์ฒญ ์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ค์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ด๋ถ ์ค์ ์ ์์กดํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ง์ ์กฐ์ ํ๊ธฐ๋ณด๋ค๋ ์ปจํ ์ด๋์ ๋ฌธ์์ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๊ธฐ๋ณธ ๋์ ๋ฐ ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
- load-on-startup ์ค์ ์ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํ ๊ณผ์ ์์ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ฌ์ ์์ฑ ์ฌ๋ถ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋๋ถ๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉฐ, ์ฌ์ ์์ฑ์ web.xml์ ์ค์ ์ ํตํด ์ ์ดํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์์ฑ ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋์ ๋ฐฉ์๊ณผ ์ค์ ์ ํฌ๊ฒ ์์กดํ๋ฉฐ, ๊ฐ๋ฐ์๋ web.xml ํ์ผ์ ์ค์ ์ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ด๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
๐ฅ ์๋ธ๋ฆฟ๊ณผ JSP ์ปจํ ์ด๋์ ์ํธ ์์ฉ
โ Question
๋ณดํต ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๊ฐ์ฒด๊ฐ ์คํ๋์ JSP๋ฅผ ๋ฐํํ์์ ๊ทธ ๋ค์ JSP์ปจํ ์ด๋๋ฅผ ํ๋๊ฑด๊ฐ?
๐ Answer
๋ง์ต๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ์๋ต์ ์์ฑํฉ๋๋ค. ์ด ์๋ต์ด JSP ํ์ด์ง๋ฅผ ํฌํจํ ๋๋, ์๋ธ๋ฆฟ๊ณผ JSP ์ปจํ ์ด๋์ ์ํธ ์์ฉ์ด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค:
์๋ธ๋ฆฟ๊ณผ JSP์ ์ํธ ์์ฉ ๊ณผ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ
- ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์น ์๋ฒ๋ ์ด๋ฅผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ก ์ ๋ฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ์ ์์ฒญ ์ฒ๋ฆฌ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์์ฒญ์ ํด๋น ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ก ์ ๋ฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ service() ๋ฉ์๋ ๋ด์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์์ JSP ํ์ด์ง๋ฅผ ๋ฐํํ๋ ค๋ฉด, ์๋ธ๋ฆฟ์ JSP ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- JSP ํ์ด์ง์ ๋ฐํ
- ์๋ธ๋ฆฟ์ด JSP๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ: ์๋ธ๋ฆฟ์ด JSP ํ์ด์ง๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ์ RequestDispatcher๋ฅผ ์ฌ์ฉํ์ฌ JSP ํ์ด์ง๋ก ํฌ์๋ฉํ ์ ์์ต๋๋ค.
```java
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);
``` - ์ด ๊ฒฝ์ฐ ์๋ธ๋ฆฟ์ JSP ํ์ด์ง๋ก ํฌ์๋ฉํ๊ณ , JSP ์ปจํ ์ด๋๊ฐ JSP ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ต์ข HTML ์๋ต์ ์์ฑํฉ๋๋ค.
- ์๋ธ๋ฆฟ์ด JSP๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ: ์๋ธ๋ฆฟ์ด JSP ํ์ด์ง๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ์ RequestDispatcher๋ฅผ ์ฌ์ฉํ์ฌ JSP ํ์ด์ง๋ก ํฌ์๋ฉํ ์ ์์ต๋๋ค.
- JSP ์ปจํ
์ด๋์ ์ฒ๋ฆฌ
- JSP ํ์ด์ง์ ์ฒ๋ฆฌ: JSP ์ปจํ ์ด๋๋ JSP ํ์ด์ง๋ฅผ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ์ฌ ์คํํฉ๋๋ค. JSP ํ์ผ์ ์๋ฐ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํ๋๊ณ , ์ด ์๋ธ๋ฆฟ์ด ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ์ต์ข HTML์ ์์ฑํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ญํ : JSP ์ปจํ ์ด๋๋ JSP ํ์ด์ง๋ฅผ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ๊ณ , ์์ฑ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ต์ข
์๋ต ๋ฐํ
- JSP ์ปจํ ์ด๋๊ฐ ์์ฑํ ์ต์ข HTML ์๋ต์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํตํด ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๋ก ๋ฐํ๋ฉ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ธ์คํด์ค: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ํ์ํ ๊ฒฝ์ฐ JSP ํ์ด์ง๋ก ํฌ์๋ฉํฉ๋๋ค.
- JSP ํ์ด์ง: ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฒญ์ JSP ํ์ด์ง๋ก ํฌ์๋ฉํ๋ฉด, JSP ์ปจํ ์ด๋๋ JSP ํ์ผ์ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ์ฌ ์คํํฉ๋๋ค.
- JSP ์ปจํ ์ด๋: JSP ํ์ด์ง๋ฅผ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ์คํํ์ฌ ์ต์ข HTML ์๋ต์ ์์ฑํฉ๋๋ค.
- ์๋ต ๋ฐํ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ต์ข ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํฉ๋๋ค.
๋ฐ๋ผ์, ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ JSP ํ์ด์ง๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ, JSP ์ปจํ ์ด๋๊ฐ JSP ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ต์ข ์๋ต์ ์์ฑํ๊ณ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ JSP ์ปจํ ์ด๋ ๊ฐ์ ํ์ ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
๐ฅ JSP๊ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋๋ ๊ณผ์
โ Question
JSP ํ์ด์ง๋ HTML์ฒ๋ผ ์๊ฒผ๋๋ฐ ์๋ฐ ๊ฐ์ฒด์ธ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ๋ค๋๊ฒ ์ ์ดํด๋์ง ์๋๋ค. ์ฝ๋๋ฅผ ์์๋ก ๋ค์ด ์ค๋ช ํด์ค๋?
๐ Answer
๋ฌผ๋ก ์ ๋๋ค. JSP ํ์ด์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTML๊ณผ ์๋ฐ ์ฝ๋๊ฐ ์์ฌ ์๋ ํํ๋ก ์์ฑ๋์ง๋ง, ์ค์ ๋ก๋ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋์ด ์คํ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด, ๊ฐ๋จํ JSP ํ์ด์ง์ ๊ทธ๊ฒ์ด ๋ณํ๋ ์๋ธ๋ฆฟ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ JSP ํ์ด์ง
์๋๋ ๊ฐ๋จํ JSP ํ์ด์ง์ ์์ ๋๋ค:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Example</title>
</head>
<body>
<h1>Hello, JSP!</h1>
<p>The current time is: <%= new java.util.Date() %></p>
</body>
</html>
์ด JSP ํ์ด์ง๋ HTML๊ณผ ์๋ฐ ์ฝ๋๊ฐ ์์ฌ ์์ผ๋ฉฐ, <%= new java.util.Date() %> ๊ตฌ๋ฌธ์ ํ์ฌ ์๊ฐ์ JSP ํ์ด์ง์ ํฌํจ์ํค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
JSP ํ์ด์ง๊ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋๋ ๊ณผ์
- JSP ํ์ผ์ด ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋จ
JSP ์ปจํ ์ด๋๋ JSP ํ์ด์ง๋ฅผ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํํ์ฌ ์ปดํ์ผํฉ๋๋ค. ์์ JSP ํ์ด์ง๊ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋ ์ฝ๋๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์ ํํ๊ฐ ๋ฉ๋๋ค:
```java
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;
public final class example_jsp extends HttpServlet implements jsp_page {
private static final long serialVersionUID = 1L;
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
response.setContentType("text/html; charset=UTF-8");
JspWriter out = response.getWriter();
PageContext pageContext = null;
ServletContext application = null;
HttpSession session = null;
ServletConfig config = null;
try {
pageContext = new PageContextImpl();
application = pageContext.getServletContext();
session = request.getSession();
config = pageContext.getServletConfig();
out.write("<!DOCTYPE html>\n");
out.write("<html>\n");
out.write("<head>\n");
out.write(" <meta charset=\"UTF-8\">\n");
out.write(" <title>JSP Example</title>\n");
out.write("</head>\n");
out.write("<body>\n");
out.write(" <h1>Hello, JSP!</h1>\n");
out.write(" <p>The current time is: ");
out.print(new Date());
out.write("</p>\n");
out.write("</body>\n");
out.write("</html>\n");
} finally {
out.close();
}
}
}
``` - ์๋ธ๋ฆฟ ์ฝ๋์ ์ฃผ์ ๋ถ๋ถ ์ค๋ช
- ํจํค์ง ๋ฐ ์ํฌํธ: ์๋ธ๋ฆฟ ํด๋์ค๋ org.apache.jsp ํจํค์ง์ ์์นํ๊ณ , ํ์ํ ํด๋์ค๋ฅผ ์ํฌํธํฉ๋๋ค.
- _jspService ๋ฉ์๋: JSP ํ์ด์ง์ ์ฃผ์ ๋ด์ฉ์ _jspService ๋ฉ์๋ ๋ด์ ์์ฑ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ์๋ธ๋ฆฟ์ service ๋ฉ์๋์ ์ ์ฌํ๊ฒ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- HTML ์ถ๋ ฅ: JspWriter๋ฅผ ์ฌ์ฉํ์ฌ HTML์ ์์ฑํฉ๋๋ค. out.write() ๋ฉ์๋๋ฅผ ํตํด HTML์ ์ง์ ์์ฑํ๊ณ , out.print() ๋ฉ์๋๋ฅผ ํตํด ์๋ฐ ๊ฐ์ฒด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ฌ ์๊ฐ์ ์ถ๋ ฅํ๊ธฐ ์ํด new Date()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๋ธ๋ฆฟ์ด ์ฒ๋ฆฌํ๋ ์์ฒญ
- ์์ฒญ ์ฒ๋ฆฌ: ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํฉ๋๋ค. JSP ํ์ด์ง์ HTML๊ณผ ์๋ฐ ์ฝ๋๋ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํ๋์ด HTML ์๋ต์ ์์ฑํฉ๋๋ค.
- ์๋ต ๋ฐํ: ์ต์ข ์ ์ผ๋ก ์์ฑ๋ HTML์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ฉ๋๋ค.
๐ ์์ฝ
- JSP ํ์ผ: HTML๊ณผ ์๋ฐ ์ฝ๋๊ฐ ์์ธ ํ์ผ์ ๋๋ค.
- ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ: JSP ์ปจํ ์ด๋๊ฐ JSP ํ์ผ์ ์๋ธ๋ฆฟ ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ฝ๋: ๋ณํ๋ ์๋ธ๋ฆฟ ์ฝ๋ ๋ด์์๋ HTML ์์ฑ๊ณผ ์๋ฐ ์ฝ๋ ์คํ์ด ์ด๋ฃจ์ด์ง๋๋ค.
- ์๋ต ์์ฑ: ์๋ธ๋ฆฟ์ด ์ต์ข HTML ์๋ต์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค.
์ด ๊ณผ์ ์ JSP ํ์ด์ง๊ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋๊ณ , ์๋ธ๋ฆฟ์ด ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ์๋ต์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก, ์ต์ข ์ ์ผ๋ก ์น ํ์ด์ง๊ฐ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ๋ฉ๋๋ค.
๐ฅ JVM๊ณผ WAS(tomcat)์ ๊ด๊ณ
โ Question
JVM๊ณผ WAS(tomcat)์ ๊ด๊ณ
๐ Answer
JVM (Java Virtual Machine)๊ณผ WAS (Web Application Server, ์: Apache Tomcat)๋ Java ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ ๊ฐ์ง ํต์ฌ ์ปดํฌ๋ํธ์ ๋๋ค. ์ด๋ค์ ๊ด๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ Java ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ๊ณผ์ ์ ๋ช ํํ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ค์์ JVM๊ณผ Tomcat (WAS)์ ๊ด๊ณ๋ฅผ ์ค๋ช ํฉ๋๋ค:
JVM (Java Virtual Machine)
- ์ญํ : JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๊ฐ์ ๋จธ์ ์ ๋๋ค. ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๊ณ , ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ฐ๋ ๋ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
- ๊ธฐ๋ฅ:
- ๋ฐ์ดํธ์ฝ๋ ์คํ: ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ: JVM์ ๋ค์ํ ์ด์ ์ฒด์ ์ ํ๋์จ์ด์์ ๋์ผํ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ์ ์๊ฒ ํฉ๋๋ค.
Tomcat (WAS)
- ์ญํ : Tomcat์ ์๋ฐ ์๋ธ๋ฆฟ๊ณผ JSP(JavaServer Pages)๋ฅผ ์คํํ๊ธฐ ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ(WAS)์ ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ธ๋ฆฟ ๋ฐ JSP ํ์ด์ง๋ฅผ ์คํํ์ฌ ์น ์๋ต์ ์์ฑํฉ๋๋ค.
- ๊ธฐ๋ฅ:
- ์๋ธ๋ฆฟ ๋ฐ JSP ์ฒ๋ฆฌ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ฐ JSP ์์ง์ ์ ๊ณตํ์ฌ ๋์ ์ธ ์น ์ฝํ ์ธ ๋ฅผ ์์ฑํฉ๋๋ค.
- ์น ์์ฉ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ, ๊ด๋ฆฌ, ๋ณด์ ์ค์ ์ ๋ด๋นํฉ๋๋ค.
- HTTP ์์ฒญ ์ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ์์ ํ๊ณ , ์ ์ ํ ์๋ธ๋ฆฟ ๋๋ JSP ํ์ด์ง๋ก ์ ๋ฌํ์ฌ ์๋ต์ ์์ฑํฉ๋๋ค.
JVM๊ณผ Tomcat์ ๊ด๊ณ
- Tomcat์ JVM ์์์ ์คํ๋จ: Tomcat์ ์๋ฐ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ด๋ฏ๋ก, JVM ์์์ ์คํ๋ฉ๋๋ค. Tomcat์ ์๋ฐ ํด๋์ค์ ์๋ธ๋ฆฟ, JSP ํ์ผ์ ์คํํ๊ธฐ ์ํด JVM์ด ํ์ํฉ๋๋ค.
- Tomcat์ ์ค์น: Tomcat์ ์ค์นํ๊ณ ์คํํ๊ธฐ ์ํด์๋ ๋จผ์ JVM์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. Tomcat์ ์คํ์ JVM์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
- JVM์ ์ญํ : JVM์ Tomcat์ด ๋ก๋ํ ์๋ฐ ํด๋์ค์ ์๋ธ๋ฆฟ, JSP ํ์ผ์ ์คํํ๋ ๋ฐ ํ์ํ ์์(๋ฉ๋ชจ๋ฆฌ, ์ฐ๋ ๋ ๋ฑ)์ ์ ๊ณตํฉ๋๋ค.
- Tomcat์ ์ปดํฌ๋ํธ๋ JVM ๋ด์์ ์คํ๋จ: Tomcat์ ์ฃผ์ ์ปดํฌ๋ํธ(์๋ธ๋ฆฟ ์ปจํ
์ด๋, JSP ์์ง ๋ฑ)๋ JVM ๋ด์์ ์๋ฐ ๊ฐ์ฒด๋ก ์คํ๋ฉ๋๋ค. Tomcat์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ธ๋ฆฟ ๋ฐ JSP๋ฅผ ์คํํ์ฌ ๋์ ์ธ ์น ์ฝํ
์ธ ๋ฅผ ์์ฑํฉ๋๋ค.
- ์๋ธ๋ฆฟ๊ณผ JSP: Tomcat์ ์๋ธ๋ฆฟ๊ณผ JSP ํ์ผ์ ์๋ฐ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ๊ณ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ชจ๋ JVM์์ ์ด๋ฃจ์ด์ง๋๋ค.
- ์๋ฒ ๊ด๋ฆฌ: Tomcat์ HTTP ์์ฒญ์ ์์ ํ๊ณ ์ ์ ํ ์๋ธ๋ฆฟ์ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ฐํํฉ๋๋ค. ์ด ๊ณผ์ ์ญ์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๋ ๋ ๊ด๋ฆฌ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
๐ ์์ฝ
- JVM: ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๊ฐ์ ๋จธ์ ์ผ๋ก, ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๊ณ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฐ๋ ๋ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
- Tomcat: ์๋ฐ ์๋ธ๋ฆฟ๊ณผ JSP๋ฅผ ์คํํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก, Tomcat์ ์คํ์ JVM ์์์ ์ด๋ฃจ์ด์ง๋๋ค.
- ๊ด๊ณ: Tomcat์ JVM ๋ด์์ ์คํ๋๋ฉฐ, Tomcat์ด ์ฒ๋ฆฌํ๋ ์๋ธ๋ฆฟ๊ณผ JSP๋ ๋ชจ๋ JVM์ ๊ธฐ๋ฅ์ ํตํด ์คํ๋ฉ๋๋ค.
์ฆ, Tomcat์ JVM์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ์์ ์ JVM์ ์๋ฐ ์คํ ํ๊ฒฝ์์ ์ด๋ฃจ์ด์ง๋๋ค.
๐ฅ JVM์์์ WAS๊ฐ ์คํ?
โ Question
JVM์์์ WAS๊ฐ ์คํ๋๋๊ฑฐ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค
๐ Answer
์ ํํฉ๋๋ค. JVM ์์์ WAS๊ฐ ์คํ๋๋ค๊ณ ํ ์ ์์ต๋๋ค. ์ด ๊ด๊ณ๋ฅผ ์ข ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค:
JVM๊ณผ WAS์ ๊ด๊ณ
- JVM์ ์ญํ
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ: JVM์ ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ๊ฐ์ ๋จธ์ ์ผ๋ก, ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ํ์์ ์ธ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฐ๋ ๋ ๊ด๋ฆฌ: JVM์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ด ํจ์จ์ ์ผ๋ก ์คํ๋ ์ ์๋๋ก ์์์ ํ ๋นํ๊ณ , ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- WAS์ ์ญํ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ: WAS๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ๊ด๋ฆฌํ๋ ์๋ฒ์ ๋๋ค. ์๋ธ๋ฆฟ, JSP, ์น ์๋น์ค ๋ฑ์ ์ฒ๋ฆฌํ์ฌ ๋์ ์ธ ์น ์ฝํ ์ธ ๋ฅผ ์์ฑํฉ๋๋ค.
- HTTP ์์ฒญ ์ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ HTTP ์์ฒญ์ ์์ ํ๊ณ , ์๋ธ๋ฆฟ์ด๋ JSP๋ฅผ ํตํด ์๋ต์ ์์ฑํฉ๋๋ค.
- WAS๊ฐ JVM ์์์ ์คํ๋๋ ๊ณผ์
- ์ค์น ๋ฐ ์คํ: WAS(์: Apache Tomcat)๋ฅผ ์ค์นํ๊ณ ์คํํ๊ธฐ ์ํด์๋ JVM์ด ํ์ํฉ๋๋ค. Tomcat๊ณผ ๊ฐ์ WAS๋ ์๋ฐ๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ด๊ธฐ ๋๋ฌธ์, JVM์ด ์๋ ํ๊ฒฝ์์๋ ์คํ๋ ์ ์์ต๋๋ค.
- ์๋ฐ ํด๋์ค ๋ก๋ฉ: WAS๋ ์๋ฐ ํด๋์ค์ ์๋ธ๋ฆฟ, JSP ํ์ผ์ ๋ก๋ํ๊ณ ์คํํฉ๋๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ JVM ๋ด์์ ์ด๋ฃจ์ด์ง๋๋ค.
- ์์ฒญ ์ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด WAS๋ JVM์ ์์์ ํ์ฉํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋, JSP ์์ง ๋ฑ WAS์ ์ฃผ์ ์ปดํฌ๋ํธ๋ JVM์์ ์คํ๋๋ฉฐ, HTTP ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ต์ ์์ฑํฉ๋๋ค.
๐ ์์ฝ
- WAS: ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
- JVM: ์๋ฐ ๊ฐ์ ๋จธ์ ์ผ๋ก, WAS๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
- ๊ด๊ณ: WAS๋ JVM ์์์ ์คํ๋๋ฉฐ, JVM์ WAS๊ฐ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋๋ก ์์๊ณผ ์คํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
๋ฐ๋ผ์, WAS๊ฐ JVM ์์์ ์คํ๋๋ค๋ ์ค๋ช ์ด ์ ํํ๋ฉฐ, ์ด๋ ์๋ฐ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ JVM์ ์์๊ณผ ํ๊ฒฝ์ ํ์ฉํ์ฌ ๋์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐ฅ JVM๊ณผ ๋ฉํฐ์ฐ๋ ๋
โ Question
์์ฒญ๋ค์ด ๋ค์ด์ค๋ฉด ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ํตํด ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ด์ฉํ ์ ์๋ ๊ฒ๋ JVM ๋์ด๋ค?
๐ Answer
๋ง์ต๋๋ค. ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ๋ค์ด์ฌ ๋, ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ํตํด ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ JVM์ ๊ธฐ๋ฅ ๋๋ถ์ ๋๋ค. ์ด๋ฅผ ์ข ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
JVM๊ณผ ๋ฉํฐ์ฐ๋ ๋ฉ
- JVM์ ๋ฉํฐ์ฐ๋ ๋ฉ ์ง์
- ์ฐ๋ ๋ ๊ด๋ฆฌ: JVM์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ฐ๋ ๋๋ฅผ ํ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์๋ฐ์ ์ฐ๋ ๋๋ JVM์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์ค ํ๋๋ก, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋๋ฉด์ ์์(๋ฉ๋ชจ๋ฆฌ, CPU ๋ฑ)์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ฐ๋ ๋ ์ค์ผ์ค๋ง: JVM์ ์ด์ ์ฒด์ ์ ํ๋ ฅํ์ฌ ์ฐ๋ ๋์ ์ค์ผ์ค๋ง์ ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ ์ฐ๋ ๋๋ CPU์์ ์คํ๋๋ฉฐ, JVM์ด ์ด๋ฅผ ์กฐ์ ํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ๋ฉํฐ์ฐ๋ ๋ฉ
- ๋์ ์์ฒญ ์ฒ๋ฆฌ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฉํฐ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ์์ฒญ์ ๋ณ๋์ ์ฐ๋ ๋์์ ์ฒ๋ฆฌ๋๋ฉฐ, ์ด๋ก ์ธํด ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ฐ๋ ๋: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํด(์ฆ, ์ธ์คํด์ค ํ๋)์ผ๋ก ์กด์ฌํ๋ฏ๋ก, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์ผํ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ์ฒ๋ฆฌ๋๋๋ผ๋ ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ์ ๋ฉํฐ์ฐ๋ ๋ฉ๊ณผ ๋๊ธฐํ
- ๋์ ์ ๊ทผ: ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์ผํ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋, ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ํ๋ฅผ ๋๊ธฐํํด์ผ ํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ ๊ฐ๋ฐ์๋ ๋๊ธฐํ(synchronization)๋ฅผ ๊ณ ๋ คํ์ฌ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํฉ๋๋ค.
- ์ค๋ ๋ ์์ ์ฑ: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์์ ์์ ์ฑ์ ๊ณ ๋ คํ์ฌ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๊ฐ ๋์์ ์ฌ๋ฌ ์ฐ๋ ๋์ ์ํด ํธ์ถ๋๋๋ผ๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์ ์ง๋๋๋ก ํด์ผ ํฉ๋๋ค.
์์: ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ด์ฉํ ์๋ธ๋ฆฟ ์ฒ๋ฆฌ
- ์์ฒญ ์ฒ๋ฆฌ ๊ณผ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ: ํด๋ผ์ด์ธํธ๊ฐ ์น ์๋ฒ์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ฐ๋ ๋ ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ฐ ์์ฒญ์ ๋ณ๋์ ์ฐ๋ ๋์์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค ์ฌ์ฉ: ๊ฐ ์ฐ๋ ๋๋ ๋์ผํ ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ต ๋ฐํ: ๊ฐ ์ฐ๋ ๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค.
- JVM๊ณผ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ํ๋ ฅ
- JVM: ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ง์ํ์ฌ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋: ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํ๊ณ , ๊ฐ ์์ฒญ์ ์ ์ ํ ์ฒ๋ฆฌํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
๐ ์์ฝ
- JVM: ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ง์ํ๋ฉฐ, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋: ๋ฉํฐ์ฐ๋ ๋๋ฅผ ํ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๋ฉฐ, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ฌ๋ฌ ์ฐ๋ ๋์ ์ํด ๊ณต์ ๋ฉ๋๋ค.
- ํ๋ ฅ: JVM์ ๋ฉํฐ์ฐ๋ ๋ฉ ์ง์ ๋๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋์ ์ฑ๋ฅ๊ณผ ํจ์จ์ ์ธ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ผ์, JVM ๋๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋ฉํฐ์ฐ๋ ๋๋ฅผ ํ์ฉํ์ฌ ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์๋ฐ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ ๋์์ฑ์ ์ง์ํ ์ ์๋ ์ค์ํ ์ด์ ์ค ํ๋์ ๋๋ค.
๐ฅ WAS ๋ web.xml ์ ์ฐธ์กฐํ์ฌ ํด๋น Servlet ์ ๋ํ Thread ๋ฅผ ์์ฑ?
โ Question
1. ํด๋ผ์ด์ธํธ๊ฐ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ ์์ฒญ์ Web Server ์๊ฒ ๋ณด๋ ๋๋ค.
2. Web Server ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ์ ๋ฐ์ต๋๋ค.
3. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ ์ ํ์ด์ง์ธ ๊ฒฝ์ฐ Web Server ๋ ํ์ผ ๊ฒฝ๋ก ์ด๋ฆ์ ํตํด file content ๋ฅผ ๋ฐ๋ก ๋ฐํํฉ๋๋ค.
4. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋์ ํ์ด์ง์ธ ๊ฒฝ์ฐ Web Server ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ WAS๋ก ๋ณด๋ ๋๋ค.
5. WAS ๋ ๊ด๋ จ๋ Servlet ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฝ๋๋ค.
6. WAS ๋ web.xml ์ ์ฐธ์กฐํ์ฌ ํด๋น Servlet ์ ๋ํ Thread ๋ฅผ ์์ฑํฉ๋๋ค.
7. Servlet ์ Service() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ ์์ฒญ์ ๋ง๊ฒ doGet() or doPost() ๋ฅผ ํธ์ถํฉ๋๋ค.
8. ์ธ์์ ๋ง๊ฒ ์์ฑ๋ ์ ์ ํ ๋์ ํ์ด์ง๋ฅผ Response ๊ฐ์ฒด์ ๋ด์ WAS ์ ์ ๋ฌํฉ๋๋ค.
9. WAS ๋ Response ๊ฐ์ฒด๋ฅผ HttpResponse ํํ๋ก ๋ฐ๊พธ์ด Web Server ์ ์ ๋ฌํฉ๋๋ค.
10. ์์ฑ๋ Thread ๋ฅผ ์ข ๋ฃํ๊ณ ๊ด๋ จ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ ๊ฑฐํฉ๋๋ค.
6๋ฒ์ด ๋ง๋ ๋ง์ด์ผ?
๐ Answer
6๋ฒ์ ์ค๋ช ์ ์ฝ๊ฐ์ ์คํด๊ฐ ์์ ์ ์์ต๋๋ค. ์ ํํ ์ค๋ช ํ์๋ฉด, **WAS (Web Application Server)**๊ฐ web.xml์ ์ฐธ์กฐํ์ฌ ์๋ธ๋ฆฟ์ ๋ํ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. web.xml ํ์ผ์ ์๋ธ๋ฆฟ์ ๋งคํ๊ณผ ์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ์ง ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์์ฒญ ์ฒ๋ฆฌ ๊ณผ์
- ํด๋ผ์ด์ธํธ ์์ฒญ: ํด๋ผ์ด์ธํธ๊ฐ HTTP ์์ฒญ์ ์น ์๋ฒ์ ๋ณด๋ ๋๋ค.
- ์น ์๋ฒ์ ์ญํ :
- ์ ์ ํ์ด์ง ์์ฒญ: ์์ฒญ์ด ์ ์ ํ์ด์ง์ผ ๊ฒฝ์ฐ, ์น ์๋ฒ๋ ํ์ผ ์์คํ ์์ ํด๋น ํ์ผ์ ์ฝ์ด ์ง์ ํด๋ผ์ด์ธํธ์ ์๋ตํฉ๋๋ค.
- ๋์ ํ์ด์ง ์์ฒญ: ์์ฒญ์ด ๋์ ํ์ด์ง์ผ ๊ฒฝ์ฐ, ์น ์๋ฒ๋ ์์ฒญ์ WAS๋ก ์ ๋ฌํฉ๋๋ค.
- WAS์ ์ญํ :
- ์๋ธ๋ฆฟ ์ธ์คํด์ค ์์ฑ: WAS๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ด๋ จ ์๋ธ๋ฆฟ์ ๋ก๋ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋ฉ๋๋ค. WAS๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ํ์์ ๋ฐ๋ผ ์์ฑํ๊ฑฐ๋, ์ด๋ฏธ ์์ฑ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- web.xml ์ฐธ์กฐ: WAS๋ web.xml ํ์ผ์ ์ฐธ์กฐํ์ฌ ์์ฒญ๋ URL์ ๋งคํ๋ ์๋ธ๋ฆฟ์ ์ฐพ์ต๋๋ค. web.xml์ ์๋ธ๋ฆฟ์ URL ํจํด๊ณผ ์๋ธ๋ฆฟ ํด๋์ค์ ๋งคํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์์ฒญ ์ฒ๋ฆฌ:
- ์ฐ๋ ๋ ์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ฐ๋ ๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ฐ๋ ๋๋ ๋ณ๊ฐ๋ก, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ web.xml์ ์ํด ์ ์๋๊ณ , ์ฐ๋ ๋๋ ์์ฒญ ์ฒ๋ฆฌ์ ์ํด ์์ฑ๋ฉ๋๋ค.
- service() ๋ฉ์๋ ํธ์ถ: ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉฐ, ์ด ๋ฉ์๋ ๋ด์์ ์์ฒญ์ ํ์ ์ ๋ฐ๋ผ doGet() ๋๋ doPost() ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์๋ต ์์ฑ:
- ์๋ต ๊ฐ์ฒด ์์ฑ: ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑํ์ฌ HttpServletResponse ๊ฐ์ฒด์ ๋ด์ต๋๋ค.
- ์๋ต ๋ฐํ: ์์ฑ๋ ์๋ต์ WAS๋ฅผ ํตํด ์น ์๋ฒ๋ก ๋ฐํ๋ฉ๋๋ค. ์น ์๋ฒ๋ ์ด ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ๋ฆฌ:
- ์ฐ๋ ๋ ์ข ๋ฃ: ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ, WAS๋ ์ฌ์ฉ๋ ์ฐ๋ ๋๋ฅผ ์ข ๋ฃํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค์ ์ํ ๊ด๋ฆฌ: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ WAS์ ๊ด๋ฆฌ ํ์ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ WAS๊ฐ ๊ด๋ฆฌํฉ๋๋ค.
๐ ์์ฝ
- web.xml: ์๋ธ๋ฆฟ์ URL ๋งคํ ๋ฐ ์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฐ๋ ๋๋ฅผ ์์ฑํ์ง๋ ์์ต๋๋ค.
- ์ฐ๋ ๋ ์์ฑ: ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค WAS๋ ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์ฐ๋ ๋๋ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ฐ๋ผ์, 6๋ฒ์ ์ค๋ช ์ ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
6. WAS๋ web.xml์ ์ฐธ์กฐํ์ฌ ์์ฒญ์ ๋ํ ์ ์ ํ ์๋ธ๋ฆฟ์ ์ฐพ์ต๋๋ค. ๊ทธ ํ, ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ฐ๋ ๋๋ฅผ ์์ฑ?
โ Question
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋๊ฑฐ๋ค
๐ Answer
๋ง์ต๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋(๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ, ์: Apache Tomcat)๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ฐ๋ ๋ ๊ด๋ฆฌ ๊ณผ์
- ํด๋ผ์ด์ธํธ ์์ฒญ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์ฐ๋ ๋ ์์ฑ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ฐ๋ ๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค ํธ์ถ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ web.xml ํ์ผ(ํน์ ์ ๋ํ ์ด์ )์ ์ฐธ์กฐํ์ฌ ์์ฒญ์ ๋งคํ๋ ์๋ธ๋ฆฟ์ ์ฐพ์ต๋๋ค.
- ํด๋น ์๋ธ๋ฆฟ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- service() ๋ฉ์๋ ํธ์ถ
- ์์ฑ๋ ์ฐ๋ ๋๋ ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์์ฒญ์ ํ์ ์ ๋ฐ๋ผ doGet() ๋๋ doPost() ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์๋ต ์์ฑ
- ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ HttpServletResponse ๊ฐ์ฒด์ ๋ด์ ์๋ต์ ์์ฑํฉ๋๋ค.
- ์๋ต ๋ฐํ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ต์ ์น ์๋ฒ๋ก ๋ฐํํ๊ณ , ์น ์๋ฒ๋ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค.
- ์ฐ๋ ๋ ์ข
๋ฃ
- ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฐ๋ ๋๋ฅผ ์ข ๋ฃํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ ์ค๋น๋ฅผ ํฉ๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ฐ๋ ๋ ๊ด๋ฆฌ
- ์ฐ๋ ๋ ํ: ๋ง์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฐ๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฐ๋ ๋ ํ์ ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฐ๋ ๋์ ์งํฉ์ผ๋ก, ์๋ก์ด ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๊ธฐ์กด ์ฐ๋ ๋ ์ค ํ๋๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ณ ์ข ๋ฃํ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ๋์์ฑ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ฏ๋ก, ๋ฉํฐ์ฐ๋ ๋ฉ์ ํ์ฉํ์ฌ ๋์์ฑ์ ์ง์ํฉ๋๋ค. ๊ฐ ์์ฒญ์ ๋ณ๋์ ์ฐ๋ ๋์์ ์ฒ๋ฆฌ๋๋ฉฐ, ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์๋ต ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ์ฐ๋ ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฐ๋ ๋ ๊ด๋ฆฌ: ์ฐ๋ ๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ต์ ์์ฑํฉ๋๋ค.
- ์ฐ๋ ๋ ํ: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ข ์ข ์ฐ๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
๋ฐ๋ผ์, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ค์ํ ์ญํ ์ ๋งก๊ณ ์์ต๋๋ค.
๐ฅ JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
โ Question
ํ์์ญ ์คํ์์ญ ๋ฉ์๋์์ญ์ ๋ํ ์ค๋ช ์ข ๊ทธ๋ฆฌ๊ณ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ ์์ญ์ ์๋๊ฑฐ์ง?
๐ Answer
Java ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ JVM์ ์ํด ์คํ๋๋ฉฐ, JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํฉ๋๋ค:
- ํ(Heap) ์์ญ
- ์คํ(Stack) ์์ญ
- ๋ฉ์๋(Method) ์์ญ (๋๋ ํด๋์ค ์์ญ)
1. ํ(Heap) ์์ญ
- ์ค๋ช : ํ ์์ญ์ ์๋ฐ ๊ฐ์ฒด๊ฐ ๋์ ์ผ๋ก ์์ฑ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค. ๋ชจ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ํ ์์ญ์ ํ ๋น๋๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ํ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ GC(Garbage Collection)์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด์ด๋ฏ๋ก ํ ์์ญ์ ์์ฑ๋ฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด, ๊ทธ ์ธ์คํด์ค๋ ํ ๋ฉ๋ชจ๋ฆฌ์์ ๊ด๋ฆฌ๋ฉ๋๋ค.
- ํน์ง:
- ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- JVM์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ ์์ญ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ญ์ ํฉ๋๋ค.
2. ์คํ(Stack) ์์ญ
- ์ค๋ช : ์คํ ์์ญ์ ๋ฉ์๋ ํธ์ถ ์ ์์ฑ๋๋ ํ๋ ์์ด ์์ด๋ ๊ณต๊ฐ์ ๋๋ค. ๊ฐ ๋ฉ์๋ ํธ์ถ์ ๋ฐ๋ผ ํด๋น ๋ฉ์๋์ ์ง์ญ ๋ณ์์ ๋งค๊ฐ๋ณ์, ๊ทธ๋ฆฌ๊ณ ๋ฉ์๋ ์คํ์ ์ค๊ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ ๋ฑ์ด ์คํ ํ๋ ์์ ์ ์ฅ๋ฉ๋๋ค.
- ํน์ง:
- ๊ฐ ์ฐ๋ ๋๋ง๋ค ๋ณ๋์ ์คํ์ด ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์คํ์ ์ฐ๋ ๋๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค.
- ๋ฉ์๋ ํธ์ถ์ด ๋๋๋ฉด ํด๋น ๋ฉ์๋์ ์คํ ํ๋ ์์ ์๋์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค.
- ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ๊ทธ๋ฆฌ๊ณ ๋ฉ์๋์ ๋ฆฌํด ์ฃผ์๊ฐ ์ ์ฅ๋ฉ๋๋ค.
3. ๋ฉ์๋(Method) ์์ญ
- ์ค๋ช : ๋ฉ์๋ ์์ญ์ ํด๋์ค์ ๊ด๋ จ๋ ๋ฐ์ดํฐ(ํด๋์ค ์ ๋ณด, ๋ฉ์๋ ์ ๋ณด, ์์, ์ ์ ๋ณ์ ๋ฑ)๊ฐ ์ ์ฅ๋๋ ์์ญ์ ๋๋ค. ์ด ์์ญ์ JVM์ด ๋ก๋ํ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํฉ๋๋ค. ์ด ์์ญ์ ๋ฐํ์ ์ JVM์ ์ํด ๊ณต์ ๋๋ฉฐ, ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ํน์ง:
- ํด๋์ค์ ๊ตฌ์กฐ, ๋ฉ์๋์ ๋ฐ์ดํธ์ฝ๋, ์์ ํ, ์ ์ ๋ณ์ ๋ฑ์ด ์ ์ฅ๋ฉ๋๋ค.
- ์ ์ (static) ๋ณ์๋ ์ด ๋ฉ์๋ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
- ํด๋์ค ๋ก๋๊ฐ ํด๋์ค๋ฅผ ๋ก๋ํ ๋, ๋ฉ์๋ ์์ญ์ ํด๋น ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ์์น
- ํ ์์ญ: ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด์ด๋ฏ๋ก ํ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด, ํด๋น ์ธ์คํด์ค๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์นํ๊ฒ ๋ฉ๋๋ค.
- ์คํ ์์ญ: ์๋ธ๋ฆฟ์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ํด๋น ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ์ง์ญ ๋ณ์๋ ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ฐ๋ ๋์ ์คํ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
- ๋ฉ์๋ ์์ญ: ์๋ธ๋ฆฟ ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ(ํด๋์ค ๊ตฌ์กฐ, ๋ฉ์๋ ๋ฐ์ดํธ์ฝ๋ ๋ฑ)๋ ๋ฉ์๋ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
๐ ์์ฝ
- ํ(Heap) ์์ญ: ์๋ฐ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์ด๊ณณ์ ์ ์ฅ๋ฉ๋๋ค.
- ์คํ(Stack) ์์ญ: ๋ฉ์๋ ํธ์ถ ์ ์์ฑ๋๋ ํ๋ ์์ด ์์ด๋ ๊ณต๊ฐ์ผ๋ก, ์ง์ญ ๋ณ์์ ๋ฉ์๋ ํธ์ถ ์ ๋ณด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- ๋ฉ์๋(Method) ์์ญ: ํด๋์ค์ ๋ฉ์๋์ ๋ํ ๋ฉํ๋ฐ์ดํฐ์ ์ ์ ๋ณ์๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ฐ ๊ฐ์ฒด์ด๋ฏ๋ก ํ ์์ญ์ ์์นํ๋ฉฐ, ์๋ธ๋ฆฟ์ ๋ฉ์๋ ํธ์ถ ์ ํ์ํ ์ ๋ณด๋ ์คํ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
๐ฅ ์คํ๋ง ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๊ณต์กด?
โ Question
์คํ๋ง ํ๋ก์ ํธ์ ๊ตฌ์กฐ์์ ์คํ๋ง ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๊ณต์กดํด?
๐ Answer
๋ค, ์คํ๋ง ํ๋ก์ ํธ์์๋ ์คํ๋ง ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํจ๊ป ๊ณต์กดํ๋ฉฐ ์๋ก ํ๋ ฅํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํฉ๋๋ค. ๊ฐ๊ฐ์ ์ญํ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
1. ์๋ธ๋ฆฟ ์ปจํ ์ด๋ (Servlet Container)
- ์ญํ : ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ผ๋ถ๋ก, ์๋ธ๋ฆฟ๊ณผ JSP๋ฅผ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ์ ๋ํ ์๋ต์ ์์ฑํ๋ ๊ฒ์ ๋ด๋นํฉ๋๋ค.
- ์์: Tomcat, Jetty ๋ฑ.
- ์๋ ๋ฐฉ์: ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ๋ฐ์์, ์ ์ ํ ์๋ธ๋ฆฟ์ด๋ JSP๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค.
2. ์คํ๋ง ์ปจํ ์ด๋ (Spring Container)
- ์ญํ : ์คํ๋ง ์ปจํ ์ด๋๋ ์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋น(Bean) ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ์คํ๋ง ์ปจํ ์ด๋๋ ์์กด์ฑ ์ฃผ์ (DI), ์ ์คํํธ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(AOP), ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ์ ๋ด๋นํฉ๋๋ค.
- ์์: ApplicationContext, WebApplicationContext ๋ฑ.
- ์๋ ๋ฐฉ์: ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ํ์ผ ๋๋ ์ ๋ํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ ์๋ ๋น๋ค์ ์ด๊ธฐํํ๊ณ , ํ์์ ๋ฐ๋ผ ๋น์ ์์ฑ ๋ฐ ์ฃผ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ๋์ต๋๋ค.
์คํ๋ง ํ๋ก์ ํธ์์์ ๊ณต์กด
์คํ๋ง ํ๋ก์ ํธ์์๋ ๋ณดํต ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ๊ทธ๋ค์ ํ๋ ฅ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ์ด๊ธฐํ:
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Tomcat ๋ฑ)๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ํ๊ณ ์คํํฉ๋๋ค.
- ์ด ๊ณผ์ ์์ web.xml ๋๋ Java Config (์๋ธ๋ฆฟ 3.0 ์ด์)์์ ์ง์ ๋ ์๋ธ๋ฆฟ์ ์ด๊ธฐํํฉ๋๋ค.
- ์คํ๋ง MVC์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ํตํฉ:
- ์คํ๋ง MVC ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ DispatcherServlet์ด ์ฃผ์ ์๋ธ๋ฆฟ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ DispatcherServlet์ ์๋ธ๋ฆฟ์ผ๋ก ๋ก๋ํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
- DispatcherServlet์ ์คํ๋ง ์ปจํ ์ด๋(WebApplicationContext)๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์คํ๋ง ์ปจํ
์ด๋ ์ด๊ธฐํ:
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๊ณ , ์ ์๋ ๋น๋ค์ ์ด๊ธฐํํฉ๋๋ค.
- ์ด ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ์ ๋น์ด ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์์ฒญ ์ฒ๋ฆฌ:
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ๋ฐ์ DispatcherServlet์ ์ ๋ฌํฉ๋๋ค.
- DispatcherServlet์ ์คํ๋ง ์ปจํ ์ด๋์์ ์ ์ ํ ์ปจํธ๋กค๋ฌ ๋น์ ์ฐพ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
๐ ์์ฝ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์์ฒญ/์๋ต ์ฌ์ดํด์ ๊ด๋ฆฌํฉ๋๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋น ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์คํ๋ง MVC๋ฅผ ์ฌ์ฉํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด๊ธฐํํ๊ณ , ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋น์ ๊ด๋ฆฌํ๋ฉด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํ๋ ฅํ์ฌ ์น ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ๊ฒ ๋ ์ปจํ ์ด๋๊ฐ ์๋ก ํ๋ ฅํ์ฌ ์คํ๋ง ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํํ๊ฒ ์๋ํ ์ ์๊ฒ ํฉ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํฌํจํ๋๊ฐ?
โ Question
Spring MVC ์ญ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ณ ์๋ ๊ฑฐ๋ํ ์๋ธ๋ฆฟ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋์ ์๋ธ๋ฆฟ ์์ด Spring MVC๋ง ์์ผ๋ฉด ๋๋ค๊ณ ํ๋ ๊ฒ์ ๋น์ฆ๋์ค ๋ก์ง์ Spring์ ํตํด ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ด์ง, ์๋ธ๋ฆฟ์ด ํ์ ์๋ค๋ ๋ป์ด ์๋๋๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์ ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฆ, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ ๋ฆฝ์ ์ธ ์กด์ฌ๊ฐ ์๋๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ Spring Bean์ ์ ๊ทผํ๋ ค๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
์ด๊ฒ ๋ฌด์จ๋ง์ด์ง? ๋ง๋๋ง์ธ๊ฐ?
๐ Answer
๋ค, ๋ง๋ ๋ง์ ๋๋ค. ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์ ์คํ๋ง MVC์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋, ์คํ๋ง ์ปจํ ์ด๋์ ๊ด๊ณ๋ฅผ ์กฐ๊ธ ๋ ๊น์ด ์๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Spring MVC์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๊ด๊ณ
- Spring MVC๋ Java์ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ ๋๋ค. ์ฆ, Spring MVC ์์ฒด๋ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค. Spring MVC์ ํต์ฌ ์๋ธ๋ฆฟ์ **DispatcherServlet**์ ๋๋ค. DispatcherServlet์ ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ๋ "ํ๋ก ํธ ์ปจํธ๋กค๋ฌ" ์ญํ ์ ํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ DispatcherServlet๊ณผ ๊ฐ์ ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๊ณ ์คํํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ(Tomcat, Jetty ๋ฑ)์ ์ผ๋ถ๋ถ์ผ๋ก, ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
Spring ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๊ด๊ณ
- ์คํ๋ง ์ปจํ ์ด๋๋ ApplicationContext ๋๋ WebApplicationContext์ ๊ฐ์ ๊ฐ์ฒด๋ก, ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋ชจ๋ ๋น(Bean)์ ๊ด๋ฆฌํ๊ณ , ๋น์ ๋ผ์ดํ์ฌ์ดํด, ์์กด์ฑ ์ฃผ์ ๋ฑ์ ๋ด๋นํฉ๋๋ค.
- ์คํ๋ง MVC๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด์์ DispatcherServlet์ด ์ด๊ธฐํ๋ ๋, ์คํ๋ง ์ปจํ ์ด๋๋ ํจ๊ป ์ด๊ธฐํ๋ฉ๋๋ค. ์ฆ, DispatcherServlet์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋์ง๋ง, DispatcherServlet์ด ์ด๊ธฐํ๋๋ฉด์ ์คํ๋ง ์ปจํ ์ด๋๋ ์ด๊ธฐํ๋์ด, ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋ชจ๋ ๋น์ด ๊ด๋ฆฌ๋๊ธฐ ์์ํฉ๋๋ค.
- ์ค์ํ ํฌ์ธํธ:
- ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋์ํฉ๋๋ค. ์ฆ, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ผ๋ถ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
- DispatcherServlet์ ์คํ๋ง ์ปจํ ์ด๋์ ์ ๊ทผํ์ฌ, ์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐ๋ผ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ๋น์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ผ ํฉ๋๋ค.
์์๋ก ์ดํดํ๊ธฐ
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ์๋ธ๋ฆฟ์ ์ด๊ธฐํ:
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Tomcat ๋ฑ)๊ฐ ์คํ๋๋ฉด web.xml ์ค์ ๋๋ Java Config์ ๋ฐ๋ผ DispatcherServlet์ด ์ด๊ธฐํ๋ฉ๋๋ค.
- ์ด ์์ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์คํ๋ง ์ปจํ ์ด๋(WebApplicationContext)๋ ํจ๊ป ์ด๊ธฐํํฉ๋๋ค.
- ์คํ๋ง ์ปจํ
์ด๋์ ์ด๊ธฐํ:
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ก๋ํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ์ด ๋น๋ค์ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ:
- ํด๋ผ์ด์ธํธ๊ฐ HTTP ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ๋ฐ์ DispatcherServlet์ ์ ๋ฌํฉ๋๋ค.
- DispatcherServlet์ ์คํ๋ง ์ปจํ ์ด๋์ ์ ๊ทผํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๋น์ ์ฐพ๊ณ , ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ ๊ฒฐ๋ก
- Spring MVC์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋: Spring MVC๋ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ๋ก, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๋ฐ๋์ ํ์ํฉ๋๋ค. Spring MVC๋ DispatcherServlet์ ํตํด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์คํ๋ฉ๋๋ค.
- ์คํ๋ง ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋: ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋์ํ๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ๋น์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์, ์คํ๋ง ์ปจํ ์ด๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋ ๋ฆฝ์ ์ธ ์กด์ฌ๊ฐ ์๋๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง MVC ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๊ธฐ ์ํด์๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ์ํ๊ณ , ๊ทธ ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋์ํฉ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํฌํจํ๋๊ฐ? 2
โ Question
์ด ๊ทธ๋ฆผ์ ๋ง๋ ๊ทธ๋ฆผ์ธ๊ฐ? ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์คํ๋ง์ปจํ ์ด๋๊ฐ ์ข ์๊ด๊ณ๊ฐ ์๋๋ผ ์๋ก ํ์กฐํ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ฌ
๐ Answer
์ด ๊ทธ๋ฆผ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์คํ๋ง ์ปจํ ์ด๋์ ๊ด๊ณ๋ฅผ ์ค๋ช ํ๋๋ฐ, ์ผ๋ถ ์ธก๋ฉด์์๋ ๋ง๋ ์ค๋ช ์ ์ ๊ณตํ๊ณ ์์ง๋ง, ๋ช ๊ฐ์ง ์ค์ํ ์ ์ ์ ํํ ์ดํดํ ํ์๊ฐ ์์ต๋๋ค.
1. ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์คํ๋ง ์ปจํ ์ด๋์ ํ๋ ฅ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, DispatcherServlet์ Spring MVC์ ํต์ฌ ์๋ธ๋ฆฟ์ผ๋ก์, ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ ์ ํ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋น(Bean) ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, DispatcherServlet๋ ์ด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ ๋น๋ค์ ์ ๊ทผํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
2. ๊ทธ๋ฆผ์ ํด์
- ๊ทธ๋ฆผ์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ DispatcherServlet์ ์คํํ๊ณ ์์ผ๋ฉฐ, ์ด ์๋ธ๋ฆฟ์ด Spring MVC ์ปจํ ์ด๋(์ผ์ข ์ ์คํ๋ง ์ปจํ ์ด๋)์ ์ผ๋ถ๋ก ๋์ํ๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
- Spring MVC ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ด๊ธฐํ์ ์ํด ์ด๊ธฐํ๋๋ฉฐ, ์คํ๋ง ์ปจํ ์ด๋ ์์์ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฆ, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์๋ธ์ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํ๋ ฅํ์ฌ ๋์ํฉ๋๋ค. ๊ทธ๋ฆผ์์์ "ํ๋ ฅ" ๊ด๊ณ๊ฐ ๊ฐ์กฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ข ์์ ์ ๋๋ค. ์ฆ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์ด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ ์๋ ์์ต๋๋ค.
3. ๊ทธ๋ฆผ์์์ ์ฃผ์ ํฌ์ธํธ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํฌํจํ๊ณ , ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๋น๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ HTTP ์์ฒญ์ ๋ฐ์ DispatcherServlet์ ์ ๋ฌํ๊ณ , DispatcherServlet์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ ๊ฒฐ๋ก
๊ทธ๋ฆผ์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋ ฅํ์ฌ ์๋ํ์ง๋ง, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ฐ์ ์ ์ผ๋ก HTTP ์์ฒญ์ ๋ฐ์์ ์คํ๋ง ์ปจํ ์ด๋์ ์ ๋ฌํ๋ ํ๋ฆ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์คํ๋ง ์ปจํ ์ด๋์ ์์ ๋ ๋ฒจ์์ ๋์ํ๋ฉฐ, ์คํ๋ง ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ ๊ณตํ๋ ํ๊ฒฝ ๋ด์์ ๋์ํ๊ฒ ๋ฉ๋๋ค.
๐ฅ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ≠ ํฐ์บฃ
โ Question
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํฐ์บฃ์ ๊ฐ์ ์๋ฏธ๋ ์๋์ง? ํฐ์บฃ ์๋ฒ ๋ด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋๊ฑฐ ์๋
๐ Answer
๋ง์ต๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ **ํฐ์บฃ(Tomcat)**์ ๊ฐ์ ์๋ฏธ๊ฐ ์๋๋ฉฐ, ํฐ์บฃ ์๋ฒ ๋ด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1. ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ **Java EE (ํ์ฌ๋ Jakarta EE)**์ ์๋ธ๋ฆฟ ๊ท๊ฒฉ์ ๊ตฌํํ ์ปดํฌ๋ํธ์ ๋๋ค. ์ฃผ๋ ์ญํ ์ ์๋ธ๋ฆฟ์ ๋ก๋ํ๊ณ , ์ด๊ธฐํํ๋ฉฐ, ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ HTTP ์์ฒญ์ ๋ฐ์์ ์๋ธ๋ฆฟ์ ํตํด ์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํ๋ ์ผ์ ๋ด๋นํฉ๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ API๋ฅผ ๊ตฌํํ๊ณ , ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
2. ํฐ์บฃ(Tomcat)
- **ํฐ์บฃ(Tomcat)**์ Apache Software Foundation์์ ๊ฐ๋ฐํ ์คํ์์ค **์น ์๋ฒ(Web Server)**์ด์ **์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)**์ ๋๋ค.
- ํฐ์บฃ์ Java Servlet ๋ฐ JavaServer Pages (JSP) ๊ธฐ์ ์ ๊ตฌํํ ์๋ฒ๋ก, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- ํฐ์บฃ ์๋ฒ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฟ๋ง ์๋๋ผ, JSP ์์ง, HTTP ์ปค๋ฅํฐ ๋ฑ ๋ค์ํ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ์ฌ, ์ ์ฒด์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ์ญํ ์ ์ํํฉ๋๋ค.
3. ํฐ์บฃ ์๋ฒ ๋ด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋
- ํฐ์บฃ์ ์น ์๋ฒ๋ก์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ์ ๋ฐ์ต๋๋ค. ์ด ์์ฒญ์ด ์๋ธ๋ฆฟ์ด๋ JSP์ ๊ฐ์ ๋์ ๋ฆฌ์์ค์ ๊ด๋ จ์ด ์๋ค๋ฉด, ํฐ์บฃ ๋ด๋ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
- ํฐ์บฃ ๋ด์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์ด๊ธฐํํ๋ฉฐ, ์๋น์ค ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํฉ๋๋ค.
๐ ๊ฒฐ๋ก
- ํฐ์บฃ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํฌํจํ ์น ์๋ฒ์ ๋๋ค. ํฐ์บฃ ์๋ฒ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํตํด ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํฐ์บฃ ๋ด์ ์ปดํฌ๋ํธ ์ค ํ๋๋ก, ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ์ HTTP ์์ฒญ/์๋ต ์ฒ๋ฆฌ๋ฅผ ์ ๋ดํฉ๋๋ค.
๋ฐ๋ผ์, ํฐ์บฃ๊ณผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋์ผํ ๊ฐ๋ ์ด ์๋์ง๋ง, ํฐ์บฃ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํฌํจํ์ฌ ๋์ํ๋ ์๋ฒ๋ผ๊ณ ์ดํดํ ์ ์์ต๋๋ค.
๐ฅ ์น ์ปจํ ์ด๋ ๏นฆ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ?
โ Question
์น ์ปจํ ์ด๋๋ผ๋๊ฒ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ผ?
๐ Answer
๋ค, **์น ์ปจํ ์ด๋(Web Container)**์ **์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)**๋ ๊ฑฐ์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๋ค ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ธ๋ฆฟ(Servlet)๊ณผ JSP(JavaServer Pages)๋ฅผ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ์ญํ ์ ํ๋ ์ปจํ ์ด๋๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์ฉ์ด๋ค์ ์ข ์ข ํผ์ฉ๋๋๋ฐ, ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ๋ ์ ๊ฐ๋ฆฌํต๋๋ค.
์น ์ปจํ ์ด๋(Web Container)
- ์น ์ปจํ ์ด๋๋ **์๋ธ๋ฆฟ(Servlet)**๊ณผ **JSP(JavaServer Pages)**๋ฅผ ์คํํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์์ธ ์๋ธ๋ฆฟ, JSP, ํํฐ(Filter), ๋ฆฌ์ค๋(Listener) ๋ฑ์ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค.
- ์น ์ปจํ ์ด๋๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ด๋ฅผ ์ ์ ํ ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ ๋ฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ HTTP ์๋ต์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ ์ผ์ ์ํํฉ๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๋ธ๋ฆฟ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , HTTP ์์ฒญ์ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌํ๋ฉฐ, ์๋ธ๋ฆฟ์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ปจํ ์ด๋์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ก, ์๋ธ๋ฆฟ์ ์คํํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์ฐจ์ด์
- ์น ์ปจํ ์ด๋๋ผ๋ ์ฉ์ด๋ ๋ ๋์ ๋ฒ์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฟ๋ง ์๋๋ผ, JSP ์์ง, ์น ํํฐ, ๋ฆฌ์ค๋ ๋ฑ์ ํฌํจํ ์ ์ฒด ์น ์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ๊ฒฝ์ ์๋ฏธํ ์ ์์ต๋๋ค.
- ๋ฐ๋ฉด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฃผ๋ก ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค.
๐ ๊ฒฐ๋ก
์ผ๋ฐ์ ์ผ๋ก, ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์น ์ปจํ ์ด๋๋ ๋์ผํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ, ๋ ์ฉ์ด๋ ์ํธ ๊ตํ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ํ์ง๋ง, ์น ์ปจํ ์ด๋๋ผ๋ ์ฉ์ด๋ ์กฐ๊ธ ๋ ํฌ๊ด์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ทธ ์์ ํฌํจ๋ ํ๋์ ์ปดํฌ๋ํธ๋ก ๋ณผ ์ ์์ต๋๋ค.
๐ฅ ์คํ๋ง Bean / ์๋ธ๋ฆฟ ์ธ์คํด์ค
โ Question
๋น์ ์๋ธ๋ฆฟ์ธ์คํด์ค๋ ๋น์ทํ ๋๋์ธ๋ฐ ๋น์ DI ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋๊ฑฐ๊ณ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋๊ฑฐ์ง?
๐ Answer
๋ค, ์ ํํฉ๋๋ค! **๋น(Bean)**๊ณผ **์๋ธ๋ฆฟ ์ธ์คํด์ค(Servlet Instance)**๋ ๋น์ทํ ๊ฐ๋ ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ๋ ์ฌ์ด์๋ ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์ด ๋ ๊ฐ๋ ์ ๊ตฌ๋ถํ๋ ํต์ฌ์ ๊ฐ๊ฐ ์ด๋ค ์ปจํ ์ด๋์์ ๊ด๋ฆฌ๋๋๋์ ๋๋ค.
1. ๋น(Bean)
- **๋น(Bean)**์ Spring Framework์์ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋น์ DI ์ปจํ ์ด๋(Dependency Injection Container), ์ฆ ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ , ๊ด๋ฆฌ๋๋ฉฐ, ์์กด์ฑ ์ฃผ์ (Dependency Injection) ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋น์ ์๋ช ์ฃผ๊ธฐ(์์ฑ, ์ด๊ธฐํ, ์๋ฉธ)๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ํ์ํ ๊ณณ์ ๋น์ ์ ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค.
2. ์๋ธ๋ฆฟ ์ธ์คํด์ค(Servlet Instance)
- **์๋ธ๋ฆฟ ์ธ์คํด์ค(Servlet Instance)**๋ Java Servlet API๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container), ์ฆ ์น ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ(์์ฑ, ์ด๊ธฐํ, ์๋น์ค, ์๋ฉธ)๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ํด๋น ์๋ธ๋ฆฟ ์ธ์คํด์ค์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ ์ ์ํํฉ๋๋ค.
์ฃผ์ ์ฐจ์ด์
- ์ปจํ
์ด๋:
- ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ๊ธฐ๋ฅ:
- ๋น์ ์ฃผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๋ ๊ฐ์ฒด๋ก, ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ๋ค์ํ ๊ธฐ๋ฅ(์์กด์ฑ ์ฃผ์ , AOP, ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ)์ ํ์ฉํ ์ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HTTP ์์ฒญ์ ์ง์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ก, ์์ฒญ-์๋ต ์ฒ๋ฆฌ์ ํนํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์๋ช
์ฃผ๊ธฐ:
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ๋น์ ์์ฑํ๊ณ , ํ์์ ๋ฐ๋ผ ์์กด์ฑ์ ์ฃผ์ ํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์ ๋น์ ์๋ฉธ์ํต๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ด ์ต์ด๋ก ์์ฒญ์ ๋ฐ์ ๋ ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ์๋ธ๋ฆฟ์ด ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ด๋ฅผ ์๋ฉธ์ํต๋๋ค.
๐ ๊ฒฐ๋ก
- ๋น๊ณผ ์๋ธ๋ฆฟ ์ธ์คํด์ค ๋ชจ๋ ํน์ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ค์ํ ์ญํ ์ ์ํํ๋ ๊ฐ์ฒด์ ๋๋ค.
- ๋น์ ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๋ จ๋ ๊ฐ์ฒด๋ก, ์๋ธ๋ฆฟ ์ธ์คํด์ค๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋ ๊ฐ๋ ์ ์ดํดํ๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์คํ๋ง๊ณผ ์๋ธ๋ฆฟ์ด ์ด๋ป๊ฒ ํ๋ ฅํ์ฌ ๋์ํ๋์ง ๋ ์ ์ดํดํ ์ ์์ต๋๋ค.
๐ฅ web.xml ํด์
โ Question
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- ์ฒซ๋ฒ์งธ -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- ๋๋ฒ์งธ -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- ์ธ๋ฒ์งธ -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- ๋ค๋ฒ์งธ -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
ํด์์ ์์ธํ ํด์ค
๐ Answer
์ด web.xml ํ์ผ์ Java ์น ์ ํ๋ฆฌ์ผ์ด์ ์ **๋ฐฐํฌ ์์ ์(Deployment Descriptor)**๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ฝ์ด์ ์ด๊ธฐ ์ค์ ์ ์ํํ๋ ์ค์ํ ํ์ผ์ ๋๋ค. ์ด ํ์ผ์ ํตํด ์คํ๋ง ํ๋ ์์ํฌ์ ์๋ธ๋ฆฟ์ ์ด๋ป๊ฒ ์ค์ ํ๊ณ ์ด๊ธฐํํ ์ง ์ ์ํฉ๋๋ค.
๊ฐ ์น์ ์ด ์ด๋ค ์ญํ ์ ํ๋์ง ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค:
1. <context-param> ํ๊ทธ (์ปจํ ์คํธ ํ๋ผ๋ฏธํฐ ์ค์ )
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
- ์ด ์น์ ์ ์ ์ญ ์ปจํ ์คํธ ์ค์ ํ์ผ์ธ root-context.xml์ ์์น๋ฅผ ์ ์ํฉ๋๋ค.
- contextConfigLocation: ์ด ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ์คํ๋ง ํ๋ ์์ํฌ์ ๋ํ ์ค์ ํ์ผ์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ง์ ๋ ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ๋๋ ์คํ๋ง ๋น๋ค์ ์ ์ํ ์ ์์ต๋๋ค.
- /WEB-INF/spring/root-context.xml: ์ด ๊ฐ์ ์ค์ ํ์ผ์ ๊ฒฝ๋ก์ ๋๋ค. ํด๋น XML ํ์ผ์๋ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋ ์คํ๋ง ๋น ์ค์ ์ด ๋ค์ด์์ต๋๋ค.
2. <listener> ํ๊ทธ (๋ฆฌ์ค๋ ์ค์ )
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- ์ด ์น์ ์ **ContextLoaderListener**๋ผ๋ ์คํ๋ง ํ๋ ์์ํฌ์ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํฉ๋๋ค.
- ContextLoaderListener: ์ด ๋ฆฌ์ค๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ **์คํ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ(ApplicationContext)**๋ฅผ ์ด๊ธฐํํ๊ณ , ์์ ์ ์๋ context-param์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ root-context.xml ํ์ผ์ ๋ก๋ํฉ๋๋ค.
- ์ด ๋ฆฌ์ค๋๋ ์ ์ญ์ ์ผ๋ก ์ ์ฉ๋๋ **ApplicationContext**๋ฅผ ์ด๊ธฐํํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ํ ์ ์๋ ๋น๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
3. <servlet> ํ๊ทธ (์๋ธ๋ฆฟ ์ค์ )
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- ์ด ์น์ ์ **DispatcherServlet**์ ๋ฑ๋กํ๋ ๋ถ๋ถ์ ๋๋ค. **DispatcherServlet**์ ์คํ๋ง MVC์์ ๊ฐ์ฅ ์ค์ํ ์๋ธ๋ฆฟ์ผ๋ก, ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ๊ณ ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค.
- appServlet: ์ด ์๋ธ๋ฆฟ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
- DispatcherServlet: ์ด ์๋ธ๋ฆฟ ํด๋์ค๋ ์คํ๋ง MVC์ ์ค์ฌ ์ญํ ์ ํ๋ ์๋ธ๋ฆฟ์ ๋๋ค.
- init-param: DispatcherServlet์ด ๋ก๋๋ ๋ ์ฌ์ฉํ ์ค์ ํ์ผ์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ง์ ๋ servlet-context.xml ํ์ผ์ ์ด ์๋ธ๋ฆฟ๊ณผ ์ฐ๊ด๋ ์คํ๋ง ๋น๋ค์ ์ ์ํฉ๋๋ค.
- /WEB-INF/spring/appServlet/servlet-context.xml: ์ด ํ์ผ์๋ ์ฃผ๋ก ์คํ๋ง MVC์ ๊ด๋ จ๋ ๋น ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค. ์ปจํธ๋กค๋ฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ ๋ฑ์ ์ค์ ์ด ์ด ํ์ผ์ ํฌํจ๋ ์ ์์ต๋๋ค.
- <load-on-startup>1</load-on-startup>: ์ด ์๋ธ๋ฆฟ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ๋ฐ๋ก ์ด๊ธฐํ๋๋๋ก ์ค์ ํฉ๋๋ค. ๊ฐ์ด 1๋ก ์ค์ ๋์ด ์์ด, ์๋ฒ๊ฐ ์์๋ ๋ ์ฆ์ ์ด ์๋ธ๋ฆฟ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค.
4. <servlet-mapping> ํ๊ทธ (์๋ธ๋ฆฟ ๋งคํ)
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- ์ด ์น์ ์ URL ํจํด์ ์๋ธ๋ฆฟ์ ๋งคํํฉ๋๋ค.
- appServlet: ์ด ๋งคํ์ด ์ฐ๊ฒฐ๋ ์๋ธ๋ฆฟ์ ์ด๋ฆ์ ๋๋ค. ์ด ์ด๋ฆ์ ์์ ์ ์ํ DispatcherServlet์ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
- *.do: ์ด URL ํจํด์ .do๋ก ๋๋๋ ๋ชจ๋ ์์ฒญ์ appServlet ์๋ธ๋ฆฟ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, /example.do๋ผ๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด ์๋ธ๋ฆฟ์ด ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๐ ์ข ํฉ
์ด web.xml ํ์ผ์ ์คํ๋ง MVC ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์ค์ ์ ์ ์ํ๊ณ ์์ต๋๋ค.
- root-context.xml์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉํ ์คํ๋ง ๋น์ ์ ์ํ๊ณ ,
- DispatcherServlet์ ์ค์ ํ์ฌ servlet-context.xml์ ์ฌ์ฉํด ์คํ๋ง MVC ๊ด๋ จ ์ค์ ์ ์ํํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, *.do ํจํด์ ์ฌ์ฉํ์ฌ ํน์ URL๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์คํ๋ง MVC์ DispatcherServlet์ด ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ๊ณ ์์ต๋๋ค.
์ด ํ์ผ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํ๊ณ ์คํํ ๋, ์คํ๋ง ํ๋ ์์ํฌ์ ์๋ธ๋ฆฟ ๊ฐ์ ํตํฉ์ ์ค์ ํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
๐ฅ ApplicationContext ๏นฆ Spring DI ์ปจํ ์ด๋ ?
โ Question
ApplicationContext๋ Spring DI ์ปจํ ์ด๋์ง?
๐ Answer
๋ค, ๋ง์ต๋๋ค! **ApplicationContext**๋ ์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ์ผ๋ก, **์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)**์ ๋ด๋นํ๋ ์ปจํ ์ด๋์ ๋๋ค.
ApplicationContext์ ์ฃผ์ ์ญํ :
- ๋น(Bean) ๊ด๋ฆฌ:
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ค์ ๋น(Bean)์ผ๋ก ๋ฑ๋กํ๊ณ , ๊ทธ ๋น์ ์์ฑ๊ณผ ์ด๊ธฐํ, ์์กด์ฑ ์ฃผ์ ๋ฑ์ ๊ด๋ฆฌํฉ๋๋ค.
- ApplicationContext๋ ์ด๋ฌํ ๋น๋ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค.
- ์์กด์ฑ ์ฃผ์
(Dependency Injection, DI):
- ApplicationContext๋ ์ค์ ํ์ผ(XML, Java Config ๋ฑ)์ด๋ ์ ๋ ธํ ์ด์ (@Autowired, @Inject ๋ฑ)์ผ๋ก ์ ์๋ ๋น ๊ฐ์ ์์กด์ฑ์ ์๋์ผ๋ก ์ฃผ์ ํฉ๋๋ค.
- ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฝ๋์ ์์ฑํ์ง ์๊ณ ๋, ํ์ํ ๊ณณ์ ํ์ํ ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋๋๋ก ํ ์ ์์ต๋๋ค.
- ๋น ํ์ ๋ฐ ์ ๊ณต:
- ApplicationContext๋ ํ์ํ ๋ ๋น์ ์์ฒญ๋ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ ๋ถ๋ถ์์๋ ์ง ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๋น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋น ์ ์ ํ์ผ ์ฝ๊ธฐ:
- ApplicationContext๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋, ์ง์ ๋ ์ค์ ํ์ผ(applicationContext.xml ๋๋ Java Config ํด๋์ค ๋ฑ)์ ์ฝ์ด์ ๋น๋ค์ ์ด๊ธฐํํฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฐํ ๋ฐ ๋ฆฌ์ค๋:
- ์คํ๋ง ์ด๋ฒคํธ ์์คํ ์ ์ฌ์ฉํ์ฌ, ApplicationContext ๋ด์์ ๋ฐ์ํ๋ ๋ค์ํ ์ด๋ฒคํธ๋ค์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๐ ๊ฐ๋จํ ์์ฝ
- **ApplicationContext**๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น(Bean)๋ค์ ๊ด๋ฆฌํ๊ณ , **์์กด์ฑ ์ฃผ์ (DI)**์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ํต์ฌ ์ปจํ ์ด๋์ ๋๋ค.
- ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ฌ ์ญํ ์ ํ๋ฉฐ, ๋ชจ๋ ๋น์ ์์ฑ, ์์กด์ฑ ๊ด๋ฆฌ, ์๋ช ์ฃผ๊ธฐ ๋ฑ์ ์ฑ ์์ง๋๋ค.
๐ฅ root-context.xml ์ ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ
โ Question
root-context.xml ๋ ์คํ๋ง ๋น์ ์ ์ํ ์ค์ ํ์ผ์ด์ผ?
๐ Answer
๋ค, ๋ง์ต๋๋ค! root-context.xml ํ์ผ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ๋น(Bean)์ ์ ์ํ๊ณ ์ค์ ํ๋ ํ์ผ์ ๋๋ค.
root-context.xml ํ์ผ์ ์ญํ :
- ์คํ๋ง ๋น ์ ์:
- ์ด ํ์ผ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ ๋น๋ค์ด ์ ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋น ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
- ๋น์ ๋ผ์ดํ์ฌ์ดํด, ์์กด์ฑ, ์ด๊ธฐํ ๋ฐ ์๋ฉธ ๋ฉ์๋ ๋ฑ์ ์ ์ํ ์ ์์ต๋๋ค.
- ์ ์ญ ์ค์ :
- root-context.xml์ ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉ๋๋ ๋น์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ์ผ์์ ์ ์๋ ๋น๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋ธ๋ฆฟ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์์ค, ํธ๋์ญ์ ๋งค๋์ , ์๋น์ค ๊ณ์ธต์ ๋น ๋ฑ์ ์ด ํ์ผ์ ์ ์ํฉ๋๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฃจํธ ์ปจํ
์คํธ:
- ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ์ด ํ์ผ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ์ปจํ ์คํธ์ ํด๋นํฉ๋๋ค. DispatcherServlet์ด๋ ๋ค๋ฅธ ์๋ธ๋ฆฟ๊ณผ ๊ตฌ๋ณ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ๋๋ ๋น์ ์ค์ ํฉ๋๋ค.
๐ ์์
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Example: Bean definition for a service -->
<bean id="myService" class="com.example.MyService">
<property name="repository" ref="myRepository"/>
</bean>
<!-- Example: Bean definition for a repository -->
<bean id="myRepository" class="com.example.MyRepository">
<!-- Configuration properties -->
</bean>
</beans>
์์ ๊ฐ์ ํ์์ผ๋ก ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
๐ ์์ฝ
- **root-context.xml**์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ ์ฌ์ฉ๋๋ ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ค์ ์ ๊ด๋ฆฌํฉ๋๋ค.
- ์ด ํ์ผ์์ ์ ์๋ ๋น๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋ธ๋ฆฟ์์ ๊ณตํต์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
๐ฅ root-context.xml / servlet-context.xml
โ Question
root-context.xml ๋ ์คํ๋ง ๋น์ ์ ์ํ ์ค์ ํ์ผ์ด์ผ?
servlet-context.xml๋ ๋ญ์ผ ๊ทธ๋ผ
๐ Answer
root-context.xml๊ณผ servlet-context.xml์ ๋ ๋ค ์คํ๋ง ํ๋ ์์ํฌ์์ ๋น(Bean)์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ ์ค์ ํ์ผ์ด์ง๋ง, ๊ทธ ์ญํ ๊ณผ ๋ฒ์๋ ๋ค๋ฆ ๋๋ค.
root-context.xml
- ์ญํ : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉ๋๋ ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ์ ๋๋ค.
- ๋ฒ์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ๋๋ ๋น์ ์ค์ ํฉ๋๋ค. ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋น, ์๋น์ค ๊ณ์ธต์ ๋น, ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ํธ๋ฆฌํฐ ๋น ๋ฑ์ ์ด ํ์ผ์ ์ ์ํฉ๋๋ค.
- ์ฉ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋ธ๋ฆฟ(๋๋ ์ปจํธ๋กค๋ฌ)์์ ์ฌ์ฉํ ์ ์๋ ์ ์ญ ๋น์ ๋ฑ๋กํฉ๋๋ค.
servlet-context.xml
- ์ญํ : ํน์ ์๋ธ๋ฆฟ, ํนํ ์คํ๋ง MVC์์ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ์ ๊ด๋ จ๋ ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ์ ๋๋ค.
- ๋ฒ์: ์ฃผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๋ธ๋ฆฟ ๋๋ ์คํ๋ง MVC์ ๊ด๋ จ๋ ๋น๋ค์ ์ค์ ํฉ๋๋ค.
- ์ฉ๋: ์คํ๋ง MVC์ ๊ด๋ จ๋ ์ค์ (์: ๋ทฐ ๋ฆฌ์กธ๋ฒ, ์ปจํธ๋กค๋ฌ ๋น, ์ธํฐ์ ํฐ ๋ฑ)์ ์ ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก DispatcherServlet๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
์ญํ ์ ์ฐจ์ด์
- root-context.xml:
- ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ฌ์ฉ๋๋ ๋น์ ์ค์ ํฉ๋๋ค.
- DispatcherServlet์ ํฌํจํ ๋ชจ๋ ์๋ธ๋ฆฟ์ด ์ด ์ค์ ํ์ผ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ์ ์ญ์ ์ธ ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ๋ฐ์ดํฐ ์์ค ๊ฐ์ ๋น์ ์ ์ํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- servlet-context.xml:
- ์คํ๋ง MVC์์ ์ฌ์ฉ๋๋ ์ปจํธ๋กค๋ฌ์ ๋ทฐ ๊ด๋ จ ๋น์ ์ ์ํฉ๋๋ค.
- DispatcherServlet๊ณผ ์ง์ ์ฐ๊ด๋์ด ์์ผ๋ฉฐ, ์ด ์๋ธ๋ฆฟ๊ณผ ๊ด๋ จ๋ ์์ฒญ ์ฒ๋ฆฌ์ ํ์ํ ๋น์ ์ค์ ํฉ๋๋ค.
- ์ฃผ๋ก ์น ๊ณ์ธต๊ณผ ๊ด๋ จ๋ ๋น์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปจํธ๋กค๋ฌ ๋น, ๋ทฐ ๋ฆฌ์กธ๋ฒ, ํฌ๋งทํฐ, ์ธํฐ์ ํฐ ๋ฑ์ ์ค์ ํฉ๋๋ค.
์์๋ก ์ดํดํ๊ธฐ
root-context.xml ์์:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋น -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์ -->
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="myService" class="com.example.service.MyService">
<!-- ์์กด์ฑ ์ค์ -->
</bean>
</beans>
servlet-context.xml ์์:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ์ปจํธ๋กค๋ฌ ๋น -->
<bean id="homeController" class="com.example.web.HomeController">
</bean>
<!-- ๋ทฐ ๋ฆฌ์กธ๋ฒ ์ค์ -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
๐ ์์ฝ
- **root-context.xml**์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉ๋ ์ ์ญ ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ์ด๊ณ ,
- **servlet-context.xml**์ ์คํ๋ง MVC์ ๊ด๋ จ๋ ์น ๊ณ์ธต ๋น์ ์ ์ํ๋ ์ค์ ํ์ผ์ ๋๋ค.
์ด ๋ ํ์ผ์ ์ญํ ๊ณผ ๋ฒ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ํ์ผ์ ๋น์ ์ ์ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
๐ฅ ์น ํ๋ก์ ํธ ์ค์ ํ์ผ๋ค
โ Question
ํฐ์บฃ์ค์น๊ฒฝ๋ก/conf/server.xml -> Tomcat ์๋ฒ ์ค์ ํ์ผ
ํฐ์บฃ์ค์น๊ฒฝ๋ก/conf/web.xml -> Tomcat์ ๋ชจ๋ web app์ ๊ณตํต ์ค์
์น์ฑ์ด๋ฆ/WEB-INF/web.xml -> web app์ ๊ฐ๋ณ ์ค์
Spring์ค์
root-context.xml -> non-web
servlet-context.xml -> web
์์ธํ ์ค๋ช ์ข ํด์ค
๐ Answer
์ ์ค๋ช ์ ํฐ์บฃ ์๋ฒ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ํ์ผ๋ค์ ๊ฐ๋ ์ ์ผ๋ก ์ ๋ฆฌํ ๊ฒ์ ๋๋ค. ๊ฐ ํ์ผ์ ์ญํ ๊ณผ ๊ธฐ๋ฅ์ ์ดํดํ๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ์ค์ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ํ์ ํ ์ ์์ต๋๋ค. ๋ค์์ ๊ฐ ํ์ผ์ ์ญํ ๊ณผ ๊ธฐ๋ฅ์ ๋ํ ์์ธ ์ค๋ช ์ ๋๋ค.
ํฐ์บฃ(Tomcat) ์ค์ ํ์ผ
- ํฐ์บฃ์ค์น๊ฒฝ๋ก/conf/server.xml
- ์ญํ : ์ด ํ์ผ์ ํฐ์บฃ ์๋ฒ์ ์ ์ฒด ์ค์ ์ ์ ์ํฉ๋๋ค.
- ์ฃผ์ ์ค์ :
- ํฌํธ ์ค์ : HTTP, HTTPS, AJP ๋ฑ์ ํ๋กํ ์ฝ์ ์ฒ๋ฆฌํ๋ ์ปค๋ฅํฐ(Connector)์ ํฌํธ๋ฅผ ์ค์ ํฉ๋๋ค.
- ํธ์คํธ ๋ฐ ์ปจํ ์คํธ ์ค์ : ์ฌ๋ฌ ๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ธฐ ์ํ ํธ์คํธ์ ์ปจํ ์คํธ๋ฅผ ์ค์ ํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ด๋ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฆฌ์์ค๋ค์ ์ ์ํ ์ ์์ต๋๋ค.
- ์์:
xml<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- ํฐ์บฃ์ค์น๊ฒฝ๋ก/conf/web.xml
- ์ญํ : ์ด ํ์ผ์ ํฐ์บฃ์ ๋ฐฐํฌ๋ ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ์ค์ ์ ์ ์ํฉ๋๋ค.
- ์ฃผ์ ์ค์ :
- ๋ํดํธ ์๋ธ๋ฆฟ: ํฐ์บฃ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋ธ๋ฆฟ์ ์ค์ .
- ๊ณตํต ํํฐ: ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ๋๋ ํํฐ.
- MIME ํ์ : ํ์ผ ํ์ฅ์์ ๋ฐ๋ฅธ MIME ํ์ ์ ์.
- ์์:
xml<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
- ์น์ฑ์ด๋ฆ/WEB-INF/web.xml
- ์ญํ : ๊ฐ ๊ฐ๋ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ ์ํฉ๋๋ค. ์ด ํ์ผ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ ์ค๋ช ์๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ ์ํฉ๋๋ค.
- ์ฃผ์ ์ค์ :
- ์๋ธ๋ฆฟ ๋ฐ ์๋ธ๋ฆฟ ๋งคํ: ์๋ธ๋ฆฟ ํด๋์ค์ URL ๋งคํ์ ์ค์ ํฉ๋๋ค.
- ํํฐ ๋ฐ ํํฐ ๋งคํ: ํน์ ์์ฒญ์ ๋ํด ํํฐ๋ฅผ ์ ์ฉํ๋ ์ค์ .
- ๋ฆฌ์ค๋: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ดํ์ฌ์ดํด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฆฌ์ค๋๋ฅผ ์ ์ํฉ๋๋ค.
- ๋ณด์ ์ค์ : ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ์ค์ .
- ์์:
xml<servlet>
<servlet-name>exampleServlet</servlet-name><servlet-class>com.example.ExampleServlet</servlet-class></servlet><servlet-mapping><servlet-name>exampleServlet</servlet-name><url-pattern>/example</url-pattern></servlet-mapping>
์คํ๋ง(Spring) ์ค์ ํ์ผ
- root-context.xml
- ์ญํ : ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ **์น๊ณผ ๋ฌด๊ดํ ์ ์ญ์ ์ธ ๋น(Bean)**์ ์ ์ํ๋ ์ค์ ํ์ผ์ ๋๋ค.
- ์ฃผ์ ์ค์ :
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋น, ํธ๋์ญ์ ๊ด๋ฆฌ ๋น ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉ๋๋ ๋น์ ์ ์ํฉ๋๋ค.
- ์ฃผ๋ก DispatcherServlet ์ธ๋ถ์์ ์ฌ์ฉ๋ ๋น์ ์ค์ ํฉ๋๋ค.
- ์์:
xml<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><!-- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์ --></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean>
- servlet-context.xml
- ์ญํ : ์น ๊ณ์ธต์์ ์ฌ์ฉ๋๋ ๋น์ ์ ์ํ๊ณ , ์คํ๋ง MVC๋ฅผ ์ค์ ํ๋ ํ์ผ์ ๋๋ค.
- ์ฃผ์ ์ค์ :
- ์ปจํธ๋กค๋ฌ ๋น, ๋ทฐ ๋ฆฌ์กธ๋ฒ, ํฌ๋งทํฐ, ์ธํฐ์ ํฐ ๋ฑ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ด๋ จ๋ ์ค์ ์ ๋ด๋นํฉ๋๋ค.
- DispatcherServlet์ด ๋ก๋ํ ๋ ์ฐธ์กฐํ๋ฉฐ, ์น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ๋น์ ์ ์ํฉ๋๋ค.
- ์์:
xml<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean><bean id="homeController" class="com.example.web.HomeController" />
๐ ์์ฝ
- ํฐ์บฃ ์ค์ ํ์ผ๋ค:
- server.xml: ํฐ์บฃ ์๋ฒ ์ ์ฒด์ ์ค์ .
- web.xml(ํฐ์บฃ ์ค์น ๊ฒฝ๋ก์): ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ์ค์ .
- web.xml(์น ์ ํ๋ฆฌ์ผ์ด์ ๋ด์): ๊ฐ๋ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ .
- ์คํ๋ง ์ค์ ํ์ผ๋ค:
- root-context.xml: ์น๊ณผ ๋ฌด๊ดํ ์ ์ญ ๋น ์ค์ .
- servlet-context.xml: ์น ๊ณ์ธต๊ณผ ๊ด๋ จ๋ ๋น ๋ฐ ์คํ๋ง MVC ์ค์ .
์ด์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์คํ๋ง๊ณผ ํฐ์บฃ์ด ํจ๊ป ๋์ํ๋ฉด์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค. ํฐ์บฃ์ด ๊ธฐ๋ณธ์ ์ธ ์น ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๊ณ , ์คํ๋ง์ ๊ทธ ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ผ๊ณ ์ดํดํ ์ ์์ต๋๋ค.
๐ฅ root-context๊ฐ servlet-context ์ ๋ถ๋ชจ ?
โ Question
root-context๊ฐ servlet-context์ ๋ถ๋ชจ๋ผ๊ณ ๋ด๋ ๋ ๊น?
๐ Answer
๋ค, **root-context**๊ฐ **servlet-context**์ ๋ถ๋ชจ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ด ๊ด๊ณ๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๊ณ์ธต ๊ตฌ์กฐ์ ์ํด ํ์ฑ๋ฉ๋๋ค.
๋ถ๋ชจ-์์ ์ปจํ ์คํธ ๊ด๊ณ
- **root-context**๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ ์ฌ์ฉ๋๋ ์ ์ญ์ ์ธ ์คํ๋ง ๋น๋ค์ ์ ์ํ๋ ์ปจํ ์คํธ์ ๋๋ค. ์ด๋ ๋ณดํต **ContextLoaderListener**์ ์ํด ์ด๊ธฐํ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฅ ์์ ๋ ๋ฒจ์์ ๊ด๋ฆฌ๋ฉ๋๋ค.
- **servlet-context**๋ **DispatcherServlet**๊ณผ ์ฐ๊ด๋ ์ปจํ ์คํธ๋ก, ์ฃผ๋ก ์น ๊ณ์ธต๊ณผ ๊ด๋ จ๋ ๋น๋ค์ ์ ์ํฉ๋๋ค. ์ด ์ปจํ ์คํธ๋ ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ํน์ ์๋ธ๋ฆฟ(์ฃผ๋ก DispatcherServlet)์ ๋ํ ์ค์ ์ ๋ด๊ณ ์์ต๋๋ค.
๊ณ์ธต ๊ตฌ์กฐ์ ์๋ ๋ฐฉ์
- servlet-context๋ root-context์ ์์ ์ปจํ ์คํธ๋ก ๋์ํฉ๋๋ค. ์ด๋ servlet-context์์ ์ ์๋ ๋น๋ฟ๋ง ์๋๋ผ root-context์ ์ ์๋ ๋น๋ ์ฐธ์กฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋๋ก, root-context๋ servlet-context์ ์ ์๋ ๋น์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ์ด ๊ณ์ธต ๊ตฌ์กฐ ๋๋ถ์ ์ ์ญ์ ์ผ๋ก ๊ณต์ ํด์ผ ํ ๋น(์: ์๋น์ค ๋น, ๋ฆฌํฌ์งํ ๋ฆฌ ๋น ๋ฑ)์ root-context์ ์ ์๋๊ณ , ํน์ ์๋ธ๋ฆฟ๊ณผ ๊ด๋ จ๋ ๋น(์: ์ปจํธ๋กค๋ฌ ๋น, ๋ทฐ ๋ฆฌ์กธ๋ฒ ๋ฑ)์ servlet-context์ ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์
root-context.xml (์ ์ญ์ ์ธ ๋น ์ ์)
<beans>
<!-- ์ ์ญ์ ์ผ๋ก ๊ณต์ ํ ์๋น์ค ๋น -->
<bean id="myService" class="com.example.service.MyService" />
</beans>
servlet-context.xml (์น ๊ณ์ธต ๊ด๋ จ ๋น ์ ์)
<beans>
<!-- ์ปจํธ๋กค๋ฌ ๋น -->
<bean id="myController" class="com.example.web.MyController">
<!-- ๋ถ๋ชจ ์ปจํ
์คํธ(root-context)์ ๋น์ ์ฃผ์
๋ฐ์ ์ ์์ -->
<property name="myService" ref="myService" />
</bean>
<!-- ๋ทฐ ๋ฆฌ์กธ๋ฒ -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
์ด๋ ๊ฒ ๋ถ๋ชจ-์์ ์ปจํ ์คํธ ๊ตฌ์กฐ ๋๋ถ์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ๋น๊ณผ ์น ๊ณ์ธต์์๋ง ์ฌ์ฉํ ๋น์ ๋ถ๋ฆฌํ์ฌ ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ๋ ๋ช ํํ๊ณ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋๊ธ