Spring Data JPA - 순수 JPA 기반 리포지토리 만들기

2022. 7. 26. 20:11·공부/JPA
반응형

출처 : 인프런 실전! 스프링 데이터 JPA

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.

 

순수 JPA 기반 리포지토리 만들기

CRUD 기능 만들기

MemberJpaRepository.class

@Repository
public class MemberJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public void delete(Member member) {
        em.remove(member);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    public long count() {
        return em.createQuery("select count(m) from Member m", Long.class)
                .getSingleResult();
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

 

TeamRepository.class

@Repository
public class TeamRepository {

    @PersistenceContext
    private EntityManager em;

    public Team save(Team team) {
        em.persist(team);
        return team;
    }

    public void delete(Team team) {
        em.remove(team);
    }

    public List<Team> findAll() {
        return em.createQuery("select m from Team t", Team.class)
                .getResultList();
    }

    public Optional<Team> findById(Long id) {
        Team team = em.find(Team.class, id);
        return Optional.ofNullable(team);
    }

    public long count() {
        return em.createQuery("select count(t) from Team t", Long.class)
                .getSingleResult();
    }
}

MemberRepository와 TeamRepository의 코드가 타입만 다를 뿐 사실 비슷하다. 아니 똑같다! 그래서 스프링에서는 이런 기본적인 CRUD 같은 부분들을 더욱 간편하게 쓸 수 있는 기능을 제공한다. 

여기서 UPDATE가 없는 이유는 JPA는 엔티티 변경 감지 기능으로 데이터를 변경하기 떄문에 따로 update 기능을 만들지 않아도 된다.

↓  관련 포스팅

 

JPA 영속성 관리 - 영속성 컨텍스트

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. JPA 영속성 관리 - 영속성 컨텍스트 엔티티 매니저 팩토리와 엔티티 매니저 이 전

devhan.tistory.com

 

MemberJpaRepositoryTest.class

@SpringBootTest
@Transactional
@Rollback(false)
class MemberJpaRepositoryTest {

    @Test
    public void basicCRUD() {
        Member member1 = new Member("member1");
        Member member2 = new Member("member2");
        memberJpaRepository.save(member1);
        memberJpaRepository.save(member2);

        // 단건 조회 검증
        Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
        Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
        assertThat(findMember1).isEqualTo(member1);
        assertThat(findMember2).isEqualTo(member2);

        // 리스트 조회 검증
        List<Member> all = memberJpaRepository.findAll();
        assertThat(all.size()).isEqualTo(2);

        // 카운트 검증
        long count = memberJpaRepository.count();
        assertThat(count).isEqualTo(2);

        // 삭제 검증
        memberJpaRepository.delete(member1);
        memberJpaRepository.delete(member2);
        long deleteCount = memberJpaRepository.count();
        assertThat(count).isEqualTo(2);
    }
}

 

변경 감지 테스트

변경 감지 기능은 트랜잭션 안에서 엔티티를 조회한 다음, 데이터를 변경하면 트랜잭션 종료 시점에 변경 감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다.

    @Test
    public void basicCRUD() {
        Member member1 = new Member("member1");
        Member member2 = new Member("member2");
        memberJpaRepository.save(member1);
        memberJpaRepository.save(member2);

        // 단건 조회 검증
        Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
        Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
        assertThat(findMember1).isEqualTo(member1);
        assertThat(findMember2).isEqualTo(member2);

        findMember1.setUsername("member!!!!!!!!!!"); // ** Member1의 이름 변경

//        // 리스트 조회 검증
//        List<Member> all = memberJpaRepository.findAll();
//        assertThat(all.size()).isEqualTo(2);
//
//        // 카운트 검증
//        long count = memberJpaRepository.count();
//        assertThat(count).isEqualTo(2);
//
//        // 삭제 검증
//        memberJpaRepository.delete(member1);
//        memberJpaRepository.delete(member2);
//        long deleteCount = memberJpaRepository.count();
//        assertThat(count).isEqualTo(2);
    }
// 출력 로그 중 일부
update
    member 
set
    age=?,
    team_id=?,
    username=? 
where
    member_id=?

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • Spring Data JPA - 메서드 이름으로 쿼리 생성
  • Spring Data JPA - 공통 인터페이스
  • Spring Data JPA - 예제 도메인 모델과 동작확인
  • Spring Data JPA - 프로젝트 환경 설정
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바스크립트
    프로그래머스
    인프런
    RESTful
    SQL
    springboot
    react
    개발자
    스프링부트
    oracle
    프론트엔드
    전자정부프레임워크
    MSA
    Spring
    에러해결
    토이프로젝트
    기출문제
    운영체제
    JPA
    QueryDSL
    IT
    Java
    백준
    방통대
    SpringBoot를 이용한 RESTful Web Service 개발
    토비의스프링부트
    알고리즘
    넥사크로
    코딩테스트
    egov
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
Spring Data JPA - 순수 JPA 기반 리포지토리 만들기
상단으로

티스토리툴바