한주 한주가 정말 빠르게 지나간다.
생각보다 공부를 많이한 것 같지만 복습하면서 뒤돌아보면
그렇게 많은 양을 공부한 것도 아니다.

얼른 지식을 익히고 프로젝트를 해보고 싶다 ㅠㅠ
그날을 위해서 열심히 지식 축척을 !!















Spring JDBC 기반 액세스 계층

JDBC

JDBC는 Java Database Connectivity 약자로
Java 레벨에서 데이터를 데이터베이스에 저장 및 업데이트 하거나
데이터베이스에 저장된 데이터를 Java 레벨에서 사용할 수 있도록
Java에서 제공해주는 표준 사양 이다.

JDBC의 API를 우리가 직접 사용할 일은 없다고한다.
후에 Spring Data JDBC,JPA 같은 기술로 로직을 구현할 것이고
위와 같은 기술이 내부적으로는 JDBC를 이용하기 때문에
동작 흐름정도 파악하려고 이번 챕터를 배운다고 생각하면 될 것 같다.

JDBC 동작 흐름















JDBC API를 사용하기 위해서는
JDBC 드라이브를 먼저 로딩한 후에 데이터베이스와 연결한다.

드라이버는 그림과 같이 데이터베이스와 통신을 담당하는 인터페이스다.
여러 데이터베이스 회사에 맞게 드라이버를 구현해서 제공해준다.


Data Access 기술 유형

Spring에서 사용할 수 있는 대표적인 액세스 기술에는
mybatis, Spring JDBC, Spring Data JDBC, JPA, Spring Data JPA 등이 있다고한다.
어디선가 한번씩 들어본적있는 이름들이다..

과거에는 SQL 쿼리문을 직접 포함하고 있는 방식을 많이 사용했다고한다.
하지만 현재 Java 진영에서는 SQL중심이 아니라 객체중심의 기술
지속적으로 이전하고 있는 추세라고한다. 즉, SQL중심의 학습보다는 현재
많이 사용하고 있는 추세의 객체중심의 기술을 학습하는 방향이 좋을 것 같다.

객체중심 기술?
SQL 쿼리문을 직접 다루기보단, 객체를 SQL 쿼리문으로 변환해주고
접근하는 방법을 말한다고 한다. 이러한 데이터 액세스 기술을
기술을 ORM(Object Relational Mapping)라고 한다.
이후에 우리가 배울 JPA가 Java에서 대표적인 ORM 기술이라고한다.

Spring Data JDBC

JPA의 기술적인 난이도에 비해 심플하다.
우선 Spring data JDBC를 이용하기 위해서는

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

이전에 우리가 의존 라이브러리 추가했던 것 처럼
build.gradle 의존 라이브러리 코드를 추가해줘야 된다.


데이터 베이스는 인메모리를 이용하는 DB H2를 사용하여 실습해보자

runtimeOnly 'com.h2database:h2'

동일하게 build.gradle에 h2를 사용가능하게
의존성 라이브러리를 추가해주자

스프링 부트를 실행시키면 콘솔에 아래와 같이 노출되는 것을 볼 수 있는데

H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:48abebe3-424c-4a03-a74b-8d1ff2ebc750'

이말은, /h2-consle 주소로 접속후 연결하기 위한
JDBC URL: jdbc:h2:mem:48abebe3-424c-4a03-a74b-8d1ff2ebc750 를
입력하라는 의미이다.






















위와 같이 입력하면 H2 DB에 접속이 가능하다.
여기서 JDBC URL은 부트실행시킬시 랜덤으로 변경되므로 간편하게 이용하기위해선

spring:
  h2:
    console:
      enabled: true
      path: /h2 (1) #Context path 변경
  datasource:
    url: jdbc:h2:mem:test #(2) #JDBC URL 변경

resources -> application.yml에서 위와 같이 설정을하면
주소를 h2, JDBC URL을 간단하게 입력해
접속이 가능하므로 참고하자!
(application.properties를 application.yml로 이름을 바꾸면 사용가능)


















접속에 성공할 경우 위와 같은 화면으로 들어와진다.
(왼쪽의 테이블은 현재 만들어둔 것이라 생성되어 있지만 처음엔 없음)

여기까지가 build.gradle에 사용할 라이브러리들을 의존주입해주었고
application.yml 파일에 사용할 DB를 연동했다.
이제 우리가 Spring Data JDBC 사용하기 위해선 다음과 같은 순서를 진행해야한다.


1). .sql 파일에 필요한 Table Script를 작성한다.

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

resources 경로에서 -> 새로 만들기 -> 파일 -> 이름.sql
로 입력하면 .sql 파일이 생길 것이다.

그리고 파일 내용에는 테이블을 생성하고 안에 BABO_ID라는
Primary key를 만들고 MESSAGE라는 column도 생성하는 쿼리문을
작성한 파일을 넣어두면 된다.

2). 작성한 sql파일을 읽어서 테이블을 생성할 수 있도록 application.yml파일에 초기화 설정을 추가한다.

spring:
  h2:
    console:
      enabled: true
      path: /h2     
  datasource:
    url: jdbc:h2:mem:test    
  sql:
    init:
      schema-locations: classpath*:schema.sql # 경로 추가

이제 우리가 만든 sql파일의 경로를 설정해주는 방법인데.
파일이름을 schema.sql이라고 지정했고 해당 파일을
위의 코드 처럼 경로를 지정했다.
예를들어 패키지 구조를 만든다면 루트 디렉토리 위치를 적어 주면된다.
ex) db라는 폴더안에 파일있을 경우 = classpath*:db/schema.sql

이렇게 위와 같이 두 가지 준비를 해주고
애플리케이션 실행시, h2 DB에 우리가 작성한
sql 구문대로 테이블이 자동으로 생성이된다.





이렇게 H2 DB에 들어가서 확인해보면 우리가 만든
테이블의 이름대로 Column들이 생성되는 것을 볼 수 있다.

여기서 이제 우리는 레코드값(행값)을 여태까지 배운 방법을 통해서
DB에 저장을 해줄 수 있다.

맨처음에 JDBC는 자바레벨에서 데이터베이스에 데이터를 업데이트하거나
반대로 받을 수 있다고 맨처음에 얘기를 했습니다.

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

맨처음에 의존라이브러리를 우리가 추가했었는데
이 라이브러리 안에 기능중 CrudRepository라는 클래스로
데이터베이스에 접근이 가능하다.

import org.springframework.data.repository.CrudRepository;

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

인터페이스로 Repository를 만들고 CrudRepository를 상속해준 다음에
<클래스, PrimaryKey 타입>을 입력해주면 우리는 다형성에 의해
CrudRepository에 있는 기능들을 사용할 수 있게 되어진다.

(CrudRepository를 사용하기위해서 위에 import가 필요하며
import가 되려면 의존라이브러리를 추가해야한다 !!)

위에 코드로 이제 우리는 infterface MessageRepository를 사용해
Service 클래스에서 Overriding하여 사용하면
데이터가 H2 DB에 저장이되는 아주 신비로운 일을 겪을 수 있다.

@Service
public class MessageService {
    private final MessageRepository messageRepository;

    public MessageService(MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
    }
    public Babo createMessage(Babo message){
        return messageRepository.save(message);
    }
}

스프링 컨테이너를 통한 의존성 주입 후
해당 객체의 .save(); 메서드를 구현하면
Entity의 맞는 데이터가 들어왔을 때, 데이터가 맵핑되어 자동으로
DB에 저장되게 되어진다.


이렇게 오늘은 JDBC에 내용을 알아 보았고
그 중에서도 Spring data JDBC를 사용해보았다.
앞으로도 많은 DB접근 기술을 접할 텐데
설렘반 걱정반인 느낌이다..

최대한 많은 기술을 배울수 있도록 구글링해보면서
공부해볼 생각이다

오늘 공부는 여기서 끝!!


오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 불고기, 라면, 밥