[Spring] ์คํ๋ง PSA
1. PSA(Portable Service Abstraction)
Spring์ Spring Triangle์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ธ ๊ฐ์ง ๊ฐ๋ ์ ์ ๊ณตํด์ค๋ค. ๊ฐ๊ฐ IoC, AOP, PSA๋ฅผ ์ผ์ปซ๋๋ค.
Spring์ PetClinic ์์ ๋ฅผ ๋ณด๋ฉด ์๋ธ๋ฆฟ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ๋ถ๊ตฌํ๊ณ ์๋ธ๋ฆฟ์ด ์ ํ ์กด์ฌํ์ง ์๋๋ค. ๋จ์ง @Controller ์ ๋ ธํ ์ด์ ์ด ๋ถ์ด์๋ ํด๋์ค์์ @GetMapping, @PostMapping๊ณผ ๊ฐ์ @RequestMapping ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์์ฒญ์ ๋งคํํ๋ค.
์ค์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๊ฐ ๋์ํ์ง๋ง ์๋ธ๋ฆฟ ๊ธฐ์ ์ ์ถ์ํ ๊ณ์ธต์ ์ํด ์จ๊ฒจ์ ธ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์ถ์ํ ๊ณ์ธต์ ์ฌ์ฉํด์ ์ด๋ค ๊ธฐ์ ์ ๋ด๋ถ์ ์จ๊ธฐ๊ณ ๊ฐ๋ฐ์์๊ฒ ํธ์์ฑ์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ Service Abstraction์ด๋ผ ํ๋ค.
๋ํ์ฌ Service Abstraction์ผ๋ก ์ ๊ณต๋๋ ๊ธฐ์ ์ ๋ค๋ฅธ ๊ธฐ์ ์คํ์ผ๋ก ๊ฐํธํ๊ฒ ๋ฐ๊ฟ ์ ์๋ ํ์ฅ์ฑ์ ๊ฐ๊ณ ์๋ ๊ฒ์ด Portable Service Abstraction์ด๋ค.
Spring์ Spring Web MVC, Spring Transaction, Spring Cache ๋ฑ์ ๋ค์ํ PSA๋ฅผ ์ ๊ณตํ๋ค.
2. Spring Web MVC
์ผ๋ฐ ํด๋์ค์ @Controller ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์์ฒญ์ ๋งคํํ ์ ์๋ ์ปจํธ๋กค๋ฌ ์ญํ ์ ์ํํ๋ ํด๋์ค๊ฐ ๋๋ค.
๊ทธ ํด๋์ค์์๋ @GetMapping๊ณผ @PostMapping ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์์ฒญ์ ๋งคํํ ์ ์๋ค.
์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ค์ ๋ทฐ๋ฅผ ๋ฆฌํดํ๋ฉฐ ๊ฐ ๋ฉ์๋์์ model์ ๋ด๋ ๊ฐ์ฒด๊ฐ ๋ชจ๋ธ์ ํด๋นํ๋ค.
Spring Web MVC๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ ์๋ธ๋ฆฟ์ ๊ฐํธํ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ฐ, ๋ท๋จ์ spring์ด ์ ๊ณตํด์ฃผ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด ์จ๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์๋ธ๋ฆฟ์ low level๋ก ๊ฐ๋ฐํ์ง ์์๋ ๋๋ค.
์ฆ HttpServlet์ ์์๋ฐ๊ณ doGet(), doPost()๋ฅผ ๊ตฌํํ๋ ๋ฑ์ ์์ ์ ์ง์ ํ์ง ์์๋ ๋๋ค.
Service abstraction์ ๋ชฉ์ ์ค ํ๋๊ฐ ์ด๋ฌํ ํธ์์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
PetClinic ์์ ์ดํ๋ฆฌ์ผ์ด์ ์ ํฐ์บฃ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋๋ค.
๊ทธ๋ฐ๋ฐ Spring Web MVC๋ ์ฝ๋๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ๋ ์ํ์์ ํฐ์บฃ์ด ์๋ ์์ ํ ๋ค๋ฅธ ๊ธฐ์ ์คํ์ผ๋ก ์คํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด ํ๋ก์ ํธ๊ฐ spring-boot-starter-web ์์กด์ฑ ๋์ spring-boot-starter-webflux ์์กด์ฑ์ ๋ฐ๋๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ํฐ์บฃ์ด ์๋ netty ๊ธฐ๋ฐ์ผ๋ก ์คํํ๊ฒ ํ ์๋ ์๋ค.
์๋ ๊ธฐ์กด์ ํฐ์บฃ์ผ๋ก ์คํํ๋ ํ๋ก์ ํธ๋ฅผ netty ๊ธฐ๋ฐ์ผ๋ก ์คํํ๊ฒ ํ๋ ค๋ฉด ๋ ๋ณต์กํ ๊ณผ์ ์ด ํ์ํ์ง๋ง spring์ด ์ ๊ณตํด์ฃผ๋ Spring Web MVC ์ถ์ํ ๊ณ์ธต์ ์ฌ์ฉํด์ ๊ฐ๋จํ netty๋ก ์คํํ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ Spring Web MVC๋ @Controller, @RequestMapping๊ณผ ๊ฐ์ ์ ๋ ธํ ์ด์ ๊ณผ ๋ท๋จ์ ์ฌ๋ฌ๊ฐ์ง ๋ณต์กํ ์ธํฐํ์ด์ค๋ค ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ฌ์ฉ์๊ฐ ์น ๊ธฐ์ ์คํ์ ๊ฐํธํ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ค๋ค.
์ค์ํ ๊ฒ์ ์ด๋ฐ ๊ฒ๋ค์ด ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
3. Spring Transaction
Low level๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ค๋ฉด setAutoCommit()๊ณผ commit(), rollback()์ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ Spring์ด ์ ๊ณตํ๋ @Transactional ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋จ์ํ ๋ฉ์๋์ ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค์ผ๋ก์จ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ด๋ํ PSA๋ก์จ ๋ค์ํ ๊ธฐ์ ์คํ์ผ๋ก ๊ตฌํ์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
์๋ฅผ ๋ค์ด JDBC๋ฅผ ์ฌ์ฉํ๋ DatasourceTransactionManager, JPA๋ฅผ ์ฌ์ฉํ๋ JpaTransactionManager, Hibernate๋ฅผ ์ฌ์ฉํ๋ HibernateTransactionManager๋ฅผ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ค.
์ฆ ๊ธฐ์กด ์ฝ๋๋ ๋ณ๊ฒฝํ์ง ์์ ์ฑ๋ก ํธ๋์ญ์ ์ ์ค์ ๋ก ์ฒ๋ฆฌํ๋ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉ ๊ธฐ์ ์ ๋ฐ๋ผ ๋ฐ๊ฟ ๋ผ์ธ ์ ์๋ ๊ฒ์ด๋ค.
4. Spring Cache
Cache๋ ๋ง์ฐฌ๊ฐ์ง๋ก JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManager์ ๊ฐ์ ์ฌ๋ฌ๊ฐ์ง ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉ์๋ @Cacheable ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค์ผ๋ก์จ ๊ตฌํ์ฒด๋ฅผ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋ ํ์์ ๋ฐ๋ผ ๋ฐ๊ฟ ์ธ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ spring์ด ์ ๊ณตํด์ฃผ๋ ๋ค์ํ PSA ๊ธฐ์ ๋๋ถ์ ์ฝ๋๋ ๋ ๊ฒฌ๊ณ ํด์ง๊ณ ๊ธฐ์ ์ด ๋ฐ๋์ด๋ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๊ฒ ๋๋ค.
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์์ ๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ์ ๋ฌธ(๊ฐ์ ํ)
๋๊ธ