본문 바로가기

JAVA

JDBC, MyBatis

728x90

1. JDBC 란?

 

자바 어플리케이션에서 데이터베이스(DBMS)에 접근 하기 위한 자바 표준 SQL 인터페이스 API

단, JDBC는 표준적인 API 인터페이스만 제공할 뿐 실질적인 드라이버는 DBMS 제조사에서 제공한다.

JDBC 를 사용하기 위해서는 다음과 같이 의존성을 추가 하면된다.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

2. JDBC 프로그래밍 흐름

 

2-1) JDBC Driver 로드

Class.forName("oracle.jdbc.driver.OracleDriver");

forName은 클래스로더로 해당 데이터베이스 드라이버를 JVM에 로드 하는 역할을 한다.

 

https://coneseo.tistory.com/32

 

Class.forName()의 동작 원리

자바는 JVM을 기반으로 동작합니다. main 메소드를 갖는 간단한 클래스를 만들어서 실행시키든, WAS에서 JSP나 서블릿을 실행시키든 결국 JVM위에서 동작하게 됩니다. JSP의 경우에는 먼저 WAS가 파일�

coneseo.tistory.com

2-2) DB 연결(Connection)
 

Connection conn = DriverManager.getConnection(dburl, dbuser, dbpw);

 

Connection 은 데이터베이스와 연결 관련된 객체이며 매번 DB에 연결할때마다 새로 만들고 해제해줘야한다.

스프링 JDBC를 사용할 경우 커넥션 풀을 미리 만들어서 풀 속에 저장해뒀다가 풀에서 가져다 쓰고 사용 후에 다시 반환하는 기법을 사용한다.

스프링 부트에서 default로 사용되는 커넥션 풀은 hikariCP로 application.yml에 DB 정보들을 저장해두면 반복적으로 해야하는 연결 생성, 해제들을 풀을 통해 자동으로 해준다. application.yml 에 다음과 같이 Datasource 빈을 등록하고 사용하면 된다.

`

 

2-3) 쿼리문 작성 및 실행 (Statement, PrepareStatement, ResultSet)

 

 Sttatement와 PreparedStatement를 이용하여 쿼리를 작성한후

executeQuery 등을 이용하여 쿼리를 실행한 후

결과값이 필요하다면 ResultSet에 반환 할수 있다.

 

2-4) DB 연결 해제

쿼리 수행후에는 ResultSet, Statement Connection를 모두 해제해줘야한다.

이는 서버 자원이므로 해제하지않으면 고갈될수 있다.

 

 

3.  MyBatis

3-1) JDBC 의 단점 그리고 MyBatis 라이브러리

 

- 초기에 JDBC 연결을 생성하고 해제하는 반복 코드는 스프링 JDBC를 사용하여 관리 할수 있다. 하지만, 스프링 JDBC를 사용하더라도 자바 파일에 SQL 쿼리가 스트링으로 선언되고 이에 append메소드를 추가하고 저장되면서 SQL 쿼리문과 자바코드의 분리가 어려워진다. 이러한 현상은 쿼리가 길어지면 길어질수록 더 심해해지고 이로 인해 코드의 유지보수성이 떨어지고 추가개발을 하기도 어려워진다. 이를 위해 제공되는 것이 MyBatis 라이브러리다.

 

MyBatis의 원리는 간단한다.

 

개발자가 JDBC API를 직접 호출하지 않고 MyBattis에 일을 시키는 것이다. (쿼리문은 사전에 정의된 MyBatis mapper 파일에 정의되어있다.)

이렇게 MyBatis를 사용하면 쿼리문이 Mapper 파일에 정의되어 기존 자바코드와 따로 분리되기 때문에 유지보수성 측면에서 더 좋고,. 추가 개발을 할때에도 Mapper 파일에만 추가하면 된다.

 

3-2) MyBatis 사용법

스프링 부트에서 MyBatis 를 사용하기 위해서는 mybatis-spring-boot-starter 의존성을 추가한다.

 

application.properties 에 config파일의 경로를 등록 한 후

mybatis.config-location=classpath:mybatis-config.xml  

 

config 파일에는 다음과 같이 mapper와 typealias 를 정의해주면 된다.

그 후 각각의 매퍼 파일을 아래와 같이 쿼리를 포함하게 작성한다.

 

Dao에서 작성한 매퍼 쿼리를 호출하기 위해서는 SqlSession 객체를 빈으로 주입받은 후 쿼리의 id를 인자로 넘겨주면 쿼리가 실행된다.

 

 

xml를 이용하는 방법 외에도 Mapper 어노테이션을 이용하여 빈으로 등록한후에 사용할 수도 있다. 

 

 

4. MyBatis의 한계 

 

MyBatis 라이브러리 조차도 한계가 있다.

만약에 엔터티에 컬럼이 하나 추가된다면 ? 그 엔터티와 관련된 맵퍼파일의 모든 CRUD 쿼리에 칼럼을 추가해줘야한다.

또한 mysql를 사용하다가 Oracle로 데이터베이스를 옮겨야할 일이 생긴다면? 모든 쿼리를 오라클 문법에 맞게  다 작성해야할 것이다. 이러한 현상은 기존의 JDBC 프로그래밍이 쿼리문에 의존하는 프로그래밍을 했기 때문이다. 이렇듯 MyBatis는 유지보수성과 코드 생산성 면에서 뛰어나지 않다. 이러한 한계점을 해결한 것이 ORM 와 JPA이다. 이에 대한 내용은 다음 포스트에서 이어가겠다.

'JAVA' 카테고리의 다른 글

JPA 프록시와 연관관계 관리  (0) 2020.09.04
Spring Data JPA  (0) 2020.08.30
JAVA 8 - 람다 추가  (0) 2020.08.15
JAVA 8 (2) - Optional  (0) 2020.08.15
웹서버 vs WAS  (0) 2020.08.07