PSA ๋ ? ์ ๋ง๋ ์ธํฐํ์ด์ค
๋์ ์ฝ๋
ํ์ฅ์ฑ์ด ์ข์ง ๋ชปํ ์ฝ๋ or ๊ธฐ์ ์ ํนํ๋์ด ์๋ ์ฝ๋
๋์ ์ฝ๋
+++++++++
์ ๋ง๋ ์ธํฐํ์ด์ค(PSA)
++++++++++++++++
ํ์ฅ์ฑ์ด ์ข์ง ๋ชปํ ์ฝ๋ or ๊ธฐ์ ์ ํนํ๋์ด ์๋ ์ฝ๋
์คํ๋ง ํธ๋์ญ์
@Transactional ์ด๋ผ๋ annotation์ ์ฒ๋ฆฌํ๋ Aspect ๊ฐ ์๋ค.
๊ทธ Aspect์์๋ *PlatformTransactionManager ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ์ฝ๋ฉ์ ํด๋จ๋ค.
* ์ ๋ง๋ ์ธํฐํ์ด์ค(PSA) ์ ์
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ PlatformTransactionManager ์ ์ฌ๋ฌ ๊ตฌํ์ฒด๋ค์ด ๋ฐ๋๋๋ผ๋, ํธ๋์ญ์ ์ Aspect ์ฝ๋๋ ๋ฐ๋์ง๊ฐ ์๋๋ค.
์ฌ๊ธฐ์๋ Repository ๋ผ๋ interface๋ฅผ ๊ตฌํํ๊ณ ์๋๋ฐ , ์ด ํ๋ก์ ํธ๋ Spring JPA Data ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์,
SpringBoot์ ์๋์ค์ ์ ์ํด์ JpaTransactionManager ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก๋์ด์๋ ์ํ์ด๋ค.
@Transactional์ ์ฒ๋ฆฌํ๋ @Aspact๋ PlatformTransactionManager ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์
๊ตฌํ์ฒด๊ฐ JpaTransactionManager -> DataSourceTransactionManager ์ผ๋ก ๋ฐ๋์ด๋
๊ทธ Transactional์ ์ฒ๋ฆฌํ๋ Aspect ์ฝ๋๋ ๋ฐ๋์ง๊ฐ ์๋๋ค.
์คํ๋ง ์บ์
@EnableCaching๊ฐ ํ์ฑํ๊ฐ ๋๋ฉด @Cachenable | @CacheEvict | ..... ๋ฑ์ annotation์ ์ฌ์ฉํ ์ ์๋๋ฐ,
์ฌ์ฉํ๋ ค๋ฉด CacheManager๊ฐ ์์ด์ผํ๋ค. (์ด ๋ถ๋ถ์ ํธ๋์ญ์ ๊ณผ ๋์ผํ๋ค.)
์ด annotation์ ์ฒ๋ฆฌํ๋ Aspect๊ฐ ์ด๋๊ฐ์ ์๋๋ฐ ๊ทธ Aspect๋ ๋ถ๋ช ํ TransactionManager๋ฅผ ์ฌ์ฉํ๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด @Bean์ด ํ๋ ์๊ณ ๊ทธ ์์ JCacheMAnagerCustomizer๊ฐ ์๋ค? -> ์ฌ๊ธฐ์ JCacheManager๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ง์ด๋ค.
๋ง์ฝ EhCacheManagerCustomizer๋ก ๋ฐ๊พผ๋ค๊ณ ํ๋ฉด EhCaheManger๋ฅผ ์ฐ๊ฒ ๋ ๊ฑฐ๊ณ , ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฒ๋ฆฌํ๋ Aspect์ ์ฝ๋๋ ๋ฐ๋์ง ์๋๋ค.
์คํ๋ง ์น MVC
์ด ์ฝ๋๋ @Controller ์ @GetMapping ์ ์ฌ์ฉํด์ ์น MVC๋ฅผ ๊ตฌํํ๊ณ ์๋ค.
@LogExecutionTime
@GetMapping("/owners/new") //์ด๋ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋์ ๋ฉ์๋๋ค์ด ์คํ๋จ.
public String initCreationForm(Map<String, Object> model) {
Owner owner = new Owner();
model.put("owner", owner);
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}
๊ทธ๋ฆฌ๊ณ return View์ ํด๋นํ๋ view๋ฅผ ๋ณด์ฌ์ค๋ค.
๊ทผ๋ฐ ์ด ์ฝ๋๊ฐ survlet ์ผ์๋ ์๊ณ , Reactive ์ผ์๋ ์๋ค.
๋๋ถ๋ถ์ ์ฝ๋๋ ์ถ์ํ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ survlet์์ Reactive๋ก ๋ฐ๊ฟ์๊ฐ ์๋ค.
์ด๊ฒ์ด PSA์ ๊ฐ์ฅ ํฐ ๋ชฉํ๊ณ ์ฅ์ ์ด๋ค.