[Spring Boot] DTO(Data Transfer Object)?

·2025년 6월 1일
0

Spring Boot

목록 보기
1/6

1. DTO란?

DTO(Data Transfer Object)는 계층 간 데이터 전달을 위한 객체로, 로직을 포함하지 않고 데이터를 담는 역할만 한다.

✅왜 DTO를 써야 할까?

1. 관심사 분리

  • Entity는 DB와 직접 연결된 도메인 객체
  • DTO는 그와 별개로 프레젠테이션 계층(Controller, View) 또는 API 응답에 맞는 구조로 데이터를 전달.

2. 보안성과 캡슐화

  • Entity를 직접 외부에 노출할 경우 민감한 데이터(비밀번호 등)가 노출될 수 있음.
  • DTO는 필요한 필드만 선택적으로 포함할 수 있어 보안과 설계 측면에서 안전

3. API 응답 포맷 통제

  • JSON으로 직렬화 시, 필드명, 구조 등을 자유롭게 통제 가능
  • 예 : 날짜 포맷 변경, 필드명 변환, 불필요한 정보 제거 등

4. 유지보수성 향상

  • Entity 구조가 바뀌어도 DTO를 통해 외부 API 포맷을 그대로 유지 가능
  • 즉, 내부 변경이 외부에 영향을 주지 않음

5. 성능 최적화

  • Entity와 달리 DTO는 필요한 데이터만 선택해서 전달 -> 네트워크 트래픽 최소화

2. DTO 사용 예시

✅RequestDto

@Getter
public class UserReqestDto{
	private String name;
    private String email
    
   @Builder
    public UserRequestDto(String name, String email) {
        this.name = name;
        this.email = email;
    }

	//Entity -> DTO 변환
    public User toEntity() {
        return User.builder()
            .name(name)
            .email(email)
            .build();
    }
}

/*
*  Controller 사용 예시
*/
UserRequestDto requestDto = UserRequestDto.builder()
	.name("홍길동")
    .email("aaa@aaa.com")
    .build();
    
User user = requestDto.toEntity();    //DTO -> Entity로 변환

✅ResponseDto

@Getter
public class UserResponseDto{
	private Long id;
    private String name;
    private String email;
    
    @Bulider
    public UserResponseDto(Long id, String name, String email) {
    this.id = id;
    this.name = name;
    this.email = email;
    }
    
    //Entity -> DTO 변환
    public static UserResponseDto from(User user){
    return UserResponseDto.builder()
    	.id(user.getId())
        .name(user.getName())
        .email(user.getEmail())
        .build();
    }
}

/*
* Controller 사용 예시
*/
User user = userRepository.findById(1L).orElseThrow();
UserResponseDto responseDto = UserResponseDto.from(user);

3. 요약

구분EntityDTO
목적DB 연동, 비즈니스 로직계층 간 데이터 전달
위험성외부 노출 시 보안 문제필요한 데이터만 노출
유연성변경 시 외부 영향 있음변경에 유연함
포함 데이터모든 필드필요한 필드만 선택
profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글