AOP와 MVC에서의 클라이언트 요청 흐름( REST CONTROLLER / CONTROLLER )

chaewon·2025년 5월 18일

Spring AOP와 MVC 개념 정리


Spring에서 AOP(Aspect Oriented Programming)가 필요한 이유와 이를 활용한 실제 애플리케이션 개발 사례

1. AOP란?

AOP(Aspect Oriented Programming)는 관심사의 분리(Separation of Concerns)를 실현하기 위한 프로그래밍 패러다임
핵심 비즈니스 로직과는 별도로 처리되어야 할 공통 기능(로깅, 보안, 트랜잭션 등)을 분리해서 모듈화할 수 있게 해준다.


2. 왜 필요한가?

Spring 기반 애플리케이션에서는 다양한 공통 기능이 반복적으로 등장한다.
이를 각 서비스마다 구현하면 중복 코드가 늘어나고, 유지보수가 어려워진다.

AOP를 사용하면:

  • 중복 코드 제거
  • 핵심 로직과 부가 로직 분리
  • 변경 시 한 군데만 수정하면 됨

3. 예시

1. 트랜잭션 관리

@Transactional
public void processOrder() {
    // 주문 처리 로직
}

Spring은 AOP 기반으로 @Transactional 동작을 구현한다.
메서드 실행 전후에 트랜잭션을 시작하고, 실패 시 롤백한다.

2. 로깅 처리

@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();
    }
}

서비스 계층 메서드에 대한 일괄 로그 출력을 구현한다.

4. 핵심 구성 요소

  • @Aspect: AOP 클래스 정의

  • @Before, @After, @Around: 실행 시점 정의

  • Pointcut: 어떤 메서드에 적용할지 지정

  • Advice: 실제 실행될 공통 기능


Spring MVC에서 클라이언트의 요청 처리 흐름 / @Controller와 @RestController의 차이점


1. @Controller

  • 주로 HTML View 페이지 반환에 사용
  • 반환값이 String일 경우 ViewResolver를 통해 .html, .jsp 등의 뷰 파일로 연결
  • @ResponseBody를 붙이지 않으면 반환 문자열을 View 이름으로 인식함
@Controller
public class PageController {
    @GetMapping("/hello")
    public String hello() {
        return "hello"; // templates/hello.html 렌더링
    }
}

2. @RestController

  • 주로 JSON 형태의 데이터 반환(API 응답) 에 사용
  • @Controller + @ResponseBody 조합의 단축형
  • View를 사용하지 않고 응답 본문에 데이터를 직접 반환
@RestController
public class ApiController {
    @GetMapping("/api/hello")
    public String hello() {
        return "hello"; // 문자열을 그대로 반환 (JSON 또는 텍스트)
    }
}

3. 요청 처리 흐름 차이

항목@Controller@RestController
반환 대상View 이름 (String)객체 또는 문자열
사용 목적웹 페이지(View) 렌더링RESTful API 응답
필요 어노테이션@ResponseBody 필요별도 필요 없음 (@RestController에 내장)
내부 처리 방식ViewResolver → 템플릿 렌더링HttpMessageConverter → JSON 변환

4. 정리

  • @Controller서버사이드 렌더링용
  • @RestControllerAPI 응답용(JSON)
  • API를 작성하는 경우에는 반드시 @RestController를 사용해야 정상적인 JSON 응답이 가능함

0개의 댓글