230309 - DB & 객체 mapping 역사

Cornchip·2023년 3월 9일
0

Today-I-Learned

목록 보기
18/28

목차
1. Apache iBATIS
2. MyBatis
3. JDBC API (Spring JDBC)
4. 총평



1. Apache iBATIS

  • SQL 데이터베이스와 객체 간 매핑을 지원해주는 persistence framework

  • 지원 언어 : Java, .NET, Ruby

  • SQL 문을 별도의 XML 문서로 작성하여 프로그램 코드와 분리한 형식

  • 2001년 Clinton Begin이 개발

  • 2004년 iBATIS 2.0 릴리즈 - 아파치 소프트웨어 재단에 기증, 아파치에서 6년간 운영됨

  • 2010년 iBATIS 3.0 릴리즈 - MyBatis로 개발 프로젝트 이동, 아파치 애틱(Attic) 프로젝트로 분류됨(=더 이상 업데이트 하지 않음)

  • DAO 패턴이 발전하던 시기

    • Data Access Object 패턴 : 애플리케이션 비즈니스 레이어와 영속성 레이어를 추상화된 API를 이용하여 분리
    • DB 접근 구현 클래스를 ~~Dao라고 네이밍하는 관례가 많았던 시기
  • ex)

<select id="getProduct" parameterClass="java.lang.Long" resultClass="com.example.Product">
  select PROD_ID as id,
  	PROD_DESC as description
  from PRODUCT
  where PROD_ID = #value#
  </select>

Product resultProduct = (Product) sqlMapClient.queryForObject("getProduct", 123);


2. MyBatis

  • iBATIS 3.0에서 출발한 persistence framework (iBATIS랑 비교할 필요 없이 이것을 사용하면 된다.)
  • 아직 살아있고 업데이트도 되는 프로젝트
  • 스프링, 스프링 부트와 연동을 지원
    • 스프링: org.mybatis:mybatis-spring
    • 스프링 부트: org.mybatis.spring.boot:mybatis-spring-boot-starter
  • 다양한 프레임워크와 연동을 지원
    • Freemarker, Velocity, Hazelcast, Memcached, Redis, Ignite, Guice
  • ORM vs MyBatis
    • ORM: 자바 객체를 DB 테이블과 매핑
    • MyBatis: 자바 메소드를 SQL 실행 결과와 매핑
  • ex)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTO Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where Id = #{id}
  </select>
</mapper>

package org.mybatis.example;

public interface BlogMapper {
  @Select("select * from Blog where Id = #{id}")
  Blog selectBlog(int id);
}

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

MyBatis vs. iBATIS

  • 특별한 차이점: 쿼리 실행 결과
iBATISMyBatis
SELECTSELECT 결과SELECT 결과
INSERTNULL1
UPDATE1UPDATE 된 행의 개수
DELETEDELETE 된 행의 개수DELETE 된 행의 개수


3. JDBC API (Spring JDBC)

  • 스프링에서 제공하는 jdbc 기반 persistence framework
  • spring-boot-starter-jdbc (spring-boot-starter-data-jdbc 랑 다르다!)
  • JdbcTemplate: Spring JDBC에서 제공하는 템플릿 클래스. 쿼리 실행과 결과 전달 기능을 제공


4. 총평

  • 나쁘지는 않지만 아쉬운 영속성 프레임워크
  • 프로그램 코드에서 아직 SQL을 완전히 분리하지 못함
    • 개발자가 여전히 SQL을 알아야 한다. (개발자가 SQL을 진짜로 모르는 게 아니라 Java 소스코드 내에서 SQL을 확인해야 한다는 점)
    • 프로그램이 (특정 DB에 종속된) SQL을 알아야 한다 -> 전체 코드가 특정 DB 기술과 결합을 가짐
    • XML 관리: SQL을 분리하는 목적으로 만들었지만.. 결국 XML을 알아야 한다.
  • type-safety 를 온전히 활용하지 못한다: 쿼리 실행 결과는 대체로 Map, ResultSet 구조로 넘어옴
    • 결국 매핑은 내가 구현해 줘야 한다.
    • Map 구조가 데이터 클래스와 비교해서 갖는 단점
      • 어떤 "필드"(맵에서는 key)가 있음을 보장하지 않는다
      • 각 데이터의 타입을 보장하지 않는다.
    • 결론: 객체 지향적이지 않다!
profile
cornchip

0개의 댓글