RestAPI(6) 스프링 빈 스코프

별빛사막·2024년 12월 23일

1. HttpServletRequest이란?

  • 설명: HttpServletRequest는 HTTP 요청의 모든 정보를 포함하는 객체이다. 클라이언트가 보낸 헤더, 파라미터, 요청 바디 등의 데이터를 처리하는 데 사용된다.
  • 주요 메서드:
    • getHeader(String name): 요청 헤더 값을 가져온다.
    • getParameter(String name): 요청 파라미터 값을 가져온다.
    • getInputStream(): 요청 바디의 내용을 스트림으로 읽는다.

2. 스프링 빈 스코프

스프링 빈의 스코프는 객체가 생성되고 관리되는 범위를 결정한다.

  • 싱글톤 (Singleton): 애플리케이션 당 하나의 객체만 생성된다. 스프링의 기본 스코프이며 대부분의 서비스에서 사용된다.
  • 세션 (Session): 사용자 세션 당 하나의 객체가 생성된다. 동일 세션 내에서는 객체가 재사용된다.
  • 리퀘스트 (Request): HTTP 요청 당 하나의 객체가 생성된다. 요청-응답 과정 내에서는 동일 객체가 재사용된다.
  • 프로토타입 (Prototype): 요청 시마다 새로운 객체가 생성되며 다른 요청 간에 객체가 공유되지 않는다.
스코프설명특징
싱글톤애플리케이션 당 하나의 객체만 생성된다.대부분의 서비스에서 사용된다.
세션사용자 세션 당 하나의 객체가 생성된다.사용자별 세션 상태를 유지할 때 사용한다.
리퀘스트HTTP 요청 당 하나의 객체가 생성된다.요청-응답 간 데이터를 저장할 때 사용한다.
프로토타입매 요청마다 새로운 객체가 생성된다.요청 간 독립된 상태가 필요할 때 사용한다.

싱클톤 스코프 빈을 대부분 사용하며, 리퀘스트 스코프 빈은 요청 당 1개이고
1개의 요청과 응딥 프로세스가 끝나기 전가지는 새로 만들지 않고 만들어진 것을 공유하며 쓴다.


3. Request Scope Bean의 동작

Request Scope Bean은 HTTP 요청 당 하나의 객체를 생성하며, 요청-응답 과정에서 동일한 객체를 재사용한다.
다른 빈 스코프와의 주요 차이점은 다음과 같다.

  • 일반적으로 하나의 Proxy 객체가 하나의 실제 객체와 매핑된다.
  • Request Scope Bean은 하나의 Proxy 객체가 다수의 실제 객체를 요청 단위로 매핑할 수 있다.
  • 재사용 여부: 동일 요청 내에서는 이미 생성된 객체를 재사용한다.
@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/test")
    public String testRequestScope(HttpServletRequest request) {
        // 첫 번째 호출
        String userAgent1 = request.getHeader("User-Agent");
        System.out.println("첫 번째 호출: " + userAgent1);

        // 두 번째 호출
        String userAgent2 = request.getHeader("User-Agent");
        System.out.println("두 번째 호출: " + userAgent2);

        // 동일한 객체인지 확인
        System.out.println("HttpServletRequest 객체 해시코드: " + request.hashCode());

        return "User-Agent: " + userAgent1;
    }
}

===================================================
[실행 결과]

첫 번째 호출: PostmanRuntime/7.32.0
두 번째 호출: PostmanRuntime/7.32.0
HttpServletRequest 객체 해시코드: 12345678

→ 출력했을 때 동일한 값이 출력되었으므로, 동일 객체가 요청-응답 과정 내에서 재사용되고 있음을 확인할 수 있다


특징:

  • 요청 단위로 관리되므로 메모리 사용량에 주의해야 한다.
  • 동일 요청 내에서는 Proxy를 통해 객체가 재사용되므로 효율적이다.

일반적으로 1개의 proxy객체에서 1개의 실제 객체가 매핑되는데
request scope Bean은 proxy 객체:실제 객체 = 1: N 매핑이 가능하다

profile
조금씩 매일 성장하자

0개의 댓글