Contents
5. 모든 코드 전환 완료 후 테스트 하기DTO전환시 규칙
- 모든 insert 요청 시에는 그 insert된 row를 DTO에 담아서 return
- DTO에 민감정보 빼기, 날짜는 String으로 (날짜 공부하기 전까지)
- update된 데이터도 DTO에 담아서 return
- 화면에 보이는 데이터 + PK 포함(필수)
- delete는 응답할 데이터가 없다.
update, insert 같은 DTO 사용해도 괜찮음
- 화면에 출력하는게 아니기 때문에 같은 DTO를 사용해도 괜찮음
하지만 select를 하여 화면에 그림을 그릴 때 에는 화면이 똑같이 생겨도 같은 DTO 사용 금지
- A, B와 화면이 같아서 같은 DTO를 사용하다가 B에 추가를 해야할 것이 있어서 추가하다보면 A의 화면이 꼬임
- 화면도 꼬이고 프론트에게 B에 필요한거 하나 추가 했으니 A에서는 쓰면 안되라고 말하면 안됨
delete는 돌려줄 row없으니 돌려줄 DTO도 없음
DTO 생성
- 테이블 column을 그대로 옮기고 어노테이션 삭제 후 생성자 생성
- 생성자는 객체를 받기
package shop.mtcoding.blog.user;
import lombok.Data;
public class UserResponse {
@Data
public static class DTO {
// 규칙 2 : DTO에 민감정보 빼기, 날짜는 String으로 (날짜 공부하기 전까지)
private Integer id;
private String username;
// private String password; // 보안에 민감한 데이터는 주면 안됨
private String email;
private String createdAt; // 날짜는 Timestamp 말고 String으로 받기
public DTO(User user) { // 객체를 받아서 뿌리기
this.id = user.getId();
this.username = user.getUsername();
this.email = user.getEmail();
this.createdAt = user.getCreatedAt().toString(); // . toString하면 문자열로 바뀜
}
}
}

Service에서 DTO넘기기
- 영속화된 객체를 DTO에 담아서 Controller로 넘겨주었다.
// RestAPI 규칙1 : insert 요청 시에 그 행을 DTO에 담아서 리턴한다.
@Transactional
public UserResponse.DTO 회원가입(UserRequest.JoinDTO reqDTO) {
try {
User userPS = userRepository.save(reqDTO.toEntity());
return new UserResponse.DTO(userPS);
} catch (Exception e) {
throw new Exception400("잘못된 요청입니다");
}
}
Controller
- DTO를 받아서 추후 return값을 DTO로 변경
@PostMapping("/join")
public String join(@Valid UserRequest.JoinDTO reqDTO, Errors errors) {
// DTO로 변경 완료
UserResponse.DTO respDTO = userService.회원가입(reqDTO);
return "redirect:/login-form";
}
5. 모든 코드 전환 완료 후 테스트 하기
- 테스트 전에 이제부터는 view를 만들지 않기때문에 필요하지 않은 mustache를 삭제



Share article