DTO란?
- Data Transfer Object의 약자로, 계층간 데이터 교환을 위해 사용하는 객체이다.
- DTO를 사용하지 않고, Controller에서 View를 뿌릴때 도메인 객체를 Model을 통해 View에 직접 전달할 수 있지만, 민감한 정보 등이 포함되어 노출될 우려가 있기 때문에 Model과 View가 강하게 결합되어 의존성이 생길 수 있다.
public class Member {
public Long id;
public String username;
public String email;
public String password; //외부에 노출되면 안됨
public String info; //외부에 노출되면 안됨
}
@GetMapping
public ResponseEntity<Member> memberInfo(@PathVariable long memberId) {
Member member = memberService.findById(memberId);
return ResponseEntity.ok().body(member);
}
위처럼 Controller에서 @PathVariable로 받은 memberId의 정보를 바탕으로 도메인인 Member를 직접 넘겨주게 되면,
- 도메인의 모든 속성이 외부에 노출된다.
- 또한 Model 객체가 화면에서 사용하지 않을 불필요한 정보까지 보유하게 된다.
- 비즈니스 로직 등, Member의 민감한 정보(password,info)가 외부에 노출될 수 있다.
- Model과 View가 강하게 결합되어, View와 Model의 의존관계가 형성될 수있다.
- Member Entity의 코드가 변경될 경우, View의 UI에도 변경이 요구되어질 수 있기 때문이다.
public class MemberDto {
public final String username;
public final String email;
public static MemberDto toDto(Member member) {
return new MemberDto(member.getName(), member.getEmail());
}
}
@GetMapping
public ResponseEntity<MemberDto> memberInfo(@PathVariable Long memberId) {
Member member = memberService.findById(memberId);
return ResponseEntity.ok().body(MemberDto.toDto(member));
}
그래서 위와 같이 DTO를 사용하게 되면 도메인 Model을 캡슐화하고, UI에서 사용하는 데이터만 선택적으로 보낼수 있으므로, 앞서 언급된 문제들을 해결할 수 있다.
'🍃Spring' 카테고리의 다른 글
[Spring DB] MyBatis 사용하기 (0) | 2023.01.29 |
---|---|
[Spring DB] 테스트 - 트랜잭션 (0) | 2023.01.29 |
[Spring DB] JDBC Template 사용하기 (0) | 2023.01.29 |
[Spring] Spring이란? (0) | 2023.01.28 |
[Spring] MapStruct (0) | 2023.01.23 |