Spring
AOP( Aspect Oriented Programming)(관점 == 기능)
AOP는 "관점 지향 프로그래밍"으로 프로그램의 공통적인 관심사를 분리해 모듈화하는 방법론임
AOP를 통해 코드의 재사용성을 높이고 유지보수를 용이하게 할 수 있음
핵심 기능
- 핵심 관심사 (Core Concerns)
- 비즈니스 로직, CRUD 메서드 등 애플리케이션의 주된 기능을 의미
- 공통 관심사 (Cross-Cutting Concerns)
- 로그, 인증, 유효성 검사 등 여러 모듈에 걸쳐 반복적으로 사용되는 기능
이러한 공통 기능은 코드 중복을 초래하고 유지보수를 어렵게 함
- 로그, 인증, 유효성 검사 등 여러 모듈에 걸쳐 반복적으로 사용되는 기능
AOP의 구성 요소
Advice (어드바이스)
- 공통 로직으로, 특정 Joinpoint에서 실행될 코드
Pointcut (포인트컷)
- 어떤 Joinpoint에서 Advice를 적용할지를 정의
CRUD 메서드나 특정 조건을 만족하는 메서드를 지정할 수 있음
Joinpoint (조인포인트)
- Advice가 적용될 수 있는 지점으로 모든 CRUD 메서드를 포함
Aspect (애스팩트)
- Advice와 Pointcut의 결합체로 특정 공통 기능을 적용할 대상을 정의
Weaving (위빙)
- 핵심 관심사에 공통 로직을 삽입하는 과정
스프링에서는 런타임 시에 위빙이 이루어짐
AOP설정 순서
1. 의존성 추가
AOP를 사용하기 위해 스프링 AOP 관련 의존성 추가
<!-- AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
AOP XML 설정
스프링 XML 설정 파일에서 AOP를 구성 (applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.koreait.app.biz.member" />
<context:component-scan base-package="com.koreait.app.biz.board" />
<bean class="com.koreait.app.biz.common.LogAdvice" id="la"/>
<bean class="com.koreait.app.biz.common.BoardInsertLogAdvice" id="bia"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.koreait.app.biz..*Impl.*(..))" id="aPointcut"/>
<aop:pointcut expression="execution(* com.koreait.app.biz..*Impl.select*(..))" id="bPointcut"/>
<aop:pointcut expression="execution(* com.koreait.app.biz.board..*Impl.insert(..))" id="cPointcut"/>
<aop:aspect ref="la">
<aop:before pointcut-ref="aPointcut" method="printLog"/>
</aop:aspect>
<aop:aspect ref="bia">
<aop:after pointcut-ref="cPointcut" method="printAfterInsertBoard"/>
</aop:aspect>
</aop:config>
</bean>
Advice 클래스 작성
AOP의 공통 로직인 Advice를 작성
package com.koreait.app.biz.common;
import org.aspectj.lang.JoinPoint;
import com.koreait.app.biz.board.BoardDTO;
public class BoardInsertLogAdvice {
public void printAfterInsertBoard(JoinPoint joinPoint) {
Object[] obj = joinPoint.getArgs();
BoardDTO boardDTO = null;
for (Object arg : obj) {
System.out.println("Argument: " + arg); // 각 인자 출력
if(arg instanceof BoardDTO) {
boardDTO = (BoardDTO)arg;
}
}
System.out.println(boardDTO.getBoard_writer_id()+"님의 글이 DB에 등록 되었습니다.");
}
}
객체지향 프로그래밍(OOP)
클래스와 객체를 중심으로 하는 프로그래밍 방식으로 객체의 상태와 행동을 정의
절차지향 프로그래밍
함수를 중심으로 프로그램을 구성하며 함수의 호출 흐름에 따라 프로그램이 실행
AOP는 OOP의 한계를 보완하기 위해 등장
예를 들어 공통 로직을 수정할 때 코드가 많이 변경되어야 할 경우
AOP를 사용하면 코드의 변경 없이 Advice만 수정하면 됨
AOP를 통해 개발 시간과 비용을 절감할 수 있음
AOP의 장점
결합도 감소: IoC(제어의 역전)와 함께 사용되어 모듈 간 결합도를 낮춤
응집도 증가: 공통 기능이 모듈화되어 응집도가 높아지며 코드의 가독성 향상
유지보수 용이: 공통 로직을 한 곳에서 관리할 수 있어 유지보수가 간편
'javaboiii의 Spring' 카테고리의 다른 글
Spring - 성능 개선(Model 맛) (0) | 2024.10.18 |
---|---|
Spring - 트랜잭션 (0) | 2024.10.17 |
Spring - 비동기 처리 (0) | 2024.10.14 |
Spring - 성능개선(Controller맛) (2) | 2024.10.10 |
Spring - ViewResolver와 요청 처리 흐름 (feat.@controller) (0) | 2024.10.08 |