본문 바로가기
부트캠프 개발일기/Spring MVC

46일차: Spring MVC(JDBC, Spring Data JDBC)

by shyun00 2023. 4. 18.

❯ JDBC(Java Database Connectivity)

JDBC란 자바에서 데이터베이스와 연결하여 데이터를 다루기 위한 API 를 의미한다.

자바에서 제공하는 표준 사양이다.

JDBC를 이용해 자바 애플리케이션에서 다양한 DB시스템(Oracle, MySQL, PostgreSQL 등)과 연결할 수 있다.

JDBC API는 데이터베이스 연결, 쿼리 실행, 결과 처리 등을 담당한다.

 

일반적으로 JDBC를 직접 사용하지는 않는다고 한다.

Spring Data JDBC, Spring Data JPA 와 같은 데이터 액세스 프레임워크를 사용한다.

JDBC 동작 흐름

Java 애플리케이션에서 JDBC API를 이용해 적절한 JDBC 드라이버*를 로딩하고 데이터베이스를 사용하게 된다.

*JDBC 드라이버란 데이터베이스와 통신을 담당하는 인터페이스로 MySQL, Oracle 등 벤더에 맞는 드라이버를 사용해야한다.

JDBC API 동작 흐름

  1. JDBC 드라이버 로딩: 사용할 JDBC 드라이버를 DriverManager  클래스를 통해서 로딩
  2. Connection 객체 생성: DB와 연결되는 Session 인 Connection 객체 생성
  3. Statement 객체 생성: 작성된 SQL 쿼리문을 실행하기 위한 객체 생성
  4. 쿼리 실행
  5. ResultSet 객체로부터 데이터 조회: 실행된 쿼리문에 대한 결과를 조회
  6. ResultSet, Statement, Connection 객체 close: JDBC API에서 사용된 객체는 사용 역순으로 close.

코드 작성 실습에서 위 과정을 직접 구현하지는 않으나 간단한 동작 흐름에 대해서는 이해하도록 하자.

위 과정 중 Connection 객체는 생성하는데 많은 비용이 드는 작업이다.

따라서 Connection Pool(CP)을 사용해 애플리케이션 로딩 시점에 Connection 객체를 미리 생성해두고 필요시 해당 객체를 사용한다.

(Spring Boot 2.0 부터 기본 DBCP로 HikariCP를 사용한다.)

❯ Spring Data JDBC

Spring에서 사용할 수 있는 데이터 액세스 기술에는 mybatis, Spring JCBC, Spring Data JDBC, JPA, Spring Data JPA 등이 있다.

여기에서 이름에 혼동이 온 것이 JDBC, Spring JDBC, Spring Data JDBC이다.

이름만 봐서는 같은거 아닌가? 싶을 정도로 비슷한데 다른 개념이다. 먼저 이부분에 대해 짚고 넘어가도록 하자.

JDBC Java에서 데이터베이스와의 연결과 쿼리 수행을 위해 제공되는 표준 인터페이스.
JDBC를 사용해 Java 언어로 데이터베이스와 통신할 수 있으며 CRUD가 가능하다.
데이터베이스 벤더마다 다른 드라이버를 사용하므로 적절한 JDBC 드라이버를 사용해야한다.
Spring JDBC Spring Framework에서 제공하는 데이터 액세스 기능 중 하나.
JDBC를 기반으로 보다 쉽게 사용할 수 있도록 도와준다.
JDBC Template 이라는 클래스를 통해 데이터베이스와의 연결과 쿼리 수행을 처리한다.
Spring Data JDBC Spring Data 프로젝트에서 제공하는 데이터 액세스 기술 중 하나.
ORM 프레임워크가 아닌, JDBC와 직접 연결되는 프레임 워크임 (ORM: Object - Relational Mapping)
JPA와 유사한 방식으로 데이터 액세스를 처리할 수 있도록 도와준다.
POJO를 사용해 데이터베이스와의 매핑을 처리하며 자바 코드로 데이터 액세스를 처리할 수 있다.

데이터 액세스 기술 중 접근 방식에 따라 크게 두가지로 나눌 수 있다.

  • SQL 중심 기술
    SQL 쿼리문을 애플리케이션 내부에 직접 작성해서 사용하는 기술. 대표적으로 mybatis, Spring JDBC가 있다.
  • 객체 중심 기술 (ORM: Object - Relational Mapping)
    모든 데이터를 객체 관점으로 보는 기술. 애플리케이션 내부에서 Java 객체를 SQL 쿼리문으로 변환한 후 DB에 접근하는 방식이다.
    => 객체 중심의 데이터 액세스 기술을 ORM 이라고 한다. 대표적으로 JPA(Java Persistence API)가 있다.

In-memory DB

Spring Data JDBC 실습 단계에서는 MySQL 같은 데이터베이스를 사용하지 않고 H2 라는 In-memory DB를 사용한다.

In-memory DB 란 메모리에 데이터를 저장하는 데이터베이스를 말한다.

애플리케이션이 실행되는 동안에만 데이터를 저장하므로 작업이나 컴퓨터 전원이 종료되면 메모리에 저장된 데이터는 모두 지워진다. 

실제 서비스를 운영할때는 인메모리 DB를 사용하면 안되겠지만, 개발(테스트)시에는 애플리케이션을 실행시키면 데이터베이스가 초기화되므로 테스트에 유리하기 때문에 현재 단계에서는 인메모리 데이터베이스를 사용할 예정이다.

.yml 파일

인메모리 데이터베이스를 사용하고 H2 브라우저를 활성화하기 위해 몇가지 설정이 필요하다.

이 때 작성하는 파일이 application.yml 파일이다.

Spring Boot Initializr 를 사용해 프로젝트를 만들면 해당 파일이 src/main/resources 경로에 자동으로 생성되어있다.

.yml 파일이란 YAML(YAML Ain't Markup Language) 형식으로 작성된 파일을 말한다.

데이터 직렬화 양식의 하나로 다른 언어와 구조화된 데이터 교환을 위해 사용된다고 한다. (설정 파일로 주로 사용)

들여쓰기(depth)를 통해 데이터 구조를 표현할 수 있어 설정 정보(프로퍼티)를 쉽게 작성할 수 있다.

spring:
  h2:
    console:
      enabled: true
      path: /h2     
  datasource:
    url: jdbc:h2:mem:test
  sql:
    init:
      schema-locations: classpath*:db/h2/schema.sql

.sql 파일

위의 application.yml 설정파일에서 schema-locations가 db/h2/schema.sql 라고 하였다.

따라서 해당 위치의 schema.sql 파일에 생성하고자 하는 테이블을 작성해두면 애플리케이션 실행시 데이터베이스에 자동 생성된다.

CREATE TABLE IF NOT EXISTS MESSAGE (
    message_id bigint NOT NULL AUTO_INCREMENT,
    message varchar(100) NOT NULL,
    PRIMARY KEY (message_id)
);

❯ Spring Data JDBC 적용 순서

1. build.gradle 에 사용할 데이터베이스를 위한 의존 라이브러리 추가

2. application.yml 파일에 사용할 데이터베이스 설정

3. schema.sql 파일에 필요한 테이블 스크립트 작성

4. application.yml 파일에 schema.sql 파일 읽어서 초기화하는 설정 추가

5. 데이터베이스 테이블과 매핑할 Entity 클래스 작성

6. Entity 클래스를 기반으로 데이터베이스 작업 처리할 Repository 인터페이스 작성 * CrudRepositoy 인터페이스 상속

7. 서비스 클래스에 Repository를 DI 적용(생성자에 파라미터로 넣어줌)

8. DI 적용된 Repository 의 메서드를 사용해서 서비스 클래스에서 CRUD 작업 수행


이제 본격적인 데이터베이스 관련 내용이 시작됐다.

오늘은 이론 자체는 간단하고 실습도 복잡하지 않았으나 한가지 오류로 인해 꽤 시간이 걸렸다.

디버깅을 해보니 DTO에서 Entity로 매핑이 제대로 되지 않는것이었는데 처음부터 다시 해볼까? 하다가

오류가 발생할때마다 매번 다 지웠다가 작성할수는 없다고 생각해서 끝까지 한번 풀어보기로 했다.

결국 로그를 확인하고 알게된 것이, @Setter 가 @Service 로 잘못 작성되어 발생한 오류였다.

자동완성기능때문에 @Se 에서 바로 Service로 작성이 되어버린것이다.

다행히 간단한 오류여서 바로 수정하고 정상작동하는걸 확인할 수 있었는데 나름 큰 교훈을 얻었다.

프로그램을 너무 믿지 말고..ㅎㅎ 꼼꼼하게 확인하는 자세를 길러야겠다!