프로젝트에 DB연결 배경지식

jungnoeun·2022년 9월 15일
0

spring

목록 보기
8/24

🏁 시작

김영한님의 강의로 Spring을 공부하고 있는데, MVC 1편까지 듣고나서 어느정도 MVC와 Spring 기초에 대해 알 것 같다는 생각이 들었다. 그래서 j2kb의 추천 방식대로 간단하게 직접 Spring으로 페이지를 만들어보기로 하였다.

🛩️ Database 연결

어느 코드를 작성하기 이전에 database 연결을 하려 한다. 지금까지 MySQL 워크벤치에서 SQL을 사용해서 몇번 써보기만 했어서 막상 database를 연결하려니 막막했다. 그래도 검색을 통해 MyBatis + MySQL + HikariCP를 사용하려 한다.

참고사이트: https://veneas.tistory.com/entry/Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1-startspringio

사이트를 참고해서 MyBatis, MySQL, HikariCP를 쓰기로 했지만 이것들이 각각 어떤 역할을 하는 것일까?


JDBC

JDBC는 관계형 데이터베이스를 사용하기 위해 다양한 API를 제공한다. 다양한 관계형 데이터베이스를 지원하기 위해 JDBC는 세부적인 작업이 가능하게 작업별로 각각의 메서드를 호출하게 된다. 이러한 사항들은 메서드를 호출하고 관련된 객체를 해제해야 하는 단점이 있다. MyBatis는 JDBC보다 좀더 편하게 사용하기 위해 개발되었다. 한마디로 JDBC는 자바에서 제공하는 데이터베이스 프로그래밍 API 모음이라고 할 수 있다.


MyBatis

MyBatis는 객체지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 더 쉽게 할수 있게 도와주는 개발 프레임워크이다. 자바에서는 데이터프로그래밍을 하기위해 JDBC(자바에서 제공하는 데이터 프로그래밍 API)를 제공한다.

공식문서:
https://mybatis.org/mybatis-3/configuration.html#properties

MyBatis의 장점

  • SQL 및 프로시저구문의 독립
  • 복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드 유지 가능
  • 수동적인 파라미터 설정과 쿼리 결과에 대한 매핑 구문 제거 가능
    MyBatis는 별도의 XML문서에 매핑된 프로시저와 SQL구문을 연동하여 데이터베이스와 연동하도록 돕는다. 결과적으로는 복잡한 JDBC연동 코드나 트랜잭션 코드를 간소화할 수 있게 도와준다. 그래서 소스코드의 유지보수가 쉬워진다. 또한 ResultSet과 같이 결과값을 매핑하는 객체 또한 자동화시켜주어 많은 라인의 소스코드를 줄일 수 있다.

JDBC와 MyBatis의 차이

JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스코드안에 SQL문을 작성하는 방식이었다. JSP로 블로그를 만드는 과정에서처럼 Connection을 맺고 Select문을 날려서 ResultSet이 나오고 그것을 rs.next()등을 이용해서 하나씩 받아오는 방식이었다. 그 결과 SQL의 변경 등이 발생할 경우, 프로그램(java파일)을 수정해야하기 때문에 그 유연성이 좋지 않다. 그런데 MyBatis에서는 SQL을 xml파일에 작성하여, SQL의 변환이 자유롭고, 가독성이 좋다.


MyBatis의 개발 방식

위에서 말했듯, 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://mybatis.org/mybatis-3/ko/getting-started.html


MyBatis와 Spring 연동

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

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이란?


Connection Pool이란 위의 그림처럼 Pool속에 DataBase와의 연결(Connection)을 미리 만들어두고 Database에 접근 시 Pool에 남아있는 Connection 중 하나를 받아와서 사용한뒤 반환하는 기법을 말한다.

DataSource란?

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

profile
개발자

0개의 댓글