1. 순수 Jdbc

데이터 베이스 설정

  • 데이터 베이스: h2 db

  • 테이블 생성

라이브러리 추가, 설정 추가

  • build.gradle: Jdbc, h2 데이터베이스 관련 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
//java는 db랑 연동하려면 jdbc driver가 있어야함
runtimeOnly 'com.h2database:h2'
//db와 연동할 때 db가 제공하는 client가 필요
  • resources/application.properties: 스프링 부트 데이터베이스 연결 설정 추가
resources/application.properties
spring.datasource.url = jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver //h2 driver
//db에 연결하려면 접속 정보 필요 -> spring boot가 해줌 -> 경로만 넣으면 됨

Jdbc 리포지토리 구현



스프링 설정 변경

  • SpringConfig
@Configuration
public class SpringConfig {
    private final DataSource dataSource;
 
 	@Autowired
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }
 
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
       // return new MemoryMemberRepository();
       return new JdbcMemberRepository(dataSource);
   }
}
  • DataSource: 데이터베이스 커넥션을 획득할 때 사용하는 객체
    • 스프링부트는 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다.

  • SpringConfig 빈 등록
    • 어떤 코드도 건드리지 않고, 인터페이스 구현체만 생성하여 대체함

  • 스프링 설정 이미지
    • OCP(개방-폐쇄 원칙)
      • 확장에는 열려있고, 수정, 변경에는 닫혀있다.
    • 스프링 DI(Dependency Injection)을 사용하면 기존 코드(memberService)를 전혀 손대지 않고, 설정(SpringConfig)만으로 구현 클래스(Jdbc repository)를 변경할 수 있다.


2. 스프링 통합 테스트

회원 서비스 스프링 통합 테스트

	@SpringBootTest
	@Transactional
	class MemberServiceIntegrationTest {
    	//생략
	}
  • @SpringBootTest
    • 스프링 컨테이너와 테스트를 함께 실행

  • @Transactional (in test)
    • 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다.
      • DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

  • 참고
    • 단위테스트: 최소한으로 순수한 자바 코드로 작성된 테스트 (ex. 이전까지 진행한 테스트들)
    • 통합테스트: 위와 같이 스프링 컨테이너와 같이 함께 하는 테스트
    • 단위 테스트가 통합 테스트보다 좋은 테스트일 확률이 높다.


3. 스프링 Jdbc Template

JdbcTemplate 리포지토리 구현

  • 코드

  • 순수 Jdbc에서 반복적인 코드들을 대부분 제거해준다.(sql은 여전히 직접 작성해야함)

스프링 설정 변경

  • SpringConfig
@Bean
 public MemberRepository memberRepository() {
// return new MemoryMemberRepository();
// return new JdbcMemberRepository(dataSource);
     return new JdbcTemplateMemberRepository(dataSource);
 }

4. JPA

JPA란?

  • JPA?
    • 자바의 ORM기술 표준
    • JPA는 인터페이스, 구현체는 Hibernate(다른 구현체들 존재)

  • ORM?
    • Object-Relational Mapping
    • 객체와 관계형 DB를 맵핑
      • by annotation, ex) @Entity, @Id, @GeneratedValue

  • JPA 동작 과정
    • JPA는 애플리케이션과 Jdbc사이에서 동작
      • Jdbc를 이용하여 SQL을 통해 DB와 통신


라이브러리 추가, 설정 추가

  • build.gralde: jpa라이브러리 추가(jdbc관련 라이브러리 포함함)
//implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa함
  • resources/application.properties: 스프링 부트에 JPA설정 추가
    • show-sql: JPA가 생성하는 SQL 출력 여부
    • ddl-auto: JPA가 제공하는 테이블 자동 생성 기능 사용 여부
spring.jpa.show-sql=true 
spring.jpa.hibernate.ddl-auto=none



JPA Entity 맵핑

   @Entity
   public class Member {
  
       @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long id;
       private String name;
  }
  • @Entity
    • 클래스Member와 DB에 생성한 table이 맵핑된다.
    • @Id
      • 해당 column이 식별키라는 것을 의미한다.
      • @GeneratedValue와 함께 식별키를 어떤 strategy로 생성하는지 명시한다.
        • strategy=GenerationType.IDENTITY: 생성 방식을 DB에게 넘긴다.



JPA 리포지토리 구현

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

import org.springframework.transaction.annotation.Transactiona

@Transactional
public class MemberService {}
  • 스프링은 해당 클래스의 메서드를 실행할 때 트랜젝션 시작, 정상 종료되면 트랜젝션을 커밋한다.

  • RuntimeException이 발생하면 커밋하지 않고 롤백한다.
    • ex) 프로그램 실행중 서버가 다운이 되어 정확한 데이터가 반영이 안되면 문제를 유발할 수 있다.

  • JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.


스프링 설정 변경

  • SpringConfig
@Configuration
public class SpringConfig {
    private final EntityManager em;
    
    public SpringConfig(EntityManager em) {
        this.em = em;
    }
    
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
       // return new MemoryMemberRepository();
       // return new JdbcMemberRepository(dataSource);
       // return new JdbcTemplateMemberRepository(dataSource);
       return new JpaMemberRepository(em);
   }
}
  • Entity manager: 엔티티 객체들(Member)을 관리하는 역할


5. 스프링 데이터 JPA

스프링 데이터 JPA란?

  • JPA를 더 편리하게 사용할 수 있음


스프링 데이터 JPA 리포지토리 구현

public interface SpringDataJpaMemberRepository extends 
JpaRepository<Member,Long>, 
MemberRepository {
    Optional<Member> findByName(String name);
}
  • 스프링 데이터 JPA를 이용하면 구현 클래스 없이 인터페이스만으로 개발 가능하다.
    • JpaRepository를 상속하고 있는 인터페이스는 spring data JPA를 통해 구현체 자동으로 생성
    • SpringDataJpaMemberRepository를 자동으로 스프링 빈으로 등록해준다.

  • 기본 CRUD기능(JPA repository의 save(), findAll()등)을 제공한다.


스프링 데이터 JPA 제공 클래스, 기능

  • 제공 클래스


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

0개의 댓글

관련 채용 정보