자바생
article thumbnail
객체지향 쿼리 언어2

페치 조인 페치 조인은 SQL에서 사용하는 조인의 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능이다. 우리는 연관관계에서 지연 로딩을 사용한다. 하지만 페치 조인을 사용하게 되면 즉시 로딩을 하여 N+1 문제를 해결할 수 있다. 페치 조인을 할 때 나올 수 있는 값에 따라 2종류로 나눌 수 있다. 엔티티 페치 조인, 컬렉션 페치 조인 그렇다면 페치 조인을 사용할 때와 사용하지 않을 때를 비교하면서 총 4가지의 예시로 정리해보겠다. 연관관계를 그려보면 아래와 같다. 단일 값 일반 join String query1 = "select m from Member m join m.team"; List resultList = em.createQuery(query1, Member.class) .getR..

article thumbnail
객체지향 쿼리 언어1 (1) ~ 프로젝션
Spring 강의/JPA - 기본편 2021. 12. 14. 04:54

JPQL은 왜 사용하나? 우리는 DB에서 데이터를 조회할 때, em.find를 통해 쉽게 조회할 수 있다. 그런데 왜 JPQL을 사용할까? 예를 들어 member가 100명이 있는데 여기서 특정 나이 이상인 member를 조회하고 싶다. 그렇다면 우리가 할 수 있는 일은 모든 member 수 만큼 em.find를 하여, 각 member 객체의 age를 조회해야한다. 데이터의 개수가 더욱 더 늘어난다면 우린 DB에 있는 모든 member들을 모두 객체로 만들어야한다. 이 점이 불가능하기 때문에 검색 조건이 있는 JPQL을 사용하여 쉽게 조회할 수 있다. JPQL의 특징 우리가 흔히 알고 있는 SQL은 DB 테이블을 대상으로 쿼리를 짠다. 하지만 JPQL은 엔티티 객체를 대상으로 쿼리를 작성한다. 또한, 앞..

article thumbnail
값 타입
Spring 강의/JPA - 기본편 2021. 12. 12. 02:04

JPA의 데이터 타입 JPA의 데이터 타입은 크게 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입과 값 타입의 가장 큰 차이는 식별자의 유무이다. 엔티티는 식별자를 통해 구별할 수 있지만 값은 할 수 없다. 기본 값 기본 값은 엔티티에 생명주기를 의존한다. Member가 삭제되면 age나 name이 삭제되기 때문이다. 임베디드(embedded) 임베디드 타입은 사용자가 JPA에서 새로운 값 타입을 직접 정의한 것이다. 임베디드 타입은 여러 곳에 사용할 수 있는 재사용성이 좋다. member도 주소가 필요하고, group도 주소가 필요할 때 member에 주소를 모두 쓰고, group에도 주소를 모두 쓰는 것보다 주소 임베디드 타입을 만든다면 매우 객체지향적이고 깔끔한 코드가 될 것이다. 임베디드 ..

article thumbnail
프록시와 연관관계 관리(2) 즉시 로딩과 지연 로딩 ~ 영속성 전이
Spring 강의/JPA - 기본편 2021. 12. 10. 02:32

지연 로딩 즉시 로딩과 지연 로딩의 차이는 내 생각엔 필요할 떄 조회하는 것 같다. 지연 로딩은 필요할 때 찾고, 즉시 로딩은 처음부터 다 찾는거다. 그리고 지연 로딩을 하는 LAZY 옵션을 사용하면, 앞에서 배운 프록시 클래스가 생성이 되는 것을 알 수 있다. Member findMember = em.find(Member.class, member1.getId()); System.out.println("findMember.getClass() = " + findMember.getClass()); System.out.println("findMember.Team = " + findMember.getTeam().getClass()); System.out.println("여기 시점에 team을 조회하므로 쿼리가 ..

article thumbnail
프록시와 연관관계 관리 (1) 프록시
Spring 강의/JPA - 기본편 2021. 12. 10. 02:05

프록시 프록시를 사용하면 객체를 처음부터 DB에서 조회하는 것이 아니라 실제 사용하는 시점에 DB에서 조회하는 것이다.(= 지연 로딩) 예를 들어 Member와 Team이 연관관계 매핑이 되어있다. 그러면 find를 통하여 Member를 찾을 때, join 쿼리를 이용하여 Team도 당연히 조회가 된다. 이 부분이 효율적이지 못해 프록시를 사용한다면 Member를 찾을 때, DB에서 Member만을 조회하여 조회할 수 있다. getReference & find 우리는 엔티티를 조회할 때 em.find를 사용해왔다. find는 위와 같은 실제 엔티티를 반환하게 된다. 하지만 em.getReference는 프록시 객체를 가져온다. Member findMember = em.getReference(Member...

article thumbnail
고급 매핑
Spring 강의/JPA - 기본편 2021. 12. 7. 15:41

상속관계 매핑 관계형 DB에는 상속이란 개념이 없고 슈퍼타입 서브타입 관계라는 모델링 기법이 상속 개념과 비슷하다. JPA에서는 상속 관계 매핑의 옵션으로 @Inheritance(strategy = "[전략]") SINGLE_TABLE, TABLE_PER_CLASS, JOINED 방법이 있다. SINGLE_TABLE TABLE_PER_CLASS JOINED 부모 엔티티에 자식 엔티티의 속성을 모두 넣음. 이 때, 자식 테이블은 생성되지 않음. 부모 엔티티(추상 클래스)가 생성되지 않고, 각각 자식 엔티티가 생성됨. 부모, 자식 엔티티를 각각 테이블로 만들고 PK, FK 를 이용하여 테이블을 조인한다. JOINED 조인 전략은 부모, 자식 엔티티를 모두 테이블로 만들고, 자식 테이블은 부모 테이블의 기본 ..

article thumbnail
다양한 연관관계 매핑
Spring 강의/JPA - 기본편 2021. 12. 2. 03:23

연관관계 매핑 종류 그림은 단지 테이블을 보기위함 ( 화살표 상관 X ) 단방향 양방향 다대일 '다' : 연관관계 주인(Member) @ManyToOne @JoinColumn(name = "TEAM_ID") '다' : 연관관계 주인 (Member) @ManyToOne @JoinColumn(name = "TEAM_ID") '일' (Team) @OneToMany (mappedBy = "team") 일대다 '일' : 연관관계 주인 (Team) @OneToMany @JoinColumn(name = "TEAM_ID") 다대일 양방향 매핑 선호 단방향 양방향 일대일 주 테이블, 대상 테이블에 따라 연관관계 주인 선택 '일' : 주 테이블(Member) @OneToOne @JoinColumn(name = "LOCKE..

article thumbnail
연관관계 매핑 기초
Spring 강의/JPA - 기본편 2021. 11. 29. 19:02

연관관계 매핑이 왜 필요할까? 우리가 DB 테이블 구조대로 코드를 작성하면 객체지향적이지 않게 된다. 위와 같이 테이블 구조대로 코드를 작성하고, 멤버가 속한 팀을 찾아보자. DB에서 멤버 찾기 -> 멤버의 팀 아이디 찾기 -> 팀 아이디를 통하여 DB에서 팀 찾기 과정이 이뤄진다. 하지만 객체지향적으로 코드를 작성하고, 멤버가 속한 팀을 찾아보자. DB에서 멤버 찾기 -> 멤버의 팀 찾기 과정이 이뤄진다. 과정이 단축되는 것을 알 수 있다. 테이블과 객체에서 연관관계를 맺는 데의 차이점이 있다. 테이블은 외래키로 두 테이블이 양방향 관계를 맺게 되고, 객체는 참조를 사용하여 관계(단방향)를 맺는다. 단방향 연관관계 현재 위의 테이블을 보면 회원은 하나의 팀에만 소속될 수 있다. 그래서 Member와 T..

article thumbnail
앤티티 매핑
Spring 강의/JPA - 기본편 2021. 11. 20. 03:17

객체와 테이블 매핑 객체는 @Entity, 테이블은 @Table 어노테이션을 사용한다. Entity는 우리가 관리해야할 객체, 즉 클래스임을 나타낸다. Table은 지정한 엔티티와 DB에 매핑할 테이블을 지정한다. Table에 따로 name을 설정해주지 않으면 엔티티 이름을 그대로 사용한다. 예로 Member 클래스를 엔티티로 지정하고, name을 따로 설정하지 않았을 때, DB에 Member라는 테이블이 만들어지고, Java의 Member 클래스와 매핑한다. DB 스키마 자동 생성 JPA를 배우면서 처음으로 놀랬던 일이었다. 자바 코드만 작성한다면 JPA가 자체적으로 쿼리를 생성하여 테이블을 만들어주는 것이 매우 신기했다.. 하지만 해당 기능은 "운영 서버"에서는 절대 사용하면 안된다고 하셨다. DDL..

article thumbnail
영속성 관리 - 내부 동작 방식
Spring 강의/JPA - 기본편 2021. 11. 19. 22:08

앞에서 EntityManagerFactory와 EntityManager에 대해 배웠다. emf는 애플리케이션이 실행될 때 최초 한 번만 실행이 되고, em은 고객 요청마다 생성 되고, 서비스가 끝나면 버린다. 이 때 em을 쓰레드끼리 공유하게 된다면 예상치 못한 "버그"가 생길 수 있기 때문에 필히 close 해야한다. 또한, em은 트랜잭션 단위로 실행된다. 트랜잭션 안에서 실행되지 않으면 JPA가 기능하지 않게 된다. 영속성 컨텍스트(PersistenceContext) 영속성 컨텍스트란 말은 JPA를 배우면서 많이 접하는 용어이다. "엔티티를 영구 저장하는 환경"이라는 뜻을 가지고 있고, persist 메서드를 사용하여 객체를 영속화 시킬 수 있다. 영속화한 객체는 EntityManager를 통하여 ..

article thumbnail
JPA 시작하기
Spring 강의/JPA - 기본편 2021. 11. 17. 22:36

EntityManagerFactory JPA를 구동하려면 EntityManagerFactory를 하나만 생성해서 애플리케이션 전체에서 공유를 하게 된다. 이 때, persistenceUnitName을 인자로 받게 된다. 해당 인자는 우리가 persistence.xml에서 작성했던 "hello"이다. 정리하면 JPA가 실행될 때, persistence.xml을 정보들을 조회하여 EntityManagerFactory를 생성하고 emf가 EntityManager들을 생성하면서 JPA가 실행된다. EntityManager 트랜잭션 단위로 실행된다. 이 말은 트랜잭션이 끝나면 버려야 한다. 예를 들어 고객 요청이 올 때마다 생성되고 요청이 끝나면 버린다. JPA의 데이터 변경은 트랜잭션 단위로 실행 아래의 코드를..

728x90

검색 태그