코드스테이츠_국비교육/[Section3]

46.03_[Spring MVC] JDBC 기반 데이터 액세스 계층_Spring Data JDBC 실사용_22.10.27

생각없이 해도 생각보다 좋다. 2022. 10. 27. 23:24

Spring Data JDBC 사용하기

>dependencies 추가

//의존 라이브러리 추가

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

//인메모리 데이터베이스 추가

runtimeOnly 'com.h2database:h2'

 

In-memory DB애플리케이션을 실행하는 동안만 잠시 사용하는 데이터베이스이다.
말 그대로 메모리 안에 데이터를 저장하기 때문에 애플리케이션을 종료하면 In-memory DB에 저장된 데이터는 휘발된다.
하지만 오히려 이 휘발되는 특징과 간단한 사용때문에 개인 PC에서 개발할 때, 테스트 용도로 많이 사용된다.
쓸데없는 데이터가 없고, 테스트가 끝나면 데이터를 깔끔히 비워 항상 초기 상태를 유지할 수 있다!

 

>application.yml 혹은 application.properties

: Spring Boot Initializer를 통해 생성한 프로젝트의 src/main/resources 디렉토리 경로에 존재하는 파일

: Spring에서 사용하는 다양한 설정 정보를 입력할 수 있음. application.yml이 조금 더 나은 방법을 제공함.(depth)

: url을 설정하지 않으면 매번 랜덤하게 생성됨.

//h2: console: enabled: true => h2 DB를 사용하겠다

//path: /h2 => http://localhost:8080 뒤에 /h2 경로를 설정하겠다.

//datasource: url: jdbc:h2:mem:test => url을 랜덤이 아닌 설정한 url로 고정되게 생성하겠다. 

//sql은 밑에서 설명

 

>애플리케이션 실행 및 로그 확인

Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
Finished Spring Data repository scanning in 10 ms. Found 0 JDBC repository interfaces.
H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:test '

//실행 로그에서 찾아 볼 수 있는 Database 관련 로그(요약)

>path를 통해 H2 DB 접속

http://localhost:8080/h2

>JDBC URL로 Connect

jdbc:h2:mem:test

>H2 콘솔 확인

 

>Sample 코드 구현

DTO
Controller
Mapper
Service
Entity
Respository

>Respository

: 인터페이스로 구현하며 CrudRespository를 상속받는다.
: CrudRespository <> 안에 들어갈 요소는 entity 참조형과 @Id 애너테이션이 붙은 id 변수의 자료형이다.

>CrudRespository<1,2>

: Spring 에서 지원해주는 인터페이스
: DB에 CRUD 작업을 할 수 있는 기능을 지녔다.
: 제네릭 1의 요소로 클래스를 제공한다. 해당 클래스 객체에 담긴 데이터를 DB에서 CRUD 작업을 할 수 있다.
: 제네릭 2의 요소로 @Id가 붙은 변수의 자료형을 제공한다.
: @NoRepositoryBean이 붙어있어서 Spring Bean 등록 없이 DI 개념을 사용할 수 있다. (추가 설명)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface NoRepositoryBean { ... }

 

>Entity 클래스

: Message 라는 이름으로 명명한 상황
: Message는 DB의 테이블 명이다.
: @Id 를 붙인 멤버 변수는 Entity의 고유 식별자 역할을 하며, DB의 PK(Primary Key)이다.

>application.yml 파일 sql 설명

-schema-lacations:
: schema.sql 의 경로를 지정해주면 Spring에서 자동으로 애플리케이션 실행 시, 데이터베이스에 테이블을 자동으로 생성해준다.

//sql: init: schema-location: classphat*:db/h2/schema.sql => 해당 경로에 있는 schema.sql을 읽고 h2 DB를 초기화 시키겠다.

/*schema.sql*/
CREATE TABLE IF NOT EXISTS MESSAGE (
    message_id bigint NOT NULL AUTO_INCREMENT,
    message varchar(100) NOT NULL,
    PRIMARY KEY (message_id)
);

//MESSAGE라는 테이블이 없다면 MESSAGE라는 테이블을 생성한다.
//message_id 라는 컬럼을 만든다. message_id는 bigint 타입이고 Null을 허용하지 않고 자동으로 증가한다.
//+AUTO_INCREMENT 때문에 따로 지정해서 값을 넣어주지 않아도 다른 값을 추가하면 자동으로 증가한다.
//message 라는 컬럼을 만든다. message 는 100자 내외 varchar타입이고 Null을 허용하지 않는다.
//message_id 를 PK(Primary Key)로 지정한다.
//+message_id는 Entity 클래스의 @Id가 붙은 messageId와 연동된다. 따라서 RequsetBody로 messageId도 받을 필요가 없다. AUTO_INCREMENT이기 때문이다.

 

Spring Data JDBC 적용 순서 간편 정리

1. build.gradle 에 의존 라이브러리 추가
2. application.yml 에 사용할 데이터베이스 설정(H2)
3. schema.sql 에 내용 작성 후 생성
4. application.yml 에 SQL 파일 사용 설정(schema.sql)
5. Entity 클래스 생성; DB의 테이블과 매핑할 클래스
6. Respository 인터페이스 생성
7. Service 클래스에서 Respository 인터페이스를 DI 하여 사용할 수 있게 설정
8.Service 클래스에서 설정된 Respository 인터페이스(CrudRespository)의 메서드를 이용해서 DB에 CRUD 작업 수행 코드 작성.