ORM(Object Relational Mapping)

  • Object 는 객체지향 언어의 객체를 의미한다.

  • Ralational 은 관계형 데이터베이스(Relational Database)의 데이터를 의미한다.

  • Mapping이 의미하는 것은 객체지향 언어의 객체와 관계형 데이터를 서로 변환해 준다는 것이다.

관계형 데이터베이스에서 조회한 데이터를 Java 객체로 변환하여 리턴해 주고, Java 객체를 관계형 데이터베이스에 저장해 주는 라이브러리 혹은 기술을 말한다.

JPA(Java Persistence API)

  • 제품의 이름이 아니고, API 표준의 이름이다.

  • JPA 표준 규격대로 만들어진 제품 중에서 유명한 것이 Hibernate 오픈소스 라이브러리이다.

  • 우리가 사용하는 Spring JPA에 Hibernate 라이브러리가 포함되어 있다.

장점

-SQL 명령을 구현할 필요가 없다. DBMS 제품을 교체하더라도 소스코드를 수정할 필요가 없다.

  • 자동으로 처리되는 부분이 많아서, 구현할 소스코드의 양이 상대적으로 적다.

  • 관계형 데이터베이스가 아니더라도 적용할 수 있다.

단점

  • 복잡한 조회 명령을 구현해야 할 때, 익숙한 SQL 명령으로 구현할 수가 없고,
  • JPA의 고급 기능을 공부해야 한다.

MyBatis

장점

  • 익숙한 SQL 명령으로 구현할 수 있다.

  • DB 조회 결과를 복잡한 객체 구조로 변환해야 할 때 myBatis 기능이 좋다.

  • 복잡한 보고서(report)를 출력해야 할 때, 특히 유용하다. (mybatis의 resultMap)

  • SQL 쿼리 분석하기 편하다.

단점

  • 구현할 소스코드의 양이 상대적으로 많다.
  • 관계형 데이터베이스에만 적용할 수 있다.
  • DBMS 제품을 교체하면 SQL 소스코드를 수정해야 한다.(Oracle, MS SQL Server, mySQL 등 DBMS 마다 SQL 문법이 약간씩 차이가 있다.)

mybatis mapper

ResultMap

  • DB 조회 결과를 복잡한 객체 구조로 변환해야 할 때 mybatis의 resultMap 기능을 사용한다.

  • 이 기능은 복잡한 보고서(report)를 출력해야 할 때, 특히 유용하다.

  • 여러 테이블의 조인 결과를 여러 자바 객체에 담을 때 resultMap 기능이 유용하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
<select id="findAllWithStudents" resultMap="resultMap1">
SELECT d.*,
s.id studentId, s.studentNumber, s.name, s.year
FROM Department d LEFT JOIN Student s ON d.id = s.departmentId
</select>


// 예시
<resultMap id="resultMap1" type="Department">
<id property="id" column="id" />
<result property="departmentName" column="departmentName" />
<collection property="students" ofType="Student">
<id property="id" column="studentId" />
<result property="studentNumber" column="studentNumber"/>
<result property="name" column="name"/>
<result property="year" column="year"/>
</collection>
</resultMap>

Association VS Collection

1:1 => Association
1:N => Collection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="findAll" resultMap="resultMap_Professor">
SELECT p.*, d.departmentName
FROM Professor p LEFT JOIN department d ON p.departmentId = d.id
</select>

<resultMap id="resultMap_Professor" type="Professor">
<id property="id" column="id" />
<result property="professorName" column="professorName"/>
<result property="departmentId" column="departmentId"/>
<association property="department" javaType="Department">
<id property="id" column="departmentId" />
<result property="departmentName" column="departmentName" />
</association>
</resultMap>