본문 바로가기
인프런 🍀

[스프링 입문] 스프링 DB 접근 기술

by 의정부핵꿀밤 2022. 9. 11.
728x90

H2 데이터베이스

  • 개발이나 테스트 용도로 가볍고 편리한 DB로, 교육용으로도 많이 사용된다
  • 웹 화면을 제공한다

 

 

h2를 설치하고 위와 같이 db를 설정한다

이후 부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속하면 된다!

 

접속한 후 위의 sql문을 통해서 MEMBER 테이블을 생성한다

 


JDBC 리포지토리 구현

JDBC API로 직접 코딩하는 것은 굉장히 오래 전 이야기이다

이 부분은 그냥 예전엔 이랬구나~ 하고 넘어가면 된다고 한다!

 

  • 객체지향을 잘 사용하면 개방-폐쇄 원칙을 잘 지킬 수 있다
  • 개방-폐쇄 원칙(OCP, Open-Closed Principle)
    • 확장에는 열려있고, 수정/변경에는 닫혀있다
  • 스프링의 DI(Dependencies Injection)을 사용하면 기존의 코드는 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다

 


@SpringBootTest

  • 스프링 컨테이너와 테스트를 함께 실행한다

 

@Transactional

  • 테스트 케이스에 이 어노테이션이 있으면 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다
  • 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다

 


스프링 JdbcTemplate

  • 순수 Jdbc와 동일한 환경설정을 하면 된다
  • 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다
  • 그러나 SQL문은 직접 작성해야 한다

JPA

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다

 

 

1) build.gradle에 JPA와 h2 데이터베이스 관련 라이브러리를 추가한다

  • spring-boot-starter-data-jpa 는 내부에 jdbc 관련 라이브러리를 포함한다. 따라서 jdbc는 제거해도 된다

 

 

2) 스프링부트에 JPA 설정도 추가한다

  • show-sql : JPA가 생성하는 SQL을 출력한다
  • ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데, none을 사용하면 해당 기능을 끈다
    • create 를 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성해준다
🚨주의
스프링부트 2.4부터는 spring.datasource.username=sa 를 꼭 추가해주어야 한다. 그렇지 않으면 오류가 발생한다.

 

 

3) JPA 리포지토리 생성

  • JPA는 EntityManager를 기반으로 동작한다
  • build.gradle에서 spring-data-jpa를 설정하면, 스프링이 알아서 EntityManager까지 생성해주고, properties를 기반으로 데이터베이스와 EntityManager를 연결까지 시켜준다
  • 따라서 우리는 리포지토리에서 EntityManager의 의존성만 주입받으면 된다
  • EntityManager는 내부적으로 의존성이나 연결까지 갖고 있어서 DB와 알아서 통신을 해준다
  • 즉, JPA를 사용하려면 EntityManager를 주입받아야 한다!

 

 

4) 서비스 계층에 트랜잭션 추가

  • org.springframework.transaction.annotation.Transactional 를 사용하면 된다 (@Transactional)
  • 스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋하고, 만약 런타임 예외가 발생하면 롤백한다
  • JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다

 


스프링 데이터 JPA

  • 스프링 부트와 JPA만 사용해도 개발 생산성이 크게 증가하고 개발해야 할 코드도 확연히 줄어든다
  • 여기에 스프링 데이터 JPA를 사용하여 기존의 한계를 넘어 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다
  • 또한 반복적으로 개발한 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다
  • 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA는 환상적인 프레임워크를 더하면 개발이 쉬워진다
  • 따라서 개발자는 핵심 비즈니스 로직을 개발하는데 집중할 수 있게된다

 

🚨 주의
- 스프링 데이터 JPA는JPA를 편리하게 사용하도록 도와주는 기술이다
- 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 한다

 

 

 

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

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

 

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

댓글