[스프링 입문] - 섹션6. 스프링 DB 접근 기술

jada·2023년 10월 10일
0

Spring 스터디

목록 보기
4/35

🚩 h2 데이터베이스 설치

h2 데이터베이스는 교육용으로 좋음, 용량이 작고 가벼움
설치 방법 )
1. http://h2database.com/html/main.html에서 다운로드 후 원하는 폴더 내에 압축 해제
2. h2 폴더 내의 bin 폴더로 이동 후 cmd에서 h2.bat 실행(윈도우 기준)
3. 데이터베이스 파일 생성 방법
jdbc:h2:~/test (최초 한번)
~/test.mv.db 파일 생성 확인
이후부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속 (안그러면 동시에 애플리케이션과 웹 콘솔 접근시 접속 안될 수 있음)

h2데이터베이스에서 테이블 생성

member 테이블 생성

drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity, #기본키 알아서 생성되도록 함
name varchar(255),
primary key (id)
);

🍀 프로젝트 폴더 최상단에 sql 파일 만들어 ddl관련 sql문 정리해두면 좋음 (git에서 같이 관리 가능, 테이블 파악 가능하기 때문)

순수 JDBC

20여년 전 개발하던 방식...
자바는 기본적으로 DB와 연동하기 위해 Jdbc드라이버가 꼭 필요

  • 환경 설정
    build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가

    implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'com.h2database:h2'
    //db와 연동할 때 데이터베이스가 제공하는 클라이언트가 꼭 필요함. 여기서는 h2database 클라이언트 사용

  • DB와 연동하기 위해 접속 정보 저장(경로만 넣어놓으면 SpringBoot가 알아서 설정해준다.) - 필요한 data source를 DB와 연결하는 작업.

    // resources/application.properties
    spring.datasource.url=jdbc:h2:tcp://localhost/~/test
    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.username=sa

  • DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체.
    스프링 부트는 데이터베이스 커넥션 정보를 바탕으로
    DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.

  • 스프링 프레임워크 쓸 때는 DataSourceUtils를 통해 커넥션 관리해야 함.
    return DataSourceUtils.getConnection(dataSource); 를 사용



  • MemberService는 MemberRepository를 의존
  • MemberRepository의 구현체는 MemoryMemberRepository와 JdbcMemberRepository

  • 개방-폐쇄 원칙(OCP - Open-Closed Principal)
    확장을 열어두고 수정 및 변경에는 닫혀있음
  • 스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현
    클래스를 변경할 수 있다.
  • 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다

spring bean(스프링에서 관리하는 객체)을 만들면 DI는 spring이 알아서 해줌. -> 인터페이스에서 구현체를 바꾸면서도 의존성 관련한 기존 코드를 수정하지 않아도 됨 ! 이것이 객체지향의 큰 장점임.

통합 테스트

(DB와 스프링 컨테이너까지 엮어서 실행하는 테스트)

  • 순수하게 java 코드만으로 최소한의 단위로 테스트하는 것은 단위테스트라고 함. (단위 테스트를 잘하는 것이 통합 테스트보다 더 중요)

    • @SpringBootTest
      스프링 컨테이너와 테스트를 함께 실행 (테스트를 스프링과 엮어서 할 수 있음)
    • @Transactional
      테스트 케이스에 이 에노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백(커밋 X)한다.
      따라서 테스트를 반복해서 실행해도 상관 없음.

스프링 JdbcTemplate

  • 설정은 순수 jdbc와 동일한 환경설정하면 됨.
  • 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해줌. 하지만 SQL은 직접 작성해야 한다.

JdbcTemplate의 장점

  • 설정이 편리함

    • spring-jdbc 라이브러리에 포함되어 있기 때문에 jdbc를 사용한다면 기본적으로 사용할 수 있다.

  • 반복 문제 해결

    • JdbcTemplate은 템플릿 콜백 패턴을 사용해서, JDBC를 직접 사용할 때 발생하는 대부분의 반복작업을 대신 처리해준다.

    • 개발자는 SQL을 작성하고, 전달할 파리미터를 정의하고, 응답 값을 매핑하기만 하면 된다.

    • 우리가 생각할 수 있는 대부분의 반복 작업을 대신 처리해준다.

      • 커넥션 획득
      • statement 를 준비하고 실행
      • 결과를 반복하도록 루프를 실행
      • 커넥션 종료, statement , resultset 종료
      • 트랜잭션 다루기 위한 커넥션 동기화
      • 예외 발생시 스프링 예외 변환기 실행 )

JdbcTemplate의 단점

  • 동적 쿼리문 생성이 어려움
    -> 단점 해결을 위해 동적 쿼리문의 수월한 작성을 위해 다른 DB 접근 기술을 사용할 수 있다.
    예를 들어 MyBatis와 JPA+QueryDSL 을 사용할 수 있다.

JPA (Java Persistence Api)

JPA는 ORM기술 (객체와 관계형 DB 매핑해주는 기술)
-> @Entity 에노테이션 사용해 매핑.

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.

  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.

  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.
  • JPA는 entityManager를 기반으로 모든 것이 작동함. 엔티티 매니저는 내부적으로 data source를 들고있어서 DB와 통신 처리 함.
  • JPQL : entity를 대상으로 날리는 query.
    예 ) select m from Member m <- Member 객체 자체를 select함.
  • 스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을
    커밋한다. 만약 런타임 예외가 발생하면 롤백한다.
  • JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. -> Service 계층에 @Transactional 사용해야 함.

Spring Data JPA

  • Spring Data JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스만으로 개발할 수 있다. 또한 반복 개발해온 기본 CRUD기능도 Spring Data JPA가 모두 제공한다.

스프링 데이터 JPA 제공 클래스

🍳 스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
  • 페이징 기능 자동 제공

    참고: 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는
    라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적
    쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리
    사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.

profile
꾸준히 발전하는 개발자가 되자 !

0개의 댓글