본문 바로가기

웹개발 프레임워크(must-have skills)/스프링

Data Access - Mybatis vs JdbcTemplate

mybatis(동적쿼리, xml로 분리) 와 jdbctemplate(plain jdbc보다 중복코드를 제거해줘서 편리) 

어느정도 프로그램 규모가 작으면 jdbctemplate이좋고,

그 이상이면 mybatis가 좋을 듯 싶다. 

0. Jdbc? 

Java Database Connectivity (JDBC) is an application programming interface (API) for the programming language Java, which defines how a client may access a database. It is a Java-based data access technology used for Java database connectivity. It is part of the Java Standard Edition platform, from Oracle Corporation. It provides methods to query and update data in a database, and is oriented toward relational databases. A JDBC-to-ODBC bridge enables connections to any ODBC-accessible data source in the Java virtual machine (JVM) host environment.

 

요약: 자바에서 db를 사용하기 위한 API

 

1. JdbcTemplate (Spring-jdbc 기반)

spring-framework-main\spring-jdbc\src\main\java\org\springframework\jdbc\core/JdbcTemplate.java

1-1 . 디자인패턴: 템플릿콜백패턴

템플릿 콜백 패턴과 JdbcTempalte - Junroot

1-2.필요의존성

// https://mvnrepository.com/artifact/org.springframework/spring-jdbc
implementation 'org.springframework:spring-jdbc:5.3.20'
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
implementation 'mysql:mysql-connector-java:5.1.49'

1-3 .예시코드

private final String INSERT_MESSAGE_SQL = "insert into sys_message (message) values(?) ";

@Override
public void insert(int roomId, BaseballGame game) {
    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(connection -> { 
        PreparedStatement ps = connection.prepareStatement(INSERT_MESSAGE_SQL, Statement.RETURN_GENERATED_KEYS);
        ps.getGeneratedKeys();
        ps.setString(1, String.valueOf(roomId));
        return ps;
    }, keyHolder);
    keyHolder.getKey();

}

 

2. Mybatis 

2-1 . 디자인패턴: 팩토리빌더패턴

2-1.5 . Scope(이해해야 concurreny 문제를 예방가능) 

a. SqlSessionFactoryBuilder(xml or java) ->b. SqlSessionFactory ->c. SqlSession ->d. Mapper Instances

a. SqlSessionFactory만들면 임무 끝이니 method scope

b. 앱 실행시에 계속 존재.  application scope.  Singleton pattern or Static Singleton pattern.

c. 각각의 스레드가 SqlSession의 인스턴스를 소유 .  공유되지 않고, 스레드안전하지 못하니 request or method scope  ex) http요청이 올때마다 SqlSession을 open하고 ,  http응답으로 돌려줄때  close해주자. 

try (SqlSession session = sqlSessionFactory.openSession()) {
  // do work
}

 

2-2.필요의존성

// https://mvnrepository.com/artifact/org.mybatis/mybatis
implementation 'org.mybatis:mybatis:3.5.10'

2-3.예시코드

 

 

참고자료

Spring JDBC Tutorial | Baeldung

 

Java Database Connectivity - Wikipedia

 

mybatis – MyBatis 3 | Getting started