Back-End/JPA

[JDBC, Spring Data JDBC] 데이터 엑세스 계층

달의 조각 2022. 8. 26. 11:09

  JDBC란, Java 기반 애플리케이션에서 사용하는 데이터를 DB에 저장하거나, DB의 데이터를 Java 코드로 사용할 수 있도록 해 주는 표준 사양이다. JDBC API는 다양한 벤더(Oracle, MS SQL, MySQL 등)의 DB와 연동할 수 있다. 동작 흐름을 알면 Spring의 데이터 엑세스 기술 사용에 도움이 된다. (Spring Data JDBC, Spring Data JPA)

 

📁 동작 흐름

Java 애플리케이션 → JDBC API → JDBC 드라이버 → 데이터베이스

  1. JDBC 드라이버 로딩
    • DB와 통신을 담당하는 인터페이스
    • 다양한 벤더에서 이를 제공하면 드라이버의 구현체를 이용하여 특정 벤더의 DB에 엑세스
    • DriverManager 클래스를 통해 로딩 (인터페이스)
  2. Connection 객체 생성: DriverManager를 통해 DB와 연결되는 세션
  3. Statement 객체 생성: 작성한 SQL 쿼리문을 실행하기 위한 객체로, 정적 SQL를 입력으로 가짐
  4. Query 실행
  5. ResultSet 객체로부터 데이터 조회: 실행된 쿼리문에 대한 결과 데이터 셋
  6. Close: 사용 순서 역순으로 (Close ResulSet ➡️ Statement ➡️ Connection 객체)

 

📁 Connetion Pool

  Connection 객체의 생성 작업은 비용이 많이 든다. 애플리케이션 로딩 시점에 객체를 미리 생성해 두고, DB에 연결이 필요할 경우 이 객체를 사용하여 성능을 향상시킨다. 이 Connection을 제공해 주는 관리자이다. Spring Boot 2.0부터 HikariCP가 기본 DBCP로 채택되었다.

 


 

Spring Data JDBC 사용하기

 

Spring의 데이터 액세스 기술

SQL 중심: mybatis, Spring JDBC
객체 중심(ORM): Spring Data JDBC, JPA, Spring Data JPA 등

 

01. 의존 라이브러리 추가

dependencies {
	...
	...
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	runtimeOnly 'com.h2database:h2'
}

 

02. H2 Browser 활성화, 추가 설정

#H2 Browser 활성화
spring:
  h2:
    console:
      enabled: true
      path: /h2 #자동 H2 DB 디폴트 설정: Context path 변경
  datasource:
    url: jdbc:h2:mem:test #자동 H2 DB 디폴트 설정: JDBC URL 변경

 

03. DB 테이블과 매핑할 엔티티 클래스 작성

  • 엔티티 클래스 이름은 데이터베이스 테이블의 이름과 매핑된다.
  • 엔티티 클래스 각각의 멤버 변수는 데이터베이스 테이블의 컬럼에 매핑된다.
  • 멤버 변수에 @Id 애너테이션을 추가하면 데이터베이스 테이블의 기본키(Primary key) 컬럼과 매핑된다.
@Getter
@Setter
public class Message {
    @Id
    private long messageId;
    private String message;
}

 

04. ‘schema.sql’ 파일을 읽어서 테이블을 생성할 수 있도록 설정 추가

애플리케이션 실행 시, 데이터베이스에 테이블을 자동으로 생성해 준다. ORM에서는 객체의 멤버 변수와 데이터베이스 테이블의 컬럼이 대부분 1대1로 매핑이 된다.

  sql:
    init:
      schema-locations: classpath*:db/h2/schema.sql // 테이블 생성 파일 경로

 

05. Repository 인터페이스 작성

  • DB의 CRUD 지원 인터페이스인 CrudRepository를 상속받는다.
  • 제네릭의 `Message`: 엔티티 클래스의 데이터를 테이블로 관리
  • 제네릭의 `Long`: 식별자 `@Id` 타입
import org.springframework.data.repository.CrudRepository;

public interface MessageRepository extends CrudRepository<Message, Long> {
}

 

06. Service에 Repository DI

Repository의 메서드를 사용해서 서비스 클래스에서 데이터베이스에 CRUD 작업을 수행한다.

@Service
public class MessageService {

    private MessageRepository messageRepository;

    public MessageService(MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
    }

    public Message createMessage(Message message) {
        return messageRepository.save(message); // CrudRepository의 save() 메서드
    }
}