๐ ์น์๋น์ค ํ๋ก๊ทธ๋๋ฐ 8์ฅ MVC ํจํด์ ์ดํด
CHAP.08 MVC ํจํด์ ์ดํด
1. MVC ํจํด
๋์์ธ ํจํด
- ๋์์ธ ํจํด(Design Pattern)
- ๊ฑด์ถํ์ ๊ด์ ์์ ์ถ๋ฐํ ๊ฐ๋
- 1994๋
Gof์
<<Design Patterns: Elements of Reusable Object-Oriented Software>>
๋ฅผ ํตํด ์ํํธ์จ์ด ์ค๊ณ์์ ๊ณตํต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ผ๋ก ์ ์ - Gof์ ๋์์ธ ํจํด์ ์์ฑ, ๊ตฌ์กฐ, ํ๋, ๋์ ์คํ ๋ฑ์ ๋ฌธ์ ์ ๋ํด ์ฌ๋ฌ ํจํด์ ์ ์ํ๊ณ ์์ผ๋ฉฐ UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ด์ฉํด ๊ตฌ์กฐ ํํ
- UML(Unified Modeling Language)
- ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ตฌํ์ ์ง์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์ผ์ข ์ ๋ชจ๋ธ๋ง ์ธ์ด
- ์์คํ ๋ถ์, ์ค๊ณ์ ํ์ํ ๋ด์ฉ์ ์ฌ๋ฌ ๋ค์ด์ด๊ทธ๋จ ํํ๋ก ์ ์ํ ๊ท๊ฒฉ
์ถ์ ํฉํ ๋ฆฌ ํจํด
- ์ถ์(Abstract): ์๋ฐ์ ์ถ์ ํด๋์ค Abstract Class์๋ ์ฌ์ฉ๋๋ ํํ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๊ตฌํ์ ํ์ ๊ฐ์ฒด์ ์์ํ๋ ๋ชจ๋ธ
- ํฉํ ๋ฆฌ(Factory): ๋์์ธ ํจํด์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ
- ์ถ์ํฉํ ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ณ๋๋ก ๊ตฌํํ๋ ๊ด๋ จ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ํ์ ํด๋์ค์์ ๋ด๋นํ๊ฒ ํ๋ ์ค๊ณ ๋ชจ๋ธ
- ์ถ์ ํฉํ ๋ฆฌ ํจํด UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ[๋ณ๋ ์ด๋ฏธ์ง ์ถ๊ฐ]
MVC ํจํด
- Model-View-Controller์ ์ฝ์ด
- GUI ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด
- ๋ฐฑ ์๋ ๊ธฐ๋ฐ์ ์น ์ดํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ๊ธฐ๋ณธ๋ชจ๋ธ
- ๋ชจ๋ฐ์ผ ์ฑ ๋ฐ FE ๊ธฐ๋ฐ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ๋์ด๋๋ฉด์ MVP(Model-View-Presenter), MVVM(Model-View-ViewModel)๊ณผ ๊ฐ์ ํจํด๋ ๋๋ฆฌ ์ฌ์ฉ๋จ
- MVC ํจํด์ ๋ชฉ์ ์ ํ๋ฉด๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋๊ฐ ์ข
์์ฑ์ ์ค์ด๋ ๊ฒ
- ๊ตฌ์ฑ์์๊ฐ ์ญํ ์ ๋ช ํํ๊ฒ ํ์ฌ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๋ถ๋ฆฌํ๊ณ ํ์ ์ ์ฉ์ด
-
MVCํจํด ๊ตฌ์กฐ[๋ณ๋ ์ด๋ฏธ์ง ์ถ๊ฐ]
- ๋ชจ๋ธ(Model)
- ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ญ
- ์ผ๋ฐ์ ์ผ๋ก DB์ ์ฐ๋์ ์ํ DAO(Data Access Object) ํด๋์ค์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํํํ๋ DO(Data Object, ์ํฐํฐ ํด๋์ค) ๋ฑ์ผ๋ก ๊ตฌ์ฑ
- ๋ชจ๋ธ์ ๋ทฐ๋ ์ปจํธ๋กค๋ฌ์ ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ๋ก DB์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ ์ฌ๋ฌ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ณต์ ํ ์ ์์ผ๋ฉฐ, ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ทฐ(View)
- ํ๋ฉด์ ๊ตฌ์ฑ์ ๋ด๋นํ๋ ์์ญ
- ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์ง
- ๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ๊ถ์ฅํ์ง ์์
- ๋ทฐ ์์ญ์ ๊ตฌํ์ ์ํด ๋ทฐ ํ ํ๋ฆฟ ์์ง์ด ์ฌ์ฉ๋๋ฉฐ, JSP ์ญ์ ์ด๋ฌํ ๋ทฐ ํ ํ๋ฆฟ ์์ง ์ค ํ๋
- HTML ์ด์ธ์ EL, JSTL๋ฑ์ ์ฌ์ฉํด ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ HTML, CSS ๋ฑ์ ํตํด ํ๋ฉด ๋์์ธ
- ๋ทฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ธ, ์ปจํธ๋กค๋ฌ์์ ์ข ์์ฑ์ด ์๋๋ก ๊ตฌํ
- ์ปจํธ๋กค๋ฌ(Controller)
- MVCํจํด์ ํต์ฌ์ผ๋ก ๋ชจ๋ ์ฌ์ฉ์ ์์ฒญ์ ์ค์ฌ
- ์ฌ์ฉ์ ์์ฒญ์ ํน์ ๋ทฐ์ ๋ฐ๋ก ์ ๋ฌ๋์ง ์๊ณ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ์ ๋ฌ
- ์ปจํธ๋กค๋ฌ๋ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ ๋ชจ๋ธ์ ํตํด DB์ ์ฐ๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ทฐ์ ์ ๋ฌ
- ๋ทฐ๋ก ์ ๋ฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ DO ํน์
List<DO>
ํํ์ ๊ฐ์ฒด๋ฅผ request์ ์ ์ฅํ ํ ํฌ์๋ฉ - ์ปจํธ๋กค๋ฌ๋ ํน์ ๋ทฐ๋ฅผ ์ง์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ทฐ์ ์ข
์๊ด๊ณ๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์
- ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํด์๋ก ์ปจํธ๋กค๋ฌ๋ ๋ณต์กํด์ง๊ณ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ๊ฐ ์์
- ์ปจํธ๋กค๋ฌ์ ๊ตฌํ
- JSP, ์๋ธ๋ฆฟ ๋ชจ๋ ๊ฐ๋ฅ
- JSP: ๊ฐ๋จํ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ ๋ฆฌ
- ์๋ธ๋ฆฟ: ๊ท๋ชจ ํ์ฅ๊ณผ ํฅํ ์คํ๋ง ํ๋ ์์ํฌ๋ก์ ํ์ฅ ๋ฑ์ ์ ๋ฆฌ
- ์ปจํธ๋กค๋ฌ ํธ์ถ
- ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ
- ์ฌ์ฉ์ ์์ฒญ๋ง๋ค ์ปจํธ๋กค๋ฌ ๋ง๋ค๊ธฐ
- ํน์ ๋ชจ๋ ๋จ์๋ก ํ๋์ ์ปจํธ๋กค๋ฌ ์์์ ์ฌ๋ฌ ์์ฒญ ๋จ์๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌ
- Front ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฐ๋ก ๋์ด ๋ชจ๋ ์์ฒญ์ ํ๋์ ์ปจํธ๋กค๋ฌ๋ก ๋ชจ์ ๋ค์ ์์ฒญ์ ๋ฐ๋ผ ๊ตฌํ ์ปจํธ๋กค๋ฌ ํธ์ถ
2. ์๋ธ๋ฆฟ ์ปจํธ๋กค๋ฌ ์ค๊ณ
ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ
- ์ปจํธ๋กค๋ฌ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ ์ธ๊ฐ์ง
- ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋จ์ผ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ๊ฐ๋ณ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผํจ
- ์๋ธ๋ฆฟ์ URL ์์ฒญ์ GET, POST ๋ฑ์ HTTP ๋ฉ์๋๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ URL์ ํ๋์ ์๋ธ๋ฆฟ์์ ์ฒ๋ฆฌํ ์ ์์ง๋ง, URL์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์
-
ex1) ์ด๋ค ์ผํ๋ชฐ์ ์ ํ ๋ฑ๋ก๊ณผ ์ญ์ ๊ธฐ๋ฅ
- ์ ํ ๋ฑ๋ก ์์ฒญ URL: /shop/addProduct - ์ ํ ์ญ์ ์์ฒญ URL: /shop/delProduct
- ์ด๋, ๋ URL์ ์์ฒญ์ ํ๋์ ์๋ธ๋ฆฟ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก URL ๋งคํ ์ค์ ์ ํ ์ ์์ผ๋, ๋ ์์ฒญ ๋ชจ๋ GET ๋ฐฉ์์ด๋ผ๋ฉด URL์ด ๋ค๋ฅด๋๋ผ๋ ๋์ผํ
doGet()
๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ์ด๋ค ์์ฒญ์ด ํธ์ถ๋ ๊ฒ์ธ์ง ๊ตฌ๋ถํ ์ ์์ - ๋ฐ๋ผ์ ๊ฐ๊ฐ์ URL ์์ฒญ์ ๋ณ๋์ ์๋ธ๋ฆฟ์ผ๋ก ๊ตฌํํด์ผ ํจ
GET๋ฐฉ์๊ณผ POST ๋ฐฉ์
- GET ๋ฉ์๋๋ ํน์ ๋ฆฌ์์ค์ ํ์๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ
- GET์ ์ฌ์ฉํ๋ ์์ฒญ์ parameter(Query String)๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์ก
- POST ๋ฉ์๋๋ ํน์ ์๋ฒ ๋ฆฌ์์ค(์๋ธ๋ฆฟ ๋ฑ)์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ
- GET ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์น ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ๋ฐ์ดํฐ๋ ๋ณด์ด์ง ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ Request Body์ ํฌํจ๋์ด ์ ๋ฌ
- ex2) ํ์ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ ํ์ ๊ฐ์ , ์น์ธ, ์์ , ํํด(์ญ์ ), ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
- ๊ฐ์ ์์ ํ๋ฉด -> ๊ฐ์ ์ฒ๋ฆฌ ์ปจํธ๋กค๋ฌ -> ๊ฐ์ ์๋ฃํ๋ฉด - ์ ๊ท ํ์ ๊ด๋ฆฌ์ ํ๋ฉด -> ์ ๊ท ํ์ ๊ฐ์ ์น์ธ ์ปจํธ๋กค๋ฌ -> ์น์ธ ์๋ฃ ํ๋ฉด - ๋ก๊ทธ์ธ ์์ ์ ๋ ฅ ํ๋ฉด -> ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ์ปจํธ๋กค๋ฌ -> ๋ฉ์ธ ํ๋ฉด
- ๊ฐ๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ปจํธ๋กค๋ฌ ํ์
- ์ ๋ ฅ/์์ฒญ ํ๋ฉด๊ณผ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ, ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ํ๋ฉด ํ์
- ๊ฐ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํด์ผ ํ์ง๋ง, ๊ฐ์ ๋จ์์ ์
๋ฌด๋ฅผ ํ๋์ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ๋๊ฒ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๊ด๋ฆฌ๊ฐ ์ฌ์ธ ์ ์์
- ํ๋์ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ ์์ฒญ์ด ์ง๋์น๊ฒ ๋ง์๊ฒฝ์ฐ ์คํ๋ ค ์ฝ๋ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ์ฃผ์ ํ์
- ์ด๋, ๋ URL์ ์์ฒญ์ ํ๋์ ์๋ธ๋ฆฟ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก URL ๋งคํ ์ค์ ์ ํ ์ ์์ผ๋, ๋ ์์ฒญ ๋ชจ๋ GET ๋ฐฉ์์ด๋ผ๋ฉด URL์ด ๋ค๋ฅด๋๋ผ๋ ๋์ผํ
- ์ฌ์ฉ์์ ์์ฒญ์ ๊ตฌ๋ถํ์ฌ ํ๋์ ์๋ธ๋ฆฟ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋๊ฐ์ง ๋ฐฉ๋ฒ
- URL์ ํ๋ผ๋ฏธํฐ ์ด์ฉ
- URL์ action๊ณผ ๊ฐ์ด ๋ณ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ด ์์ฒญ ๊ตฌ๋ถ
- http://xxx.com/member?action=create - http://xxx.com/member?action=login member: ์๋ธ๋ฆฟ URL ๋งคํ ๊ฐ action: ์์ฒญ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ํ๋ผ๋ฐํฐ
- ์์ฒญ์๋ ํ์์ ๋ณด, ๋ก๊ทธ์ธ ์์ด๋ ๋ฑ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ก ํฌํจ
- GET, POST ๋ฐฉ์์ด ๋ชจ๋ ๊ฐ๋ฅ
- ์ปจํธ๋กค๋ฌ์์๋ action๊ฐ์ ๋น๊ตํ์ฌ ๋ณ๋์ ๋ฉ์๋ ๊ตฌํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ
- ๋น๊ต์ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด์ง๋ง action ํ๋ผ๋ฏธํฐ์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ด๋ จ๋ HTML,JSP,์ปจํธ๋กค๋ฌ์ ์์ ์ด ํ์ํ๋ค๋ ๋จ์ ์ด ์์
- URLํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉ์ ์ค์ ๊ตฌํ: ๋ถ๊ธฐ๋ฌธ ์ฌ์ฉ
doGet(...){ String action = request.getParameter("action"); switch(action){ case "create": createMember(); break; case "login": loginMember(); break; ... } }
- Front ์ปจํธ๋กค๋ฌ ๊ตฌํ
- ๋ชจ๋ ์์ฒญ์ ์ง์ ์ ์ด ๋๋ ์ปจํธ๋กค๋ฌ์์ ์๋ธ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๋ ๊ตฌ์กฐ
- ์ข ๋ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Front ์ปจํธ๋กค๋ฌ ํจํด์ผ๋ก ์ ๋ฆฝ๋์ด ์์ด ์ฌ๋ฌ ๊ตฌํ์ ์์ฉ๋๋ ๋์์ธ ํจํด
- ๋ชจ๋ ์์ฒญ์ ํ๋๋ก ๋ชจ์ผ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์๋ธ๋ฆฟ ๋งคํ์ ๊ตฌ์กฐ์ ์ธ ํน์ง ํ์ฉ
- http://xxx.com/member/create.do - http://xxx.com/member/login.do /member : ํ์๊ด๋ฆฌ ์น ์ดํ๋ฆฌ์ผ์ด์ context ํน์ ์๋น์ค ๊ตฌ๋ถ ๊ฒฝ๋ก *.do : ์๋ธ๋ฆฟ URL ๋งคํ ๊ฐ์ผ๋ก ๋ชจ๋ ์์ฒญ์ ํ๋์ ์๋ธ๋ฆฟ ํธ์ถ
- ์ปจํธ๋กค๋ฌ์์๋
.do
์์ ์์ฒญ ์ด๋ฆ(create, login)์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ณ๋์ ๋ฉ์๋ ํน์ ์๋ธํด๋์ค๋ฅผ ํตํด ์คํ
- Front ์ปจํธ๋กค๋ฌ ๊ตฌํ ์ฅ์
- ์์ฒญ์ ๋ํ ํ๋ผ๋ฏธํฐ ์์ด ๋ช ํํ ์ด๋ฆ(create, login)์ผ๋ก ์์ฒญ
- ์์ฒญ์ ๋ํ URL ๊ด๋ฆฌ๊ฐ ํ์ ์์
- Front ์ปจํธ๋กค๋ฌ ๊ตฌํ ๋จ์
- ์ ์ฒด ์์คํ
์ ์ธ๋ถ ์์คํ
์ด ๋ถ๋ฆฌ๋์ด ์๋ ๊ฒฝ์ฐ
- Context๋ฅผ ๋ถ๋ฆฌํ๋๊ฒ์ ์ธ์ ๊ด๋ฆฌ ๋ฑ์ ๋ถ๋ด์ด ๊ฐ ์ ์์
- ex) ๋ค์ด๋ฒ์ ๊ฐ์ ํฌํธ ํํ
- ๋จ์ผ Context์ ๊ฒฝ๋ก๋ก ๊ตฌ๋ถํ๋ ๊ฒฝ์ฐ
- Front ์ปจํธ๋กค๋ฌ์์ ๋ชจ๋ ์์ฒญ์ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฉ์๋ ๊ตฌํ๋ง์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ์๋ ์ปจํธ๋กค๋ฌ ํด๋์ค๊ฐ ๋น๋ํด์ง
- ๊ท๋ชจ๊ฐ ์ด๋ ์์ค ์ด์์ด ๋๋ฉด ๊ฒฝ๋ก์ ๋ฐ๋ผ ์๋ธ ์ปจํธ๋กค๋ฌ๋ก ํฌ์๋ฉ ํ๋ ์ฒ๋ฆฌ ํ์
- ์๋ธ ์ปจํธ๋กค๋ฌ ๊ตฌํ
- URL ์์ฒญ์ ๋ถ์ํด ์ฌ์ฉ์ ์์ฒญ์ ๊ตฌ๋ถํ๋ ์์ ์ด ์ฐ์ ์ ์ผ๋ก ํ์
- ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ ์์ฒญ์ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌ
- switch(ํน์ if) ๋ฌธ์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๋ ๊ธฐ๋ฅ ์ถ๊ฐ or ๋ณ๊ฒฝ์ด ํ์ํ ๋ ์กฐ๊ฑด๋ฌธ๋ ํจ๊ป ๊ด๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์
@WebServlet("*.do") public class MemberController extends HttpServlet{ ... doGet(...){ String uri = request.getRequestURI(); String conPath = request.getContextPath(); String command = uri.substring(conPath.length()); switch(command){ case 'create.do': createMember(); break; case 'login.do': loginMember(); break; } } }
- Command ํจํด์ ์ฌ์ฉํ๋ฉด switch(ํน์ if) ๊ตฌ์กฐ ์์ด ํด๋น ์์ฒญ์ ๋ง๋ ํน์ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๋๋ก ๊ตฌํ
public void init(ServletConfig sc) throws ServletException{ Map<String, SubController> contList = new HashMap<>(); contList.put("/create.do", new MemberCreateController()); contList.put("/login.do", new LoginController()); ... } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcption, IOException{ String url = request.getRequestURI(); String contextPath = request.getContextPath(); String path = url.substring(contextPath.length()); SubController subController = conList.get(path); subController.process(request, response); } // ์๋ธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ด์ํ๋ Front ์ปจํธ๋กค๋ฌ ์ค๊ณ // ์๋ธ ์ปจํธ๋กค๋ฌ์ ๊ท๊ฒฉ์ ์ ์ํ ์ธํฐํ์ด์ค ํ์ public interface Subcontroller{ void process(HttpServletRequest request, HttpServletResponse response); } // ํ์ํ ์๋ธ ์ปจํธ๋กค๋ฌ ๊ตฌํ // ์์ ๋ค์ค ์์ฒญ ์ฒ๋ฆฌ ์๋ธ๋ฆฟ์ ์๋ธ ์ปจํธ๋กค๋ฌ ๊ท๊ฒฉ์ ๋ง๊ฒ ์์ public class MemberController implements Subcontroller{ void process(HttpServletRequest request, HttpServletResponse response){ ... } }
- ์๋ธ ์ปจํธ๋กค๋ฌ ๊ตฌํ
- ์ ์ฒด ์์คํ
์ ์ธ๋ถ ์์คํ
์ด ๋ถ๋ฆฌ๋์ด ์๋ ๊ฒฝ์ฐ
- URL์ ํ๋ผ๋ฏธํฐ ์ด์ฉ
- ์
๋ ฅ ๊ฐ ํธ๋ค๋ง
- ์๋ธ๋ฆฟ์์ ํด๋ผ์ด์ธํธ์ ์
๋ ฅ ๊ฐ์ ์ฒ๋ฆฌํ๋ ค๋ฉด
request.getParameter()
์ด์ฉ- ํ์๊ฐ์
๊ฐ์ด ์ฌ๋ฌ ์ ๋ณด๊ฐ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์
request.getParameter()
๋ก ๋ฐ๋๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์
- ํ์๊ฐ์
๊ฐ์ด ์ฌ๋ฌ ์ ๋ณด๊ฐ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์
- DAO ํด๋์ค์ ์ฐ๋์ ์ํด์๋ ์ ๋ ฅ ๊ฐ์ Member ๊ฐ์ฒด๋ก ๋ง๋ ํ์ ์ ๋ฌํด์ผ ํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋ ๊ตฌํ์ด ํ์
doGet(...){ Member m = new Member(); m.setName(request.getParameter("name")); m.setTel(request.getParameter("tel")); ... dao.create(m); }
- JSP์์๋ useBean ์ก์ ์ ํตํด ์ ๋ ฅ ๊ฐ์ Member ๊ฐ์ฒด๋ก ์ฝ๊ฒ ์ ์ฅ ๊ฐ๋ฅ
- ์๋ธ๋ฆฟ์์๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
- ๋ํ์ ์ผ๋ก Apache Commons BeanUtils ์ฌ์ฉ
doGet(...){ Member m = new Member(); BeanUtils.populate(m, request.getParameterMap()); ... dao.create(m); }
- ์๋ธ๋ฆฟ์์ ํด๋ผ์ด์ธํธ์ ์
๋ ฅ ๊ฐ์ ์ฒ๋ฆฌํ๋ ค๋ฉด
- ๋ทฐ ์ด๋
- ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ค์์๋ ์ ์ ํ ๋ทฐ๋ก ์ด๋ํ ์ ์์ด์ผ ํจ
- ๋ทฐ์์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ์ด๋ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ก ๋๋จ
- ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ
- ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ ํ ๋ณ๋์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์๋๋ค๋ฉด ํด๋น ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ (Redirection) ํ ์ ์์
- jsp, ์๋ธ๋ฆฟ ๋ชจ๋
response.sendRedirect()
์ฌ์ฉ
response.sendRedirect('main.jsp');
- ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ
- request scope ์์ฑ์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅ ํ ์ํ๋ ํ์ด์ง๋ก forwarding
- ๋ฐ์ดํฐ ํ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ session ๋๋ applictaion์ ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋๊ฒ๋ ๊ฐ๋ฅ
doGet(...){ ... request.setAttribute("member", m); RequestDispatcher dispatcher = request.getRequestDispatcher("userInfo.jsp"); dispatcher.forward(request, response); }
- ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ
3. [์ค์ต 8-1] ์ปจํธ๋กค๋ฌ ๊ธฐ์ด ์์ : ๊ณ์ฐ๊ธฐ ๊ตฌํ
์ปจํธ๋กค๋ฌ ๊ธฐ์ด ์์ : ๊ณ์ฐ๊ธฐ ๊ตฌํ
- View ๊ตฌํ: calForm.html, calcResult.jsp
- calForm.html
...<form method="post" action="/jwbook/calcControl" >...</form>...
- calcResult.jsp
...๊ฒฐ๊ณผ: ${result}...
- calForm.html
- Model ๊ตฌํ: Calculator.java
- Controller ๊ตฌํ: CalcController.java
- CalcController.java
...@WebServlet("/calcControl") ...request.serAttribute("result", result); getServletContext().getRequestDispatcher("/ch08/calcResult.jsp").forward(request,response);
4. [์ค์ต 8-2] ๊ณ ๊ธ ์ปจํธ๋กค๋ฌ ์๋ธ๋ฆฟ ๊ตฌํ
๊ณ ๊ธ ์ปจํธ๋กค๋ฌ ์๋ธ๋ฆฟ ๊ตฌํ
- View ๊ตฌํ: productList.jsp, productInfo.jsp
- productList.jsp
... <c:forEach var="p" varStatus="i" items="${products}"> <tr> <td>${i.count}</td> <td><a href="/jwbook/pcontrol?action=info&id=${p.id}">${p.name}</a></td> <td>${p.price}</td> </tr> </c:forEach> ...
- productInfo.jsp
... <ul> <li>์ํ์ฝ๋: ${p.id}</li> <li>์ํ๋ช : ${p.name}</li> <li>์ ์กฐ์ฌ: ${p.maker}</li> <li>๊ฐ๊ฒฉ: ${p.price}</li> <li>๋ฑ๋ก์ผ: ${p.date}</li> </ul> ...
- Model ๊ตฌํ: Product.java, ProductService.java
- ProductService.java
import java.util.HashMap; import java.util.Map; public class ProductServie{ Map<String, Product> products = new HashMap<>(); public ProductService(){ Product p = new Product("...") this.products.put("101",p); ... } public List<Product> findAll(){ return new ArrayList<>(products.values()); } public Product find(String id){ return products.get(id); } }
- Controller ๊ตฌํ: ProdutController.java
- ProductController.java
@WebServlet("/pcontorl") public class ProductController extends HttpServlet{ private static final long serialVersionUID = 1L; ProductService = service; ... public ProductController(){ service = new ProductService(); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String action = request.getParameter("action"); String view = ""; if (request.getParameter("action") == null){ getServletContext().getRequestDispatcher("/pcontrol?action=list").forward(request, response); } else{ switch(action){ case "list": view = list(request,response); break; case "info": view = info(request,response); break; } getServletContext().getRequestDispatcher("/ch08/" + view).forward(request,response); } } private String info(HttpServletRequest request, HttpServletResponse response){ request.setAttribute("p", service.find(request.getParameter("id"))); return "productInfo.jsp" } private String list(HttpServletRequest request, HttpServletResponse response){ request.setAttribute("products", service.findAll()); return "productList.jsp" } }
๋๊ธ๋จ๊ธฐ๊ธฐ