2022 02 02 - oneso123456789/2022 GitHub Wiki
other
part 3 ๊ธฐ๋ณธ์ ์ธ ์น ๊ฒ์๋ฌผ ๊ด๋ฆฌ
์ค์ ๋ด์ฉ
- ์คํ๋ง MVC๋ฅผ ์ด์ฉํ๋ ์น ํ๋ก์ ํธ ์ ์ฒด ๊ตฌ์กฐ์ ๋ํ ์ดํด
- ๊ฐ๋ฐ์ ๊ฐ ๋จ๊ณ์ ํ์ํ ์ค์ ๋ฐ ํ ์คํธ ํ๊ฒฝ
- ๊ธฐ๋ณธ์ ์ธ ๋ฑ๋ก, ์์ , ์ญ์ , ์กฐํ, ๋ฆฌ์คํธ ๊ตฌํ
- ๋ชฉ๋ก(๋ฆฌ์คํธ) ํ๋ฉด์ ํ์ด์ง(paging)์ฒ๋ฆฌ
- ๊ฒ์ ์ฒ๋ฆฌ์ ํ์ด์ง ์ด๋
์คํ๋ง MVC ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ
์์ ๋ฅผ ์์ฑํ๊ธฐ์ ์์์ ์คํ๋ง MVC๋ฅผ ์ด์ฉํ๋ ํ๋ก์ ํธ์ ๊ตฌ์ฑ์ ์ดํดํ๋ ์ผ์ ์ ์ฒด ๋ฐ์ดํฐ์ ํ๋ฆ์
๋ณด๊ธฐ ์ํด์์
๋ธ๋ผ์ฐ์ ์์ ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์คํ๋ง MVC์ ์ด๋ค ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์คํ๋๋์ง๋ฅผ ์ดํดํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋
๋น ๋ฅธ ๋์ฒ์ ๋์์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์
์ผ๋ฐ์ ์ผ๋ก ์น ํ๋ก์ ํธ๋ 3-tier(ํฐ์ด)๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํจ
164p ๊ทธ๋ฆผ์ Presentation <-> Business <-> Persistence ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ค๋๋ป
Presentation Tier(ํ๋ฉด ๊ณ์ธต): ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ์์ญ
์ฑ
์์ Servlet/JSP๋ ์คํ๋ง MVC๊ฐ ๋ด๋นํ๋ ์์ญ์ด ๋จ
presentation Tier๋ ํ๋ก์ ํธ์ ์ฑ๊ฒฉ์ ๋ง์ถฐ ์ฑ์ผ๋ก ์ ์ํ๊ฑฐ๋, CS(Client-Server)๋ก ๊ตฌ์ฑ๋จ
์ด์ ํํธ์์ ํ์ตํ ์คํ๋ง MVC์ JSP๋ฅผ ์ด์ฉํ ํ๋ฉด ๊ตฌ์ฑ์ด ์ด์ ์ํจ
Business Tier(๋น์ฆ๋์ค ๊ณ์ธต): ์์ํ ๋น์ง๋์ค ๋ก์ง์ ๋ด๊ณ ์๋ ์์ญ
์ด ์์ญ์ด ์ค์ํ ์ด์ ๋ ๊ณ ๊ฐ์ด ์ํ๋ ์๊ตฌ ์ฌํญ์ ๋ฐ์ํ๋ ๊ณ์ธต์ด๊ธฐ ๋๋ฌธ
์ด ์์ญ์ ์ค๊ณ๋ ๊ณ ๊ฐ์ ์๊ตฌ์ฌํญ๊ณผ ์ ํํ ์ผ์นํด์ผํจ
์ด ์์ญ์ ์ฃผ๋ก XXXService
์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑํ๊ณ
๋ฉ์๋์ ์ด๋ฆ ์ญ์ ๊ณ ๊ฐ๋ค์ด ์ฌ์ฉํ๋ ์ฉ์ด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋๋ก ํ๋๊ฒ ์ข์
Persistence Tier(์์ ๊ณ์ธต ํน์ ๋ฐ์ดํฐ ๊ณ์ธต): ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ณด๊ดํ๊ณ ,
์ฌ์ฉํ๋๊ฐ์ ๋ํ ์ค๊ณ๊ฐ ๋ค์ด๊ฐ๋ ๊ณ์ธต
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง์ด ์ด์ฉํ์ง๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋คํธ์ํฌ ํธ์ถ์ด๋ ์๊ฒฉ ํธ์ถ๋ฑ์ ๊ธฐ์ ์ด ์ ๋ชฉ๋จ
์ด ์์ญ์ MyBatis์ mybatis-spring์ ์ด์ฉํด์ ๊ตฌ์ฑํ๋ ํํธ1์ ์ด์ฉํจ
๊ณ์ธต์ ๋ํ ์ค๋ช ์ ์คํ๋ง MVC์ ๋ง์ถฐ์ ์ค๋ช ํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋จ
Spring MVC <->Spring Core <-> MyBatis <-> DB
^
|
v
Spring-mybatis(Spring Core์ ์ํจ)
์คํ๋ง MVC ์์ญ์ Presentation Tier๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋๋๋ฐ, ๊ฐ ์์ญ์ ์ฌ์ค ๋ณ๋์ ์ค์ ์ ๊ฐ์ง๋ ๋จ์๋ก ๋ณผ ์ ์์
์ด์ ์์ ์์ root-context.xml, servlet-context.xml
๋ฑ์ ์ค์ ํ์ผ์ด ํด๋น ์์ญ์ ์ค์ ์ ๋ด๋นํ์
์คํ๋ง ์ฝ์ด ์์ญ์ ํํ POJO(Plain-Old-Java-Object)์ ์์ญ์
์คํ๋ง์ ์์กด์ฑ ์ฃผ์
์ ์ด์ฉํด์ ๊ฐ์ฒด ๊ฐ์ ์ฐ๊ด๊ตฌ์กฐ๋ฅผ ์์ฑํด์ ์ฌ์ฉํจ
MyBatis ์์ญ์ ํ์ค์ ์ผ๋ก๋ mybatis-spring์ ์ด์ฉํด์ ๊ตฌ์ฑ SQL์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ตฌ์กฐ์
๊ฐ ์์ญ์ Naming Convention(๋ช ๋ช ๊ท์น)
ํ๋ก์ ํธ๋ฅผ ์์ ๊ฐ์ด 3-tier๋ก ๊ตฌ์ฑํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ค๋ช
์ '์ ์ง ๋ณด์'์ ๋ํ ํ์์ฑ ๋๋ฌธ์
๊ฐ ์์ญ์ ๋
๋ฆฝ์ ์ผ๋ก ์ค๊ณ๋์ด ๋์ค์ ํน์ ํ ๊ธฐ์ ์ด ๋ณํ๋๋ผ๋ ํ์ํ ๋ถ๋ถ์
์ ์์ ํ์ ๋ถํ์ฒ๋ผ ์ฝ๊ฒ ๊ตํํ ์ ์๊ฒ ํ์๋ ๋ฐฉ์์
๋ฐ๋ผ์ ๊ฐ ์์ญ์ ์ค๊ณ ๋น์๋ถํฐ ์์ญ์ ๊ตฌ๋ถํ๊ณ , ํด๋น ์ฐ๊ฒฐ ๋ถ์๋
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ์ค๊ณํ๋๊ฒ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ๋ฐฉ์์
ํ๋ก์ ํธ ์งํ ๋ค์ด๋ฐ ๊ท์น
- xxxController: ์คํ๋ง MVC์์ ๋์ํ๋ Controller ํด๋์ค๋ฅผ ์ค๊ณํ ๋ ์ฌ์ฉํจ
- xxxService, xxxServiceImpl: ๋น์ฆ๋์ค ์์ญ์ ๋ด๋นํ๋
์ธํฐํ์ด์ค๋ 'xxxService'๋ผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ,
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋xxxServiceImpl
์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํจ - xxxDAO, XXXRepository: DAO(Data-Access-Object)๋ Repository(์ ์ฅ์)๋ผ๋ ์ด๋ฆ์ผ๋ก
์์ญ์ ๋ฐ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋ณดํธ์ ์
๋ค๋ง ์ฑ ์ ์์ ๋ ๋ณ๋์ DAO๋ฅผ ๊ตฌ์ฑํ๋ ๋์ ์ MyBatis์ Mapper ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํจ - VO, DTO: VO์ DTO๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฌํ ์๋ฏธ๋ก ์ฌ์ฉํ๋ ์ฉ์ด๋ก, ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด๋ฅผ
์๋ฏธํ๋ค๋ ๊ณตํต์ ์ด ์์, ๋ค๋ง VO์ ๊ฒฝ์ฐ๋ ์ฃผ๋ก Read Only์ ๋ชฉ์ ์ด ๊ฐํ๊ณ ,
๋ฐ์ดํฐ ์์ฒด๋ Immutable(๋ถ๋ณ)ํ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ ์์
DTO๋ ์ฃผ๋ก ๋ฐ์ดํฐ ์์ง์ ์ฉ๋๊ฐ ์ข ๋ ๊ฐํจ ์๋ฅผ ๋ค์ด, ์น ํ๋ฉด์์ ๋ก๊ทธ์ธ ํ๋ ์ ๋ณด๋ฅผ
DTO๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํจ ์ด ์ฑ ์์ ํ ์ด๋ธ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ VO๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ฒ ์
ํจํค์ง์ Naming Convention
ํจํค์ง์ ๊ตฌ์ฑ์ ํ๋ก์ ํธ์ ํฌ๊ธฐ๋ ๊ตฌ์ฑ์๋ค์ ์ฑํฅ์ผ๋ก ๊ฒฐ์ ํจ
์๋ฅผ ๋ค์ด, ๊ท๋ชจ๊ฐ ์์ ํ๋ก์ ํธ๋ Controller ์์ญ์ ๋ณ๋์ ํจํค์ง๋ก ์ค๊ณํ๊ณ ,
Service ์์ญ ๋ฑ์ ํ๋์ ํจํค์ง๋ก ์ค๊ณํ ์ ์์
๋ฐ๋ฉด์, ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ ธ์ ๋ง์ Service ํด๋์ค์ Controller๋ค์ด ํผ์ฌํ ์ ์๋ค๋ฉด
๋น์ฆ๋์ค๋ฅผ ๋จ์๋ณ๋ก ๊ตฌ๋ถํ๊ณ (๋น์ฆ๋์ค ๋จ์ ๋ณ๋ก ํจํค์ง๋ฅผ ์์ฑ)
๋ค์ ๋ด๋ถ์์ Controller ํจํค์ง, Service ํจํค์ง ๋ฑ์ผ๋ก ๋ค์ ๋๋๋ ๋ฐฉ์์ ์ด์ฉํจ
์ด๋ฐ ๋ฐฉ์์ ๋ด๋น์๊ฐ ๋ช
ํํด์ง๊ณ , ๋
๋ฆฝ์ ์ธ ์ค์ ์ ๊ฐ์ง๋ ํํ๋ก ๊ฐ๋ฐํ๊ธฐ ๋๋ฌธ์
ํฐ ๊ท๋ชจ์ ํ๋ก์ ํธ์ ์ ํฉํจ ๋ค๋ง
ํจํค์ง๊ฐ ๋ง์์ง๊ณ , ๊ตฌ์ฑ์ด ๋ณต์กํ๊ฒ ๋๊ปด์ง๋ ๋จ์ ์ด ์์
์ด ์ฑ ์ ์์ ๊ตฌ์ฑ์ PART 3 ์ดํ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ ๊ฒ์
com.crow.config: ํ๋ก์ ํธ์ ๊ด๋ จ๋ ์ค์ ํด๋์ค๋ค์ ๋ณด๊ด ํจํค์ง
com.crow.controller: ์คํ๋ง MVC์ Controller๋ค์ ๋ณด๊ด ํจํค์ง
com.crow.service: ์คํ๋ง์ Service ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค ํจํค์ง
com.crow.domain:VO, DTO ํด๋์ค๋ค์ ํจํค์ง
com.crow com.crow.persistence: MyBatis Mapper ์ธํฐํ์ด์ค ํจํค์ง
com.crow.exception: ์น ๊ด๋ จ ์์ธ์ฒ๋ฆฌ ํจํค์ง
com.crow.aop: ์คํ๋ง์ AOP ๊ด๋ จ ํจํค์ง
com.crow.security: ์คํ๋ง Security ๊ด๋ จ ํจํค์ง
com.crow.util: ๊ฐ์ข
์ ํธ๋ฆฌํฐ ํด๋์ค ๊ด๋ จ ํจํค์ง
ํ๋ก์ ํธ๋ฅผ ์ํ ์๊ตฌ์ฌํญ
ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ ์ ์ ๊ณ ๊ฐ์ ์๊ตฌ์ฌํญ์ ์ธ์ํ๊ณ , ์ด๋ฅผ ์ค๊ณํ๋ ๊ณผ์ ์ด ํ์ํจ
์ด๋ฅผ ํํ ์๊ตฌ์ฌํญ ๋ถ์ ์ค๊ณ๋ผ๊ณ ํ๋๋ฐ, ๊ณ ๊ฐ์ด ์ํ๋ ๋ด์ฉ์ด ๋ฌด์์ด๊ณ ,
์ด๋์ ๋๊น์ง ๊ตฌํํ ๊ฒ์ธ๊ฐ์ ๋ํ ํ๋ก์ ํธ์ ๋ฒ์๋ฅผ ์ ํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํจ
์๊ตฌ์ฌํญ์ ์ค์ ๋ก ์๋นํ ๋ฐฉ๋ํด ์ง ์ ์์ผ๋ฏ๋ก, ํ๋ก์ ํธ์์๋ ๋จ๊ณ๋ฅผ ์ ํํ ๊ตฌ๋ถํด ์ฃผ๋๊ฒ์ด ์ข์
๋ง์ผ ํ์๋ค์ด ๊ฒฝํ์ด ํ๋ถํ๋ค๋ฉด ์ด๊ธฐ ๋ฒ์ ์ ์๋นํ ๋ง์ ๊ธฐ๋ฅ์ ํฌํจ์์ผ ๊ฐ๋ฐ์ ์งํ
ํ ์ ์์ง๋ง, ๊ทธ๋ ์ง ๋ชปํ๋ค๋ฉด ์ต๋ํ ๋จ์ํ๊ณ ๋์ ๋ณด์ด๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ๋ด๋ ํํ๋ก ๊ฐ๋ฐํ ๊ฒ
์๊ตฌ์ฌํญ์ ์จ์ ํ ๋ฌธ์ฅ์ผ๋ก ์ ๋ฆฌํ๋ ๊ฒ์ด ์ข์
์ฃผ์ด๋ '๊ณ ๊ฐ'์ด๊ณ ๋ชฉ์ ์ด๋ '๋์'์ด ๋จ
์ฌ๊ธฐ์ '๋์'์ ๊ฒฐ๊ตญ ๋ฐ์ดํฐ์ ๋ฒ ์ด์ค ์ค๊ณ์ ์์คํ
์ค๊ณ์์ ๊ฐ์ฅ ์ค์ํ ์ฉ์ด๊ฐ๋จ
(๋ค๋ฅธ ์ฉ์ด๋ก๋ ๋๋ฉ์ธ(domain)์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์)
EX: ๊ฒ์ํ์ ์๊ตฌ์ฌํญ
- ๊ณ ๊ฐ์ ์๋ก์ด ๊ฒ์๋ฌผ์ ๋ฑ๋กํ ์ ์์ด์ผ ํ๋ค.
- ๊ณ ๊ฐ์ ํน์ ํ ๊ฒ์๋ฌผ์ ์กฐํํ ์ ์์ด์ผ ํ๋ค.
- ๊ณ ๊ฐ์ ์์ฑํ ๊ฒ์๋ฌผ์ ์ญ์ ํ ์ ์์ด์ผ ํ๋ค.
- ๊ธฐํ ๋ฑ๋ฑ
์ด ๊ฒฝ์ฐ '๋์'์ '๊ฒ์๋ฌผ'์ด ๋๋ฏ๋ก, ๊ฒ์๋ฌผ์ด๋ผ๋ ์ฉ์ด๊ฐ ํ์ํ๊ฒ ๋๊ณ ,
๊ฒ์๋ฌผ์ ๊ตฌ์กฐ๋ฅผ ํ๋จํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ์ค๊ณํจ
์๋ฅผ ๋ค์ด ๊ฒ์๋ฌผ์ ๊ฒฝ์ฐ 'tbl_board'๋ผ๋ ํ
์ด๋ธ์ ์ค๊ณํ๊ฒ ๋๊ณ ,
ํ
์ด๋ธ๊ณผ ๊ด๋ จ๋ VO ํด๋์ค ์ญ์ com.crow.domain.BoardVO์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ค๊ณ๋ ์ ์์
๊ฒ์๋ฌผ๊ณผ ๊ด๋ จ๋ ๋ก์ง์ com.crow.service.BoardService๊ฐ ๋ ์ ์๊ณ ,
com.crow.controller.BoardController๋ผ๋ ์ด๋ฆ์ ํด๋์ค๋ฅผ ์์ฑํ๋ ์ฐ์์ ์ธ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋จ