부트캠프/ETC

Spring - DTO??

purple95 2024. 8. 14. 16:22

왜? 우리는 DTO를 사용해야할까?

DTO란 무엇일까?

DTO는 Data Transfer Object 의 약자로 프로세스 간에 데이터를 전달하는 개체입니다. Web 서비스, 즉 Spring 환경에서의 DTO는 HTTP 요청의 데이터를 전달 받거나 계층(Controller, Service) 간의 이동 시에 사용 되는 객체라 이해하시면 좋을 것 같습니다.

DTO를 사용함으로써 얻을 수 있는 이점

  1. DTO를 사용함으로써 Client로부터 Entity의 정보를 숨길 수 있으며 내부 DB 구조를 변경하는 경우 코드를 유지하고 관리(유지보수)하는데 유리합니다.
  2. DTO와 Entity 클래스의 책임을 확실하게 분리할 수 있습니다.
    1. DTO와 Entity 클래스는 서로 다른 책임을 가지고 있습니다.
      • Entity 클래스는 DB의 Entity를 나타내며 일반적으로 ORM 목적으로 사용됩니다.
    2. e.g. 사용자의 정보를 반환하는 API가 있다고 가정했을 때 사용자의 주민번호와 같은 민감한 정보는 마스킹 하거나 제외하고 반환해야한다면?
      • 이때, Member Entity 클래스를 그대로 Controller에서 반환하게 된다면 해당 반환조건들을 충족하지 못하게됩니다.
      • Entity To DTO, 즉 Entity의 정보를 API 반환 조건에 맞는 DTO 객체에 담아 반환한다면 이를 해결할 수 있습니다.

간단한 예제를 통해 DTO 사용법을 확인해 보겠습니다.

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

@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> {}

<참고>

The DTO Pattern (Data Transfer Object) | Baeldung

Spring Boot DTO Example

DTO Java - Javatpoint

'부트캠프 > ETC' 카테고리의 다른 글

[ETC] - @Transactional  (0) 2024.09.18
[부트캠프] Spring 숙련 - 개인프로젝트 피드백 반영  (0) 2024.08.30