프로젝트를 하면서 JDBC에 대한 개념을 확실히 알아야 될 것 같아 이참에 정리를 한번 해보았다.
JDBC(Java Database Connectivity) 란?
서버랑 데이터베이스를 연결해주는 API이자 드라이버이다.
즉, JAVA 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트를 하거나, 데이터베이스에 저장된 데이터를 Java에서 사용가능하도록 하는 API이다.
쉽게 말해서 자바 언어와 DB를 연결해주는 통로와 같은 것이다.
- JDBC API : JDBC 클래스는 자바 패키지 java.sql과 javax.sql에 포함되어 있다.
- JDBC Driver Manager : 애플리케이션이 요구하는 데이터베이스에 접근하기 위한 적절한 드라이버를 선택해서 데이터베이스와 연결하도록 도와준다.
→ 애플리케이션의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터이다. (서버가 아닌 클라이언트에 설치된다.)
JDBC가 필요한 이유
DB를 이용할 때 SQL을 통해서 직접 값을 넣거나 조회하는 일을 수행하였다.
DB와 서버를 연동하는 방법은 다음과 같다.
1. 커넥션 연결 : 주로 TCP/IP를 사용해 애플리케이션 서버와 DB서버가 연결된다.
2. SQL 전달 : 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.
3. 결과 응답 : DB는 전달된 SQL을 수행하고 그 결과를 응답한다.
하지만 우리가 웹을 동작시킬 때마다 매번 이런 식으로 할 수는 없다. 또한 데이터베이스의 종류를 바꾸게 되면 데이터베이스 사용 코드를 매번 바꿔야 하므로 번거롭다. 그래서 우리는 이러한 일을 대신해주는 API인 JDBC를 사용한다.
JAVA는 표준 인터페이스인 JDBC API를 제공하므로, 이미 인터페이스가 정의되어있기 때문에 어떤 DB든 다 똑같은 방법으로 사용할 수 있으므로 이용하기 편하다.
JDBC 동작 흐름
위에 말했다싶이 JDBC는 응용프로그램과 DBMS 간의 통신을 중간에서 번역해주는 역할을 한다.
JDBC는 크게 JDBC 인터페이스와 드라이버로 구성된다.
JDBC 흐름은 Java 애플리케이션 내에서 JDBC API을 사용해서 데이터베이스에 접근하는 단순한 구조이다.
SQL문을 만들어서 JDBC 인터페이스에 전송하고 실제 구현 클래스인 JDBC 드라이버는 데이터베이스에 알맞는 JDBC 드라이버를 구현하여 제공한 후, DBMS와 접속 시도를 하며 SQL 쿼리를 전송하는 구조를 가진다.
JDBC 드라이버 전송 부분에서 더 자세한 로직은 위와 같다.
1. 먼저 사용하고자 하는 JDBC 드라이버를 DriverManager 클래스를 통해 로딩한다.
2. 그 후 드라이버가 정상적으로 로딩되면 DrvierManager를 통해 데이터베이스와 연결되는 세션인 Connection 객체를 생성한다.
3. 그 다음 작성된 sql 쿼리문을 실행하기 위한 객체인 statement 객체를 생성하고 그 객체를 이용하여 입력한 sql 쿼리를 실행한다.
4. 마지막으로 resultset 객체로부터 데이터를 조회하고 실행된 sql 쿼리문에 대한 결과 데이터를 셋하고 생성된 객체들을 사용한 순서의 역순으로 객체들을 close한다.
여기서 말했다싶이, JDBC를 통해 DBMS에서 나온 결과를 역으로 거쳐 애플리케이션으로 가져오기 때문에 애플리케이션과 DBMS의 통로 역할을 한다고 생각하면 이해하기 쉽다.
JDBC 표준 인터페이스
JDBC는 3가지 기능을 표준 인터페이스로 정의하여 제공하고 있다.
1. java.sql.Connection - 연결 부분
2. java.sql.Statement - sql을 담은 내용 부분
3. java.sql.ResultSet - sql 요청 응답 부분
⬇️ MySQL을 연결한 경우 JDBC 로직
JDBC 사용법
gradle 프로젝트를 기준으로 설명하겠다. (JDK를 설치하고 JDBC 드라이버를 설치해야 함)
1. build.gradle 추가
DBMS와의 연결을 위해서 build.gradle 파일 아래에 dependency 구문을 추가한다.
plugins {
id 'java'
// java 프로젝트라서 plugin 설정이 java로 되어있다.
}
group 'org.example'
version '1.0-SNAPSHOT'
// 프로젝트 만들 때 설정한 값이다.
repositories {
mavenCentral()
// 외부 라이브러리를 maven 저장소에서 가지고 오는 것으로 설정된다.
}
dependencies {
// mysql JDBC driver 외부 라이브러리를 추가해주면 된다.
implementation group: 'mysql', name:'mysql-connector-java', version:'8.0.28'
// 자신이 사용하는 mysql 버전과 맞춰주면 된다.
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}
build.gradle 파일에서 외부 라이브러리를 추가하거나 설정을 바꾸게 되면 위의 사진과 같이 코끼리가 붙어있는 새로고침 아이콘이 뜬다. 그러면 이 아이콘을 클릭해서 반드시 수정사항을 변경해주어야 한다.
2. application.properties 수정하기
DB 연결 및 JPA 설정을 통해 DB 정보를 추가해준다.
# MySQL 설정 부분
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB Source URL
spring.datasource.url=jdbc:mysql://<IP>:<Port/<DB>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
# DB username 입력
spring.datasource.username=<username>
# DB password 입력
spring.datasource.password=<password>
# true 설정시 JPA 쿼리문을 확인할 수 있다.
spring.jpa.show-sql=true
# DDL(create, alter, drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=update
# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다.
spring.jpa.properties.hibernate.format_sql=true
⬇️ spring.jpa.hibernate.ddl-auto=[ ] 부분
- create : 기존 테이블을 삭제하고 새로 생성한다. [ DROP + CREATE ]
- create-drop : CREATE 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거한다. [ DROP + CREATE + DROP ]
- update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다. [ 테이블이 없을 경우 CREATE ]
- validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않는다.
- none : 자동 생성 기능을 사용하지 않는다.
그 이후, JPA 엔티티와 레포지토리를 프로젝트에 생성해서 테스트를 해보면 DB 연동이 잘된 것을 확인할 수 있다.
'Framework > Spring' 카테고리의 다른 글
[Spring] 스프링부트 패키지 구조 (0) | 2024.08.06 |
---|