나의 길
DTO를 사용하며 정리한 내용 본문
DTO(Data Transfer Object)란?
계층 간에 데이터 교환을 위해 사용하는 객체
public class User {
private Long id;
private String name;
private String email;
private String password;
}
위의 User 클래스를 바로 응답으로 넘겨주면 몇 개의 문제점이 있습니다.
1. 해당 클래스의 모든 정보가 보이며 이로 인해 민감한 정보가 노출되어 보안 문제가 발생할 수 있습니다.
2. User 클래스가 변경될 경우 View가 View가 변경될 경우 User 클래스가 변경되는 강한 결합을 가지게 됩니다.
3. JPA 사용시 직렬화 문제가 발생할 수 있습니다. Lazy 로딩 필드가 직렬화되지 않거나 예외 발생
이 밖에도 많은 문제점이 있습니다.
그래서 저도 DTO를 사용하기 시작했습니다.
DTO의 사용 범위
DTO를 사용하며 몇 가지 의문점이 있었습니다. 그게 바로 DTO를 무슨 Layer에서까지 사용해야 할까?, Business Layer에서 DTO를 만들어 반환해야 하나? 입니다. 먼저 저의 생각을 말하자면 상황에 따라 다르지만 Business 로직에서 할 수 있는 것은 그곳에서 하는 게 제일 좋지 않나 생각이 듭니다.
예를 들어, 아래처럼 Controller에서 DTO를 받아 Entity를 만들어 서비스에 넘긴다고 생각해보자.
@PostMapping("/signup")
public ResponseEntity<CreateMemberResponseDto> create(@RequestBody CreateMemberDto createMemberDto){
Member member = Member.builder()
.id(createMemberDto.getId)
.name(createMemberDto.getName())
.email(createMemberDto.getEmail())
.password(createMemberDto.getPassword())
.build();
CreateMemberResponseDto createMemberResponseDto = memberService.createMember(member);
return ResponseEntity.ok(createMemberResponseDto);
}
이런 식으로 작성하고 나니 생각이 나는 것은 꼭 Entity를 Controller에서 변환해야 하나? 와 service에서 DTO를 반환해서 주는 게 맞나라는 생각이 들었습니다.
먼저 Controller에서 Entity를 DTO로 변환하여 service로 넘기는 부분을 생각해 보면 Controller에 많은 코드가 적히고 service에서 변환을 하더라도 문제가 없기 때문에 특별한 경우가 아닐 때는 DTO를 service에 넘겨 Entity로 변환하는 것이 좋다고 생각합니다.(복잡한 로직 일 경우 Controller에서 DTO를 가지고 완벽하게 Entity를 만들지 못할 수도 있음.)
그리고 다음 service에서 DTO를 반환하는 경우를 생각해 보려면 반대로 service에서 Entity를 반환하고 Controller에서 DTO로 변환한다고 역으로 생각해 보면 조금은 문제점이 생각납니다. Entity에 Controller에서 반환을 할 필요가 없는 데이터까지 Controlle에 넘어오게 되고, Controller에서 DTO로 변환을 할 때 여러 service 로직을 통해 DTO를 조합해야 하는 경우 Business 로직이 Controller에 포함되게 됩니다.
이 경우 처음 생각처럼 service에서 DTO를 만들어 반환하는 것이 조금은 단점이 없는 것 같습니다.
참고 자료
DTO의 사용 범위에 대하여
1. DTO란? DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans)입니다. 간략하게 DTO의 구체적인 용례 및 필요성을 MVC 패턴을 통해 알아볼까요? 🚀 1.1. MVC 패턴 MVC…
tecoble.techcourse.co.kr
'Framework > Spring boot' 카테고리의 다른 글
JWT에 대한 이해 (0) | 2024.12.03 |
---|---|
당연하게 생성하던 spring boot 프로젝트 구조 살펴보기 (0) | 2024.04.28 |
쿠키와 세션 및 spring security 알아보기 (0) | 2024.03.31 |
유데미(Udemy) 옆집 개발자와 같이 진짜 이해하며 만들어보는 첫 Spring Boot 프로젝트 수강 후기! (0) | 2023.12.24 |
Spring boot + H2 사용하기 (0) | 2023.11.07 |