[Java] JDBC와 빌드툴, Spring JDBC까지 알아보자
이글을 작성하게된 계기
과제진행중 팀원분들께서 jdbc드라이버 설정과 관련하여 에러가 발생했다.
jdbc드라이버를 직접 다운받아서 외부라이브러리로 넣어주는것이 일반 자바프로젝트에서는 가능했는데
그래들 프로젝트에서는 해당방법이 적용되지않았다 (드라이버를 외부라이브러리로 넣어주었음에도 불구하고 찾을수없다는 오류가 발생)
따라서 왜 이런현상이 발생했는지 이해하기위해 그래들과같은 빌드툴과 JDBC에 대해서도 좀더 정확이 이해해보고자한다.
잠깐, JDBC란 무엇인가??
JDBC란 자바에서 데이터베이스를 다루기위한 Java API로 제공되는 인터페이스이다.
JDBC가 있기때문에 우리는 사용하는 디비에 관계없이 동일한 방식으로 디비에 접근/조작이 가능한것이다.
이게바로 인터페이스의 역할이니까!
JDBC가 인터페이스라면 그에해당하는 구현체는 각 벤더들(오라클, mysql, postgresql)이 자신들의 DBMS에 맞게 구현을 해놓은것이다.
일반적인 (빌드툴을 이용하지 않는)순수 자바프로젝트에서 JDBC로 DB에 접근하는 방법은 다음과같다.
(MySQL을 사용한다고 가정하겠다.)
- MySQ홈페이지에 가서 드라이버를 설치한다.
- 설치가 완료되면 받은 jar파일을 준비한다. (jar파일은 여러 클래스를 모아놓은 파일을 말한다.)
- jar파일을 외부라이브러리로 등록한다.이제 JDBC를 사용할 준비가 되었다.
- JDBC를 사용하는 방법은 어떤 디비를 사용하던 똑같다.
- import java.sql.*;
- jdbc드라이버를 메모리에 로드한다.
- mysql 연결을 위한 Connection 객체 생성 (디비서버와 연결)
- Statement 객체를 생성하여 질의 수행
- statement객체는 자바프로그램이 디비로 sql쿼리를 전송하고 처리결과를 다시 자바프로그램으로 전달하도록 돕는 객체이다.
- 질의 결과가 있다면, ResultSet 객체를 생성하여 결과 저장
- sql쿼리결과를 ResultSet객체로 받아 DTO에 옮겨준다.
- 추가 로직 실행 후, JDBC 연결 과정에서 필요했던 객체들을 clos
이렇게 JDBC를 사용함으로서 java프로그램에서 디비에 접근할 수 있게된다.
빌드툴의 등장
위에서 본것처럼 일일이 드라이버를 설치하고 jar파일을 연동하고 이런 일들이 너무 귀찮아진것이다. 그래서 빌드툴이 등장했다.
기존 JDBC연동에서 Jar을 import하는것을 빌드툴로 자동화한다는 것이다.
어떻게??
빌드 설정파일에 라이브러리를 추가하면 관련된 의존성관리를 모두 알아서 해준다.
예를들어 grdle이라는 빌드툴을 사용하면 build.gradle파일이 있다.
이 파일이 의존성을 관리해주는 파일인데 이 파일의 dependencies(의존성)부분에 아래와같은 문구를 추가한다.
compile("mysql:mysql-connector-java:8.0.21")
이 코드 한줄로 jar이 import된것이다.
빌드툴을 사용하는경우 직접 외부라이브러리 설정은 불가한것인가?
결론부터 말하면 빌드툴을 사용하는경우 단순히 External Libraries폴더에 직접 jar파일을 넣는것만으로는 프로젝트가 이를 인식하지 못한다.
gradle 빌드를 사용하게되면 사용자폴더 아래 .gradle폴더 하위에 원격 repository에서 다운받은 라이브러리가 다운로드되게 된다. 즉 이 폴더 이외에 있는 라이브러리는 빌드툴의 관리대상이 아니게된다.
아침조회를 하려고 학생들을 모았는데 선생님이 알지못하는 이상한 학생한명이 거기 낑겨있다고 해서 그 학생은 선생님이 관리하는 반 학생이 아닌것..처럼..??🤔
그래도 방법은 있다. 내가 사용하고자하는 jar파일의 위치를 빌드툴에게 알려주면 되는데 maven의 경우 dependency scope을 system으로 설정하고 내가 로컬에 가지고있는 jar파일의 위치를 넣어주면 maven이 이를 인식한다!
결론적으로 다시한번 정리하면 빌드툴 기반으로 프로젝트를 생성한 이상 해당 프로젝트에서 사용되는 모드 외부라이버러리의 의존성은 빌드툴이 관리하게되기 때문에 사용하고자 하는 라이브러리가 있다면 빌드툴이 jar파일의 위치를 알게 해야하는것이다!
빌드툴의 종류
가장 많이 쓰이는 Gradle, Maven, Groovy등이 있다.
Maven
"라이브러리를 자동으로 추가 및 관리, 라이브러리 버전을 자동으로 동기화"
스프링초기에 웹프로젝트 생성후 직접 스프링기능에 필요한 라이브러리를 다운받아 사용했다. 스프링 버전이 자주 업데이트됨에따라 호환되는 라이브러리를 다시 다 업데이트 해야하는 불편함이 있었다.
Maven은 Ant라는 빌드만 관리하는 도구에 자동라이브러리 관리기능이 추가되어 등장하였다.
Maven은 내가 사용하는 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리까지 관리하여 자동으로 다운받아준다.
Gradle
Gradle은 기본적으로 빌드배포도구이다. 안드로이드앱을 만들때 필요한 공식 빌드시스템이다.
최근에는 Gradle로 추세가 변하고 있다. ( maven보다 100배 빠르다고한다)
메이븐의 경우 pom.xml로 라이브러리를 관리하도록 되어있지만 그래들의 경우 별도 빌드스크립트를 통해 어플리케이션 버전, 라이브러리를 설정할 수 있다.
이렇게 빌드툴에 대해서 알아보았다.
그러나 여전히 불편함이 존재하는데 한번 생각해보자 어떤것이 불편한가...
아래코드는 빌드툴로 라이브러리를 받은 후에 디비연동을 위한 코드이다!
public class Main {
public static void main(String[] args) {
// 예외처리 일일이 해줘야함
try {
// 커넥션객체 생성
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3307",
"leica",
"1234"
);
// Statement생성후 쿼리날림
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"show databases"
);
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC를 자동으로 다운받아주는군,,, 그래도 여전히 불편햇!!!
빌드툴을 사용해도 빌드툴은 단지 라이브러리 의존성 관리만 해주는것이기때문에
순수 JDBC를 사용한다면 결국 커넥션을 열고닫고, Statement를 준비하고닫고, Statement를 실행하고 ResultSet을 처리하고, Exception를 처리하는것 모~~두 개발자가 직접 하긴해야한다!!!!
그래서 등장한게 Spring JDBC이다!!!
Spring JDBC에 대한 글은 좀더 자세한 글은 다음을 참고하자. (https://esoongan.tistory.com/164)
Spring JDBC
spring jdbc는 위에서말한 순수JDBC를 사용할때의 불편함을 보완하여 더 편리한 기능을 제공한다.
Spring JDBC가 하는일
- Connection 열기와 닫기
- Statement 준비와 닫기
- Statement 실행
- ResultSet Loop처리
- Exception 처리와 반환
- Transaction 처리
따라서 개발자가 할일은 아래일밖에 없다. 개 꿀
- datasource 설정
- sql문 작성
- 결과 처리
Spring jdbc에 대해 이해하기위해서는
1. JDBC Template ( Spring JDBC의 접근방법중 하나)
2. DataSource (DB 커넥션을 얻기위한 정보를 담고있음 )
에 대해서 이해해야한다.
두가지에 대해서 더 자세한글은 https://esoongan.tistory.com/164를 참고하자!
정리
아무튼 이렇게 JDBC에서부터 시작해 빌드툴과 Spring JDBC까지 알아보았다.
글을 쓰면서 느낀것은 어떤 새로운것이 생겨나면 또 거기서 더 편한방법을 위해 계속 꼬리를 물고 새로운 기술이 생겨난다는 것이다.
정말 다들 대단하다..🎅🏻
안주하지않고 끊임없이 더 좋은 기술이 생겨나는점이 이 분야의 최대장점인것같다는 생각이 들었다.
(번외)
compile - deprecated
compile은 gradle3.X부터 deprecate되었다고 한다. 따라서 대신 implementation을 사용하자.