[java] MyBatis에서 엔티티 간 관계 매핑하기

MyBatis는 자바 개발자들이 데이터베이스와 상호작용하기 위해 사용되는 ORM(Object-Relational Mapping) 프레임워크입니다. 엔티티 간의 관계를 매핑하는 것은 MyBatis를 사용하는 중요한 부분 중 하나입니다. 이번 블로그 포스트에서는 MyBatis에서 엔티티 간 관계를 매핑하는 방법에 대해 알아보겠습니다.

일대일 관계 매핑

일대일 관계는 한 엔티티가 다른 엔티티와 하나의 관계만을 가지는 경우를 의미합니다. 예를 들어, 사용자(User) 엔티티와 주소(Address) 엔티티가 있다고 가정해봅시다. 한 사용자는 한 개의 주소만을 가질 수 있습니다.

먼저, MyBatis에서 일대일 관계를 매핑하기 위해 association 태그를 사용합니다. 이 태그는 부모 엔티티에 대한 참조를 가지고 있다는 것을 나타냅니다. 아래는 예시 코드입니다.

public class User {
    private Long id;
    private String name;
    private Address address;
    // getters and setters
}

public class Address {
    private Long id;
    private String city;
    private String country;
    // getters and setters
}
<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="name"/>
    <association property="address" resultMap="addressMap"/>
</resultMap>

<resultMap id="addressMap" type="Address">
    <id property="id" column="address_id"/>
    <result property="city" column="city"/>
    <result property="country" column="country"/>
</resultMap>

위의 코드에서는 association 태그를 사용하여 User 엔티티의 address 필드와 Address 엔티티를 매핑하였습니다. resultMap을 이용하여 사용자와 주소의 속성과 데이터베이스의 열을 매핑합니다.

일대다 관계 매핑

일대다 관계는 한 엔티티가 다른 엔티티와 여러 개의 관계를 가지는 경우를 의미합니다. 예를 들어, 게시물(Post) 엔티티와 댓글(Comment) 엔티티가 있다고 가정해봅시다. 한 게시물은 여러 개의 댓글을 가질 수 있습니다.

일대다 관계를 매핑하기 위해서는 collection 태그를 사용합니다. 이 태그는 부모 엔티티에 대한 컬렉션을 나타냅니다. 아래는 예시 코드입니다.

public class Post {
    private Long id;
    private String title;
    private List<Comment> comments;
    // getters and setters
}

public class Comment {
    private Long id;
    private String content;
    // getters and setters
}
<resultMap id="postMap" type="Post">
    <id property="id" column="post_id"/>
    <result property="title" column="title"/>
    <collection property="comments" ofType="Comment" resultMap="commentMap"/>
</resultMap>

<resultMap id="commentMap" type="Comment">
    <id property="id" column="comment_id"/>
    <result property="content" column="content"/>
</resultMap>

위의 코드에서는 collection 태그를 사용하여 Post 엔티티의 comments 필드와 Comment 엔티티를 매핑하였습니다. ofType 속성을 사용하여 컬렉션의 요소 유형을 설정합니다.

다대다 관계 매핑

다대다 관계는 한 엔티티가 다른 엔티티와 여러 개의 관계를 가지고, 동시에 해당 엔티티도 다른 여러 개의 엔티티와 관계를 가지는 경우를 의미합니다. 예를 들어, 사용자(User) 엔티티와 역할(Role) 엔티티가 있다고 가정해봅시다. 한 사용자는 여러 개의 역할을 가질 수 있고, 한 역할은 여러 사용자에게 할당될 수 있습니다.

다대다 관계를 매핑하기 위해서는 추가적인 조인 테이블을 사용해야 합니다. 아래는 예시 코드입니다.

public class User {
    private Long id;
    private String name;
    private List<Role> roles;
    // getters and setters
}

public class Role {
    private Long id;
    private String name;
    // getters and setters
}
<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="name"/>
    <collection property="roles" ofType="Role" resultMap="roleMap"/>
</resultMap>

<resultMap id="roleMap" type="Role">
    <id property="id" column="role_id"/>
    <result property="name" column="name"/>
</resultMap>

위의 코드에서는 collection 태그를 사용하여 User 엔티티의 roles 필드와 Role 엔티티를 매핑하였습니다. 이 경우에는 추가적인 조인 테이블을 사용하여 중간 매핑테이블을 생성하고, collection 태그의 select 속성을 사용하여 조인된 결과를 가져옵니다.

결론

이번 포스트에서는 MyBatis에서 엔티티간의 관계를 매핑하는 방법을 살펴보았습니다. 일대일, 일대다, 다대다 관계를 매핑하기 위해 MyBatis의 association 태그와 collection 태그를 사용했습니다. 개발자들은 이러한 관계 매핑을 통해 데이터베이스와 상호작용하는 애플리케이션을 쉽게 개발할 수 있습니다.

더 자세한 내용은 MyBatis 공식 문서를 참고하시기 바랍니다.