javaboiii의 Spring

Spring - AOP 관점 지향 프로그래밍

javaboiii 2024. 10. 15. 14:26

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(제어의 역전)와 함께 사용되어 모듈 간 결합도를 낮춤

응집도 증가: 공통 기능이 모듈화되어 응집도가 높아지며 코드의 가독성 향상

유지보수 용이: 공통 로직을 한 곳에서 관리할 수 있어 유지보수가 간편