AOP(Aspect Oriented Programming)는 관심사의 분리(Separation of Concerns)를 실현하기 위한 프로그래밍 패러다임
핵심 비즈니스 로직과는 별도로 처리되어야 할 공통 기능(로깅, 보안, 트랜잭션 등)을 분리해서 모듈화할 수 있게 해준다.
Spring 기반 애플리케이션에서는 다양한 공통 기능이 반복적으로 등장한다.
이를 각 서비스마다 구현하면 중복 코드가 늘어나고, 유지보수가 어려워진다.
AOP를 사용하면:
@Transactional
public void processOrder() {
// 주문 처리 로직
}
Spring은 AOP 기반으로 @Transactional 동작을 구현한다.
메서드 실행 전후에 트랜잭션을 시작하고, 실패 시 롤백한다.
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service..*(..))")
public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("메서드 호출: " + joinPoint.getSignature());
return joinPoint.proceed();
}
}
서비스 계층 메서드에 대한 일괄 로그 출력을 구현한다.
@Aspect: AOP 클래스 정의
@Before, @After, @Around: 실행 시점 정의
Pointcut: 어떤 메서드에 적용할지 지정
Advice: 실제 실행될 공통 기능
String일 경우 ViewResolver를 통해 .html, .jsp 등의 뷰 파일로 연결@ResponseBody를 붙이지 않으면 반환 문자열을 View 이름으로 인식함@Controller
public class PageController {
@GetMapping("/hello")
public String hello() {
return "hello"; // templates/hello.html 렌더링
}
}
@Controller + @ResponseBody 조합의 단축형@RestController
public class ApiController {
@GetMapping("/api/hello")
public String hello() {
return "hello"; // 문자열을 그대로 반환 (JSON 또는 텍스트)
}
}
| 항목 | @Controller | @RestController |
|---|---|---|
| 반환 대상 | View 이름 (String) | 객체 또는 문자열 |
| 사용 목적 | 웹 페이지(View) 렌더링 | RESTful API 응답 |
| 필요 어노테이션 | @ResponseBody 필요 | 별도 필요 없음 (@RestController에 내장) |
| 내부 처리 방식 | ViewResolver → 템플릿 렌더링 | HttpMessageConverter → JSON 변환 |
@Controller는 서버사이드 렌더링용 @RestController는 API 응답용(JSON) @RestController를 사용해야 정상적인 JSON 응답이 가능함