스프링데이터 + JPA/스프링 데이터 JPA 30

9. 메소드 이름으로 쿼리 생성

Spring Data JPA 에서 제공하는 공통 기능 말고도, 예를 들어 username으로 조회를 해 온다던지, 이런 도메인에 특화된 조회 등 공통되지 않은 부분들을 만들어야 할 필요성이 있다. Spring Data JPA는 이러 한 공통적인 부분이 아닌 쿼리들을 어떻게 만들도록 지원해 주는지 알아볼 것이다. Spring Data JPA에서 쿼리를 만들도록 지원해 주는 것은 총 3가지 방법이 있는데, 1. 메소드 이름으로 쿼리 생성 2. JPA NamedQuery 호출 3. @Query 어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의 먼저 메소드 이름으로 쿼리 생성하는 것에대해 알아볼 거임. 그 전에, Jpa로만 먼저 짜보면 username이 같고 age가 특정 값 보다 큰거 public ..

8. 공통 인터페이스 분석

이번엔 public interface MemberRepository extends JpaRepository { } 여기의 JpaRepository 등의 안으로 들어가, 분석해 볼거임. package org.springframework.data.jpa.repository; @NoRepositoryBean public interface JpaRepository extends ListCrudRepository, ListPagingAndSortingRepository, QueryByExampleExecutor { void flush(); S saveAndFlush(S entity); List saveAllAndFlush(Iterable entities); @Deprecated default void delete..

7. 공통 인터페이스 적용

적용.. 그냥 봤던대로, public interface TeamRepository extends JpaRepository { } public interface 리포지토리명 extends JpaRepository { } 끝. @Test public void basicCRUD(){ Member member1 = new Member("member1", 10); Member member2 = new Member("member2", 11); memberRepository.save(member1); memberRepository.save(member2); Member findMember1 = memberRepository.findById(member1.getId()).get(); Member findMember2 ..

6. 공통 인터페이스 설정

스프링 부트 사용 시 생략 가능하긴 한데, @SpringBootApplication @EnableJpaRepositories(basePackages = "study.datajpa.repository") public class DataJpaApplication { public static void main(String[] args) { SpringApplication.run(DataJpaApplication.class, args); } } 저렇게 JpaRepository들 어디에 있는지 경로 써줬어야 했음. 근데 스프링 부트 쓰면 그냥 저 그러니까 스프링 실행하는 곳, 여기 포함 및 하위를 그냥 다 스캔함. 그래서 사실 명시할 필요 없음. 우리가, public interface MemberRepositor..

5. 순수 JPA 리포지토리

강의 순서는 순수 JPA 리포지토리 만든다음, 순수 JPA 리포지토리 -> 스프링 데이터 JPA 저 순수 JPA 리포지토리를 똑같은 기능을 가진 스프링 데이터 JPA로 어떻게 만드냐? 이거임 먼저 멤버 리포지토리 @Repository @RequiredArgsConstructor public class MemberJpaRepository { private final EntityManager em; public Member save(Member member){ em.persist(member); return member; } public Member find(Long id){ return em.find(Member.class, id); } public Optional findById(Long id){ Mem..

4. 예제 도메인 모델 구현

우선 간단하게 이런 거 구현 할 거임. 다대일 관계로, DB에서는 당연히 단일방향. 뭐 그러면 엔티티는 일단은 자기가 가지고 있는 원시타입? 은 다 가지고 있을테고, 그럼 memberId, username age 기본적으로 이렇게 있을거고, 팀도 teamId, name 이렇게 있을건데, 연관관계를 어떻게 가져갈까. 일단은 기본적으로 단방향 연관관계로 짜놓는게 훨씬 좋음. 주인도 (mappedBy가 아닌 실제 DB에서 값을 읽어오고 얘의 값이 바뀌면 실제 DB의 값도 바뀌는 곳) 다 쪽이, 그러니까 외래키를 가지고 있는 쪽이 주인이 되는 게 좋음(왜냐하면 엔티티 상에서 외래키를 가지고 있는 쪽이 주인이 아니게 되면 쿼리가 나갈 때 한번 거쳐서 가게 되므로, team이 주인이 되면 팀 -> 멤버, 외래키를 ..

3. 스프링 데이터 JPA, DB 설정, 동작 확인

application.properties보다 application.yml 을 더 선호하신다고.. application.properties를 지우고 만듦. spring: datasource: url: jdbc:h2:tcp://localhost/./datajpa username: sa password: 1234 driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace 스프링의 데이터 소스는 url, username, passwo..

0. 프리뷰

스프링 데이터 적용하려면, public interface MemberRepository extends JpaRepository { } JpaRepository을 상속받아 인터페이스를 구현하면 된다. @NoRepositoryBean public interface JpaRepository extends ListCrudRepository, ListPagingAndSortingRepository, QueryByExampleExecutor { void flush(); S saveAndFlush(S entity); List saveAllAndFlush(Iterable entities); @Deprecated default void deleteInBatch(Iterable entities) { deleteAllInB..