✏️ 정적 멤버 클래스를 이용하여 DTO 관리하기

2026. 7. 23. 00:36·Backend/Spring

이 글은 Velog에서 이전한 글입니다. Velog 원문 보기

Java의 내부 클래스는 static으로 선언하자.

⭐️ DTO관리

공부한 내용을 복습하면서 토이 프로젝트 개발을 하고있는데 하나의 도메인에서 DTO가 여러개 나오게 되면서 클래스 파일도 많아졌다.
"이걸 좀 더 효율적으로 소스코드를 줄일 수 있는 방법은 없을까?" 고민을 했다.

그러던 도중 내부 클래스에 대한 글을 읽게되었고 정적 클래스를 이용해서 DTO를 관리하는 방법을 알게 되었다.

📌 중첩 클래스

public class TestClass {
    class NestedCLass {
    }
}
  • 클래스 안에 정의된 클래스를 중첩 클래스라고 부른다.
  • 하지만 중첩 클래스를 선언하면 static을 붙이라는 경고를 해준다.

📌 Staic

static을 붙이는 이유

  • static 내부 클래스로 선언하게 된다면 메모리 누수의 원인을 예방할 수 있고, 클래스의 각 인스턴스마다 더 적은 메모리를 사용한다.
  • static이 아닌 클래스는 바깥 인스턴스와 암묵적으로 연결이 되기 때문에 바깥 인스턴스 없이는 생성할 수 없다.
  • 두 클래스 관계는 클래스의 인스턴스 안에 만들어지며 메모리를 차지하게 되고 생성도 느리다.
  • 즉 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 static을 붙여 정적 클래스로 만들어주자

예시

public class UserResponse {

    /**
     * 회원 정적 멤버 클래스
     */
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public static class UserDetailResponse {
        private String email;
        private String name;
        private String phone;
        private String birth;
        private String roadAddress;
        private String detailAddress;
        private String bankName;
        private String account;

        @Builder
        public UserDetailResponse(String email, String name, String phone, 
                    String birth, String roadAddress, String detailAddress, 
                            String bankName, String account) {
            this.email = email;
            this.name = name;
            this.phone = phone;
            this.birth = birth;
            this.roadAddress = roadAddress;
            this.detailAddress = detailAddress;
            this.bankName = bankName;
            this.account = account;
        }

    }

    /**
     * 회원 정적 멤버 클래스로 변환하여 리턴합니다.
     * @param user 유저 엔티티
     * @return 변환된 유저 상세조회 DTO
     */
    public static UserDetailResponse toDetailUser(User user) {
        return UserDetailResponse.builder()
                .email(user.getEmail())
                .name(user.getName())
                .phone(user.getPhone())
                .birth(user.getBirth())
                .bankName(user.getBankName())
                .account(user.getAccount())
                .roadAddress(user.getUserAddress().getRoadAddress())
                .detailAddress(user.getUserAddress().getDetailAddress())
                .build();
    }

}

Controller

@GetMapping("/{userEmail}")
public UserResponse.UserDetailResponse getUser(@PathVariable("userEmail") String userEmail) {

        User findUser = userService.getUser(userEmail);
        return UserResponse.toDetailUser(findUser);

    }

출처
Java의 내부 클래스는 static으로 선언하자

'Backend > Spring' 카테고리의 다른 글

✏️ [Spring] DI(Dependency Injection)  (0) 2026.07.28
✏️ [Spring] IoC(Inversion of Control)  (0) 2026.07.28
✏️ [Spring] Spring Security란?  (0) 2026.07.25
✏️ [Spring] BindingResult와 Errors의 차이점에 대해  (0) 2026.07.24
✏️ [Spring] Spring API 예외 처리  (0) 2026.07.24
'Backend/Spring' 카테고리의 다른 글
  • ✏️ [Spring] IoC(Inversion of Control)
  • ✏️ [Spring] Spring Security란?
  • ✏️ [Spring] BindingResult와 Errors의 차이점에 대해
  • ✏️ [Spring] Spring API 예외 처리
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    나의 작은 프로젝트
    Spring
    척척학사
    트러블슈팅
    Book
    Spring MVC
    Project
    object
    HTTP WEB 기본 지식
    OS
    interview
    http
    Python
    jpa
    게시판
    Algorithm
    java
    CS Interview
    BOJ
    개념 정리!
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
✏️ 정적 멤버 클래스를 이용하여 DTO 관리하기
상단으로

티스토리툴바