MyBatis
MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함
99duuk
2024. 9. 23. 11:40
MyBatis의 쿼리 결과 매핑 방식에 대해 알게 된 점 정리해봄.
- MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함.
- 이 방식 때문에 매핑하는 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 설계할 때 상속을 활용해서 코드 재사용성을 높일 수 있음.
- 하지만 주의할 점도 있음. 상속 구조가 복잡해지면 매핑이 예상과 다르게 될 수 있으니 주의해야 함.
- 또한 컬럼 이름과 필드 이름이 일치해야 함. 다를 경우엔 별칭을 사용해야 함.