๐Ÿ˜€
Hyune's Wiki
  • Welcome
  • Article
    • Link
  • Mentor & Code Reviewer
    • ์ง„ํ–‰ํ•˜๊ธฐ์— ์•ž์„œ..
    • Code Review History
      • ํ•œ๋ฐฉ ์ฟผ๋ฆฌ vs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์กฐ๋ฆฝ
      • DB์—์„œ TIMESTAMP์™€ DATETIME ํƒ€์ž…์˜ ์ฐจ์ด
      • Service๋Š” ์–ด๋–ค dto๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ• ๊นŒ?
        • ํ™•์žฅ ์งˆ๋ฌธ
  • Legacy
    • ์‹ค๋ฌด ๊ฒฝํ—˜ & ํŒ
      • Kotlin
        • ํŒŒ์ผ ์กฐ์ž‘ํ•˜๊ธฐ
      • Infra
        • Lightsail
          • ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ ์˜ˆ์ œ
        • ๊ณต์ธ ip ํ™•์ธํ•˜๊ธฐ
      • Database
        • INSERT INTO SELECT SHARED LOCK(row LOCK)
      • API Document
        • OpenAPI (Swagger 3.0)
          • ์ •์  ๋ฌธ์„œ ๋‚ด๋ณด๋‚ด๊ธฐ
      • Side Project
        • Codesquad
      • ETC
        • HTTP Request ์ถ”์ ํ•˜๊ธฐ with HAR File
    • Study
      • Language
        • Java
          • Copy
          • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
          • Garbage Collection
          • ์ž๋ฃŒ๊ตฌ์กฐ
          • Java 17
        • Kotlin
          • Coroutine
      • Framework & Library
        • Spring
          • Spring Security
          • @Component vs @Configuration
        • JPA
          • show-sql ์„ค์ •์˜ ๋‹จ์ 
          • @GeneratedValue strategy
          • Entity์˜ field type
        • Logback
          • ๊ธฐ๋ณธ ์„ค์ •
        • Monitoring
          • VisualVM
            • ์„ค์น˜
            • ๋ฌธ์ž์—ด ์ƒ์„ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ
          • nGrinder
      • Database
        • MySQL
          • SQL ๋ฌธ ์ˆ˜ํ–‰ ์ ˆ์ฐจ
          • ํŠธ๋žœ์žญ์…˜๊ณผ ์ž ๊ธˆ
          • ์ธ๋ฑ์Šค
      • Infra
        • AWS
          • S3
            • ์šฉ์–ด
            • Amazon SDK 1.x with Spring
          • DynamoDB
            • Get vs Query vs Scan
        • Docker & Kubernetes
      • Computer Science
        • OS
          • Process vs Thread
          • Process
        • Web
          • HTTP
            • HTTP vs HTTPS
            • HTTP ๊ตฌ์„ฑ
            • HTTP ๊ทธ์™ธ
          • REST API
            • GET ๋ฉ”์„œ๋“œ์— payload๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๊ฐ€?
            • ํŠน์ • ๋ชฉ์ ์˜ API๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ?
          • TCP / UDP
          • ์ธํ„ฐ๋„ท์˜ ์ž‘๋™ ์›๋ฆฌ
          • OAuth 2.0
        • Design Pattern
          • Builder Pattern
        • MSA
        • DDD
      • Test
        • Test Doule
      • Book & Online Class
        • ํ•œ ๋ฒˆ์— ๋๋‚ด๋Š” Spring ์™„.์ „.ํŒ ์ดˆ๊ฒฉ์ฐจ ํŒจํ‚ค์ง€ Online
          • AOP, Aspect Oriented Programming
          • Data Binding
          • IoC(Inversion of Control), DI(Dependency Injection)
          • Null Safety
          • Spring Resource
          • Spring Boot ๋ฒ„์ „๋ณ„ ๋ณ€ํ™”
          • SpEL, Spring Expression Language
          • Validation
        • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” 3ํŒ
          • 2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด
            • ์•„์ดํ…œ 1. ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋ผ
            • ์•„์ดํ…œ 2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ
            • ์•„์ดํ…œ 3. private ์ƒ์„ฑ์ž๋‚˜ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์ฆํ•˜๋ผ
            • ์•„์ดํ…œ 4. ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๊ฑฐ๋“  private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ
            • ์•„์ดํ…œ 5. ์ž์›์„ ์ง์ ‘ ๋ช…์‹œํ•˜์ง€ ๋ง๊ณ  ์˜์กด ๊ฐ์ฒด ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ผ
            • ์•„์ดํ…œ 7. ๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ
          • 3์žฅ ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ
            • ์•„์ดํ…œ 11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ
            • ์•„์ดํ…œ 12. toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ
            • ์•„์ดํ…œ 14. Comparable์„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ คํ•˜๋ผ
          • 4์žฅ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค
      • Webinar
        • ์š”์ฆ˜ ํž™ํ•œ ์Šคํƒ€ํŠธ์—…์˜ DBDB DEEPํ•œ ์ด์•ผ๊ธฐ
Powered by GitBook
On this page
  • AOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค
  • Aspect
  • Advice
  • Join point
  • Pointcut
  • Target Object
  • AOP Proxy
  • Weaving
  • AspectJ
  • Aspect์˜ ์ƒ์„ฑ
  • Pointcut ์„ ์–ธ
  • Pointcut ๊ฒฐํ•ฉ
  • Advice ์ •์˜
  • Before Advice
  • After Returning Advice
  • Around Advice

Was this helpful?

Edit on GitHub
  1. Legacy
  2. Study
  3. Book & Online Class
  4. ํ•œ ๋ฒˆ์— ๋๋‚ด๋Š” Spring ์™„.์ „.ํŒ ์ดˆ๊ฒฉ์ฐจ ํŒจํ‚ค์ง€ Online

AOP, Aspect Oriented Programming

Previousํ•œ ๋ฒˆ์— ๋๋‚ด๋Š” Spring ์™„.์ „.ํŒ ์ดˆ๊ฒฉ์ฐจ ํŒจํ‚ค์ง€ OnlineNextData Binding

Last updated 3 years ago

Was this helpful?

ํŠน์ •ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์ด๋‚˜ ํ›„์˜ ๊ณตํ†ต์ ์ธ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋œ๋‹ค. (๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ์ธ์ฆ)ใ…

AOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

Aspect

์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋‚˜ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ์„œ ์žˆ๋Š” ๊ด€์‹ฌ์‚ฌ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ. ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ๋ถ€๋ถ„์€ @Transactional ๊ธฐ๋Šฅ

Advice

AOP์—์„œ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ (๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ์ธ์ฆ ๋“ฑ)

Join point

Aspect ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ ํฌ์ธํŠธ

Pointcut

Join point ์ค‘์—์„œ Aspect ๋ฅผ ์ ์šฉํ•  ๋Œ€์ƒ์„ ๋ฝ‘์„ ์กฐ๊ฑด์‹

Target Object

Advice๊ฐ€ ์ ์šฉ๋  ๋Œ€์ƒ ์˜ค๋ธŒ์ ํŠธ

AOP Proxy

๋Œ€์ƒ ์˜ค๋ธŒ์ ํŠธ์— Aspect ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Advice ๋ฅผ ๋ง๋ถ™์ด๊ธฐ ์œ„ํ•ด ํ•˜๋Š” ์ž‘์—… ์ฃผ๋กœ CGLIB (Code Generation Library, ์‹คํ–‰ ์ค‘์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

Weaving

Advice ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ.

AspectJ

AOP๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Spring AOP ๋กœ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์˜ AOP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ. (Pointcut ๋“ฑ)

Aspect์˜ ์ƒ์„ฑ

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component  // Component๋ฅผ ๋ถ™์ธ ๊ฒƒ์€ ํ•ด๋‹น Aspect๋ฅผ ์Šคํ”„๋ง์˜ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
public class UsefulAspect {

}

Pointcut ์„ ์–ธ

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component  // Component๋ฅผ ๋ถ™์ธ ๊ฒƒ์€ ํ•ด๋‹น Aspect๋ฅผ ์Šคํ”„๋ง์˜ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
public class UsefulAspect {

	@Pointcut("execution(* transfer(..))")
	private void anyOldTransfer() {}
}
  • ํ•ด๋‹น Aspect์˜ Advice ๊ฐ€ ์ ์šฉ๋  Join point ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ํŒจํ„ด ๋˜๋Š” ์กฐ๊ฑด ์ƒ์„ฑ

  • ํฌ์ธํŠธ ์ปท ํ‘œํ˜„์‹์ด๋ผ๊ณ  ๋ถ€๋ฆ„

Pointcut ๊ฒฐํ•ฉ

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component  // Component๋ฅผ ๋ถ™์ธ ๊ฒƒ์€ ํ•ด๋‹น Aspect๋ฅผ ์Šคํ”„๋ง์˜ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
public class UsefulAspect {

	@Pointcut("execution(public * *(..))")
	private void anyPublicOperation() {} //public ๋ฉ”์„œ๋“œ ๋Œ€์ƒ ํฌ์ธํŠธ ์ปท

	@Pointcut("within(com.xyz.myapp.trading..*)")
	private void inTrading() {} // ํŠน์ • ํŒจํ‚ค์ง€ ๋Œ€์ƒ ํฌ์ธํŠธ ์ปท
	
	@Pointcut("anyPublicOperation() && inTrading()")
	private void tradingOperation() {} // ์œ„์˜ ๋‘ ์กฐ๊ฑด์„ and(&&) ์กฐ๊ฑด์œผ๋กœ ๊ฒฐํ•ฉํ•œ ํฌ์ธํŠธ ์ปท
}

Advice ์ •์˜

ํฌ์ธํŠธ ์ปท๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ํฌ์ธํŠธ์ปท์˜ ์ „/ํ›„/์ฃผ๋ณ€์—์„œ ์‹คํ–‰๋  ์•ก์…˜์„ ์ •์˜ํ•จ

Before Advice

dataAccessOperation() ์ด๋ผ๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ์ธํŠธ ์ปท์˜ ๋ฐ”๋กœ ์ „์— doAccessCheck() ๊ฐ€ ์‹คํ–‰

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class BeforeExample {

    @Before("com.xyz.myapp.CommonPointcuts.dataAccessOperation()")
    public void doAccessCheck() {
        // ...
    }
}

After Returning Advice

dataAccessOperation() ๋ผ๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ์ธํŠธ์ปท์—์„œ return ์ด ๋ฐœ์ƒ๋œ ํ›„ ์‹คํ–‰

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;

@Aspect
public class AfterReturningExample {

    @AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOperation()")
    public void doAccessCheck() {
        // ...
    }
}

Around Advice

businessService() ๋ผ๋Š” ํฌ์ธํŠธ์ปท์˜ ์ „/ํ›„์— ํ•„์š”ํ•œ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•จ

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class AroundExample {

    @Around("com.xyz.myapp.CommonPointcuts.businessService()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
        Object retVal = pjp.proceed();
        // stop stopwatch
        return retVal;
    }
}