Animated Rainbow Nyan Cat

์ธํ„ฐ์…‰ํ„ฐ (Interceptor)

ํ•„ํ„ฐ์™€๋Š” ๋‹ฌ๋ฆฌ Spring์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ . diapatcher์™€ servlet์˜ ์ค‘๊ฐ„.

DispatcherServlet์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต

์›น์ปจํ…Œ์ด๋„ˆ(์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ)์—์„œ ๋™์ž‘ํ•˜๋Š” ํ•„ํ„ฐ์™€ ๋‹ฌ๋ฆฌ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์—์„œ ๋™์ž‘์„ ํ•œ๋‹ค.

 

์ธํ„ฐ์…‰ํ„ฐ์˜ ๋ฉ”์„œ๋“œ 3๊ฐ€์ง€

- preHandler : ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰, ๋ฆฌํ„ด ๊ฐ’์ด boolean ๊ฐ’. ๋ฆฌํ„ด๊ฐ’์ด true๋ฉด ๋‹ค์Œ๋‹จ๊ณ„๋กœ ์ง„ํ–‰, false๋ผ๋ฉด ์ž‘์—…์„ ์ค‘๋‹จํ•˜์—ฌ ์ดํ›„์˜ ์ž‘์—…์€ ์ง„ํ–‰ ์•ˆ๋จ. (ex.ํšŒ์›์€ ๋งž๋‚˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ํšŒ์›์ผ๋•Œ)

default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     return true;
}

- postHandler : ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋œ ํ›„์— ์‹คํ–‰

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}

- afterCompletion : ๋ทฐ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜์„œ(๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์—) ์‹คํ–‰. postHandler์™€ ๋‹ฌ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ ํ•˜์œ„ ๊ณ„์ธต์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ afterCompletion์€ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ๋œ๋‹ค.

 default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}

 

 

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TestInterceptor())
            .addPathPatterns("/hello");
        /*
        registry.addInterceptor(์ธํ„ฐ์…‰ํ„ฐ๊ฐ์ฒด)
            .addPathPatterns("/*") - ๋ชจ๋“  Path ์ ์šฉ 
            .excludePathPatterns("/sample"); - /sample Path ์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ์™ธ
        */
    }
}

addInterceptors๋ผ๋Š” ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งคํ•‘๋ช…์ด /hello๋ฅผ ๊ฐ–๋Š” ๊ฒŒ ์š”์ฒญ๋  ๊ฒฝ์šฐ์—๋งŒ TestInterceptor๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. excludePathPatterns๋Š” ํ•ด๋‹น ๋งคํ•‘๋ช…์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ์™ธํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

addPathPatterns("/*")๋Š” ๋ชจ๋“  Path์— ์ ์šฉ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

addInterceptor() : ๋“ฑ๋กํ•  ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ •

addPathPatterns() : ์ ์šฉํ•  URL ํŒจํ„ด ์„ค์ •

excludePathPatterns() : ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ œ์™ธํ•  URL ํŒจํ„ด ๋“ฑ๋ก

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•„ํ„ฐ vs ์ธํ„ฐ์…‰ํ„ฐ ์ฐจ์ด

์ถœ์ฒ˜ : https://mangkyu.tistory.com/173

 

 

AOP (Aspect-Oriented Programming)

์ถœ์ฒ˜ : https://medium.com/@darogadibia/aspect-oriented-programming-for-dummies-775e1a432daa

ํ•ต์‹ฌ๊ธฐ๋Šฅ๊ณผ ๊ณตํ†ต๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์ณ ์‚ฌ์šฉ๋˜๋Š” ๊ณตํ†ต ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ.

๊ด€์  (๊ด€์‹ฌ) ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ. → ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ, ๊ตฌ์„ฑ์„ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์„ ๋ฐ”๊ฟ”๋ณด์ž๋Š” ๋œป.

OOP๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š” ์• ๋‹ค..

๊ธฐ์กด์— OOP์—์„œ ๋ฐ”๋ผ๋ณด๋˜ ๊ด€์ ์„ ๋‹ฌ๋ฆฌ ํ•˜์—ฌ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด์•˜์„ ๋•Œ ๊ณตํ†ต๋œ ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜์ž๋Š” ๊ฒƒ์ด ๋ฐ”๋ผ AOP ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฃผ์š” ์‚ฌ์ƒ.

์ถœ์ฒ˜ : https://javawork.tistory.com/entry/Spring-AOP

๊ฐ€๋กœ ์˜์—ญ์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ์ž˜๋ผ๋ƒˆ๋‹ค๊ณ  ํ•ด์„œ AOP๋ฅผ ํฌ๋กœ์Šค ์ปทํŒ…์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ.

 

OOP : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(ํ•ต์‹ฌ๊ธฐ๋Šฅ)์˜ ๋ชจ๋“ˆํ™”, ๋ชจ๋“ˆํ™”์˜ ๋‹จ์œ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

AOP : ๊ณตํ†ต๊ธฐ๋Šฅ์˜ ๋ชจ๋“ˆํ™”. (์˜ˆ : ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…, ๋™๊ธฐํ™”, ์˜ค๋ฅ˜๊ฒ€์‚ฌ ๋ฐ ์ฒ˜๋ฆฌ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋“ค์˜ ์ฃผ ๋ชฉ์  ์™ธ์— ํ•„์š”ํ•œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค)

 

AOP๋Š” ๊ฐ๊ฐ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•.

OOP์—์„œ๋Š” ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†, ์œ„์ž„์„ ์‚ฌ์šฉํ•จ. ๊ทธ๋Ÿฌ๋‚˜ ๊น”๋”ํ•œ ๋ชจ๋“ˆํ™”๊ฐ€ ์–ด๋ ค์› ์Œ. ๊ทธ๋ž˜์„œ AOP๊ฐ€ ๋“ฑ์žฅ.

 

AOP ์žฅ์  : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ํฉ์–ด์ ธ ๊ตฌํ˜„๋˜๋Š” ๊ณตํ†ต๊ธฐ๋Šฅ์ด ํ•˜๋‚˜์˜ ์žฅ์†Œ์—์„œ ๊ด€๋ฆฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์— ์ข‹์Œ. ํ•ต์‹ฌ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋กœ, ํ•ต์‹ฌ๋กœ์ง์€ ์ž์‹ ์˜ ๊ธฐ๋Šฅ์—๋งŒ ์ง‘์ค‘ํ• ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ต์‹ฌ๊ธฐ๋Šฅ๊ณผ ๋ฝ‘์•„๋‚ธ ๊ธฐ๋Šฅ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์„ weaving์ด๋ผ๊ณ  ํ•œ๋‹ค. pointcut์— ์˜ํ•ด ์ •ํ•ด์ง„ Target์˜ JoinPoint์— Advice๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ

 

AOP ์ ์šฉ ๋ฐฉ์‹ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

 

- ์ปดํŒŒ์ผ ์‹œ์  : ํŠน๋ณ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ

- ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์  : ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ weaving์‹œํ‚จ๋‹ค. ํด๋ž˜์Šค ๋กœ๋” ์กฐ์ž‘๊ธฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•จ.

- ๋Ÿฐํƒ€์ž„ ์‹œ์  : ์Šคํ”„๋ง์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹. ํด๋ž˜์Šค ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋œ ํ›„ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ ๋‹ค์Œ์— ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹. ํŠน๋ณ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ, ํด๋ž˜์Šค ๋กœ๋” ์กฐ์ž‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ AOP๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

AOP ์šฉ์–ด

 

์กฐ์ธ ํฌ์ธํŠธ ( Join point )

๋ฉ”์„œ๋“œ ์‹คํ–‰์‹œ์ , ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์ , ๊ฐ์ฒด ์ƒ์„ฑ, ์ƒ์„ฑ์ž ํ˜ธ์ถœ ํ•˜๋Š” ์‹œ์  ๋“ฑ์„ ์กฐ์ธ ํฌ์ธํŠธ๋ผ๊ณ  ํ•œ๋‹ค. 

์ถœ์ฒ˜ : https://backtony.github.io/spring/2021-12-29-spring-aop-2/

ํฌ์ธํŠธ์ปท

์กฐ์ธ ํฌ์ธํŠธ ์ค‘์—์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์ด ์ ์šฉ๋  ์œ„์น˜๋ฅผ ์„ ๋ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ. 

 

Aspect (Adviser : ์Šคํ”„๋ง ์šฉ์–ด)

Advice + Pointcut์„ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ

 

@Before : ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋ถˆ๋Ÿฌ์™€๋ผ..

@After : ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ ์ˆ˜ํ–‰ํ• ๋•Œ ์”€.

 

AOP ํ”„๋ก์‹œ

AOP ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ํ”„๋ก์‹œ ๊ฐ์ฒด

 

@Aspect : Advisor๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• . ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ๋˜๋Š” ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

@Component(value="advice")
@Aspect
public class CalcAdvice {

 

Advice

@AfterThrowing : ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๊ฒฝ์šฐ ์‹คํ–‰. ์˜ˆ์™ธ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

@After : ์กฐ์ธ ํฌ์ธํŠธ์˜ ์ •์ƒ, ์˜ˆ์™ธ ๋™์ž‘๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹คํ–‰ํ•œ๋‹ค.

Around ์–ด๋“œ๋ฐ”์ด์Šค : Before, After์„ ๋ฌถ์€ ๊ฒƒ๊ณผ ๋น„์Šท. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ around ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋จ.

 

Target์€ ํ•ต์‹ฌ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด. Target์„ ์ „์ฒด์ ์œผ๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์กด์žฌ๋ฅผ Proxy๋ผ๊ณ  ํ•œ๋‹ค. Proxy๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Target์„ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ํ•„์š”ํ•œ ๊ณตํ†ต๊ธฐ๋Šฅ(Advice)๋“ค์„ ๊ฑฐ์ณ์„œ Target์˜ ๋ฉ”์„œ๋“œ๋“ค์ด ํ˜ธ์ถœ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ง„๋‹ค. Proxy๋Š” ๋Œ€๋ถ€๋ถ„ ์Šคํ”„๋ง AOP ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•œ๋‹ค.

 

JoinPoint๋Š” Target์ด ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ๋“ค.. Target์—๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๋ฉ”์„œ๋“œ์— ๊ณตํ†ต๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•˜๋Š”๋ฐ ์ด ๊ฒฐ์ •์„ Pointcut ์ด๋ผ๊ณ  ํ•จ.

 

 

์–ด๋…ธํ…Œ์ด์…˜ ๋™์ž‘ ์ˆœ์„œ

ํƒ€๊ฒŸ ๋จธ์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ Advice์˜ ๋Œ€์ƒ์ด ๋  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘

Around → Before → AfterThrowing → AfterReturning → After → Around

 

@AfterReturning(pointcut="execution(public int aop04.*.*())", returning="ret" )

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

System.out.println("Before Around"); // Before
Object obj = null;
try {
    obj = jp.proceed();
    System.out.println("Around ๋ฆฌํ„ด ๊ฐ’ : "+obj); //After
} catch(Exception e) {
    System.out.println("Around ์˜ˆ์™ธ ๋ฐœ์ƒ : "+e.getMessage()) //AfterThrowing
}
if (obj == null) //AfterReturning
    obj = new Integer(0);
System.out.println("After Around");
return obj;

 

within : ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค์นญ๋จ. 

bean : ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ AOP ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ์ง€์ •

@Override
public Status openConnection(String host) {
    if (blackListedHost.contains(host)) {
        return Status.BLACKLISTED;
    }
    if (internet == null) {
        this.internet = new MyInternet();
    }
    return internet.openConnection(host);
}

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด 

์ฝ˜์†”์ฐฝ์— ์ด๋Ÿฐ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

@Component
@Aspect
public class MyAspect{
    @Before("execution(public int aop04.*.*())")
    public void b(JoinPoint joinPoint) {
       System.out.println("Before");
    }
    
    @After("execution(public int aop04.*.*())")
    public void a(JoinPoint joinPoint) {
       System.out.println("After");
    }

aop04.*.*() : ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๋œป

@Before("execution(public void aop05.*.*())")
public void login(JoinPoint joinPoint) {
    System.out.println("AOP ๊ฐ€ ์ ์šฉ๋œ ์กฐ์ธํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด ๋ณด์žฅ~~");
    System.out.println(joinPoint);
    System.out.println(joinPoint.getSignature());
    System.out.println(joinPoint.getTarget());
    System.out.println(joinPoint.toLongString());
    System.out.println(joinPoint.toShortString());
    System.out.println(joinPoint.getThis());
    System.out.println("-------------------------------------------");
    System.out.println("๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ");
}


์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด

์ฝ˜์†”์— ์ด๋Ÿฐ์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค..

@Pointcut("execution(public void aop06.*.*())")
public void myWork() {
}
@Before("myWork()")
public void login(JoinPoint joinPoint) {
    System.out.println("๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ");
}


์ด๋Ÿฐ์‹์œผ๋กœ myWork()๋กœ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ  ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•จ.

@Before("within(aop09.CoreEx)")
public void before(){
    System.out.println("Before Advice");
}


within์•ˆ์— ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋„ฃ์œผ๋ฉด ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฒŒ Pointcut์ด ๋œ๋‹ค.

@AfterThrowing(pointcut="within(aop09.CoreEx)", throwing="e" )
public void afterThrowing(Throwable e){
    System.out.println("์˜ˆ์™ธ๊ฐ€ ์‹คํ–‰๋ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” Advice : "+e.getMessage());
}


ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ์— ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ.

AfterThrowing ์ž์ฒด๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์ง„ ์•Š์Œ. 

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์›ํ•œ๋‹ค๋ฉด around advice๋กœ ์ง์ ‘ ์˜ˆ์™ธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์Œ

@Before("bean(calc)")
public void before(){
    System.out.println("์—ฐ์‚ฐ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
}


calc๋ผ๋Š” ์ด๋ฆ„์˜ ๋นˆ ๊ฐ์ฒด ์ฒ˜๋ฆฌ์‹œ.. ๋ผ๋Š” ๋œป

@Component("calc")
public class CalcMethod {


์ด๋Ÿฐ์‹์œผ๋กœ..

@Before("execution(public * aop13.DayServiceImpl.get*())")


get* ๋ฉด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด get์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ€๋ฅดํ‚ด

@AfterThrowing(pointcut="execution(* *.*.error*())", throwing="e" )


ํŒจํ‚ค์ง€ ๋ช…, ํด๋ž˜์Šค ๋ช…์ด ๋ญ๋˜ ๊ฐ„์—.. error๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ฒ˜๋ฆฌ์‹œ์—..

๊ฐ€๊ธ‰์  System.exit(0)๋ฅผ ์ด์šฉํ•ด ์ข…๋ฃŒํ•˜๋Š” ๊ฑด ์•ˆํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค

@Around("execution(public * aop14.DayServiceImpl.*())")


๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋จ. 

ProceedingJoinPoint๋Š” JoinPoint์˜ ์ž์‹

pjp.getSignature().getName().startsWith("get")

'๋ฉ”์„œ๋“œ์ด๋ฆ„์ด get์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด' ์ด๋ผ๋Š” ๋œป.

 

์Šคํ”„๋ง FW์˜ ํ•ต์‹ฌ 3๋Œ€ ์š”์†Œ (Spring Triangle)

์ถœ์ฒ˜ : https://velog.io/@kimsunfang/Spring%EC%9D%98-3%EB%8C%80-%EC%9A%94%EC%86%8C

IoC(์ œ์–ด์˜ ์—ญ์ „), DI(์˜์กด์„ฑ ์ฃผ์ž…), AOP(๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ), PSA(์ด์‹๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค ์ถ”์ƒํ™”)

 

PSA

์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์„ ์ถ”์ƒํ™”ํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”์™€ ๊ด€๊ณ„์—†์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ถ”์ƒํ™” ๊ตฌ์กฐ. POJO ์›์น™์„ ์ฒ ์ €ํžˆ ๋”ฐ๋ฅธ Spring์˜ ๊ธฐ๋Šฅ์œผ๋กœ Spring์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” Library๋“ค์€ POJO ์›์น™์„ ์ง€ํ‚ค๊ฒŒ๋” PSA ํ˜•ํƒœ์˜ ์ถ”์ƒํ™”๊ฐ€ ๋˜์–ด์žˆ์Œ์„ ์˜๋ฏธ.

PSA๊ฐ€ ์ ์šฉ๋œ ์ฝ”๋“œ๋ผ๋ฉด ๋‚˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ๋„, ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ”๊ฟ€์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ , ๊ธฐ์ˆ ์— ํŠนํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธ.

@Entity


DB ํ…Œ์ด๋ธ”์„ ์ž๋ฐ”ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ๊ฐ์ฒด๋กœ ๋‹ค๋ค„์•ผ ํ•จ. ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๋Š”๊ฒŒ JPA์˜ ํ•ต์‹ฌ. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ORM. JPA๋Š” ๋Œ€ํ‘œ์ ์ธ ORM ๊ธฐ์ˆ .์ด์ œ ๋” ์ด์ƒ DBํ…Œ์ด๋ธ” ์‹ ๊ฒฝ์•ˆ์“ฐ๊ณ  ๋ฐ์ดํ„ฐ๋กœ ์—ฌ๊ธฐ๋ฉด ๋จ.

@Entity๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉด ์ž๋ฐ”๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋•Œ ์“ฐ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

์ด ์ด๋ฆ„ํ•˜๊ณ  ๋งค์นญ๋˜๋Š” DBํ…Œ์ด๋ธ”์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ ๋‹ค.

@Entity
@Table(name="emp")
public class EmpDTO {


๋งค์นญํ• ๋•Œ empDTO(์ฒซ๊ธ€์ž๋Š” ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•จ)๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋‚˜ Table(name="emp")๋กœ ์ ์–ด๋†”์„œ ์ด๋ฆ„์ด emp๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ์ฐพ๋„๋ก ํ•ด๋†จ๋‹ค.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)


@id๋Š” ์‹๋ณ„ํ‚ค์˜ ์—ญํ• ์„ ํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ๋œป.

@GeneratedValue(strategy = GenerationType.IDENTITY) ์ด๊ฑฐ๋Š” auto_increment๋ผ๋Š” ๋œป

@CreationTimestamp
private java.sql.Date writeDate;


@CreationTimestamp ์ด๊ฒƒ๋งŒ ์จ์ฃผ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ insertํ•  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ž๋™์œผ๋กœ ์„ธํŒ…ํ•ด์คŒ.

<property name="hibernate.hbm2ddl.auto" value="update" />


ํ…Œ์ด๋ธ”์ด ์—†๋‹ค๋ฉด ๋งŒ๋“ค์–ด๋ผ.. ๋””ํดํŠธ๋Š” none์ž„.

์žˆ์œผ๋ฉด ๋งŒ๋“ค์ง€ ๋ง๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ค์–ด๋ผ → update

์žˆ์–ด๋„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋ผ → create ๋„ฃ์–ด์ฃผ๋ฉด ๋จ. value์—..

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />


MySQL8๋ฒ„์ „์˜ Dialect์ด ๋งŒ๋“ค์–ด์ง€๋„๋ก ํ•ด๋ผ..

 

 

'๐Ÿ’ผ Full-Stack Study โ‘ก (feat. KOSA)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JPA, JQPL  (0) 2023.10.30
JPA  (0) 2023.10.26
Spring Boot, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ์›น์†Œ์ผ“  (0) 2023.10.24
tailwind  (0) 2023.10.14
Mybatis  (0) 2023.10.12