본문 바로가기

공부/Spring59

순수 JPA 기반 리포지토리와 차이점을 확인해보자 순수 JPA 기반 리포지토리를 먼저 알아보자 EntityManager를 통해 persist와 JPQL 등을 사용한다. 스프링 데이터 JPA를 사용하면 어떻게 될까? 인터페이스이며 구현체가 없다 구현 클래스(Member)를 보고 proxy 클래스를 만든다. 스프링 데이터 JPA가 구현클래스를 만들어준다. @Repository 애노테이션을 붙이지 않아도 된다. public interface MemberRepository extends JpaRepository { // 타입, PK } 만약 스프링데이터 JPA에서 제공되지 않는 함수를 작성한면? username으로 찾은 List를 찾고싶다면 어떻게 될까? 다음과 같은 예시는 실제로 JPA에서 제공이된다. 이를 쿼리메소드 기능 이라고 한다. public inte.. 2022. 8. 25.
[JPA] 페치 조인 🐱‍🏍페치 조인🐱‍🏍 JOIN FETCH (즉시로딩) SQL 조인 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능 N+1 문제를 해결한다. 회원 리스트를 가져온 후, 각 회원이 속한 팀을 출력한다. 각 회원이 속한 팀을 호출할때마다 추가로 쿼리가 발생한다. 1. 엔티티 페치 조인 회원을 조회하면서 연관된 팀도 함께 조회 [SQL] SELECT M.*, T.* FROM MEMBER M // select M.*, T.* INNER JOIN TEAM T ON M.TEAM_ID=T.ID 코드로 적용 String jpql = "select m from Member m join fetch m.team"; List members = em.cre.. 2022. 7. 18.
[JPA] 쿼리 문법 JPQL JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리언어 지원 테이블이 아닌 객체를 대상으로 검색 객체 지향 SQL Creteria 유지보수 어려움 대신, QueryDSL 사용 JPQL 문법 1. TypeQuery, Query TypeQuery: 반환 타입이 명확할 때 사용 Query: 반환 타입이 명확하지 않을 때 사용 TypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class); Query query = em.createQuery("SELECT m.username, m.age from Member m"); 1-1. query.getResultList() 결과가 하나 이상일 때, 리스트 반환 1-2. query.getS.. 2022. 7. 18.
[JPA] 값 타입 @Embeddable public class Period { private LocalDateTime startDate; private LocalDateTime endDate; } JPA의 타입 분류 엔티티 타입 : @Entity 값 타입 : int, Integer, String 처럼 자바 타입 객체 값타입 기본 값타입 기본타입 : int, double 래퍼 클래스 : Integer, Long String 기본 생성자 필수임베디드 타입 : JPA는 임베디드 타입 컬렉션 값 타입 : 컬렉션을 새로운 테이블로 만듦 기본키를 사용할 수 없어서, 이 대신 1:N 엔티티를 생성하자 @ElementCollection // 기본값으로 LAZY이다. @CollectionTable(name = "FAVORTIE_FOOD".. 2022. 7. 2.
[JPA] 프록시와 연관관계 관리(지연로딩) 프록시 em.find() : DB를 통한 실제 엔티티 객체 조회 em.getReference() : DB조회를 미룬 가짜(프록시) 엔티티 객체 조회 사용되는 시점에 조회함 프록시 특징 실제 클래스를 상속받아 만들어진다. 프록시 객체를 통해 실제 객체에 접근하는 것이다. 처음 사용시 한번만 초기화한다. 즉시로딩과 지연로딩 지연로딩 : 프록시로 조회 LAZY 즉시로딩 EAGER Member와 Team을 보통 동시에 사용한다면 사용한다. 프록시를 사용하지 않는다. 즉시로딩 주의 가급적 지연로딩만 사용한다(특히 실무에서) 즉시로딩은 N+1 문제를 일으킨다. OneToMany, ManyToMany은 default가 LAZY이다. ManyToOne, OneToOne은 default가 즉시로딩이다. → LAZY로 설.. 2022. 7. 2.
[JPA] 다양한 연관관계 매핑 연관관계 주인 테이블 : 외래키 하나 객체 : 참조가 두군데 (A→B, B→A) 연관관계 매핑 다대일 N:1 @ManyToOne 일대다 1:N @OneToMany 일(1)이 연관관계 주인 다(N) 쪽에 외래키가 존재 연관관계 관리를 위해 추가로 UPDATE SQL 실행된다. 즉, 1:N 매핑보다 N:1 양방향 매핑을 사용하자. @OneToMany(mappedBy = "team") private List members = new ArrayList(); 일대일 1:1 @OneToOne 주 테이블이나 대상 테이블 중에 외래키를 선택할 수 있다. 반대편은 mappedBy 매핑하기 // Member @OneToOne @JoinColumn(name = "LOCKER_ID") private Locker locker;.. 2022. 7. 2.