자바 (26). MyBatis 객체 Mapping (Collection, Association)
오랜만에 포스팅하는데, 뭐 쓸까 하다 오늘 MyBatis 에 객체안에 객체 를 매핑하는 방법을 써볼가 하고,,,, 적어본다 :)
0.차례
- 차례
- MyBatis 1-1. resultMap 1-2. constructor 1-3. result 1-4. Collection 1-5. Association
- ORM
- MyBatis VS JPA
- JPA (Hibernate)
<resultMap id="detailedBlogResultMap" type="Blog">
<constructor>
<idArg column="blog_id" javaType="int"/>
</constructor>
<result property="title" column="blog_title"/>
<association property="author" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
<result property="email" column="author_email"/>
<result property="bio" column="author_bio"/>
<result property="favouriteSection" column="author_favourite_section"/>
</association>
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
<association property="author" javaType="Author"/>
<collection property="comments" ofType="Comment">
<id property="id" column="comment_id"/>
</collection>
<collection property="tags" ofType="Tag" >
<id property="id" column="tag_id"/>
</collection>
<discriminator javaType="int" column="draft">
<case value="1" resultType="DraftPost"/>
</discriminator>
</collection>
</resultMap>
1. MyBatis
- resultMap
- id : 추후 Query를 정의하는 태그에서 resultType 대신 사용될 resultMap argument의 value가 될 것이다.
- type : 객체를 만든 자바 클래스이다. typeAliace를 정의해도 되고, 객체의 경로를 명시하여도 된다.
- constructor
- 생성자,
- JPA에서 기본 생성자를 생성하고 SETTER를 이용하여 값을 채워 넣는 것을 선호하는것과는 반대로 MyBatis에서는 생성자를 이용한 빈생성을 선호한다ㅏ.
- result
- 결과값의 columns를 자바 클래스의 어떤 멤버 변수에 할당할 것인지 정의
- result로 정의된 값들은 setter 를 통하여 값이 할당된다.
- column은 alice로 변경된 값을 지정해 준다.
- association
- has one 일때 사용하는 태그이다.
- resultMap이라는 Argument를 사용할 수 있는데 해당 태그 내부에 정의된 result를 다른 resultMap으로 분리하고 이를 참조하는 경우에 쓰인다.
- collection
- has many 일 때 사용하는 태그
- discriminator : switch case 문으로 작동 ```xml
- 위는 vehicle_type이라는 columns의 값을 case value와 비교후 같은 값인 경우 해당 resultMap과 매칭시킨다.
### 4. Java ORM
ORM 이란, 객체와 DB의 테이블이 매핑을 이루는것을 의미한다.
즉, 객체가 테이블이 되도록 매핑 시켜주는 것을 말한다.
ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드 등)로 데이터 조작이 가능하다.
예를 들어 sql내에서 User 테이블의 데이터를 출력하기 위해 MySQL에서는
```mysql
SELECT * FROM USER;
과 같이 query를 실행해야 하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 __user__라 할때, user.findAll() 라는 메서드 호출로 조회가 가능해 지게 된다.
query를 직접 사용하지 않고, 메서드 호출만으로 query가 수행됨으로써 ORM을 사용하면 생산성이 굉장히 높아지는것을 확인할 수 있다,
그러나 질의가 길어지고 복잡해지면, ORM으로 표현하는데 굉장히 어렵다는 단접이 있고, raw query에 비해 느리다는 단점이 있기 때문에 JPQL, QueryDSL 등을
사용하거나, 한 프로젝트 내에서 MyBatis와 JPA를 같이 사용하기도 한다.
5. MyBatis VS JPA
JPA를 구현한 여러 프레임워크가 있다. 하지만 지금은 Hibernate가 JPA를 주도하고 있기 때문에 JPA = Hibernate로 통용되고 있는 추세이다.
전 세계적으로 MyBatis 보단 Hibernate가 더 많이 사용이 되고 있다
JDBC 를 직접 사용하는 MyBatis보다는 JDBC를 노출하지 않고 ORM을 사용하는 JPA가 더 선호된다고 볼 수 있다.