스프링 부트와 JPA 활용1 - 회원 도메인 개발 1 & JPQL

JOY·2022년 3월 24일
0
post-thumbnail

📌 스프링 부트와 JPA 활용1 - 회원 도메인 개발 1 & JPQL

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


회원 도메인 개발 목차

1. 회원 리포지토리 개발

2. 회원 서비스 개발

3. 회원 기능 테스트


회원 도메인 개발

  • 구현 기능
    • 회원 등록
    • 회원 목록 조회
  • 순서
    • 회원 엔티티 코드 다시 보기
    • 회원 리포지토리 개발
    • 회원 서비스 개발
    • 회원 기능 테스트

1. JPQL

JPQL 이란?

SQL을 추상화한, 엔티티 객체를 조회하는 객체지향쿼리

  • SQL 은 테이블을 대상으로 쿼리 작성
  • JPQL 은 Entity를 대상으로 쿼리 작성
    DB 테이블에 직접 연결 하지 않고 JPA 엔티티에 대해 동작
    결국 SQL로 번역되어 DB 에서 데이터 조회

JPQL 문법

  • 대소문자 구분
    • 엔티티와 속성 : 구분 O
    • SQL 키워드(Select, from, where 등) : 구분 X
  • 엔티티
    • 테이블 이름이 아닌 엔티티 이름 사용
    • @Entity(name="") 으로 설정
  • 별칭 필수, as 생략 가능

2. 회원 리포지토리 개발

1) 회원 리포지토리 (MemberRepository.java)

💻 코드

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
public class MemberRepository {

    @PersistenceContext
    private EntityManager em;

    //transaction이 commit 되는 시점에 DB에 반영 (insert 쿼리)
    public void save(Member member){
        em.persist(member);
    }

	/*특정 id 회원 조회*/
    //find(entityClass, pk)
    public Member findOne(Long id){
        return em.find(Member.class, id);
    }

	/*전체 회원 조회*/
    //Member : 회원 엔티티 객체
	//createQuery(JPQL, 조회 타입)
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    /*특정 name 회원 조회*/
    //이름 기준 파라미터 바인딩
    public List<Member> findName(String name){
        return em.createQuery("select m from Member m where m.name = :name ", Member.class)
                .setParameter("name", name)
                .getResultList();
    }
}

👉 설명
1) 기술

  • @Repository : 스프링 빈으로 등록 (Component 스캔 대상)
  • @PersistenceContext : 스프링이 EntityManager 생성해서 주입 (Injection)
  • @PersistenceUnit : EntityManagerFactory 주입 (Injection)

2) 기능

  • save() : JPA가 영속성 컨텍스트에 엔티티 객체 저장
  • findAll() : 전체 회원 조회 쿼리
  • findOne() : 특정 id 회원 조회 쿼리
  • findName() : 특정 name 회원 조회 쿼리
  • EntityManager 객체의 createQuery() : 쿼리 생성
  • TypedQuery 객체의 getResultList() : JPQL에 의해 데이터 검색, List 타입 반환
  • setParameter() : 데이터 동적 바인딩

3) 파라미터 바인딩 : setParameter()

  • 이름 기준 파라미터 - 앞에 : 사용
  • 위치 기준 파라미터 - 앞에 ? 사용
    주의! 직접 바인딩 시 SQL injection 위험

💡 만약 EntitiyManagerFactory를 주입하고 싶다면? (아래 코드 작성)

@PersistenceUnit
private EntityManagerFactory emf;

❗ 그러나 @PersistenceContext 에서 스프링이 EntityManager 를 생성해서
주입해주기 때문에 따로 작성하지 않아도 된다

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글