자바-백엔드

[스프링] 어떤 상황에서 빈(Bean)을 사용하고 new를 사용해야 할까?

게로망 2026. 3. 22. 20:34

응답래핑 공통클래스를 예시를 들어 빈을 사용했을때의 장점을 설명해보자

 

 

백단에서 응답 구조가 api마다 제각각이면 프론트에서 가공로직이 페이지마다 제각각이 된다.

 

그래서 모든 컨트롤러의 응답래핑을 통일하기 위해

{
  "code": "OK",
  "message": "성공",
  "data": {
    ...
  }
}

 

예를들어 이런 json형태를 공통으로 한다고 가정했을 때(@RestControllerAdvice 사용 <- 자동으로 빈 등록)

 

@RestControllerAdvice
class ResponseWrapper {
    // 모든 응답 가로채서 감쌈
}

 

여기서 ResponseWrapper는 스프링이 관리하는 빈이 된다.

이런 경우 이 프로젝트에서 컨트롤러가 100개가 있든 1000개가 있든
자동으로 모두 이 응답래핑을 씌울 수 있다.

 

 

만약 '@RestControllerAdvice'를 통해 생성된 빈을 사용하지 않는다면

@GetMapping("/user")
public Object getUser() {
    User user = userService.findUser();

    ResponseWrapper wrapper = new ResponseWrapper();
    return wrapper.wrap(user);
}

 

이렇게 모든 컨트롤러에서 객체를 생성하고 사용해야 한다.

이는 매우 비효율적이다

 

 

빈의 진가는 여기서 한발 더 나가서 발휘한다.

 

예를들어 ResponseWrapper가 호출될 때마다 콘솔창에 로그를 찍고 싶다고 가정해보자.

빈을 사용하지 않는 경우라면 ResponseWrapper 내부에서 매번 로그 객체를 직접 생성해야 한다.

class ResponseWrapper {

    public Object wrap(Object data) {
        LogService log = new LogService();
        log.record("response processed");

        return new Response("OK", "success", data);
    }
}

 

여기서 new를 통해 log라는 객체는 컨트롤러가 응답을 할 때마다 매번 객체로 생성된다.

 

그럼 빈을 사용한다면

@RestControllerAdvice
@RequiredArgsConstructor
class ResponseWrapper {

    private final LogService log;

    public Object wrap(Object data) {
        log.record("response processed");
        return new Response("OK", "success", data);
    }
}

 

이 경우는 log 객체를 스프링이 한 번만 생성하여 ResponseWrapper에 주입한다.

 

LogService같은 클래스는 객체 하나를 공통으로 사용해도 상관없는 클래스이다.

요청이 100번 왔다고 로그서비스를 100개 생성하는건 성능적으로 낭비다.

 

즉 여기서 핵심은

특정 객체를 여러곳에서 공유를 하는가 안하는가에 따라 빈을 써야 할 때와 new 써야 할 때를 구분해야 한다는 것이다.

 

공통기능의 경우에는 빈(싱글톤) 으로 스프링이 관리하는 것이 적합하고

 

-장바구니

-요청 DTO

 

이와 같이 개별적으로 필요한 객체는 new를 사용하여 개발자가 직접 객체를 관리하는 것이 맞다.