응답래핑 공통클래스를 예시를 들어 빈을 사용했을때의 장점을 설명해보자
백단에서 응답 구조가 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를 사용하여 개발자가 직접 객체를 관리하는 것이 맞다.
'자바-백엔드' 카테고리의 다른 글
| 동시성 문제로 깨지는 PK 생성 로직 해결 사례 [FOR UPDATE] (0) | 2026.03.30 |
|---|---|
| [JPA] JPA환경에서 프로시저를 호출하려면? (StoredProcedureQuery) (0) | 2026.03.24 |
| [DBeaver] 디비버로 엑셀에 있는 데이터 DB테이블에 넣기 (0) | 2026.02.27 |
| QueryDSL은 왜 쓰는걸까? (0) | 2026.02.06 |
| (HTTP 메서드) GET / POST / PUT / DELETE 는 select / insert / update / delete에 대응되는가? (0) | 2026.02.03 |