데이터 매핑 - Mybatis

달래·2023년 11월 13일
0

Spring

목록 보기
7/7

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

  • 기본 생성자가 없는 경우, IndexOutOfBounds 에러를 만나게 된다.
  • @Builder를 사용하는 경우 기본 생성자가 사라지는데, mybatis는 데이터를 매핑하기 위해서 기본 생성자가 필요하다.

@AllArgsConstructor

  • 데이터를 바인딩하기위해서 필요하다.
  • @AllArgsConstructor만 있어도 바인딩은 정상적으로 되지만, 쿼리의 컬럼 순서와 자바 객체의 순서가 일치해야한다는 불편함이 있다.
  • 이 때 @NoArgsConstructor와 같이 사용하면 이런 불편함 없이 사용할 수 있다.

자세한 mybatis의 바인딩은 아래 포스팅 참고! https://zzang9ha.tistory.com/420

getter, setter는 없어도 데이터바인딩은 된다. 하지만...

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로 변환하는 방법을 사용하는 것 같다.

profile
아좌잣~!

0개의 댓글