김영한님의 강의로 Spring을 공부하고 있는데, MVC 1편까지 듣고나서 어느정도 MVC와 Spring 기초에 대해 알 것 같다는 생각이 들었다. 그래서 j2kb의 추천 방식대로 간단하게 직접 Spring으로 페이지를 만들어보기로 하였다.
어느 코드를 작성하기 이전에 database 연결을 하려 한다. 지금까지 MySQL 워크벤치에서 SQL을 사용해서 몇번 써보기만 했어서 막상 database를 연결하려니 막막했다. 그래도 검색을 통해 MyBatis + MySQL + HikariCP를 사용하려 한다.
사이트를 참고해서 MyBatis, MySQL, HikariCP를 쓰기로 했지만 이것들이 각각 어떤 역할을 하는 것일까?
JDBC는 관계형 데이터베이스를 사용하기 위해 다양한 API를 제공한다. 다양한 관계형 데이터베이스를 지원하기 위해 JDBC는 세부적인 작업이 가능하게 작업별로 각각의 메서드를 호출하게 된다. 이러한 사항들은 메서드를 호출하고 관련된 객체를 해제해야 하는 단점이 있다. MyBatis는 JDBC보다 좀더 편하게 사용하기 위해 개발되었다. 한마디로 JDBC는 자바에서 제공하는 데이터베이스 프로그래밍 API 모음이라고 할 수 있다.
MyBatis는 객체지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 더 쉽게 할수 있게 도와주는 개발 프레임워크이다. 자바에서는 데이터프로그래밍을 하기위해 JDBC(자바에서 제공하는 데이터 프로그래밍 API)를 제공한다.
공식문서:
https://mybatis.org/mybatis-3/configuration.html#properties
JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스코드안에 SQL문을 작성하는 방식이었다. JSP로 블로그를 만드는 과정에서처럼 Connection을 맺고 Select문을 날려서 ResultSet이 나오고 그것을 rs.next()등을 이용해서 하나씩 받아오는 방식이었다. 그 결과 SQL의 변경 등이 발생할 경우, 프로그램(java파일)을 수정해야하기 때문에 그 유연성이 좋지 않다. 그런데 MyBatis에서는 SQL을 xml파일에 작성하여, SQL의 변환이 자유롭고, 가독성이 좋다.
위에서 말했듯, MyBatis는 JDBC에서 개발자가 직접 처리하는 PreparedStatement의 ?에 대한 설정이나 ResultSet을 이용한 처리가 이루어져서 보다 생산성이 좋다. MyBatis의 이전버전인 iBatis는 개발자가 모든 SQL을 XML로 작성하고, SQL문을 사용하는 DAO클래스를 설계해서 SQL문을 호출하는 호출하는 방식으로 작성했지만 MyBatis의 경우 애너테이션을 지원하고, 인터페이스와 애너테이션을 통해 SQL문을 설정하고 처리할 수 있게 되었다. MyBatis를 이용할때 SQL문을 사용하는 방식의 종류는 다음과 같다.
방식 | 장점 | 단점 |
---|---|---|
XML만을 사용하는 방식 | SQL문은 별도의 XML로 작성되기 때문에 SQL문의 수정이나 유지보수에 적합 | 개발시 코드의 양이 많아지고, 복잡성 증가 |
애너테이션과 인터페이스만을 이용하는 방식 | 별도의 DAO없이도 개발이 가능해서 생산성 증가 | SQL문을 애너테이션으로 작성하기 때문에 매번 수정이 일어나는 경우 다시 컴파일해야 함 |
인터페이스와 XML로 작성된 SQL문을 사용하는 방식 | 간단한 SQL문은 애너테이션으로 복잡한 SQL문은 XML로 처리하므로, 상황에 따라 유연하게 처리 | 개발자에 따라 개발방식의 차이가 존재하기 때문에 유지보수가 중요한 프로젝트의 경우 부적합 |
자세한 MyBatis의 내용은 다음 사이트를 참고한다.
https://meaownworld.tistory.com/28
https://codevang.tistory.com/263
https://veneas.tistory.com/entry/Spring-Boot-MyBatis-%EC%82%AC%EC%9A%A9%EB%B2%95-Mapper-MapperScan?category=881419
HikariCP는 Brett Wooldridge가 2012년 경 개발한 매우 가볍고 빠르고 안정적인 JDBC Connection Pool이다. HikariCP는 데이터베이스와의 Connection Pool을 관리해준다. 스프링 부트 2.0부터 default JDBC connection pool이다. Connection Pool을 관리해주는 것은 성능에 큰 영향을 준다. 실제로 JDBC 커넥션을 맺는 과정은 상당히 복잡할 뿐만 아니라 자원을 많이 소모하는 작업이다. 만약 요청이 들어올때 Thread가 Database와 Connection을 맺는다면 데이터베이스뿐만 아니라 앱 서버 입장에서도 굉장히 부하가 심하게 발생할 것이다. 그런데 HikariCP는 미리 정해놓은 만큼 Connection을 Pool에 담아놓는다. 요청이 들어오면 Thread가 Connection을 요청하고, Hikari는 Pool내에 있는 Connection을 연결해준다. 그러면 Thread입장에서는 바로 쿼리를 날릴 수 있다.
Connection Pool이란 위의 그림처럼 Pool속에 DataBase와의 연결(Connection)을 미리 만들어두고 Database에 접근 시 Pool에 남아있는 Connection 중 하나를 받아와서 사용한뒤 반환하는 기법을 말한다.
DataSource는 DB와 관련된 커넥션 정보를 담고 있다. 즉 application과 database 간의 커넥션을 맺어주고 커넥션 풀을 생성하여 통신을 가능하게 해주는 역할이라고 볼 수 있다.
DataSource 인터페이스를 보면 datasource는 데이터 연결을 위한 Factory라고 하며, Connection 객체에 대한 생성을 담당하는 역할을 하는 것을 알 수 있다.
즉, DataSource는 DB와의 연결을 위한 Factory로 Connection을 맺어주는 역할을 하며 Connection 객체를 생성한다.
그리고 우리는 AutoConfiguration을 통해서 DataSourcex와 JdbcTemplate을 별도로 등록하지 않고도 사용가능하다. 만약 추가 설정을 하고 싶다면 application.yml 이나 application.properties에서 가능하다.
참고 글
MyBatis와 JDBC의 차이:
https://keumjae.tistory.com/50
MyBatis의 개발방식:
https://doublesprogramming.tistory.com/176
HikariCP:
https://brunch.co.kr/@jehovah/24
Connection Pool
https://yjh5369.tistory.com/entry/HikariCP-%EC%86%8C%EA%B0%9C
HikariCP가 동작하는 방식
https://steady-coding.tistory.com/564
JDBC와 MyBatis를 같이 사용해야 할까?
https://okky.kr/articles/516817?note=1549972
Spring JDBC란?
https://velog.io/@tco0427/Spring-JDBC