TIL_0214 - DTO 관리의 고민

johaS2·2025년 2월 14일

회원 컨트롤러를 구현하면서 회원가입, 로그인, 수정, 삭제, 중복검사 등을 처리하다 보니 각 API마다 요청과 응답을 처리하는 DTO가 달라져서, DTO가 많이 생겼다
그래서 효율적인 DTO 관리를 위한 방법을 찾다가 알게된 Inner class를 활용한 방법을 정리해보려한다.


Inner Class ?

  • Inner class는 말 그대로 한 클래스 내부에 정의된 또 다른 클래스를 의미한다.
  • 정적 내부 클래스(inner static class) 으로 정의하면, 외부 클래스의 인스턴스와 상관없이 독립적으로 사용할 수 있다.
  • 이를 통해 주요 클래스와 관련된 데이터만 묶어서 관리할 수 있으며, 코드의 응집력을 높일 수 있다.

Inner Class를 사용한 DTO 관리 방법

Inner class를 사용하면 DTO를 하나의 클래스 내부에서 관련된 데이터끼리 묶어 관리할 수 있다.
이렇게 하면 코드의 결합도를 낮추고, 관련된 데이터만 묶어서 효율적으로 관리할 수 있다!

  • 예시 코드
package com.twopro.deliveryapp.user.dto;

import com.twopro.deliveryapp.user.entity.User;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class UserDto {

    private Long user_id;
    private String email;
    private String nickname;

    public UserDto(User user) {
        this.user_id = user.getUser_id();
        this.email = user.getEmail();
        this.nickname = user.getNickname();
    }

    // 정적 내부 클래스: UserResponseDto
    @Getter
    @Setter
    public static class UserResponseDto {
        private Long user_id;
        private String email;
        private String nickname;
        private String province;
        private String district;
        private String role;
        private String road_address;
        private String detail_address;

        public UserResponseDto(User user) {
            this.user_id = user.getUser_id();
            this.email = user.getEmail();
            this.nickname = user.getNickname();
            this.province = user.getProvince();
            this.district = user.getDistrict();
            this.role = user.getRole();
            this.road_address = user.getRoad_address();
            this.detail_address = user.getDetail_address();
        }
    }
}

장점 ?

  • 상위 클래스와 독립적 : 정적 내부 클래스로 정의했으니까
  • 조직화 : DTO들이 하나의 클래스 내부에 묶여 있으므로 관련된 데이터가 명확하게 그룹화된다.
  • 캡슐화 : 데이터가 관련된 클래스를 묶어서 관리할 수 있어, 외부 클래스를 사용하지 않고도 독립적으로 기능을 처리할 수 있다.

단점 ? !

  • 중첩된 구조로 구조가 복잡해질 수 있다.
  • 단위 테스트 어려움
  • 메모리 관리 이슈
  • 응집력은 높지만 결합도가 완전히 낮아지지 않을 수 있다.

정리

Inner class를 정적으로 사용하면 결합도를 낮추면서 관련된 클래스를 묶어 효율적으로 DTO를 관리할 수 있다. 하지만 이 방식도 단점이 있으니, 상황에 따라 적절히 활용하고, 단점을 충분히 고려한 후 사용해야 한다.
결국 이것도 정답은 없는건가요..?

profile
passionate !!

0개의 댓글