코드잇 BE스프린트

위클리 페이퍼 - 6주차

beginner-development 2026. 4. 3. 13:46

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

모든 비즈니스 메소드의 실행 시간을 측정해야 한다고 가정해보자. 비즈니스 로직을 개발할 때 예시 코드와 같이 핵심 기능과 부가 기능이 섞여 있으면 다음과 같은 문제가 발생한다.

  • 시간 측정 코드가 모든 비즈니스 메소드에 중복해서 들어간다.
  • 핵심 비즈니스 로직과 부가 기능이 섞여 있어 코드의 가독성이 떨어진다.
  • 시간 측정 로직을 변경해야 할 경우, 모든 메소드를 수정해야 한다.

예시)

public class UserService {
    public void createUser(User user) {
        // 시간 측정 시작
        long start = System.currentTimeMillis();

        // 실제 비즈니스 로직
        validateUser(user);
        userRepository.save(user);
        sendWelcomeEmail(user);

        // 시간 측정 종료 및 로깅
        long end = System.currentTimeMillis();
        System.out.println("실행 시간: " + (end - start) + "ms");
    }
}

 

AOP를 사용하면 이러한 문제를 아래 예시 코드처럼 해결할 수 있으며, 다음과 같은 장점을 얻을 수 있다.

  • 비즈니스 로직과 부가 기능이 명확히 분리
  • 코드 중복이 제거되어 유지보수가 용이
  • 애플리케이션의 여러 부분에 일관된 방식으로 기능을 적용할 수 있음

예시)

@Aspect
@Component
public class TimeTraceAspect {
    @Around("execution(* com.example.service..*(..))")
    public Object trackTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        try {
            // 실제 비즈니스 메소드 실행
            return joinPoint.proceed();
        } finally {
            long end = System.currentTimeMillis();
            System.out.println(joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");
        }
    }
}

 

AOP를 활용한 실제 애플리케이션 개발 사례

실무에서는 다음과 같은 상황에서 주로 활용된다.

  1. 메소드 실행 시간 모니터링
    • 성능 병목 지점을 찾기 위해 각 메소드의 실행 시간을 측정할 때 사용한다.
    • 특정 임계값을 초과하는 경우 경고를 발생시키는 등의 모니터링이 가능하다.
  2. 보안 및 인증 처리
    • 특정 메소드 실행 전에 사용자의 권한을 확인
    • API 호출 시 인증 토큰의 유효성 검사
  3. 로깅
    • 메소드 호출과 관련된 다양한 정보(파라미터, 반환값, 예외 등)를 일관된 형식으로 기록
    • 디버깅 및 모니터링에 활용

이처럼 AOP는 애플리케이션의 부가적인 관심사를 효과적으로 모듈화하여 관리할 수 있게 해주며, 이는 코드의 품질과 유지보수성을 크게 향상시킨다. 특히 기업의 대규모 애플리케이션에서 공통 관심사를 처리할 때 그 진가를 발휘하며, Spring 프레임워크의 핵심적인 기능 중 하나로 자리 잡고 있다.

 

나만의 언어로 정리해보기

AOP(Aspect Oriented Programming)가 필요한 이유

- 비즈니스 로직과 부가 기능이 명확히 분리된다.

- 코드 중복이 제거되어 유지보수가 용이하다.

- 애플리케이션의 여러 부분에 일관된 방식으로 기능을 적용할 수 있다.


실제 애플리케이션 개발 사례
- 메소드 실행 시간 모니터링
- 보안 및 인증 처리
- 로깅

 

Spring MVC에서 클라이언트의 요청 처리 흐름을 @Controller와 @RestController의 차이점을 중심으로 각각의 처리 과정과 특징을 포함하여 설명하세요.

@Controller

특징

  • 전통적인 Spring MVC 컨트롤러
  • View 반환이 기본 목적
  • ViewResolver를 통한 View 처리 수행

처리 흐름

  • DispatcherServlet이 요청을 받음
  • HandlerMapping으로 적절한 컨트롤러 찾음
  • 컨트롤러에서 로직 처리 후 View 이름 반환
  • ViewResolver가 View 이름을 실제 View로 변환
  • View가 Model 데이터를 사용하여 HTML 생성
  • 생성된 HTML이 클라이언트에게 반환

@RestController

특징

  • @Controller + @ResponseBody의 조합
  • 데이터 자체를 반환하는 것이 목적
  • HTTP API 개발에 특화

처리 흐름

  • DispatcherServlet이 요청을 받음
  • HandlerMapping으로 적절한 컨트롤러 찾음
  • 컨트롤러에서 로직 처리 후 객체 직접 반환
  • HttpMessageConverter가 객체를 JSON/XML로 변환
  • 기본적으로 Jackson2가 JSON 변환을 담당
  • 변환된 데이터가 클라이언트에게 반환

차이점

응답 형식의 차이

  1. @Controller
    • 기본적으로 View를 반환
    • HTML 형태의 응답
    • Content-Type: text/html
  2. @RestController
    • 데이터를 직접 반환
    • JSON/XML 형태의 응답
    • Content-Type: application/json (기본값)

사용 용도의 차이

  1. @Controller
    • 웹 페이지 제공
    • 서버 사이드 렌더링
    • 동적 HTML 생성
  2. @RestController
    • RESTful API 개발
    • 클라이언트-서버 분리 아키텍처
    • 마이크로서비스 간 통신

 

나만의 언어로 정리해보기

@Controller와 @RestController의 차이점

- Controller는 기본적으로 View를 반환 하지만 RestController는 데이터를 직접 반환한다.
- Controller는 HTML 형태의 응답이지만 RestController는 JSON/XML 형태의 응답이다.
- Controller는 서버 사이드 렌더링 형태를 사용하지만 RestController는 클라이언트-서버 분리 아키텍처를 사용한다.


@Controller와 @RestController의 특징
- Controller

  - 전통적인 Spring MVC 컨트롤러이다.
  - View 반환이 기본 목적이다.
  - ViewResolver를 통한 View 처리를 수행한다.

- RestController
  - @Controller + @ResponseBody의 조합이다.
  - 데이터 자체를 반환하는 것이 목적이다.
  - HTTP API 개발에 특화되어 있다.

 

'코드잇 BE스프린트' 카테고리의 다른 글

위클리 페이퍼 - 8주차  (1) 2026.04.15
위클리 페이퍼 - 7주차  (1) 2026.04.14
위클리 페이퍼 - 5주차  (0) 2026.04.01
위클리 페이퍼 - 4주차  (0) 2026.03.31
위클리 페이퍼 - 3주차  (1) 2026.03.17