왜? 우리는 DTO를 사용해야할까?
DTO란 무엇일까?
DTO는 Data Transfer Object 의 약자로 프로세스 간에 데이터를 전달하는 개체입니다. Web 서비스, 즉 Spring 환경에서의 DTO는 HTTP 요청의 데이터를 전달 받거나 계층(Controller, Service) 간의 이동 시에 사용 되는 객체라 이해하시면 좋을 것 같습니다.
DTO를 사용함으로써 얻을 수 있는 이점
- DTO를 사용함으로써 Client로부터 Entity의 정보를 숨길 수 있으며 내부 DB 구조를 변경하는 경우 코드를 유지하고 관리(유지보수)하는데 유리합니다.
- DTO와 Entity 클래스의 책임을 확실하게 분리할 수 있습니다.
- DTO와 Entity 클래스는 서로 다른 책임을 가지고 있습니다.
- Entity 클래스는 DB의 Entity를 나타내며 일반적으로 ORM 목적으로 사용됩니다.
- e.g. 사용자의 정보를 반환하는 API가 있다고 가정했을 때 사용자의 주민번호와 같은 민감한 정보는 마스킹 하거나 제외하고 반환해야한다면?
- 이때, Member Entity 클래스를 그대로 Controller에서 반환하게 된다면 해당 반환조건들을 충족하지 못하게됩니다.
- Entity To DTO, 즉 Entity의 정보를 API 반환 조건에 맞는 DTO 객체에 담아 반환한다면 이를 해결할 수 있습니다.
- DTO와 Entity 클래스는 서로 다른 책임을 가지고 있습니다.
간단한 예제를 통해 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> {}
<참고>
'부트캠프 > ETC' 카테고리의 다른 글
[ETC] - @Transactional (0) | 2024.09.18 |
---|---|
[부트캠프] Spring 숙련 - 개인프로젝트 피드백 반영 (0) | 2024.08.30 |