스프링 DB 접근 기술

이민성·2022년 8월 25일
1

spring 입문

목록 보기
4/5

H2 데이터베이스 설치

H2 데이터베이스 설치 링크

  1. H2.bat 파일 실행 초기화면

*연결이 안된다면
1. C:\Users\OMG(계정명) 하위에 텍스트 파일 생성
2. 텍스트 파일을 열고(내용x) 다른 이름으로 저장
3. 파일 이름을 test2.mv.db, 파일형식을 모든 파일로 설정
4. h2.bat 파일을 실행 후 아래와 같이 JDBC URL입력

  1. 연결 후 테이블 생성
create table member
( 
 id bigint generated by default as identity,	
 //id 값을 세팅하지 않으면DB가 자동으로 id 값을 채워줌 
 name varchar(255),
 primary key (id)
);
  1. insert 후 결과 확인


순수 JDBC

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API

  1. build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가
  • implementation 'org.springframework.boot:spring-boot-starter-jdbc'
  • runtimeOnly 'com.h2database:h2'
  1. 스프링 부트 데이터베이스 연결 설정 추가
  • spring.datasource.url=jdbc:h2:tcp://localhost/~/test
  • spring.datasource.driver-class-name=org.h2.Driver
  • spring.datasource.username=sa
  1. JdbcMemberRepository 생성
    JdbcMemberRepository
  1. SpringConfig 수정
    SpringConfig
private DataSource dataSource;

    @Autowired
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource; 
    }

스프링 부트가 appication.properties 설정해논 파일을 보고 데이터베이스와 연결할 수 있는 dataSource를 만들어줌

  • JDBC 리포지토리 클래스(구현체)를 따로 만들고 인터페이스를 확장시키기만 해도 DB에 데이터를 연결할 수 있음
  • 스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있음
    오직 스프링이 제공하는 Configuration만 수정
    --> 객체 지향의 다형성 활용

스프링 통합 테스트

스프링 컨테이너와 DB까지 연결한 통합 테스트
MemberServiceIntegrationTest

  1. test->service->MemberServiceIntegrationTest 생성
  1. @SpringBootTest ,@Transactional 어노테이션 달기

@Transactional
테스트는 반복할 수 있어야한다.
데이터베이스는 기본적으로 트랜잭션 개념이 있는데 DB에 데이터를 insert하고 commit을 해줘야 DB에 반영이 된다.

  • @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다
  • @Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

    트랜잭션 실행 -> DB에 데이터 insert -> 테스트 -> rollback
    기존처럼 지우는 코드를 넣지 않아도 다음 테스트를 반복해서 실행할 수 있음

*트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.


스프링 JdbcTemplate

  • 순수 Jdbc와 동일한 환경설정
  • 스프링 JdbcTemplate같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해줌 SQL은 직접 작성해야함
    JdbcTemplateMemberRepository -> 깃연결 시켜야함
  1. 순수 Jdbc와 동일한 환경설정
  1. JdbcMemberRepository 생성
    JdbcMemberRepository
  1. SpringConfig 수정
    SpringConfig

JPA

JPA(Java Persistence API)

  • 현재 자바 진영의 ORM(Object Relational Mapping=객체와 데베 릴레이션 테이블을 맵핑) 기술 표준으로, 인터페이스이다.
    • 즉, 실제로 동작하는 것이 아님
    • JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate

ORM 맵핑을 어떻게 하느냐?
멤버클래스 위에 @Entity 추가 -> JPA가 관리하는 엔티티가 됨

DB에 값을 넣으면 DB가 ID를 자동생성해주는 것을 아이덴티티라고 함
Member
뭔말인지 제대로 이해가 안감

@GeneratedValue(strategy = GenerationType.IDENTITY)

@어노테이션을 사용함으로써 DB랑 맵핑을 함(Insert,delete,select문 만들기가 가능해짐!)

  • JpaMemberRepository 생성
    JPA는 EntityManager로 모든 게 동작하는데 data-jpa라이브러리를 설정해놈으로써 스프링부트가 자동으로 EntityManager를 생성해주는데 우리는 그것을 인젝션 받으면 됨
    간단하게 JPA 쓰려면 EntityManager를 주입 받아야함
    JpaMemberRepository
    *JPA를 쓸 때 항상 @Transactional이 있어야함
  • MemberServiceIntegrationTest 통합 테스트 실행
    -> DB에 spring값이 잘 들어감

스프링 데이터 JPA

스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술
리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있음

SpringDataJpaMemberRepository 인터페이스 생성(구현체는 따로 X)

SpringConfig

원리

  1. 스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자동
  2. springdata가 만들어논 스프링빈에 등록된 구현체를 인젝션해서 받음
  3. JpaRepository는 findById, findAll, save 같은 기본 CRUD, 메소드들을 제공해줌(공통된 것들은 존재)
    *name 같은 것들은 비즈니스가 다 다르기 때문에 불가능
    ex) 주문 할 때 주문번호로 조회한다던가 상품이름으로 조회한다던가.
  4. findByName해줌
    -> JPQL select m from Member m where m.name = ? (SQL로 번역돼서 실행됨)
  • 스프링 데이터 JPA 제공 클래스

간단정리

  • H2 데이터베이스 설치
  • 순수 Jdbc - 코드(쿼리)가 매우 김
  • 스프링 통합 테스트 - @Transactional(지우는 코드 필요x)
  • 스프링 JdbcTemplate - 반복되는 코드가 줄지만, SQL은 직접 작성
  • JPA - 쿼리같은 것들을 작성할 필요X (select할땐 JPQL 작성)
  • 스프링 데이터 JPA - 구현 클래스를 작성할 필요X, 인터페이스만으로 개발가능

0개의 댓글