1) ๋ ์ด์ด๋ ์ํคํ ์ฒ๋?
Controller์์ ์ค๋ณต๋๋ ๋ถ๋ถ์ ์ฒ๋ฆฌํ๋ ค๋ฉด?
-
๋ณ๋์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํฉ๋๋ค.
-
๋ณ๋์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํฉ๋๋ค.
-
์๋ฅผ ๋ค์ด ์ผํ๋ชฐ์์ ๊ฒ์ํ์์๋ ํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ํ ๋ชฉ๋ก ๋ณด๊ธฐ์์๋ ํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค๋ฉด ํ์ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ปจํธ๋กค๋ฌ์ ์๋น์ค
-
๋น์ง๋์ค ๋ฉ์๋๋ฅผ ๋ณ๋์ Service๊ฐ์ฒด์์ ๊ตฌํํ๋๋ก ํ๊ณ ์ปจํธ๋กค๋ฌ๋ Service๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.

์๋น์ค(Service)๊ฐ์ฒด๋?
๋น์ง๋์ค ๋ก์ง(Business logic)์ ์ํํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์๋น์ค ๊ฐ์ฒด๋ผ๊ณ ํฉ๋๋ค.
๋ณดํต ํ๋์ ๋น์ง๋์ค ๋ก์ง์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋์ํฉ๋๋ค.
ํธ๋์ญ์ (Transaction)์ด๋?
ํธ๋์ญ์ ์ ํน์ง์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
-
์์์ฑ (Atomicity) ์ ์ฒด๊ฐ ์ฑ๊ณตํ๊ฑฐ๋ ์ ์ฒด๊ฐ ์คํจํ๊ฑฐ๋
-
์ผ๊ด์ฑ (Consistency) ํ๋์ ํธ๋์ญ์ ๊ฒฐ๊ณผ๊ฐ.
-
๋ ๋ฆฝ์ฑ (Isolation) ๋ ์ด์์ ํธ๋์ญ์ ๋์ ๋ณํ ์คํ์ผ ๋ - ์๋ฃ ์ ๊น์ง๋ ๋ชฐ๋ผ
-
์ง์์ฑ (Durability) ํธ๋์ญ์ ์ด ์๋ฃ๋๋ฉด ์๊ตฌ์ ์ ๋ณด
์์์ฑ (Atomicity)
์๋ฅผ ๋ค์ด "์ถ๊ธ"์ด๋ผ๋ ๊ธฐ๋ฅ์ ํ๋ฆ์ด ๋ค์๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํด๋ด ์๋ค.
-
์์ก์ด ์ผ๋ง์ธ์ง ์กฐํํ๋ค.
-
์ถ๊ธํ๋ ค๋ ๊ธ์ก์ด ์์ก๋ณด๋ค ์์์ง ๊ฒ์ฌํ๋ค.
-
์ถ๊ธํ๋ ค๋ ๊ธ์ก์ด ์์ก๋ณด๋ค ์๋ค๋ฉด (์์ก - ์ถ๊ธ์ก)์ผ๋ก ์์ ํ๋ค.
-
์ธ์ , ์ด๋์ ์ถ๊ธํ๋์ง ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
-
์ฌ์ฉ์์๊ฒ ์ถ๊ธํ๋ค.
์์ ์์ ์ด 4๋ฒ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
4๋ฒ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์์ ์์ ์ ๋ชจ๋ ์๋๋๋ก ๋ณต์์ ์์ผ์ผ ํฉ๋๋ค.
์ด๋ฅผ rollback์ด๋ผ๊ณ ํฉ๋๋ค.
5๋ฒ๊น์ง ๋ชจ๋ ์ฑ๊ณตํ์ ๋๋ง ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ฐ์ํด์ผ ํฉ๋๋ค.
์ด๋ฅผ commit ํ๋ค๊ณ ํฉ๋๋ค.
์ด๋ ๊ฒ rollback ํ๊ฑฐ๋ commit์ ํ๊ฒ ๋๋ฉด ํ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ฉ๋๋ค.
์ผ๊ด์ฑ (Consistency)
์ผ๊ด์ฑ์ ํธ๋์ญ์ ์ ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ํธ๋์ญ์ ์ด ์งํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ฒ์์ ํธ๋์ญ์ ์ ์งํํ๊ธฐ ์ํด ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ก ์งํ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๊ฐ ์ฌ์ฉ์๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋ ๊ฒ์ ๋๋ค.
๋ ๋ฆฝ์ฑ (Isolation)
๋ ๋ฆฝ์ฑ์ ๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ๋ณํ ์คํ๋๊ณ ์์ ๊ฒฝ์ฐ์ ์ด๋ ํ๋์ ํธ๋์ญ์ ์ด๋ผ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ ๋ผ์ด๋ค ์ ์์ต๋๋ค.
ํ๋์ ํน์ ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํน์ ํธ๋์ญ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ง์์ฑ (Durability)
์ง์์ฑ์ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ฌ์ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํ๋ค๋ ์ ์ ๋๋ค.
JDBC ํ๋ก๊ทธ๋๋ฐ์์ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
DB์ ์ฐ๊ฒฐ๋ ํ Connection๊ฐ์ฒด์ setAutoCommit๋ฉ์๋์ false๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํฉ๋๋ค.
์ ๋ ฅ, ์์ , ์ญ์ SQL์ด ์คํ์ ํ ํ ๋ชจ๋ ์ฑ๊ณตํ์ ๊ฒฝ์ฐ Connection์ด ๊ฐ์ง๊ณ ์๋ commit()๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ํ๊ธฐ ์ํด์์ด๋ค.
@EnableTransactionManagement
Spring Java Configํ์ผ์์ ํธ๋์ญ์ ์ ํ์ฑํ ํ ๋ ์ฌ์ฉํ๋ ์ ๋ ธํ ์ด์ ์ ๋๋ค.
Java Config๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด PlatformTransactionManager ๊ตฌํ์ฒด๋ฅผ ๋ชจ๋ ์ฐพ์์ ๊ทธ ์ค์ ํ๋๋ฅผ ๋งคํํด ์ฌ์ฉํฉ๋๋ค.
ํน์ ํธ๋์ญ์ ๋ฉ๋์ ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด TransactionManagementConfigurer๋ฅผ Java Configํ์ผ์์ ๊ตฌํํ๊ณ ์ํ๋ ํธ๋์ญ์ ๋ฉ๋์ ๋ฅผ ๋ฆฌํดํ๋๋ก ํฉ๋๋ค.
์๋๋ฉด, ํน์ ํธ๋์ญ์ ๋ฉ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑ์ @Primary ์ ๋ ธํ ์ด์ ์ ์ง์ ํฉ๋๋ค.
์๋น์ค ๊ฐ์ฒด์์ ์ค๋ณต์ผ๋ก ํธ์ถ๋๋ ์ฝ๋์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ์์ธ์ค ๋ฉ์๋๋ฅผ ๋ณ๋์ Repository(Dao) ๊ฐ์ฒด์์ ๊ตฌํํ๋๋ก ํ๊ณ Service๋ Repository๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.

presentation layer์์๋ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๊ฐ ๋์ํ๊ฒ ํ๋ค.
Service Layer์์๋ ๋น์ฆ๋์ค ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋น์ค ๊ฐ์ฒด๊ฐ ๋์ํ๊ฒ ํ๋ค.
Repository Layer์์๋ db๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. (DAO)
์ค์ ์ ๋ถ๋ฆฌ
Spring ์ค์ ํ์ผ์ ํ๋ฆฌ์ ํ ์ด์ ๋ ์ด์ด์ชฝ๊ณผ ๋๋จธ์ง๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
web.xml ํ์ผ์์ ํ๋ฆฌ์ ํ ์ด์ ๋ ์ด์ด์ ๋ํ ์คํ๋ง ์ค์ ์ DispathcerServlet์ด ์ฝ๋๋ก ํ๊ณ ,
๊ทธ ์ธ์ ์ค์ ์ ContextLoaderListener๋ฅผ ํตํด์ ์ฝ๋๋ก ํฉ๋๋ค.
DispatcherServlet์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ 2๊ฐ ์ด์ ์ค์ ํ ์ ์๋๋ฐ
์ด ๊ฒฝ์ฐ์๋ ๊ฐ๊ฐ์ DispathcerServlet์ ApplicationContext๊ฐ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์
๊ฐ๊ฐ์ ์ค์ ํ์ผ์์ ์์ฑํ ๋น์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋์์ ํ์ํ ๋น์ ContextLoaderListener๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๊ฒ ํ ์ ์์ต๋๋ค.
ContextLoaderListener์ DispatcherServlet์ ๊ฐ๊ฐ ApplicationContext๋ฅผ ์์ฑํ๋๋ฐ, ContextLoaderListener๊ฐ ์์ฑํ๋ ApplicationContext๊ฐ root์ปจํ ์คํธ๊ฐ ๋๊ณ DispatcherServlet์ด ์์ฑํ ์ธ์คํด์ค๋ root์ปจํ ์คํธ๋ฅผ ๋ถ๋ชจ๋ก ํ๋ ์์ ์ปจํ ์คํธ๊ฐ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก, ์์ ์ปจํ ์คํธ๋ค์ root์ปจํ ์คํธ์ ์ค์ ๋น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ด๋ จ ํ์ผ ๋งํฌ: web.xml
2) ๋ ์ด์ด๋ ์ํคํ ์ฒ ์ค์ต
ํต์ฌ ๊ฐ๋
-
@Controller
-
@Service
-
@Repository
-
@Transactional
๋ฐฉ๋ช ๋ก ๋ง๋ค๊ธฐ ์ค์ต
์ฝ๋ ์ค์ต: guestbook05
<์๊ตฌ์ฌํญ>
Spring JDBC๋ฅผ ์ด์ฉํ Dao ์์ฑ
controller + service + dao ๋ก ๋ ์ด์ด๋ ์ํคํ ์ณ
ํธ๋์ญ์ ์ฒ๋ฆฌ
Spring MVC์์ ํผ ๊ฐ ์ ๋ ฅ๋ฐ๊ธฐ
Spring MVC์์ redirect ํ๊ธฐ
Controller์์ jsp์๊ฒ ์ ๋ฌํ ๊ฐ์ JSTL๊ณผ EL์ ์ด์ฉํด ์ถ๋ ฅํ๊ธฐ
๋ฐฉ๋ช ๋ก ์ ๋ณด๋ guestbook ํ ์ด๋ธ์ ์ ์ฅ๋๋ค.
id๋ ์๋์ผ๋ก ์ ๋ ฅ๋๋ค.
id, ์ด๋ฆ, ๋ด์ฉ, ๋ฑ๋ก์ผ์ ์ ์ฅํ๋ค
http://localhost:8080/guestbook/ ์ ์์ฒญํ๋ฉด ์๋์ผ๋ก /guestbook/list ๋ก redirecting ํ๋ค
๋ฐฉ๋ช ๋ก์ด ์์ผ๋ฉด ๊ฑด์๋ 0์ด ๋์ค๊ณ ์๋์ ๋ฐฉ๋ช ๋ก์ ์ ๋ ฅํ๋ ํผ์ด ๋ณด์ฌ์ง๋ค.
์ด๋ฆ๊ณผ ๋ด์ฉ์ ์ ๋ ฅํ๊ณ , ๋ฑ๋ก๋ฒํผ์ ๋๋ฅด๋ฉด /guestbook/write URL๋ก ์ ๋ ฅํ ๊ฐ์ ์ ๋ฌํ์ฌ ์ ์ฅํ๋ค.
๊ฐ์ด ์ ์ฅ๋ ์ดํ์๋ /guestbook/list๋ก redirect ๋๋ค.
์ ๋ ฅํ ํ ๊ฑด์ ์ ๋ณด๊ฐ ๋ณด์ฌ์ง๋ค
๋ฐฉ๋ช ๋ก ๋ด์ฉ๊ณผ ํผ ์ฌ์ด์ ์ซ์๋ ๋ฐฉ๋ช ๋ก ํ์ด์ง ๋งํฌ. ๋ฐฉ๋ช ๋ก 5๊ฑด๋น 1ํ์ด์ง๋ก ์ค์
1 ํ์ด์ง๋ฅผ ๋๋ฅด๋ฉด /guestbook/list?start=0์ ์์ฒญํ๊ณ (==/guestbook/list)
2 ํ์ด์ง๋ฅผ ๋๋ฅด๋ฉด /guestbook/list?start=5๋ฅผ ์์ฒญํ๊ฒ ๋๋ค.
๋ฐฉ๋ช ๋ก์ ๊ธ์ ์ฐ๊ฑฐ๋, ๊ธ์ ์ญ์ ํ ๋๋ log ํ ์ด๋ธ์ ํด๋ผ์ด์ธํธ์ ip์ฃผ์, ๋ฑ๋ก(์ญ์ ) ์๊ฐ, ๋ฑ๋ก/์ญ์ (method ์นผ๋ผ) ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค. id๋ ์๋์ผ๋ก ์ ๋ ฅ๋๋๋ก ํ๋ค.
Class Diagram
4๊ฐ๊ฐ ์ค์ ํ์ผ
์น ๋ ์ด์ด ์ค์ ํ์ผ: web.xml, WebMvcContextConfiguration.java
๋น์ง๋์ค, ๋ ํ์งํ ๋ฆฌ ๋ ์ด์ด ์ค์ ํ์ผ: ApplicationConfig.java, DbConfig.java
web.xml: DispatcherServlet์ด ์ฝ์ด๋ค์ด๋ WebMvcContextConfigurationํ์ผ๊ณผ
ApplicationContextListener๊ฐ ์ฝ์ด๋ค์ผ ApplicationConfig ํ์ผ์ ์ค์ ํ๋ค.
ApplicationConfig.java ๋ DbConfig importํ๋ค.

URL ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ์ธ GuestbookController
์ด๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ ์๋น์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.

์ค์ ํ์ผ
web.xml
(package: kr.or.connect.guestbook.config)์
WebMvcContextConfiguration.java
DBConfig.java
ApplicationConfig.java
์ปจํธ๋กค๋ฌ
(package: kr.or.connect.guestbook.controller)์
GuestbookController.java
์๋น์ค
(package: kr.or.connect.guestbook.service)์
GuestbookService.java
(package: kr.or.connect.guestbook.service.impl)์
GuestbookServiceImpl.java
๊ด๋ จ ํ
์คํธ ํ์ผ GuestbookServiceTest.java
Dto
(package: kr.or.connect.guestbook.dto)์
Guestbook.java
Log.java
Dao
(package: kr.or.connect.guestbook.dao)์
LogDao.java
GuestbookDaoSqls.java
GuestbookDao.java
๊ด๋ จ ํ
์คํธ ํ์ผ GuestbookDaoTest.java
๋ทฐ
index.jsp
list.jsp
Maven ํ๋ก์ ํธ ์์ฑ ์ ์๋์ผ๋ก ์ค์ ๋์ง ์์์ ๊ท์ฐฎ์ ์์ ๋ค์ ์ํํด์ผํ๋ค.
Dynamic Web Project๋ก ์์ฑํ๊ณ Maven์ผ๋ก convert ์ํค๋ ๋ฐฉ๋ฒ๋ ์๋ค.
ํ์ง๋ง ๋ ์ธํ ๋ฆฌ์ ์ด๋ก ๊ฐ์ํ๋ค. ใ ใ
'Spring > Boost Course Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4.5 Swagger (0) | 2020.11.19 |
---|---|
4.4 Controller (0) | 2020.11.19 |
4.3 WEB API (0) | 2020.11.19 |
4.1 Spring MVC (0) | 2020.11.19 |
3.3 Spring JDBC (0) | 2020.11.19 |
3.2 Spring Test (0) | 2020.11.19 |