스프링 DB에 접근하는 다양한 기술

inhalin·2022년 7월 13일
0

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고 정리한 내용입니다.

스프링 DB에 접근하는 다양한 기술

  1. 순수 Jdbc - 고대 방식
  2. JdbcTemplate - MyBatis와 비슷, 많이 쓰임, 쿼리는 직접 써줘야 함
  3. JPA - 객체 중심 설계 가능, 기본적인 쿼리는 JPA가 자동으로 만들어줌
  4. 스프링 데이터 JPA - 구현 클래스 없이 인터페이스 만으로 개발 가능

먼저, build.gradle에 h2 라이브러리를 추가하고

dependencies {
    runtimeOnly 'com.h2database:h2'
}

application.properties에서 디비 연결 설정을 해준다.

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

그리고 터미널에서 디비 서버를 켜주면 준비 완료.

스프링의 의존성 주입을 사용하면 다른 곳은 건드릴 필요 없이 설정파일인 SpringConfig.java만 변경해주면 된다.

1. 순수 Jdbc

이제는 거의 이 방식으로 쓰지 않기 때문에 가볍게 보면서 어떻게 변했는지 느낌만 알고 넘어가면 된다고 한다.

소스코드 복붙해서 테스트 코드 통과하는 것만 확인하고 넘어갔다.

2. JdbcTemplate

build.gradle에 jdbc 라이브러리를 추가한다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}

MemberRepository 인터페이스를 JdbcTemplate으로 구현해주고 SpringConfig.java파일의 memberRepository()에서 해당 레포지토리를 리턴해주면 된다.

@Bean
public MemberRepository memberRepository() {
	return JdbcTemplateMemberRepository(datasource);
}

3. JPA

  • SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다고 한다.
  • 쿼리 직접 쓸 필요 없이 JPA가 알아서 쿼리를 만들어준다.

build.gradle에 data-jpa 라이브러리를 추가하고 jdbc는 주석처리 해준다. data-jpa가 jdbc를 포함하고 있다.

dependencies {
//    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}

application.properties에서 jpa 설정을 해준다.

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

show-sql은 jpa가 날리는 sql을 볼 수 있다. 그리고 이미 만들어진 테이블을 사용할 거라서 hibernate.ddl-autonone으로 써줘서 jpa가 자동으로 테이블을 생성하고 하는 기능을 꺼준다.

❗️jpa 사용시에는 데이터를 변경하거나 저장할 때 항상 트랜잭션 안에서 실행되어야 한다. 서비스 계층에 @Transactional 어노테이션을 추가해준다.

@Transactional
public class MemberService {

JPA에서는 EntityManager를 주입해주고 memberRepository()에서 jpa 레포지토리를 리턴해준다.

4. 스프링 데이터 JPA

  • 인터페이스로 기본적인 CRUD와 페이징 처리 등을 제공한다.
  • interface 레포지토리를 만들고 JpaRepository<T, ID>MemberRepository를 extend 해준다.
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
  • JPQL 규칙에 따라서 쿼리문을 자동으로 만들어주기 때문에 메서드 이름 만으로 조회가 가능하다.
@Override
Optional<Member> findByName(String name);
// JPQL select m from Member m where m.name = :name

@Override
Optional<Member> findByNameAndId(String name, Long id);
// JPQL select m from Member m where m.name = :name and m.id = :id

스프링 데이터 JPA는 더 간단하다. MemberRepository를 주입받고 Bean으로 등록할 MemberService 에 주입받은 레포지토리를 넘겨주면 된다.

0개의 댓글