MyBatis를 사용해서 조회한 쿼리를 DTO에 매핑할 때, 어떤 원리로 되는 걸까?
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class ResponseVO {
private String id;
private String pwd;
// 서비스에서 mybatis로 받아온 데이터를 builder로 만들고, 가공해준다.
public Response toResponse(){
return Response.builder()
.id(this.id)
.pwd(this.pwd)
.build();
}
}
@NoArgsConstructor
@Builder
를 사용하는 경우 기본 생성자가 사라지는데, mybatis는 데이터를 매핑하기 위해서 기본 생성자가 필요하다.@AllArgsConstructor
@AllArgsConstructor
만 있어도 바인딩은 정상적으로 되지만, 쿼리의 컬럼 순서와 자바 객체의 순서가 일치해야한다는 불편함이 있다.@NoArgsConstructor
와 같이 사용하면 이런 불편함 없이 사용할 수 있다.front가 있는 경우에, 나는 jsp를 아직 사용하고 있는데 데이터를 가져올 때는 ${}
태그를 사용해서 가져오게 된다.
이 경우에는 getter를 사용해서 데이터를 가져오기 때문에, getter 선언이 필요하다.
@Override
public ResponseDto selectUser(UserRequest request){
return DAO.selectUser(request).toResponse();
}
또는 static 메소드를 활용해서 of/from 메소드패턴을 이용할 수 있다.
@Getter
@RequiredArgsConstructor
@Builder
public class Response {
private final Stirng id;
private final String pwd;
public static Response from(ResponseVO vo) {
return Response.builder()
.id(vo.getId())
.pwd(vo.getPwd())
.build();
}
}
@Override
public ResponseDto selectUser(UserRequest request){
return Response.from(DAO.selectUser(request));
}
보통 이렇게 하나의 ResponseDto를 사용하지는 않고, ServiceDto로 mybatis 쿼리결과를 받은 후 Controller에서 사용할 ResponseDto로 변환하는 방법을 사용하는 것 같다.