AOP(Aspect-Oriented Programming) 개요
1. AOP란?
- 코드에서 공통적으로 반복되는 부분(횡단 관심사)을 분리.
- 주요 로직(핵심 로직)과 부가 작업(부가 로직)을 나누는 프로그래밍 기법.
- 코드 중복을 줄이고 유지보수를 쉽게 만듦.
2. AOP 구성 요소
- 핵심 로직: 실제로 중요한 작업.
- 예: 회사 미팅, 자기, 운동하기.
- 부가 로직: 반복되며, 핵심 로직에 붙는 작업.
- 예: 옷을 입는 행위.
- 횡단 관심사: 여러 곳에서 공통적으로 필요한 작업.
- 예: 로깅, 트랜잭션 처리, 유효성 검사.
3. 적용 예시
- 핵심 로직: "회사 미팅", "운동하기" 등의 주요 활동.
- 부가 로직: "격식 있게 옷을 입다", "운동복을 입다".
- 핵심 로직은 상황에 따라 달라지지만, "옷을 입는" 부가 로직은 항상 필요함.
AOP를 이용한 유효성 검사
1. 유효성 검사란?
- 데이터를 서버에 보내기 전에 조건을 확인하는 작업.
- 예: 이름이 비어있지 않은지, 나이가 0 이상인지 확인.
2. 유효성 검사가 필요한 이유
- 잘못된 데이터가 서버로 들어오는 것을 방지.
- 데이터를 처리하는 과정에서 발생할 수 있는 오류를 줄임.
AOP를 사용한 유효성 검사 흐름
1. 작동 방식
- 클라이언트가 서버로 데이터를 보냄.
- AOP가 데이터를 가로채서 검사.
- 조건을 만족하지 못하면 에러를 반환.
- 조건을 만족하면 다음 로직(핵심 로직)을 실행.
2. 예제 코드
@Component
@Aspect
public class ValidationAspect {
@Before("@annotation(org.springframework.web.bind.annotation.PostMapping)") // 메서드 실행 전에 작동
public void validate(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs(); // 메서드의 모든 매개변수 가져오기
for (Object arg : args) {
if (arg instanceof Errors) { // Errors 객체 확인
Errors errors = (Errors) arg;
if (errors.hasErrors()) { // 에러 존재 여부 확인
String errMsg = errors.getFieldErrors().get(0).getField() +
": " + errors.getFieldErrors().get(0).getDefaultMessage();
throw new IllegalArgumentException(errMsg); // 예외 던지기
}
}
}
}
}
유효성 검사 어노테이션
1. 주요 어노테이션
@Valid
: 유효성 검사를 트리거.
@NotNull
: 필수 값.
@NotEmpty
: 빈 문자열 금지.
@Min
: 최소값 조건.
@Max
: 최대값 조건.
@Size
: 문자열 길이 제한.
@Pattern
: 정규식 조건.
2. DTO에 적용 예
public class UserDTO {
@NotNull(message = "이름은 필수입니다.")
private String name;
@Min(value = 18, message = "나이는 18 이상이어야 합니다.")
private int age;
@Email(message = "유효한 이메일 주소여야 합니다.")
private String email;
}
3. 추가 설정 및 라이브러리
- Spring Boot Starter Validation
- 유효성 검사를 위한 라이브러리.
- Gradle:
implementation 'org.springframework.boot:spring-boot-starter-validation'
- Spring Boot Starter AOP
- AOP를 구현하기 위한 라이브러리.
- Gradle:
mplementation 'org.springframework.boot:spring-boot-starter-aop'
정리
- AOP는 핵심 로직과 부가 로직을 분리해 코드를 간결하고 효율적으로 만듦.
- 유효성 검사는 클라이언트로부터 들어온 데이터를 검증하는 작업.
- AOP로 유효성 검사를 구현하면 공통 로직을 한 곳에서 처리 가능.
@Valid
와 같은 어노테이션으로 간편하게 유효성 검사 추가 가능.
Share article