Spring

DTO를 사용하는 이유

김예나 2025. 1. 24. 17:42

DTO?

Data Transfer Object, 즉, HTTP 메시지를 전달하고 스프링에서 계층간의 데이터를 전달할 때 사용하는 객체 

DTO의 사용 이유

1. Entity와 DTO의 책임을 명확하게 분리하기 위함

  • Entity는 ORM을 해주기 위한 객체
  • DTO는 계층간의 데이터를 전송해 주기 위한 객체 & Client에게 Entity정보를 숨기기 위함 

-> DTO 대신 Entity를 사용하게 된다면 Entity가 가지고 있는 민감한 정보(주민번호, 비밀번호,,)가 노출 될 수 있음

 

2. DB 구조가 변경됐을 때 코드의 유지보수에 용이하기 위함

 

예시

MemberController

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/member")
public class MemberController {

    private final MemberService memberService;

    @GetMapping("/{memberId}")
    public MemberResponseDto getMemberInfo(
            @PathVariable Long memberId
    ) {
        return memberService.getMemberInfo(memberId);
    }
}

 

MemberService

MemberService
@Service
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberResponseDto getMemberInfo(Long memberId) {
        Member member = memberRepository.findById(memberId).orElseThrow(NullPointerException::new);
        // Entity To DTO
        MemberResponseDto responseDto = new MemberResponseDto(member);
        return responseDto;
    }
}

 

MemberResponseDto

@Getter
public class MemberResponseDto {
    private String username;
    private int age;

    public MemberResponseDto(Member member) {
        this.username = member.getUsername();
        this.age = member.getAge();
    }
}

 

Member & MemberRepository

@Getter
@Entity
@NoArgsConstructor
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private int age;
    private String rrn; // 주민번호, Resident Registration Number
}

public interface MemberRepository extends JpaRepository<Member, Long> {}