[스프링] 5. 스프링 DB 접근기술

지니🧸·2023년 1월 27일
0

Spring Boot & JPA

목록 보기
34/35

본 문서는 인프런의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (김영한) 강의를 공부하며 작성한 개인 노트입니다.

🛥️ 스프링 JdbcTemplate

셋팅

  1. build.gradle에 dependency
dependencies {
	...
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.h2database:h2'
    ...
}
  1. src/main/java/hello.hellospring/repository에 JdbcTemplateMemberRepository 생성
  • implements MemberRepository
  1. JdbcTemplate을 사용하도록 스프링 설정 변경
@Configuration
public class SpringConfig {
	
    private final DataSource dataSource;
    
   	public SpringConfig(DataSource dataSource) {
    	this.dataSource = dataSource;
    }
    
    ...
    
    @Bean
    public MemberRepository memberRepository() {
    	return new JdbcTemplateMemberRepository(dataSource);
    }
}

SimpleJdbcInsert

SQL문을 짤 필요 없이 코드로 sql 사용

@Override
    public Member save(Member member) {
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName());

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
        member.setId((key.longValue()));
        return member;
    }

JPA

  • 반복 코드를 줄임
  • JPA가 기본적인 SQL부터 만들어서 실행
  • 객체 중심
  • 개발 편리

셋팅

  1. build.gradle
dependencies {
	...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    ...
}
  • jdbc 관련 라이브러리 포함
  1. 스프링부트에 JPA 설정 추가 (resources/application.properties)
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.datasource.username=sa
  • show-sql: JPA가 생성하는 sql 출력
  • ddl-auto: JPA는 테이블 자동 생성 기능 제공
    • none: 해당 기능 끔
    • create: 엔티티 정보 바탕으로 테이블 직접 생성
  1. JPA를 사용하도록 스프링 설정 변경
public class SpringConfig {
	private final DataSource dataSource;
    private final EntityManager em;
    
    public SpringConfig(DataSource dataSource, EntityManager em) {
    	this.dataSource = dataSource;
        this.em = em;
    }
    
    ...
    
    @Bean 
    public MemberRepository memberRepository() {
    	return new JpaMemberRepository(em);
    }
}

JPA Entity Mapping

  1. domain 디렉토리의 객체를 entity 설정
@Entity
public class Member { ... }
  1. pk 설정
@Entity 
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
}
  • GenerationType.IDENTITY : 디비가 자동으로 생성해주는 값
  1. JPARepository 셋팅

Entity Manager

엔티티 인스턴스를 생성/제거/서치/쿼리 등 관리하는 API.

  • .persist
  • .find(조회할 타입, 식별자) : 조회
  • .createQuery
    • .getResultList()
    • .setParameter

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

⏰ 스프링 데이터 JPA

  • 리포지토리에 구현 클래스 없이 인터페이스만으로 개발 가능
  • 기본 CRUD 기능도 제공됨

스프링 데이터 JPA 회원 리포지토리

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
	Optional<Member> findByName(String name);
}
  • Long: pk 타입
  • JpaRepository를 갖고 있는 SpringDataJpa가 구현체를 자동으로 만들어줌 > 스프링 빈으로 자동 등록

스프링 데이터 JPA 회원 리포지토리 사용하도록 스프링 설정 변경

@Configuration 
public class SpringConfig {
	
    private final MemberRepository memberRepository;
    
    public SpringConfig(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    @Bean
    public MemberService memberService() {
    	return new MemberService(memberRepository);
    }
    
    // 스프링 데이터 JPA 인터페이스가 구현체를 생성하기 때문에 memberRepository 메소드는 더이상 필요 없음
}
    

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • 인터페이스가 메소드 이름을 인식해 쿼리문을 짜기 때문에 추가 구현 없이 메소드 사용 가능
    • (예) findByName(String name)
  • 페이징 기능 자동 제공

복잡한 동적 쿼리 > Querydsl 라이브러리 (자바 코드로 쿼리 작성)
네이티브 쿼리 or 스프링 JdbcTemplate

profile
우당탕탕

0개의 댓글