๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

[Spring] ์Šคํ”„๋ง PSA

by Leica 2020. 3. 1.
๋ฐ˜์‘ํ˜•

[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

์ธํ”„๋Ÿฐ - ๋ฐฑ๊ธฐ์„ ๋‹˜์˜ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ์ž…๋ฌธ(๊ฐœ์ •ํŒ)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€