Spring AOP 개념 정리 1

오성민·2022년 11월 3일
0

spring

목록 보기
4/17
post-thumbnail

혼자서 프로젝트를 생기면서 한 가지 궁금증이 생겼다.
바로 동일한 동작을 위한 동일한 코드가 계속해서 불필요하게 중복된다는 것이다. 나는 혼자서 진행하는 토이 프로젝트여서 규모가 작지만 규모가 큰 프로그램에서는 말도 안되게 중복이 발생할 것이다.

이러한 문제를 해결하기 위해서 AOP라는 프로그래밍 방식이 있다.

Spring AOP(Aspect Oriented Programming)

AOP는 Aspect Oriented Programming의 약자로 한국말로는 관점 지향 프로그래밍이다. OOP는 프로그램을 사물(객체)라고 생각하고 프로그래밍을 하여 해당 객체들간에 서로 메시지를 주고받으며 개발자가 기존에 생각했던 로직대로 흘러가게 한다. 이것과는 다르게 AOP는 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화를 하는 것이다.

위에서 말하는 핵심적인 관점은 비지니스 로직에 해당한다. 그리고 부가적인 관점은 그 비즈니스 로직을 부가적으로 돕는 로직에 해당하는 로깅, 메시징, DB 연결 등등 많은 부분에 해당한다.

비지니스 로직은 모든 메소드에서 동일하게 동작할 수는 없다. 하지만 부가적인 로직은 동일할 수 있다. 유튜브를 보면서 아주 좋은 예를 발견하였는데 누군가 나에게 각 메소드에 동작 시간을 파악하고 로그로 남기는 프로그램을 추가하라고 한다. 만약 AOP 방식으로 하지 않는다면 메소드가 10000개라면 10000개를 추가해주어할 것이다.

위와 같은 수고로움을 줄이기 위해서 사용하는 방식이 AOP이다. 위에 예와 같이 중복된 로직이 계속해서 반복되는 것을 흩어진 관심사라고 한다.
이렇게 흩어진 관심사(중복된 코드)를 모듈화하여 재사용하고, 중복을 피하기 위한 것이 AOP의 취지이다.

AOP 주요 개념

  • Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

AOP 설정

Dependency

implementation 'org.springframework.boot:spring-boot-starter-aop'

build.gradle 파일에 해당 내용을 추가하여 AOP를 사용할 가장 기본적인 준비를 끝낸다.

Annotation

Spring Boot를 이용한 개발을 하면서 가장 어려운 annotation이다. 꼭 까먹지 않도록 기억하자

@EnableAspectJAutoProxy

반드시 추가해야한다.

@SpringBootApplication
//AOP를 사용하기 위해서는 해당 annotation을 추가
@EnableAspectJAutoProxy
public class CommunityApplication {

	public static void main(String[] args) {
		SpringApplication.run(CommunityApplication.class, args);
	}
}

@Component

다음에 이와 관련된 포스팅을 진행할 것이지만, 간단하게 내용을 정리하자면 사용자가 정의한 Class를 Bean으로 등록하기 위한 annotation이다.

@Aspect

자동 프록시 생성기가 해당 Annotation이 존재하는 Class를 찾아서 해당 Class를 Advisor(Pointcut + Advice)로 만들어준다. 이 Annotation도 반드시 필요한 것이기에 반드시 넣어준다.

@Aspect
@Component
public class AOP {

}

그 외 아래와 같은 Annotation 등이 있다.

이렇게 대략적인 AOP의 내용을 정리하였다.
내용을 좀 더 자세히 공부하고 살을 붙이고 추가할 것은 다음에 추가하도록 해야겠다.

profile
풀스택을 지향하는 개발자

0개의 댓글