카테고리 없음

[스프링부트] 실전! 스프링 부트와 JPA 활용1 #4-1 회원 리포지토리 개발

aSpring 2023. 11. 2. 08:12
728x90
728x90
※ 본 포스팅은 김영한 강사님의 인프런 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 들으며 작성한 수강일지 입니다.

 

| 회원 도메인 개발

 

구현 기능

  • 회원 등록
  • 회원 목록 조회

 

순서

  • 회원 엔티티 코드 다시 보기
  • 회원 레포지토리 개발
  • 회원 서비스 개발
  • 회원 기능 테스트

 

1. 회원 리포지토리 개발
2. 회원 서비스 개발
3. 회원 기능 테스트

 

1. 회원 리포지토리 개발

package jpabook.jpashop.Repository;

import jpabook.jpashop.domain.Member;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
//import javax.persistence.PersistenceUnit;
import java.util.List;ß

@Repository // componenet scan의 대상이 되서 자동으로 관리 됨
public class MemberRepository {

    @PersistenceContext // JPA의 entity manager를 주입해 줌
    private EntityManager em;

//    // 직접 주입하고 싶다면
//    @PersistenceUnit
//    private EntityManagerFactory emf;

    public void save(Member member) {
        em.persist(member); // persist -> 영속성 컨텍스트에 Member 객체를 넣음 -> transaction commit 시점에 db에 반영(insert)
    }

    // 단건 조회
    public Member findOne(Long id) {
        return em.find(Member.class, id); // JPA의 find method를 사용 -> 단건 조회, type, pk 넣어주기
    }

    // 리스트 조회
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class) // JPQL cf) SQL과 문법은 같으나 from의 대상이 table이 아니라 entity
                .getResultList();
    }

    public List<Member> findByName(String name) {
        return em.createQuery("select m from Member m where m.name = :name", Member.class) // parameter 바인딘 -> 특정 이름으로 조회
                .setParameter("name", name) // parameter가 바인딩 됨
                .getResultList();
    }
}

기술 설명

  • @Repository: 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 에외 변환
  • @PersistenceContext: 엔티티 메니저(EntityManager) 주입
  • @PersistenceUnit: 엔티티 매니저 팩토리(EntityManagerFactory) 주입

기능 설명

  • save()
  • findOne()
  • findAll()
  • findByName()

 

JPQL vs SQL

- 기능적으로는 동일

- 차이점 : SQL은 테이블을 대상으로, JPQL은 Entity 객체를 대상으로 한 쿼리(Entity Member를 조회)

728x90
728x90