๐ง๐ป๐ป ๊ธ์ ์์ํ๊ธฐ์ ์์..
- ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ์์ ์์ฃผ ๋์ค๋ ์ง๋ฌธ์ ๋ชจ์ ํ ๋ฒ์ ์ ๋ฆฌํ ํฌ์คํธ์ ๋๋ค.
- ์ ์ ๊ฐ๋ฐ์ ๊ธฐ์ ๋ฉด์ ์ ์ค๋นํ๋ ์ฌ๋์ผ๋ก, ์ ํํ์ง ์์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ ์ฌ๋ฐ๋ฅธ ๋ต์ ์๊ณ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ฐ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
- ํ์๋ Java ๊ธฐ๋ฐ์ ๋ฐฑ์๋ ์์ง๋์ด๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธ ๋ด๋ถ์ Java ํน์ ๋ฐฑ์๋ ๊ด๋ จ ์ฉ์ด๊ฐ ๋์ฌ ์ ์์ต๋๋ค. Java๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, ์์ ์ ์ง๋ฌด ์ธ์ด ๋ฐ ํ๋ ์์ํฌ ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
๐ง๐ป๐ป ๋ฐฑ์๋ ๋ฉด์ ์ง๋ฌธ
๐ก Spring ํ๋ ์์ํฌ๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
์คํ๋ง ํ๋ ์์ํฌ๋ ์๋ฐ ํ๋ซํผ์ ์ํ ์คํ ์์ค ์ดํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ๋ก POJO ๊ธฐ๋ฐ์ ๋ฐํ์ผ๋ก, DI์ AOP, PSA๋ฅผ ์ง์ํ๋ ๊ฒฝ๋์ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋์ ์ธ ์น์ ๊ฐ๋ฐํ๊ธฐ ์ํ ์ฌ๋ฌ๊ฐ์ง ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ก IoC(Inversion of Control, ์ ์ด์ ์ญ์ )์ด ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
๊ฐ์ฒด์ ์์ฑ๋ถํฐ ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ฆฌ๊น์ง ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ ์ ์ด๊ถ์ด ๋ฐ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ ํํ ์ค๋ช ํ๋ฉด, ๋์์ธ ์์น ์ค ํ๋๋ก ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ค์ํ ์ข ๋ฅ์ ์ ์ด๋ฅผ ๋ฐ์ ์ํฌ ๊ฒ์ ๊ถ์ฅํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋์ ๊ธ ์ฐธ๊ณ .
๐ก DI(Dependency Injection, ์์กด๊ด๊ณ ์ฃผ์ )๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํด์ฃผ์ธ์.
IoC๊ฐ ๋์์ธ ์์น์ด๋ผ๋ฉด, DI๋ IoC๋ฅผ ๊ตฌํํ ๋ ์์ฃผ ๋ฑ์ฅํ๋ '๋์์ธ ํจํด' ์ค ํ๋์ ๋๋ค. DI๋ ์์กด ๊ด๊ณ ์ฃผ์ ์ผ๋ก, ์์กด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์์ฑ์๋ setter๋ฅผ ํตํด ๋ฃ์ด์ค์ผ๋ก์จ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์์ ์ ์ฃผ์
- ๋๋ถ๋ถ ์์กด ๊ด๊ณ ์ฃผ์ ์ ํ๋ฒ ์ผ์ด๋๋ฉด ์ข ๋ฃ์์ ๊น์ง ๋ณ๊ฒฝํ ์ผ์ด ๊ฑฐ์ ์๋ค.
- Setter๋ฅผ ํตํด ์ฃผ์ ํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ๋ ์ํ์ด ์กด์ฌ
- setter์ public์ผ๋ก ์ด์ด์ผํจ
- ์์ฑ์ ์ฃผ์
- ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅ
- ์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ ๊ฒ์ ๋ณด์ฅ
- final ํค์๋๋ฅผ ํตํด ๋ถ๋ณํ๊ฒ ์ค๊ณ ๊ฐ๋ฅ
- ์์กด์ฑ ์ฃผ์ ์ด ๋๋ฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์(IDE์์ ์ปดํ์ผ ์ค๋ฅ๋ก ์๋ ค์ค)
์์ธํ ๋ด์ฉ์ ์๋์ ๊ธ ์ฐธ๊ณ .
๐ก Spring์์ IoC์ DI๋ฅผ ์ด๋ป๊ฒ ์ง์ํด ์ฃผ๋์ง์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์คํ๋ง์ IoC์ DI๋ฅผ DI(IoC) Container๋ก์จ ์ ๊ณตํฉ๋๋ค. ํด๋์ค ์ฌ์ด์ ์์กด ๊ด๊ณ๋ฅผ Bean ์ค์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํฉ๋๋ค.
- ์ฅ์
- ์คํ๋ง ์์ฒด์์ ์ค์ ์ ํตํด ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด์ค์ผ๋ก์จ ๊ฐ์ฒด๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ค๋ค.
- ํด๋์ค์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ์ ์ง๋ณด์๊ฐ ํธ๋ฆฌํด์ง๋ค.
- ์์กด์ฑ ์ฃผ์ ์ผ๋ก ์ธํด stub, mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด unit ํ ์คํธ์ ์ด์ ์ด ์๊ธด๋ค.
- ๋จ์
- ์์กด์ฑ ์ฃผ์ ์ ์ํ ์ ํ ์์ ์ด ํ์ํด ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์์๋ ๋ฒ๊ฑฐ๋กญ๋ค.
- ์ฝ๋ ์ถ์ ์ด ์ด๋ ต๋ค.
DI ์ปจํ ์ด๋๋, ์๋ฐ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์์ฑ๋ ์๋ฐ ๊ฐ์ฒด๋ค์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ข ๋ฅ๋, BeanFactory์ ApplicationContext๊ฐ ์์ต๋๋ค. ApplicationContext๊ฐ BeanFactory์ ๋น ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์์ ๋ฐ๊ณ ๊ตญ์ ํ ๋ฑ์ ์ถ๊ฐ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ด ApplicationContext๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋์ ๊ธ ์ฐธ๊ณ .
๐ก Bean ๊ฐ์ฒด์ Bean ์๋ช ์ฃผ๊ธฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
DI ์ปจํ ์ด๋ ๋ด๋ถ์ ์กด์ฌํ๋ฉฐ ๊ด๋ฆฌ๋ฅผ ๋ฐ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. @Bean ์ด๋ ธํ ์ด์ ์ ๋ฑ๋กํด ์ฌ์ฉํ๊ฑฐ๋, xml์ ํตํด ๋ฑ๋กํ ์ ์์ต๋๋ค. Bean์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ ์ฝ๊ฒ ์ฃผ์ ํ์ฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
Bean์ ์๋ช ์ฃผ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ → ์คํ๋ง ๋น ์์ฑ → ์์กด ๊ด๊ณ ์ฃผ์ → ์ด๊ธฐํ ์ฝ๋ฐฑ → ์ฌ์ฉ → ์๋ฉธ ์ ์ฝ๋ฐฑ → ์คํ๋ง ์ข ๋ฃ
- ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
- ์คํ๋ง ์ปจํ ์ด๋ ์ด๊ธฐํ ์ ๋น ๊ฐ์ฒด ์์ฑ, ์์กด ๊ฐ์ฒด ์ฃผ์ ๋ฐ ์ด๊ธฐํ
- ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์
๊ณผ ์ด๊ธฐํ ๋ถ๋ฆฌ
- ์์กด๊ด๊ณ ์ฃผ์ (์์ฑ์ ์ฃผ์ )์ ํ์์ ๋ณด๋ฅผ ๋ฐ๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํตํด ๊ฐ์ฑ ์์ฑ ์ฑ ์
- ์ด๊ธฐํ๋ ์์ฑ๋ ๊ฐ๋ค์ ํ์ฉํด ์ธ๋ถ ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ๋ ๋ฑ ๋ฌด๊ฑฐ์ด ์์ ์ํ
- ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ์ง๋ณด์ ๊ด์ ์์ ์ข๋ค.
- ์ฑ๊ธํค ๋น๋ค์ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์๋ฉธ์ ์ฝ๋ฐฑ์ด ๋ฐ์
๐ก Annotation์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
ํ๋ก๊ทธ๋จ์๊ฒ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. annotation์ ์ ์ํ๊ณ , ์ํ๋ ์์น์ ๋ฐฐ์นํ ํ, ์ฝ๋๊ฐ ์คํ๋๋ ๋์ค ์๋ฐ ๋ฆฌํ๋ ์ ์ ์ด์ฉํด ์ถ๊ฐ ์ ๋ณด๋ฅผ ํ๋ํด ๊ธฐ๋ฅ์ ์ค์ํ๋ ๋ฐฉ์์ผ๋ก ๋์๋ฉ๋๋ค.
Spring ์ปจํ ์ด๋์์ ๊ฐ์ฒด๊ฐ ํธ์ถ๋๋ฉด, ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ ์ด๋ ์๋ฐ ๋ฆฌํ๋ ์ ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค.
๐ก Spring์์ ์ ๊ณตํ๋ ๋ํ์ ์ธ Annotation ๋ช ๊ฐ์ง๋ง ์๋ฅผ ๋ค์ด์ฃผ์ธ์.
- @ComponentScan
- @Component, @Service, @Repository, @Controller, @Configuration์ด ๋ถ์ ํด๋์ค Bean๋ค์ ์ฐพ์์ Context์ bean์ ๋ฑ๋กํด์ฃผ๋ ์ ๋ ธํ ์ด์
- ์ ๋ถ ๋ค @Component๋ฅผ ์ฌ์ฉํ์ง ์๊ณ @Repository ๋ฑ์ผ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ ์ด์ ๋, ์๋ฅผ ๋ค์ด @Repository๋ DAO์์ ๋ฐ์ํ ์ ์๋ unchecked exception๋ค์ ์คํ๋ง์ DataAccessException์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ํ ๊ฐ๋ ์ฑ์์๋ ํด๋น ์ ๋ ธํ ์ด์ ์ ๊ฐ๋ ํด๋์ค๊ฐ ๋ฌด์์ ํ๋์ง ๋จ ๋ฒ์ ์ ์ ์๋ค.
- @EnableAutoConfiguration
- autoConfiguration๋ Configuration์ค ํ๋์ ํด๋นํ๋ค.
- spring.factories ๋ด๋ถ์ ์ฌ๋ฌ Configuration๋ค์ด ์๊ณ ์กฐ๊ฑด์ ๋ฐ๋ผ Bean์ด ๋ฑ๋ก๋๊ฒ ๋๋๋ฐ ๋ฉ์ธ ํด๋์ค @SpringBootApplication์ ์คํํ๋ฉด @EnableAutoConfiguration์ ์ํด spring.factories ์์ ์๋ ์๋ง์ ์๋ ์ค์ ๋ค์ด ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ฉ๋์ด ์ ๋ง์ Bean๋ค์ด ์์ฑ๋๋ค.
- ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด, Application Context๋ฅผ ๋ง๋ค ๋ ์๋์ผ๋ก ๋น์ค์ ์ด ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์ด๋ค.
- @Component
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ class๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ ์ ๋ ธํ ์ด์
- @Bean
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ์ bean์ผ๋ก ๋ง๋ค๋ คํ ๋ ์ฌ์ฉ๋๋ ์ ๋ ธํ ์ด์
- @Configuration
- @Configuration์ ํด๋์ค์ ์ ์ฉํ๊ณ @Bean์ ํด๋น class์ ๋ฉ์๋์ ์ ์ฉํ๋ฉด @autowired๋ก Bean์ ๋ถ๋ฅผ ์ ์๋ค.
- @Autowired
- ์คํ๋ง์ด Type์ ๋ฐ๋ผ ์์์ Bean์ ์ฃผ์ ํด์ค๋ค.
- Type์ ๋จผ์ ํ์ธํ ํ ๋ชป ์ฐพ์ผ๋ฉด Name์ ๋ฐ๋ผ ์ฃผ์ ํ๋ค.
- ๊ฐ์ ๋ก ์ฃผ์ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ @Qulifier์ ๊ฐ์ด ๋ช ์
- @Qualifier
- ๊ฐ์ ํ์ ์ ๋น์ด ๋ ๊ฐ ์ด์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์คํ๋ง์ด ์ด๋ค ๋น์ ์ฃผ์ ํด์ผํ ์ง ์ ์ ์์ด์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด๊ธฐํํ๋ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
- @Qualifier๋ @Autowired์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ ํํ ์ด๋ค bean์ ์ฌ์ฉํ ์ง ์ง์ ํ์ฌ ํน์ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
- @Resource
- @Autowired์ ๋ง์ฐฌ๊ฐ์ง๋ก Bean ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ฃผ๋๋ฐ ์ฐจ์ด์ ์ Autowired๋ ํ์ ์ผ๋ก, Resource๋ ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐํด์ค๋ค.
- ์ ๋ ธํ ์ด์ ์ฌ์ฉ์ผ๋ก ์ธํด ํน์ Framework์ ์ข ์์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ์ง ์๊ธฐ ์ํด์ @Resource ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
- @Controller
- API์ view๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
- ๋ณดํต view ํ๋ฉด return์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
- @RestController
- view๊ฐ ํ์ ์์ด API๋ง ์ง์ํ๋ ์๋น์ค์์ ์ฌ์ฉ
- @SpringBootApplication
- @Configuration, @EnableAutoConfiguration, @ComponentScan 3๊ฐ์ง๋ฅผ ํ๋๋ก ํฉ์น ์ ๋ ธํ ์ด์
๐ก ์น ์๋ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์๊ณ ๊ณ์๋์?
- ์น ์๋ฒ
- ์ ์ ๋ฆฌ์์ค ํ์ผ์ ์ ๊ณตํ๋ ์๋ฒ
- ์น ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ(WAS)
- ์น ์๋ฒ๊ฐ ํ๋ ์ผ + ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง(DB ์ฐ๊ฒฐ, ๋์ ์ํ, ๋ฐ์ดํฐ ์ ๊ณต)๊น์ง ์ ๊ณตํ์ฌ ๋์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์๋ฒ
- ์๋ฐ ์ง์์์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉด WAS ๋ผ๊ณ ํ๋ค.
- ์ ๊ทธ๋ฆผ์๋ ์์ง๋ง WAS ์์๋ ์น ์๋ฒ๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ค.
๐ก ์๋ธ๋ฆฟ๊ณผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
์น ์๋ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ฐจ์ด๋ฅผ ๋ณด๋ฉด, '๋์ ์ธ ์ฒ๋ฆฌ'์ ๋ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. WAS์์์ ์ด๋ฌํ ๋์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ ์ฌ์ฉํ๋ ์๋ฒ ํ๋ก๊ทธ๋จ์ ์๋ธ๋ฆฟ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ธ๋ฆฟ์ด ์กด์ฌํ๊ธฐ ์ ์๋ HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ํ์ฑํ๋ ์์ ๋ฑ ์ฌ๋ฌ ๋ถ๊ฐ์ ์ธ ์์ ์ ๊ฐ๋ฐ์๊ฐ ํด์ผ ํ๋, ์๋ธ๋ฆฟ์ ๋ฑ์ฅ์ดํ๋ก๋ ์ด๋ฌํ ๋ถ๊ฐ ์์ ์ ์๋ธ๋ฆฟ์ด ๋์ ํ๊ณ , ๊ฐ๋ฐ์๋ ์ค์ง์ ์ธ ๋ฉ์ธ ๋ก์ง๋ง ์ง์คํ ์ ์๊ฒ ๋์์ต๋๋ค.
DI Container์ ๋น์ทํ๊ฒ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ URL์ ํด๋ฆญํ๋ฉด HTTP Request๋ฅผ Servlet Container๋ก ๋ณด๋ธ๋ค.
- Servlet Container๋ ์ฐ๋ ๋ ํ์์ ์ฐ๋ ๋๋ฅผ ๊บผ๋ด ํ ๋น ํด์ฃผ๊ณ HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ถ์ํ์ฌ ์ด๋ ์๋ธ๋ฆฟ์ ๋ํ ์์ฒญ์ธ์ง ์ฐพ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์กด์ฌํ์ง ์์ผ๋ฉด ์ด๊ธฐํํ๊ณ ์๋ค๋ฉด ๊ฐ์ ธ์์ service() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- Spring MVC์ ๊ฒฝ์ฐ DispatcherServlet์ด ์ด๊ธฐํ๋๊ณ ํธ์ถ๋๋ค.
- service ๋ฉ์๋๊ฐ ์ํ์ด ๋๋๋ฉด HttpServletResponse ๊ฐ์ฒด์ ์๋ต์ ๋ณด๋ธ๋ค.
- ์๋ต์ด ์๋ฃ๋๋ฉด HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํจ๋ค.
๐ก Spring MVC์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Spring์์ ์ ๊ณตํ๋ ์น ๋ชจ๋๋ก, Model / View / Controller ์ธ ๊ฐ์ง ๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์์ ๋ค์ํ HTTP Request๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋จ์ํ ํ ์คํธ ํ์์ ์๋ต๋ถํฐ REST ํ์์ ์๋ต์ ๋ฌผ๋ก , View๋ฅผ ํ์ํ๋ HTML์ Retrunํ๋ ์๋ต๊น์ง ๋ค์ํ ์๋ต์ ํ ์ ์๋๋ก ๋์์ฃผ๋ Framework์ ๋๋ค.
- ํธ๋ค๋ฌ ์กฐํ
- ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์์ฒญ URL์ ๋งคํ๋ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ฅผ ์กฐํํ๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ
- ํธ๋ค๋ฌ๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์กฐํํ๋ค.
- ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ
- ์กฐํํ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ฅผ ์ธ์๋ก ํธ๋ค๋ฌ ์ด๋ํฐ์ ๋๊ฒจ์ ํธ๋ค๋ฌ๋ฅผ ์คํ์ํจ๋ค.
- ModelAndView ๋ฐํ
- ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๊ฐ ๋ก์ง์ ์ํํ๊ณ ๋ฐํํ๋ ์ ๋ณด๋ก ModelAndView๋ก ๋ณํํด์ ๋ฐํํ๋ค.
- viewResolver ํธ์ถ
- ์ ์ ํ viewResolver๋ฅผ ์ฐพ๊ณ ํด๋น viewResolver๋ฅผ ํธ์ถํ๋ค.
- RestController๋ผ๋ฉด ์ด ๊ณผ์ ๊ณผ ์ดํ ๊ณผ์ ์์ด ์ปจ๋ฒํฐ๋ฅผ ์ด์ฉํด ๋ฐ๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ๋ค.
- View ๋ฐํ
- viewResolver๋ ๋ทฐ์ ๋ ผ๋ฆฌ ์ด๋ฆ์ ๋ฌผ๋ฆฌ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๊ณ , ๋๋๋ง ์ญํ ์ ๋ด๋นํ๋ ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ๋ทฐ ๋๋๋ง
- ๋ทฐ๋ฅผ ํตํด์ ๋ทฐ๋ฅผ ๋๋๋งํ๋ค.
MVC ํจํด ์ฅ๋จ์
- ์ ์
- Model, View, Controller๋ก ๋ถ๋ฆฌํ๋ ์ํคํ ์ฒ
- ์ฅ์
- ๊ณผ๊ฑฐ์๋ Controller์ ๋ค ๋ด์๋๊ณ ์ฒ๋ฆฌํ๋ค.
- ๊ธฐ๋ฅ ๋ณ๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ, ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ฌ์ฌ์ฉ์ฑ์ ์ฆ๊ฐ์ํจ๋ค.
- ๋จ์
- view์ model ์ฌ์ด์ ์์กด์ฑ์ด ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง์๋ก ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ๋๊ท๋ชจ์ ํ๋ก๊ทธ๋จ์์ Controller์ ๋ค์์ Model๊ณผ View๊ฐ ๋ณต์กํ๊ฒ ์ฐ๊ฒฐ๋์ด ์ฝ๋ ๋ถ์๊ณผ ํ ์คํธ๊ฐ ์ด๋ ค์ ์ง ์ ์๋ค.
- ์ด๋ฐ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด MVVM, MVP ๊ตฌ์กฐ๊ฐ ๋ฑ์ฅํ๋ค.
๐ก ๊ทธ๋ ๋ค๋ฉด, ์ด๋ป๊ฒ ํ๋์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ๋ฌ ์์ฒญ์ ๋ฐ์ ์ ์์๊น์?
์ปจํธ๋กค๋ฌ๋ ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ฉด์ ์คํ๋ง ๋น ์ปจํ ์ด๋์ ์ฌ๋ผ๊ฐ๋๋ค. ๋ํ ๋น ๊ฐ์ฒด๋ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ฐ๋ ๋์ ์์ฒญ์ด ๋ค์ด์๋ ํ๋์ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ฉด์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฆ, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋ฉ์๋์ ๋ํด ๊ณต์ ์์์ผ๋ก์จ ์ ๊ทผํด ์ฌ์ฉํฉ๋๋ค.
์ฃผ์ํ ์ ์, ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํ๋์ด์๋ค๋ ์ ์, Thread-Safeํ์ง ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ์ํ๋ฅผ ๊ณต์ ํ๊ฑฐ๋ ์ ์ฅํ๋ ์ฝ๋๊ฐ ์๋๋ก Statelessํ๊ฒ ์ ์ํด์ผ ํฉ๋๋ค.
๐ก + ๊ทธ๋ผ ์ฑ๊ธํค ํจํด์ ๋ฌด์์ธ๊ฐ์?
์ปจํธ๋กค๋ฌ๋ ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ฉด์ ์คํ๋ง ๋น ์ปจํ ์ด๋์ ์ฌ๋ผ๊ฐ๋๋ค. ๋ํ ๋น ๊ฐ์ฒด๋ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ฐ๋ ๋์ ์์ฒญ์ด ๋ค์ด์๋ ํ๋์ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ฉด์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฆ, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋ฉ์๋์ ๋ํด ๊ณต์ ์์์ผ๋ก์จ ์ ๊ทผํด ์ฌ์ฉํฉ๋๋ค.
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// ์์ฑ์๋ ์ธ๋ถ์์ ํธ์ถ๋ชปํ๊ฒ private ์ผ๋ก ์ง์ ํด์ผ ํ๋ค.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}
๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ์ต์ด ํ ๋ฒ์ new ์ฐ์ฐ์๋ฅผ ํตํด ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ฒด์ ์ ๊ทผํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๊ณ , ์ด๋ฏธ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ํ์ฉํ๋ ์๋ ์ธก๋ฉด์๋ ์ด์ ์ด ์์ต๋๋ค.
๋ค๋ฅธ ์ด์ ์ผ๋ก๋ ๋ค๋ฅธ ํด๋์ค ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ์ฝ์ต๋๋ค. ์ฑ๊ธํค ์ธ์คํด์ค๋ ์ ์ญ์ผ๋ก ์ฌ์ฉ๋๋ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ์ ๊ทผํด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ '๋์์ฑ ๋ฌธ์ '๊ฐ ์ผ์ด๋์ง ์๋๋ก ์ ์ํด ์ค๊ณํด์ผ ํฉ๋๋ค.
๋ค์ ๋งํ์๋ฉด, ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํ๋์ด์๋ค๋ ์ ์, Thread-Safeํ์ง ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ์ํ๋ฅผ ๊ณต์ ํ๊ฑฐ๋ ์ ์ฅํ๋ ์ฝ๋๊ฐ ์๋๋ก Statelessํ๊ฒ ์ ์ํด์ผ ํฉ๋๋ค.
๐ก AOP์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ์ด๋ก, ๊ณตํต ๊ด์ฌ์ฌํญ๊ณผ ํต์ฌ ๊ด์ฌ์ฌํญ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ฐ ์์ค์ฝ๋์์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์ด๊ฒ์ Aspect๋ก ๋ชจ๋ํํด ํต์ฌ ๋ก์ง์์ ๋ถ๋ฆฌํด ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ก๊ทธ, ์ฑ๋ฅํ ์คํธ, ๊ถํ, ํธ๋์ญ์ ๋ฑ์ ๋ชจ๋ ๋ฉ์๋์ ์ ์ฉํ๊ณ ์ถ์ ๋ ์ผ์ผํ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ AOP๋ฅผ ํ์ฉํด ์ ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๐ก POJO๋ ๋ฌด์์ธ๊ฐ์?
Plain Old Java Object์ ์ฝ์ด๋ก, ํ๋ฒํ ๊ตฌ์ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. ํ๋ ์์ํฌ ์ธํฐํ์ด์ค๋ ํด๋์ค๋ฅผ ๊ตฌํํ๊ฑฐ๋ ํ์ฅํ์ง ์์ ๋จ์ํ ํด๋์ค๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๋ก, ํ ํ๋ ์์ํฌ์ ์ข ์๋์ง ์์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ํ ์คํธ ์๋ํ์ ์ ๋ฆฌํฉ๋๋ค. Spring์์๋ ๋๋ฉ์ธ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๋์์ด POJO ๋์์ด ๋ ์ ์์ต๋๋ค.
๐ก DAO, DTO, BO, VO์ ์ฐจ์ด๋ฅผ ์๊ณ ๊ณ์๋์? ์๋๋๋ก ์ค๋ช ํด์ฃผ์ธ์.
- DAO (Data Access Object)
- DB ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ์ ๋ดํ๋ ๊ฐ์ฒด
- DB ์ ๊ทผ ๋ก์ง๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ๊ธฐ ์ํด์ ์ฌ์ฉ
- DTO (Data Transfer Object)
- ๊ณ์ธต๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ๊ฐ์ฒด
- ๋ก์ง์ ๊ฐ์ง ์๋ ์์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ก getter, setter๋ง ํฌํจ
- VO (Value Object)
- DTO์ ๋์ผํ ๊ฐ๋
- Read Only๋ก ์์ ๋ถ๊ฐ
- getter, setter ์ด์ธ์ ์ถ๊ฐ ๋ก์ง ํฌํจ ๊ฐ๋ฅ
- BO (Business Object)
- ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๋ ์ค๋ธ์ ํธ๋ก, ์ฌ๋ฌ DAO๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
๐ก Spring์ ๋ ์ด์ด๋ ์ํคํ ์ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Spring์ ๋ ์ด์ด๋ ์ํคํ
์ฒ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
ํ๋์ ๋ ์ด์ด๋ ์์ ์ ๊ณ ์ ์ญํ ์ ์ํํ๊ณ , ์ธ์ ํ ๋ค๋ฅธ ๋ ์ด์ด์ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฒญํ๊ฑฐ๋ ์๋ตํฉ๋๋ค.
๊ทธ ๋ฐ์ ๋ค๋ฅธ ๋ ์ด์ด๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ ์ด์ด๋ ์์ ์ ์ญํ ์ ์ถฉ์คํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์คํ
์ ์ฒด๋ฅผ ์์ ํ์ง ์๊ณ ํน์ ํ ๋ ์ด์ด์ ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ฑฐ๋ ๊ต์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ฑ์ด ์ข๊ณ ์ ์ง ๋ณด์์๋ ์ ๋ฆฌํฉ๋๋ค. ๋ํ, ๋ ์ด์ด๋ณ๋ก ํ
์คํธ ๊ตฌํ์ด ํธํด์ง๊ณ ์ฝ๋ ๊ฐ๋
์ฑ๋ ๋์์ง๋๋ค.
- Presentation Layer
- view๋ฅผ ๋ด๋นํ๋ ๋ถ๋ถ์ผ๋ก, ํด๋ผ์ด์ธํธ์ ์ง์ ์ ์ผ๋ก ๋ง๋ฟ๋ ๋ถ๋ถ
- Application Layer
- ๋น์ฆ๋์ค ํต์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ
- Service ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋
- Persistence Layer
- ๋ฐ์ดํฐ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๋ถ๋ถ
๐ก ์ปค๋ฅ์ ํ์ด ๋ฌด์์ธ์ง, Springboot์์์ ์ปค๋ฅ์ ํ๋ก๋ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋์ง ์ค๋ช ํด์ฃผ์ธ์.
์ดํ๋ฆฌ์ผ์ด์ ์ด DB๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Connection์ด ํ์ํ๋ฐ, ์ด ์์ฑ ๋ฐ ์๋ฉธ ๋น์ฉ์ด ํฌ๊ธฐ ๋๋ฌธ์, ์ปค๋ฅ์ ํ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ํ๋ ์์ ์ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ๋ค ์์ฑํ๊ณ ์ด๊ฒ์ ์ฌํ์ฉํ๋ฉฐ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
Springboot 2.0 ์ดํ ๋ถํฐ๋ hikariCP๋ฅผ ๊ธฐ๋ณธ CP๋ก ์ฌ์ฉํฉ๋๋ค.
๐ก ๊ทธ๋ ๋ค๋ฉด DataSource๋ ๋ฌด์์ธ๊ฐ์?
Connection ๊ด๋ จ ๊ธฐ์ ์ด ๋ง์์ง๋ฉด์, ์ฝ๋๋ ๋ฒจ์์๋ ๋ค๋ฅด์ง๋ง ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ์ปค๋ฅ์ ์ ํ๋ํ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ถ์ํ ์ํจ ๊ฒ์ DataSource๋ผ ํฉ๋๋ค.
์ค์ง์ ์ธ ๋ก์ง์ DataSource์ ์์กดํ๋๋ก ํ๊ณ , ๊ตฌํ ๊ธฐ์ ์ด ๋ฐ๋๋ฉด DataSource์ ๊ตฌํ์ฒด๋ง ๋ฐ๊พธ๋ฉด ๋๋ฏ๋ก, ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๐ก ํธ๋์ญ์ ์ ์ถ์ํํด์ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์๊ณ ๊ณ์๋์?
๋ค์ํ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ด ๋ฑ์ฅํ๋ฉด์, ์ฝ๋๋ ๋ฒจ์์๋ ๋ค๋ฅด์ง๋ง ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ ์ถ์ํํ์ต๋๋ค. ๋ค์ํ ์ ๊ทผ ๊ธฐ์ ๋ก๋ JDBC, JPA, ํ์ด๋ฒ๋ค์ดํธ ๋ฑ์ด ์์ต๋๋ค.
๐ก ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ์ญํ ์ ๋ํด ์๋ค๋ฉด, ์๋๋๋ก ์ค๋ช ํด์ฃผ์ธ์.
๋ณดํต ์๋น์ค ๋จ์์ ํธ๋์ญ์
์ ์์ํ๊ณ ๋๋ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋์ ํธ๋์ญ์
๋ด์์๋ ๊ฐ์ ์ปค๋ฅ์
์ ์ฌ์ฉ ํด์ผ ํ๋๋ฐ ๊ณผ์ ์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋น์ค๋จ์์ ํธ๋์ญ์ ์ด ์์ํ๋ฉด ํธ๋์ญ์ ๋งค๋์ ๊ฐ ์ปค๋ฅ์ ์ ์์ฑํ๊ณ (ํ์ ์ฌ์ฉํ๋ฉด ํ์์ ๊ฐ์ ธ์ค๊ณ ) autoCommit์ false๋ก ์ธํ ํ ๋ค ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ์ค๋ ๋ ๋ก์ปฌ์ ์ปค๋ฅ์ ์ ๋ณด๊ด
- ์ดํ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์์๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ์ค๋ ๋ ๋ก์ปฌ์์ ํด๋น ์ปค๋ฅ์ ์ ๊ฐ์ ธ์์ ์ฌ์ฉ
- ์๋น์ค ๋จ์์ ํธ๋์ญ์ ์ ์ข ๋ฃํ ๋๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์์ ํด๋น ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ์ ์ํํ๊ณ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ณ ์ปค๋ฅ์ ์ ์ปค๋ฅ์ ํ์ ๋ฐํ
ํ๋์ ํธ๋์ญ์ ์์ ๊ฐ์ ์ปค๋ฅ์ ์ ์ฌ์ฉํ๋๋ก ๋์์ ์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
๐ก Spring์ ์ฌ์ฉํด ํธ๋์ญ์ ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
1) ์ ์ธ์ ํธ๋์ญ์
@Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ํธ๋์ญ์ ์ ์ ์ฉ์ํฌ ์ ์์ต๋๋ค. ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ฑ์ด ์์ด ๋๋ถ๋ถ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
@Transactional ์ด๋ ธํ ์ด์ ์ AOP๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. AOP๋ ํ๋ก์ ํจํด์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ์ค๋ฒ๋ผ์ด๋ฉ ๊ฐ๋ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ฉ์๋์ @Transactional์ ๋ถ์ด๋ฉด, ํด๋น ํด๋์ค๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋ ๋, @Transactional์ด ๋ถ์ ๋ฉ์๋๋ง ํธ๋์ญ์ ์ฒ๋ฆฌ๋๋ ๋ฉ์๋๋ก ์ค๋ฒ๋ผ์ด๋ฉ ํ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋๊ฒ ๋ฉ๋๋ค.
2) ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ํธ๋์ญ์
ํธ๋์ญ์ ๋งค๋์ ๋ ํธ๋์ญ์ ํ ํ๋ฆฟ์ ์ฌ์ฉํด ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ก ์์ฑํด ์ ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
๐ก JDBC, Spring JDBC, MyBatis, ORM, JPA, Hibernate, Spring Data JPA์ ๋ํด ๊ฐ๊ฐ ์ค๋ช ํด์ฃผ์ธ์.
์ ๋ฐ์ดํธ ์์ .
๐ก ์์์ฑ ์ปจํ ์คํธ๋ ๋ฌด์์ธ๊ฐ์?
์ ๋ฐ์ดํธ ์์ .
๐ก JPA N+1 ๋ฌธ์ ์ ๋ํด ์๊ณ ๊ณ์ ๊ฐ์? ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ ๋ฐ์ดํธ ์์ .
๐ก ๊ฐ์ฒด๊ฐ์ ์์๊ด๊ณ๋ฅผ DB์ ์ ์ฉ์ํค๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ ๋ฐ์ดํธ ์์ .
๐ก Spring Batch์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๋จ๋ฐ์ฑ์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ Batch Application์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, Spring์๋ SpringBatch๊ฐ ์์ต๋๋ค.
์์ ๊ฐ์ ์ผ ๋งค์ถ ์ง๊ณ๋ฅผ Spring MVC์์ ํ๋ค๋ฉด, ๋ง์ ์์ฒญ์ด ํ ๋ฒ์ ๋ค์ด์ CPU, I/O ๋ฑ์ ์์์ ๋ค ์จ๋ฒ๋ ค ๋ค๋ฅธ Request ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋จ๋ฐ์ฑ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ก ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
BatchApplication์ ๋ฐฐ์น ๊ธฐ๋ฅ์ ํ์ฑํ ํ๊ณ ์ถ๋ค๋ฉด, main ๋ฉ์๋๊ฐ ํฌํจ๋ ํด๋์ค์ @EnableBatchProcessing์ ์ถ๊ฐํด์ค๋๋ค.
๐ก Spring Batch์ Chunk์ Chunk ๊ธฐ๋ฐ ๋ฐฉ์์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Spring Batch์์ Chunk๋, ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ก ์์ ์ ๊ฐ ์ปค๋ฐ ์ฌ์ด์ ์ฒ๋ฆฌ๋๋ row ์๋ฅผ ์ด์ผ๊ธฐํฉ๋๋ค.
Chunk ๊ธฐ๋ฐ ๋ฐฉ์(Chunk ์งํฅ ์ฒ๋ฆฌ)์ด๋ ํ ๋ฒ์ ํ๋์ฉ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด Chunk๋ผ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ง๋ ๋ค Chunk ๋จ์๋ก ํธ๋์ญ์ ์ ๋ค๋ฃจ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํธ๋์ญ์ ์ด๋ฏ๋ก, ์คํจํ ๊ฒฝ์ฐ์ Chunk ๋งํผ๋ง ๋กค๋ฐฑ์ด ๋๊ณ , ์ด์ ์ ์ปค๋ฐ๋ ๋ฒ์๊น์ง๋ ๋ฐ์๋ฉ๋๋ค.
- itemReader, itemProcessor, itemWriter๋ก ๊ตฌ์ฑ๋๋ค.
- itemReader
- Custor ๊ธฐ๋ฐ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ฉด ๋ค์ ์ปค์๋ก ์ด๋ํ๋ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ ๊ฑด์ฉ ์ฒ๋ฆฌ
- ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๊น์ง ์ปค๋ฅ์ ์ ์ง
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋์์ฑ ์ด์ ๋ฐ์ํ๋ฏ๋ก ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ํ์
- ํ์ด์ง ๊ธฐ๋ฐ ์ฒ๋ฆฌ
- ํ์ด์ง ์ฌ์ด์ฆ ๋งํผ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌ
- ํ์ด์ง ์ฌ์ด์ฆ ๋งํผ ์ปค๋ฅ์ ์ ๋งบ๊ณ ๋์
- ํ์ด์ง ๊ฒฐ๊ณผ๋ง ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น
- ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ์ ๋ณ๋ ๋๊ธฐํ ์ฒ๋ฆฌ ๋ถํ์
- ํ์ด์ง ์ฌ์ด์ฆ์ ์ฒญํฌ ์ฌ์ด์ฆ๋ฅผ ์ผ์น์์ผ์ผ ํ๋ ์ด์
- ์ฒญํฌ ์ฌ์ด์ฆ๊ฐ 50์ด๊ณ ํ์ด์ง ์ฌ์ด์ฆ๊ฐ 10์ด๋ฉด 5๋ฒ์ read๊ฐ ๋ฐ์ํ๋ฉด์ ํ ๋ฒ์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํด์ 5๋ฒ์ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. JpaPagingItemReader์ ๊ฒฝ์ฐ ํ์ด์ง๋ฅผ ์ฝ์๋, ์ด์ ํธ๋์ญ์ ์ flush, clear๋ก ์ด๊ธฐํ ์์ผ๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ๋ง์ง๋ง์ ์ฝ์ ํ์ด์ง๋ฅผ ์ ์ธํ ์ด์ ์ ์กฐํํ ๊ฒฐ๊ณผ๋ค์ ํธ๋์ญ์ ์ธ์ ์ด ์ ๋ถ ์ข ๋ฃ๋์ด ๋ฒ๋ฆฌ๋ฉด์ processor์์ Lazy ๋ก๋ฉ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋๋ ํ์์ด ๋ฐ์ํ๋ค.
- Custor ๊ธฐ๋ฐ ์ฒ๋ฆฌ
- itemWriter
- jpaItemWriter
- JPA ์ํฐํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ํฐํฐ๋ฅผ ํ๋์ฉ insertํ๋ค.
- JdbcBatchItemWriter
- Jpa์ฒ๋ผ ๋จ๊ฑด ์ฒ๋ฆฌ๊ฐ ์๋ ์ผ๊ด bulk insert ์ฒ๋ฆฌํ๋ค.
- ChunkSize ๋งํผ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ฐํ๊ธฐ ๋๋ฌธ์ Chunk size๊ฐ ๊ณง Commit Interval(์ปค๋ฐ ๊ฐ๊ฒฉ)์ด ๋๋ค.
- jpaItemWriter
- itemReader
- chunkSize ๋งํผ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๊ณ ๋ค์ chunkSize๋ ์๋ก์ด ํธ๋์ญ์ ์ผ๋ก ๋์ํ๋ค.
- repeat, retry, skip์ ํตํด์ ๋ฐ๋ณต ๋ฐ ์ค๋ฅ ์ ์ด๋ฅผ ํ ์ ์๋ค.
๐ก Spring Batch์ Job๊ณผ Step์ ๊ตฌ์กฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
@Slf4j // log ์ฌ์ฉ์ ์ํ lombok ์ด๋
ธํ
์ด์
@RequiredArgsConstructor // ์์ฑ์ DI๋ฅผ ์ํ lombok ์ด๋
ธํ
์ด์
@Configuration
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory; // ์์ฑ์ DI ๋ฐ์
private final StepBuilderFactory stepBuilderFactory; // ์์ฑ์ DI ๋ฐ์
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(simpleStep1())
.build();
}
@Bean
public Step simpleStep1() {
return stepBuilderFactory.get("simpleStep1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is Step1");
return RepeatStatus.FINISHED;
})
.build();
}
}
@Configuration
- Spring Batch์ ๋ชจ๋ Job์
@Configuration
์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํฉ๋๋ค.
- Spring Batch์ ๋ชจ๋ Job์
jobBuilderFactory.get("simpleJob")
- simpleJob ์ด๋ ์ด๋ฆ์ Batch Job์ ์์ฑํฉ๋๋ค.
- job์ ์ด๋ฆ์ ๋ณ๋๋ก ์ง์ ํ์ง ์๊ณ , ์ด๋ ๊ฒ Builder๋ฅผ ํตํด ์ง์ ํฉ๋๋ค.
stepBuilderFactory.get("simpleStep1")
- simpleStep1 ์ด๋ ์ด๋ฆ์ Batch Step์ ์์ฑํฉ๋๋ค.
- jobBuilderFactory.get("simpleJob")์ ๋ง์ฐฌ๊ฐ์ง๋ก Builder๋ฅผ ํตํด ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
.tasklet((contribution, chunkContext))
- Step ์์์ ์ํ๋ ๊ธฐ๋ฅ๋ค์ ๋ช ์ํฉ๋๋ค.
- Tasklet์ Step์์์ ๋จ์ผ๋ก ์ํ๋ ์ปค์คํ ํ ๊ธฐ๋ฅ๋ค์ ์ ์ธํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ Batch๊ฐ ์ํ๋๋ฉด log.info(">>>>> This is Step1") ๊ฐ ์ถ๋ ฅ๋๋๋ก ํฉ๋๋ค.
Job์ ํ๋์ ๋ฐฐ์น ์์ ๋จ์๋ฅผ ๋งํ๊ณ , Job ์์๋ ์ฌ๋ฌ Step์ด ์กด์ฌํ๊ณ , Step ๋ด์ Tasklet, Reader & Writer ๋ฌถ์์ด ์กด์ฌํฉ๋๋ค.
Tasklet ํ๋์ Reader & Processor & Writer ํ ๋ฌถ์์ด ๊ฐ์ ๋ ๋ฒจ์
๋๋ค.
๊ทธ๋์ Reader & Processor๊ฐ ๋๋๊ณ Tasklet์ผ๋ก ๋ง๋ฌด๋ฆฌ ์ง๋ ๋ฑ์ผ๋ก ๋ง๋ค์ ์๋ค๋๊ฑธ ๊ผญ ๋ช
์ฌํด์ฃผ์
์ผ ํฉ๋๋ค.
Tasklet์ ์ด์ฐ๋ณด๋ฉด Spring MVC์ @Component, @Bean๊ณผ ๋น์ทํ ์ญํ ์ด๋ผ๊ณ ๋ณด์ ๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ช ํํ ์ญํ ์ ์์ง๋ง, ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ์ปค์คํ ํ ๊ธฐ๋ฅ์ ์ํ ๋จ์๋ก ๋ณด์๋ฉด ๋ฉ๋๋ค.
๐โ๏ธ ๋ค๋ฅธ ์ง๋ฌธ ๋๋น ์๋ฃ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โ ์๋ฃ๊ตฌ์กฐ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โก ์๊ณ ๋ฆฌ์ฆ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โข ๋ฐ์ดํฐ๋ฒ ์ด์ค
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฃ ๋คํธ์ํฌ
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โค ์ด์์ฒด์
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฅ ์๋ฐ(Java)
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โฆ ๋ฐฑ์๋(Java Spring ๊ธฐ๋ฐ)
[๐ ์ ์ ์ธํฐ๋ทฐ ์ค๋น] - [๋ฉด์ ์ด์ ๋ฆฌ] ์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น ์ด์ ๋ฆฌ ์๋ฃ - โง ๊ฐ๋ฐ๊ณตํต / ์ธ์ฑ๋ฉด์