(3) 2장_스프링 코어(DI, AOP) - AOP, SpEL

2021. 3. 22. 23:00개발공부/스프링 철저 입문


AOP(관점 지향 프로그래밍)


비즈니스 로직과 관련 없지만 여러 모듈에 걸쳐 공통적이고 반복적으로 처리가 필요한 내용을 횡단 관심사(Cross-Cutting Concern)이라고 합니다. 이를 DRY(Do not Repeat Yourself)대로 분리해서 한 곳으로 모으는 방법을 관점 지향 프로그래밍(AOP)라고 합니다. 예시로 보안, 로깅, 트랜잭션 관리, 모니터링, 캐시처리, 예외처리가 있습니다. 


AOP 용어


- Aspect : AOP 단위가 되는 횡단 관심사(ex.로그를 출력한다, 예외를 처리한다...등)

- Join Point : 횡단 관심사가 실행될 지점이나 시점(정상 종료나 예외 발생)을 말한다.

- Advice : 실행되는 코드; 횡단 관심사를 실제로 구현해서 처리하는 부분(Around, Before, After 등의 유형이 있음)

 - Advice 유형

    - Before : 조인 포인트 전에 실행

    - After Returning : 조인 포인트가 정상적으로 종료한 후에 실행

    - After Throwing: 조인 포인트에서 예외가 발생했을 때 실행

    - After : 조인 포인트에서 처리가 완료된 후 실행. 예외 발생이나 정상종료 여부에 관계없음

    - Around : 조인 포인트 전후에 실행, 가장 강력한 어드바이스이며, 메서드 실행 전후 처리는 물론 포인트 컷이 적용된 대상 메서드 자체도 실행할 수 있습니다.

- Pointcut : 수많은 조인 포인트 중에서 실제로 어드바이스를 적용할 곳을 선별하기 위한 표현식

- Weaving : 애플리케이션의 적절한 지점에 애스펙트를 적용하는 것을 말한다.(실행 시점, 클래스 로딩 시점, 컴파일 시점 등)

- Target : AOP 처리에 의해 변화가 생긴 객체


포인트컷 표현식


execution(*[반환자] *com.example.domain.*Service.find(String..))

 - Service로 끝나는 클래스를 대상으로 함

 - find로 시작하는 메서드를 대상으로 함

네임드 포인트컷 : @Pointcut 어노테이션을 만들어 Advice에서 메서드명으로 호출할 수 있습니다.

1
2
3
4
5
6
7
8
9
@Pointcut("execution(public * *(..))")
 public void inDomainLayer() {
 
 
@Around("inDomainLayer()"
public Object log(ProceedingJointPoint jp) throws Throwable {
 
}
cs

스프링 프로젝트에서 활용되는 AOP 기능


트랜잭션 관리

 - @Transactional 애너테이션을 지정하면 해당 메서드가 정상적으로 종료한 것이 확인되면 트랜잭션을 커밋하고 실패해서 예외가 발생할 것을 감지하면 롤백합니다.

 - 권한 제어가 필요할 경우 @PreAuthorize 애너테이션을 사용하면 해당 메서드가 호출되기 전에 특정 인가 조건을 만족하는지 확인할 수 있습니다.

스프링 데이터 바인딩

 - 대표적인 바인딩이 일어나는 곳은 웹 애플리케이션 HTTP 전송일 것입니다. 이 때 DataBinder 클래스가 제공하는 ServletRequestDataBinder을 사용하면 변수가 많아져도 처리해줄 수 있습니다.

스프링의 형 변환

 - PropertyEditor 활용, ConversionService 활용, 포매팅용 애너테이션 활용 등이 있습니다.

프로퍼티 관리

 - 애플리케이션에서 사용하는 각종 설정 값은 빈에서 읽어오는데 설정 값도 DI 컨테이너에 등록됩니다. 이 때 의존적인 정보가 String 절대값이면 변경이 일어났을 때 개선이 어려우므로 @Value를 사용해 프로퍼티를 설정해줍니다.

1
2
3
4
5
@Value("${datasource.driver-class-name}") String driverClassName 
datasource.setDriverClassName(driverClassName); 
 
//프로퍼티 파일(application.properties) 
datasource.driver-class-name=org.mysql.Driver
cs

 

 - 스프링 프레임워크가 프로퍼티 값을 주입하려면 위치를 지정해줘야 합니다. @PropertySource 어노테이션을 사용해 지정해줄 수 있습니다.

1
2
3
4
5
@Configuration 
@PropertySource("classpath:application.properties"
public class Appconfig {
 // 
}
cs

 

 - XML 기반 설정 방식에서 프로퍼티의 기본값 설정. 변경할 일이 거의 없는 프로퍼티에 대해서는 이 방식을 적용하는 것이 유용합니다.

1
2
3
<bean id="dataSource" class="org.apache..." destroy-method="close"> 
    <property name="driverClassName" value="${datasource.driver-class-name:org.mysql.Driver}"/> 
</bean>
cs

 

스프링 표현 언어(SpEL)

 - 설정 : spring-expression을 의존 라이브러리로 추가합니다. SpEL은 스프링이 제공하는 형 변환이 일어나기 때문에 다른 타입으로 형 변환할 수 있습니다.

1
2
3
4
5
//SpEL을 이용한 자바빈즈의 프로퍼티 설정 
ExpressionParser parser = new SpelExpressionParser(); 
Expression expression = parser.parseExpression("joinedYear"); 
Staff staff = new Staff(); expression.setValue(staff, "2000"); 
Integer joinedYear = staff.getJoinedYear();
cs

 

 - 변수의 개념이 있어서 변수에 접근하기 위한 표현인 #변수명 을 지원합니다.


 

출처 : 스프링 철저 입문