[기술면접] Http 요청시 Spring 동작 과정, Spring AOP, Transaction 전파

White 와잇·2024년 8월 16일

사용자가 API 요청에 대한 응답을 할 때 Spring 내부 동작에 대해 설명할 수 있는가?

디스패처 서블릿, 핸들러 매핑

Spring 프레임워크는 MVC 패턴 기반
클라이언트로부터 HTTP 요청 -> DispatcherServlet이 받음 -> 핸들러 매핑: 요청에 맞는 컨트롤러를 찾아줌 -> 컨트롤러 실행 -> 요청에 맞게 모델에게 필요한 데이터 조작 요청 -> 데이터 처리 결과를 컨트롤러가 받아 렌더링할 페이지를 뷰에게 알리거나 응답 데이터를 직렬화(보통 JSON, XML)하여 전달

  • JSON: 가볍고 사람이 읽기 편한 데이터 형식, 데이터의 구조를 표현 가능(객체, 배열, 데이터 타입 분류- 문자열인지 숫자인지)해서 평문보다 파싱에 더 적합함

  • XML: JSON과 비슷하게 사람이 읽기 편한 데이터 형식 (태그 구조)

  • Model: 비즈니스 로직, 데이터 관리 로직
    도메인 객체, 데이터 전송 객체 DTO, @Service 계층

  • View: 클라이언트 인터페이스. 화면을 표시, 데이터 입출력 상호작용
    JSP, Thymeleaf 다양한 템플릿 엔진

  • Controller: 클라이언트 요청에 맞게 로직에 따라 모델과 뷰 사이의 데이터 전달
    @Controller

Spring AOP는 무엇인가?

관점 지향 프로그래밍
핵심 로직에서 부가적인 기능(관심사) 코드를 분리하여 관리하는 방법입니다.
주로 로깅, 트랜잭션 관리, 보안처리, 예외처리 등을 사용합니다.
AOP를 사용하면 코드의 모듈화로 코드 중복을 줄이고 재사용성이 높아지고 유지보수가 쉬워집니다.

프록시를 패턴을 사용함으로서 런타임에 동작하는 특성을 갖고 있고 필요한 시점에만 실행한다는 장점이 있으나 디버깅이 어렵다는 단점이 있습니다. 성능 오버헤드가 발생할 수 있습니다.
프록시 패턴은 공부가 좀 더 필요한 것 같습니다.

Transaction 전파 전략을 설명하고 각각 어떤 상황에서 사용되는가?

메서드 간에 이동할 때 이미 트랜잭션이 진행중이면 추가 트랜잭션 진행을 어떻게 할지 결정할 수 있습니다.
Spring에서는 REQUIRED(디폴트), REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, MANDATORY, NEVER, NESTED 속성이 있습니다.

복잡한 트랜잭션 요구사항이 필요할 때 트랜잭션 전파 속성을 적절히 사용하여 데이터 무결성과 일관성을 유지할 수 있습니다.

물리 트랜잭션: 실제 데이터베이스에 적용되는 트랜잭션으로, 커넥션을 통해 커밋/롤백하는 단위
논리 트랜잭션: 스프링이 트랜잭션 매니저를 통해 트랜잭션을 처리하는 단위

  1. REQUIRED
    의미: 트랜잭션이 필요함(없으면 새로 만듬)
    기존 트랜잭션 없음: 새로운 트랜잭션을 생성함
    기존 트랜잭션이 있음: 기존 트랜잭션에 참여함

REQUIRED는 디폴트 속성으로써 모든 트랜잭션 매니저가 지원하는 속성이다. 별도의 설정이 없다면 REQUIRED로 트랜잭션이 진행된다.

  1. REQUIRES_NEW
    의미: 항상 새로운 트랜잭션이 필요함
    기존 트랜잭션 없음: 새로운 트랜잭션을 생성함
    기존 트랜잭션이 있음: 기존 트랜잭션을 보류시키고 새로운 트랜잭션을 생성함

  2. SUPPORTS
    의미: 트랜잭션이 있으면 지원함(트랜잭션이 없어도 됨)
    기존 트랜잭션 없음: 트랜잭션 없이 진행함
    기존 트랜잭션이 있음: 기존 트랜잭션에 참여함

  3. NOT_SUPPORTED
    의미: 항상 새로운 트랜잭션이 필요함
    기존 트랜잭션 없음: 새로운 트랜잭션을 생성함
    기존 트랜잭션이 있음: 기존 트랜잭션을 보류시키고 새로운 트랜잭션을 생성함

  1. MANDATORY
    의미: 트랜잭션이 의무임(트랜잭션이 반드시 필요함)
    기존 트랜잭션 없음: IllegalTransactionStateException 예외 발생
    기존 트랜잭션이 있음: 기존 트랜잭션에 참여함

  2. NEVER
    의미: 트랜잭션을 사용하지 않음(기존 트랜잭션도 허용하지 않음)
    기존 트랜잭션 없음: 트랜잭션 없이 진행
    기존 트랜잭션이 있음: IllegalTransactionStateException 예외 발생

  3. NESTED
    의미: 중첩(자식) 트랜잭션을 생성함
    기존 트랜잭션 없음: 새로운 트랜잭션을 생성함
    기존 트랜잭션이 있음: 중첩 트랜잭션을 만듬

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글