❑ JDBC 기반 데이터 액세스 계층
➤ JDBC란?
JDBC(Java Database Connectivity)
Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를
데이터베이스에 저장, 업데이트 하거나
데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있게
해주는 Java에서 제공하는 표준 API이다.
JDK 1.1 버전부터 제공됐다. 엄청 오래됐다..!
데이터베이스 액세스를 위해 Java에서 제공하는 API라고 보면 된다.
다양한 벤더(Oracle, MS SQL, MySQL 등)의 데이터베이스와 연동할 수 있다.
etc..
- Java 기반의 애플리케이션에서 사용하는 데이터 액세스 기술의 기본이 되는 저수준(low level) API 이다.
- Spring에서는 JDBC API를 직접 사용하기 보다는 Spring Data JDBC, Spring Data JPA 같은 기술이 편리해서 더 많이 사용한다. (Spring Data JDBC나 Spring Data JPA가 더 편리해서 현업에서는 JDBC를 많이 쓰지 않지만 예전 기술로 만든 애플리케이션을 그대로 사용할 경우 Spring JDBC를 사용할 수도 있다.)
- Spring Data JDBC나 Spring Data JPA 같은 기술도 내부적으로 JDBC를 이용하기 때문에 JDBC의 흐름정도는 알면 데이터 액세스 기술을 구현하는데 도움이 된다.
➤ JDBC의 동작 흐름
▶️ JDBC 드라이버(JDBC Driver)
JDBC 드라이버는 Database와의 통신을 담당하는 인터페이스이다.
Oracle, MS SQL, MySQL 등에서 해당 벤더에 맞는 JDBC 드라이버를 구현해서 제공을 한다.
JDBC 드라이버 구현체를 이용해서 특정 벤더의 Database에 액세스 할 수 있다.
➤ JDBC API 사용 흐름
1. JDBC 드라이버 로딩
사용하고자 하는 JDBC 드라이버를 로딩한다.
JDBC 드라이버는 DriverManager라는 클래스를 통해서 로딩된다.
2. Connection 객체 생성
JDBC 드라이버가 정상적으로 로딩되면 DriverManager를 통해 데이터베이스와 연결되는 세션(Session)인 Connection 객체를 생성한다.
3. Statement 객체 생성
Statement 객체는 작성된 SQL 쿼리문을 실행하기 위한 객체이다.
객체 생성 후에 정적인 SQL 쿼리 문자열을 입력으로 가진다.
4. Query 실행
생성된 Statement 객체를 이용하여 입력한 SQL 쿼리를 실행한다.
5. ResultSet 객체로부터 데이터 조회
실행된 SQL 쿼리문에 대한 결과 데이터 Set으로 부터 데이터를 조회한다.
6. ResultSet 객체 Close, Statement 객체 Close, Connection 객체 Close
JDBC API 를 통해 사용된 객체들은 사용이 끝나면 실행한 역순으로 차례대로 Close 해준다.
➤ Connection Pool 이란?
데이터베이스와의 연결을 위한 Connection 객체를 생성하는 작업은 비용이 많이 드는 작업이다.
왜 그런지는 아래 MySQL에서 제공하는 페이지를 들어가서 보면 알 수 있다.
https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html
효율을 위해서 Connection Pool에서 Connection을 미리 만들어서 보관한다.
그리고 애플리케이션이 필요할 때마다 이 Connection 객체를 제공하는 역할을 한다. (Connection 관리자)
애플리케이션 로딩 시점에 Connection 객체를 미리 생성해두고
애플리케이션에서 데이터베이스에 연결이 필요할 때마다
Connection 객체를 생성하지 않고(비용이 많이 듬)
미리 만들어둔 Connection 객체를 사용한다.
-> 애플리케이션의 성능 향상
Spring Boot 2.0 이전 버전에서는 Apache 재단의 오픈 소스인 Apache Commons DBCP(Database Connection Pool, DBCP)를 주로 사용했다.
2.0 이후 부터는 성능면에서 더 나은 HikariCP를 기본 DBCP로 채택했다.
※ 추가학습) HikariCP 란?
- Brett Wooldridge가 2012년에 개발한 JDBC Connection Pool이다.
- 가볍고 빠르고 안정적이다. (히카리는 일본어로 빛 광이다.)
- Spring Boot 2.0부터 default DBCP로 채택되었다.
https://github.com/brettwooldridge/HikariCP
※ 추가학습) JDBC 장단점
- 장점
- 깨끗하고 심플한 SQL 처리가 가능하다
- 용량이 큰 데이터에서 우수한 성능을 보인다
- 구현하기 쉽다
- 작은 애플리케이션에서 아주 좋은 성능을 보인다
- 단점
- 대형 프로그래밍에서 많은 비용, 시간이 든다
- OOP의 구현이 지원되지 않는다
- JDBC를 이용한 MVC 패턴 구현이 어렵다
- JDBC에서 사용되는 쿼리문은 database에 한정된다
- 예외 처리를 위한 try, catch, finally 블록에 모든 것을 작성해야 한다.
- 개발자가 connection을 닫지 못하면 JDBC가 자동으로 connection을 닫지 않아 문제가 발생할 수 있다.
- 많은 곳에 SQL 쿼리문을 작성해야하고 일단 프로그램이 작성되면 테이블 구조를 수정할 수 없다.
- JDBC는 데이터베이스에 특정 오류코드를 생산하고 개발자는 데이터베이스의 오류 코드에 대해 전혀 알지 못 할수 있다.
- JDBC를 사용하면 Java 객체를 DB 객체로 변환하거나 그 반대로 변환하므로 변환 및 역변환에 많은 시간이 소요되어 프로세스가 느려질 수 있다.
출처 :
https://techxyte.com/tutorials/hibernate/pros-and-cons-of-jdbc.php
❑ Spring Data JDBC 란?
➤ Data Access
Spring 에서 데이터베이스에 액세스하는 다양한 기술을 사용할 수 있다.
대표적인 데이터 액세스 기술: mybatis, Spring JDBC, Spring Data JDBC, JPA, Spring Data JPA
Spring에서 사용하는 데이터베이스 액세스 기술은 크게 두 가지로 나눌 수 있다.
➤ SQL 중심 기술
- mybatis와 Spring JDBC가 대표적
- 애플리케이션에서 데이터베이스에 접근하기 위해 SQL 쿼리문을 애플리케이션 내부에 Java 코드로 직접적으로 작성하는 것
- 과거부터 현재까지 많이 사용하고 있지만 Java 진영에서는 SQL 중심보다 객체(Object) 중심의 기술로 지속적으로 이전하고 있는 추세이다.
mybatis 에서 사용하는 SQL Mapper 예시
<select id="findMember" resultType="Member">
SELECT * FROM MEMBER WHERE member_id = #{memberId}
</select>
Spring JDBC의 JdbcTemplate 사용 예
Member member = this.jdbcTemplate.queryForObject(
"select * from member where member_id=?", 1, Member.class);
➤ 객체(Object) 중심 기술
- 모든 데이터를 객체(Object) 관점으로 바라보는 기술이다.
- SQL 쿼리문을 직접적으로 작성하기 보다 Java 객체를 이용해 애플리케이션 내부에서 Java 객체를 SQL 쿼리문으로 자동 변환해준다.
- ORM(Object-Relational Mapping) 이라고 한다.
- Java 에서 대표적 ORM 기술 : JPA(Java Persistence API), Spring Data JDBC
➤ Spring Data JDBC란?
- 심플하다.
- Spring Data JDBC는 ORM 기술을 사용하지만 JPA의 기술적 복잡도를 낮춘 기술이다.
▶️ Spring Data JDBC vs JPA vs Spring Data JPA
Spring Data JDBC
- 2018년에 처음 릴리즈 됐다.
- 아직까지는 JPA보다 상대적으로 적게 사용된다.
- 애플리케이션의 규모가 상대적으로 크지 않고, 복잡하지 않을 경우 Spring Data JDBC가 뛰어난 생산성을 보여준다.
JPA
- 실무에서 가장 많이 사용하고 있는 기술이다.
Spring Data JPA
- Spring Data JPA는 Spring에서 JPA 기술을 편리하게 사용하기 위한 기술이다.
- JPA에 대한 선행 지식이 필요하다.
❑ Spring Data JDBC 실습
➤ 의존 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'
Spring Data JDBC를 사용하기 위한 의존 라이브러리 코드 추가
데이터베이스에서 인메모리(In-memory) DB인 H2를 사용하기 위한 의존 라이브러리 설정 추가
▶️ 인메모리(In-memory) DB란?
메모리 안에 데이터를 저장하는 데이터베이스이다.
메모리는 휘발성이라 컴퓨터 전원을 껐다가 켜면 메모리에 저장되어 있는 데이터는 모두 지워진다.
인메모리 DB는 애플리케이션이 실행되는 동안에만 데이터를 저장하고 있다.
테스트에 필요한 데이터 외에는 테이블에 없는 것이 테스트의 정확도 면에서 유리하기 때문에 인메모리 DB를 사용한다.
로컬 개발 환경에서는 테스트가 끝나면 테이블을 비우는 것이 좋다.
▶️ application.yml파일에 H2 Browser 활성화 설정 추가
Spring Boot Initializr을 통해 샘플 프로젝트 생성 -> src/main/resources 에 application.properties 또는 appication.yml 파일을 통해 Spring 에서 사용하는 다양한 설정 정보들을 입력
application.yml로 확장자 변경 후 아래 코드 입력
spring:
h2:
console:
enabled: true
<애플리케이션 실행 시 콘솔 창>
HikariPool-1 - Starting...
HikariPool-1 - Start completed.
H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:97f0b3b1-369a-498d-9abe-633d5d10acaa'
<웹 브라우저>
localhost:8080/h2-console
주소창에 입력후 엔터
H2 Browser 초기 화면 나옴
JDBC URL 에 jdbc:h2:mem:97f0b3b1-369a-498d-9abe-633d5d10acaa 입력
-> Connect
▶️ H2 DB 디폴트 설정의 문제점
애플리케이션 재시작 할때마다 애플리케이션 로그에 출력되는 JDBC URL이 매번 랜덤하게 바뀌기 때문에 매번 변경된 JDBC URL을 다시 입력해야 한다.
이 문제는 application.yml 파일에 H2에 대한 설정을 추가해서 해결한다.
jdbc:h2:mem:test 로 설정
spring:
h2:
console:
enabled: true
path: /h2 # (1) Context path 변경
datasource:
url: jdbc:h2:mem:test # (2) JDBC URL 변경
주소창에
localhost:8080/h2 로 접속
▶️ PostMan 으로 Post
Post 하고 body 에 JSON 형식으로 message 값 전달
➡️ 오류 발생! ➡️ Message 테이블이 생성되지 않았음
읽어주셔서 감사합니다. 좋은 하루 되세요 😄
'TIL(Today I Learned)' 카테고리의 다른 글
7/4 (월) [Spring MVC] JDBC 기반 데이터 액세스 계층 2️⃣ (0) | 2022.07.12 |
---|---|
7/1 (금) [Spring MVC] JDBC 기반 데이터 액세스 계층 1️⃣ (0) | 2022.07.09 |
6/29 (수) [Spring MVC] 예외 처리 2️⃣ - 비즈니스 로직에 대한 예외 처리 (0) | 2022.07.04 |
6/28 (화) [Spring MVC] 예외 처리1️⃣ (0) | 2022.07.04 |
6/27 (월) [Spring MVC] 서비스 계층 (0) | 2022.07.04 |