[위클리 페이퍼] AOP, @Controller와 @RestController
2025. 5. 19. 01:12

이번주 위클리 페이퍼의 주제는

Spring에서 AOP(Aspect Oriented Programming)가 필요한 이유와 이를 활용한 실제 애플리케이션 개발 사례에 대해 설명해보자
Spring MVC에서 클라이언트의 요청 처리 흐름을 @Controller와 @RestController의 차이점을 중심으로 각각의 처리 과정과 특징을 포함하여 설명해보자

 

 

AOP

AOP (Aspect Oriented Programming)란?

-> 관점 지향 프로그래밍

공통적으로 사용되는 기능(eg. 서비스 메서드에 로그 찍기, 권한 검사)을 핵심 로직과 분리해서 관리할 수 있게 해주는 프로그래밍 기법

 

AOP를 활용한 애플리케이션 개발 사례로는 로깅 시스템 구축, 트랜잭션 관리, 보안 검사 등이 있다.

 

<로깅 시스템에 AOP를 활용한 예시>

@Aspect
@Component
public class LoggingAspect {

    // Service 계층의 모든 메서드 실행 전/후에 적용하도록 설정
    @Around("execution(* com.example.service..*(..))")
    public Object logExecutionDetails(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        // 실제 메서드 실행
        Object result = joinPoint.proceed();

        long end = System.currentTimeMillis();
        System.out.println("[LOG 출력] 실행 시간: " + (end - start) + "ms");
        System.out.println("[LOG 출력] 메서드 반환 값: " + result);

        return result;
    }
}

com.example.service 하위의 메서드의 실행 시간과 메서드 반환값을 출력해주는 AOP Aspect 클래스다.

 

<서비스 클래스 예시>

@Service
public class UserService {

    public String getUserEmail(String userId) {
        // 유저의 이메일을 조회하는 로직...
        return userEmail;
    }
}

서비스 메서드가 이렇게 작성되어 있을 때, 로그 코드가 없지만 LoggingAspect 덕분에 자동으로 로그가 출력될 것이다.

 

AOP를 활용하면 핵심 로직의 코드가 간결해지고, Aspect를 한 번 작성하고 재사용할 수 있다. 덕분에 유지보수성도 높아진다.

 

 

 

@Controller와 @RestController의 차이

@Controller는 주로 View를 반환하기 위해 사용한다. @RestController는 데이터를 반환한다.

 

<@Controller의 view 반환 과정>

1. 클라이언트가 URI 형식으로 웹 서비스에 request를 보낸다

2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.

3. HandlerMapping은 매칭되는 Controller를 찾고 그 Controller의 정보를 DispathcherServlet으로 보낸다. 

4. 정보를 받은 DisPatcherServlet은 HandlerAdapter에게 요청을 위임하고, HandlerAdapter가 Controller에게 요청을 전달한다.

5. Controller는 요청을 처리한 후에 ViewName을 HandlerAdapter에게 반환한다.

6. Handler Adapter는 이것을 ModelAndView()에 담고 DispatcherServlet으로 반환한다.

7. DispatcherServlet이 ViewResolver를 통해 이름에 해당하는 View 가 있는지 확인하고 맞는 View를 찾아서 Client에게 전달한다

 

@Controller를 사용해서 데이터를 반환할 수도 있는데 이 때는 @ResponseBody를 사용하여 데이터를 반환할 수 있다.

 

 

 

@RestController는 RESTful 웹 서비스를 쉽게 개발하도록 돕기 위해 제공되었다. 

@RestController는 @Controller에 @ResponseBody를 결합한 것과 동일한 작업을 수행한다. 

그대신 @RestController를 사용하면 모든 핸들러 메서드에 @ResponseBody를 붙일 필요가 없다.

<@RestController의 데이터 반환 과정>

 

1. 클라이언트가 URI 형식으로 웹 서비스에 request를 보낸다.

2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다

3. HandlerAdapter을 통해 요청을 Controller로 위임한다.

4. Controller는 요청을 처리한 후에 객체를 반환한다.

5. 반환되는 객체는 Json으로 직렬화(Serialize)되어 HTTP 응답 바디에 담아 클라이언트에게 반환된다.

 

과거에는 HTML 등과 같은 view를 반환했기 때문에 @Controller를 사용하였지만, 요즘엔 프론트엔드와 백엔드를 나누어 개발하는 경우가 많고, 백엔드는 json과 같이 데이터를 반환해주면 되기 때문에 @RestController를 주로 사용한다.