MyBatis

MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함

99duuk 2024. 9. 23. 11:40

MyBatis의 쿼리 결과 매핑 방식에 대해 알게 된 점 정리해봄.

  1. MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함.
  2. 이 방식 때문에 매핑하는 DTO가 다른 DTO를 상속받았을 경우, 상속받은 DTO의 필드도 매핑에 사용할 수 있음.
// 부모 클래스 B
@Getter
@Setter
public class B {
    private String x;
    private String y;
    private String z;
}

// 자식 클래스 A
@Getter
@Setter
public class A extends B {
    private String a;
    private String b;
    private String c;
}

// MyBatis 매퍼 인터페이스
public interface SomeMapper {
    A getAWithBFields();
}

// 사용 예시
A result = someMapper.getAWithBFields();
System.out.println(result.getX()); // B 클래스의 필드에 접근
System.out.println(result.getA()); // A 클래스의 필드에 접근

 

 

  • 이 예시에서 객체 구조를 보면:
    • B 클래스는 x, y, z 필드를 가지고 있음.
    • A 클래스는 B를 상속받고, a, b, c 필드를 추가로 가지고 있음.
  • MyBatis 매핑 과정:
    • MyBatis는 A 클래스의 인스턴스를 생성함.
    • SELECT 문의 결과로 나온 a, b, c, x, y, z 컬럼을 각각 매칭되는 setter 메소드를 찾아 호출함.
    • A 클래스에 직접 정의된 a, b, c는 A의 setter를 통해 값이 설정됨.
    • x, y, z는 B 클래스에서 상속받은 setter를 통해 값이 설정됨.
  • 결과:
    • A 타입의 객체에 a, b, c 뿐만 아니라 x, y, z 값도 함께 설정됨.
    • result.getX()로 B 클래스의 필드에 접근 가능하고, result.getA()로 A 클래스의 필드에 접근 가능함.
  • 동작 원리:
    • MyBatis는 리플렉션을 사용해 A 클래스의 구조를 분석함.
    • 이 과정에서 A가 B를 상속받았다는 것을 파악하고, B의 필드와 메소드도 함께 고려함.
    • 쿼리 결과의 각 컬럼에 대해 매칭되는 setter 메소드를 찾아 호출함.
  • 이 특성 덕분에 DTO 설계할 때 상속을 활용해서 코드 재사용성을 높일 수 있음.
  • 하지만 주의할 점도 있음. 상속 구조가 복잡해지면 매핑이 예상과 다르게 될 수 있으니 주의해야 함.
  • 또한 컬럼 이름과 필드 이름이 일치해야 함. 다를 경우엔 별칭을 사용해야 함.