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 드라이버 → 데이터베이스
- JDBC 드라이버 로딩
- DB와 통신을 담당하는 인터페이스
- 다양한 벤더에서 이를 제공하면 드라이버의 구현체를 이용하여 특정 벤더의 DB에 엑세스
- DriverManager 클래스를 통해 로딩 (인터페이스)
- Connection 객체 생성: DriverManager를 통해 DB와 연결되는 세션
- Statement 객체 생성: 작성한 SQL 쿼리문을 실행하기 위한 객체로, 정적 SQL를 입력으로 가짐
- Query 실행
- ResultSet 객체로부터 데이터 조회: 실행된 쿼리문에 대한 결과 데이터 셋
- 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() 메서드
}
}