SEB_BE 46일차 - JDBC 기반 데이터 액세스 계층

subimm_·2022년 10월 27일
0

코드스테이츠

목록 보기
46/83

💡 오늘의 학습목표

  • JDBC
  • Spring Data JDBC

📔 JDBC

  • JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나, 반대로 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준사양 (또는 명세) 이다.
  • JDBC API를 사용해서 다양한 벤더 (Oracle, MY SQL, MySQL 등) 의 데이터베이스와 연동 가능

📖 JDBC의 동작 흐름

  • JDBC API를 사용하기 위해서 JDBC 드라이버를 먼저 로딩한 후에 데이터베이스와 연결
    • JDBC 드라이버 : 데이터베이스와의 통신을 담당하는 인터페이스

📖 JDBC API 사용 흐름

  1. JDBC 드라이버 로딩 : DriverManager 라는 클래스를 통해서 로딩
  2. Connection 객페 생성 : DriverManager를 통해 데이터베이스와 연결되는 세션인 객체 생성
  3. Statement 객체 생성 : 작성된 SQL쿼리문을 실행하기 위한 객체
  4. Query 실행 : 생성된 Statement 객체를 이용해서 입력한 SQL 쿼리 실행
  5. ResultSet 객체로부터 데이터 조회 : 실행된 SQL문에 대한 결과 데이터 셋
  6. ResultSet 객체 Close, Statement 객체 Close, Connection 객체 Close
    사용 이후에 순서의 역순으로 차례로 Close

📖 Connection Pool

  • 애플리케이션 로딩 시점에 커넥션 객체를 미리 생성, 연결이 필요할 경우 미리 만들어 둔 커넥션 객체 사용
  • 데이터베이스 Connection을 미리 만들어서 보관하고 필요 시 제공해주는 역할을 하는 Connection 관리자

📔 Spring Data JDBC

📖 Spring Data JDBC 를 사용하기 위한 사전 준비
✔ 의존 라이브러리 추가

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

데이터베이스에서 데이터를 관리할 것이므로 개발 환경에서 손쉽게 사용할 수 있는 인메모리DB인 H2사용

  • 인메모리 DB ?
    메모리 안에 데이터를 저장하는 데이터베이스
    애플리케이션이 실행되는 동안에만 데이터를 저장하고 있음.
    • 로컬 테스트 환경에서는 인메모리 DB사용 권장

✔ application.yml 파일에 H2 Browser 활성화 설정 추가
src/main/resources 디렉토리 하단에 application.properties 파일 확장자를 yml로 변경
(shift+f6)

  • H2관련 설정 추가 (탭 키 사용으로 depth 설정하는 것이 일관성 유지에 좋다)
spring:
  h2:
    console:
      enabled: true

✔ H2 DB 정상 동작 유무 확인


✔ H2 DB 디폴트 설정 추가

  • (1) 콘솔의 접속 URL 패스 변경
  • (2) JDBC URL 설정

📖 Hello World 샘플 코드 구현

  • 클라이언트가 Hello, World 문자열 데이터를 Requset Body로 전송한 후 Spring Data JDBC를 이용해서 문자열을 H2 데이터베이스에 저장 실습
  • Hello World 샘플 패키지에서 구현해야하는 클래스
    • MessageDto(DTO클래스)
    • MessageController
    • MessageMapper
    • MessageService
    • Message(엔티티 클래스)
    • MessageRepository
  • Dto 클래스 생성
  • Controller 클래스 생성
  • Mapper 클래스 생성
  • MessageRepository 인터페이스 생성
    • 데이터 액세스 계층에서 데이터베이스와의 연동 담당
    • CrudRepository 인터페이스 상속 제너릭 타입이 <Message, Long> 으로 선언
      • 데이터베이스에 CRUD 작업을 진행하기 위해 Spring에서 지원해주는 인터페이스
      • Long은 Message엔티티클래스의 멤버 변수 중에 식별자를 의미하는 @Id 애너테이션이 붙은 멤버 변수의 데이터 타입
  • MessageService 클래스 생성
    • (1) 과 같이 MessageRepository 인터페이스는 MessageService 클래스에서 DI를 통해 주입 받음. (2)에서 Message 엔티티 클래스에 포함된 데이터를 데이터베이스에 저장하는데 사용
    • save() 메서드는 CrudRepository에 정의되어 있음.
    • (2) 에서는 데이터베이스에 데이터를 저장하고 난 후 , 데이터베이스에 저장된 데이터를 다시 리턴해준다.
  • Message 엔티티 클래스
    • (1) 의 Message 클래스 명 = 데이터베이스 테이블 명
    • (2) 애너테이션을 추가한 멤버 변수는 해당 엔티티의 고유 식별자 역할 (Primary key)

H2 DB에 MESSAGE 테이블 생성

  • 'schema' 라는 파일명으로 .sql 파일의 경로를 지정해주면 이 schema.sql 파일에 있는 스크립트를 읽어서 애플리케이션 실행 시, 데이터베이스에 테이블을 자동으로 생성해준다.
    • 인메모리DB를 사용할 경우, 애플리케이션이 실행될 때마다 schema.sql 파일의 스크립트가 매번 실행
      schema.sql에 정의된 MESSAGE 테이블 생성 스크립트
    • ORM에서는 객체의 멤버 변수와 데이터베이스 테이블의 컬럼이 대부분 1대1로 매핑
    • MESSAGE 테이블의 식별자인 'message_id' 컬럼에 AUTO_INCREMENT 설정이 되어 있어서 컬럼에 값을 입력하지 않아도 데이터가 저장이 될 때마다 자동으로 포함이 된다.

콘솔 확인

📖 Spring Data JDBC 적용 순서

  1. build.gradle에 사용할 데이터베이스를 위한 의존 라이브러리 추가
  2. application.yml 파일에 사용할 데이터베이스에 대한 설정
  3. schema.sql 파일에 필요한 테이블 스크립트 작성
  4. application.yml 파일에서 schema.sql 파일을 읽어서 데이블을 생성할 수 있도록 초기화 설정 추가
  5. 데이터베이스의 테이블과 매핑할 엔티티 클래스 작성
  6. 엔티티 클래스를 기반으로 데이터베이스의 작업을 처리할 Repository 인터페이스를 작성
  7. 작성된 Repository 인터페이스를 서비스 클래스에서 사용할 수 있도록 DI 하기
  8. DI된 Repository의 메서드를 사용해서 서비스 클래스에서 데이터베이스에 CRUD 작업 수행
profile
코린이의 공부 일지

0개의 댓글