[Spring] JDBC

zini9188·2023년 2월 22일
0

Spring

목록 보기
20/33

JDBC란?

Java Database Connectivity의 약자로 Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장, 업데이트하거나 데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준 사양이다.

JDBC의 동작 흐름

Java 애플리케이션에서 JDBC API를 이용해 적절한 데이터베이스 드라이버를 로딩 한 후, 데이터베이스와 인터랙션 한다.

JDBC 드라이버

데이터베이스와의 통신을 담당하는 인터페이스로 Orcale이나 MS SQL, MySQL 같은 다양한 벤더에서는 해당 벤더에 맞는 JDBC 드라이버를 구현해 제공한다. 사용자는 해당 드라이버 구현체를 이용해 특정 벤더의 데이터베이스에 액세스할 수 있다.

JDBC API 사용 흐름

Connection Pool

데이터베이스와의 연결을 위한 Connection 객체를 매번 생성하는 것은 비용이 매우 많이 들게 된다. 이러한 문제를 해결하기 위해서 애플리케이션 로딩 시점에 Connection 객체를 미리 생성해두고 데이터베이스와의 연결이 필요할 경우에 미리 만들어 둔 Connection 객체를 사용하는데, 이를 관리해주는 역할을 하는 것이 Connection Pool이다.

데이터 액세스 기술 유형

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

SQL 중심 기술

mybatis

SQL Mapper를 이용하여 쿼리문을 직접 작성한다. 작성된 쿼리문을 기반으로 데이터베이스의 데이터를 조회하여 Java 객체로 변환해준다.

<select id="findMember" resultType="Member">
  SELECT * FROM MEMBER WHERE member_id = #{memberId}
</select>

Spring JDBC

SQL문을 Java 코드에 작성한다.

Member member = this.jdbcTemplate.queryForObject(
											"select * from member where member_id=?", 1, Member.class);

객체 중심 기술 (ORM)

데이터를 SQL 쿼리문 위주로 생각하지 않고 모든 데이터를 객체 관점에서 바라보는 기술이다.

데이터베이스에 접근하기 위해서 SQL 쿼리문을 작성하기 보다는 자바 객체를 이용하여 애플리케이션 내부에서 자바 객체를 SQL 쿼리문으로 자동 변환하여 테이블에 접근한다.

ORM의 대표적인 기술로는 JPA가 있다.

Spring Data JDBC 적용하기

Spring Data JDBC는 ORM 기술을 사용하지만 JPA의 기술적 복잡도를 낮춘 기술로 상대적으로 학습하기에 쉽다.

인메모리 H2

메모리 안에 데이터를 저장하는 데이터베이스로 애플리케이션을 재실행하면 모든 데이터가 지워지게 된다. 기본적으로 개발 환경에서는 데이터베이스를 처음부터 사용하기 보다는 인메모리 DB인 H2를 사용하는 것이 좋다.

그 이유로는 테스트를 진행하는 과정에서 필요한 데이터 이외에 데이터는 테이블에 존재하지 않는 것이 정확도 측면에서 유리하기 때문이다.

의존 라이브러리

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

application.yml 설정

기본적으로 제공하는 파일은 application.properties 파일이다.

yml 파일을 사용하면 아래와 같은 장점이 있다.

  • 애플리케이션의 설정 정보를 depth 별로 입력하여 계층별로 구분할 수 있으며 가독성이 좋아진다.

  • 소스의 중복을 제거할 수 있다.

그러나 yml 파일은 들여쓰기와 띄어쓰기에 민감하므로 주의하여 작성하여야 한다.

spring:
  h2:
    console:
      enabled: true
      path: /h2
  datasource: # h2 url
    url: jdbc:h2:mem:test    
  sql: 
    init: # 테이블을 생성하기 위한 sql 파일의 위치 (1)
      schema-locations: classpath*:db/h2/Board.sql 

해당 설정을 하고 애플리케이션 실행 후 http://localhost:8080/h2 를 접속하면 아래와 같은 화면을 확인할 수 있으며 설정한 JDBC url을 입력하고 connect를 누르면 h2 데이터베이스를 확인할 수 있다.

h2 데이터베이스를 사용하기 위해서는 sql 파일을 작성하여 엔티티 클래스와 매핑되는 데이터베이스 테이블을 생성해줘야 한다. (1)번 부분의 경로는 classpath*: + sql파일의 위치이다.

엔티티 클래스

작성한 데이터베이스의 테이블과 매핑되는 엔티티 클래스를 작성하여야 한다.

다음과 같은 테이블이 있다면

CREATE TABLE IF NOT EXISTS BOARD (
    BOARD_ID bigint NOT NULL AUTO_INCREMENT,
    TITLE varchar(100) NOT NULL,
    CONTENT varchar(100) NOT NULL,
    USERNAME varchar(100) NOT NULL,
    PRIMARY KEY (BOARD_ID)
);

아래와 같이 테이블과 매핑되는 필드를 가지는 엔티티 클래스를 작성하여야 한다.

@Getter
@Setter
@Entity
public class Board {
    @Id
    @GeneratedValue
    private Long boardId;
    private String title;
    private String content;
    private String username;
}

@Id

해당 엔티티 클래스의 필드가 기본키 임을 설정하는 어노테이션이다.

@Entity

자동으로 테이블의 이름과 매핑된다. 만약 클래스 명이 테이블과 달라 바꿔야 하는 경우 @Table(name = "테이블명")을 추가해 변경할 수 있다.

@GeneratedValue

기본 키 생성 전략을 의미하며 기본 값은 AUTO이다.

설정에 따라 다른 속성을 가지게 된다.

// 데이터 베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용하여 기본키를 생성한다.
@GeneratedValue(strategy = GenerationType.TABLE)
// 데이터베이스의 특별한 오브젝트 시퀀스를 사용하여 기본키를 생성한다.
@GeneratedValue(strategy = GenerationType.SEQUENCE)
// 기본키 생성을 데이터베이스에 위임하며, MySQL의 경우 AUTO_INCREMENT를 사용하여 기본키를 생성한다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 각 데이터베이스에 따라 기본키를 자동으로 생성한다.
@GeneratedValue(strategy = GenerationType.AUTO)

Repository interface

작성한 엔티티 클래스를 기반으로 데이터베이스의 작업을 처리하는 Repository interface를 작성하여 서비스 클래스에서 사용한다.

스프링에서 지원하는 CrudRepository를 상속받아 별도의 CRUD 메서드를 구현하지 않아도 된다.

public interface BoardRepository extends CrudRepository<Board, Long> {
}

@Service
public class BoardService {
    private final BoardRepository boardRepository;

    public BoardService(BoardRepository boardRepository) {
        this.boardRepository = boardRepository;
    }
}
profile
백엔드를 지망하는 개발자

0개의 댓글