seong
Dto로 만드는 이유, UserJoin 실습 본문
만드는 이유
기존의 Entity는 절대 변경이 되면 안된다.
예외사항으로 변경을 할 순 있겠지만 왠만해선 해주지 않는것이 좋다.
필요한 정보만 주고 받으면 되기 때문에 요청과 응답에 필요한 Dto를 만들어주어야 한다.
예를 들면 기존의 Entity엔 user의 id,username,password 민감한 정보가 모두 담겨 있다.
하지만 회원가입 할때 필요한 정보는 username, password만 필요하다. 그래서 회원가입 요청에 대한 RequestDto가 필요하다.
그리고 회원가입이 되었다면 잘 되었다는 응답 데이터 또한 필요하다. 근데 만약 Entity를 그대로 응답을 해준다면 회원 가입 된 민감한 정보가 모두 노출이 될 것이다. 그래서 요청과 응답에 대한 각각의 Dto가 필요하다.
1. 엔티티로 요청 받은 값을 Dto로 바꿔준다 . - ReqDto
@Getter
@Setter
public static class JoinReqDto { // 로그인 전 인증 관련 로직들은 전부다 앞에 엔티티 안붙임 . ex) POST /user -> /join
private String username;
private String password;
public User toEntity() {
return User.builder().username(username).password(password).build();
}
}
2. 먼저 응답할때 필요한 RespDto를 만들어준다.
public class UserRespDto {
@Getter
@Setter
public static class JoinRespDto {
private Long id;
private String username;
// 응답의 Dto는 생성자로 처리한다. <-> 요청의 Dto는 toEntity로 처리한다.
public JoinRespDto(User user) {
this.id = user.getId();
this.username = user.getUsername();
}
}
}
3. Service
// 응답의 DTO는 서비스에서 Return
@Transactional // 트랜젝션을 붙이지 않으면 영속화 되있는 객체가 flush가 안된다.
public JoinRespDto save(JoinReqDto joinReqDto) {
User userPS = userRepository.save(joinReqDto.toEntity());
return new JoinRespDto(userPS);
}
4.Controller
RequestBody에 요청은 ReqDto를 받아서 수행.
수행한 후 응답할 땐 RespDto 응답 Dto로 바꿔서 응답해준다.
@PostMapping("/join")
public ResponseDto<?> save(@RequestBody JoinReqDto joinReqDto) {
JoinRespDto joinRespDto = userService.save(joinReqDto);
return new ResponseDto<>(1, "ok", joinRespDto);
}
결과 확인
'JPA' 카테고리의 다른 글
JPA DTO로 변환 하기 - 예제 findAll (0) | 2022.10.26 |
---|---|
Optional 사용해서 예외처리 하기 - findById예시 (0) | 2022.10.26 |
Persistence Context 전략을 활용해 ID값 받기, Http상태코드 리턴 (0) | 2022.10.25 |
JPA CRUD DTO로 변환 하기 - 예제1. findById (0) | 2022.10.25 |
Spring의 OSIV 정책 (0) | 2022.10.24 |