본문 바로가기

Spring

(183)
[JPA] JPQL - Fetch Join 이번 장에서는 JPQL-1(링크)에 이어 JPQL의 Fetch Join에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Class와 Entity에 대한 설명은 JPQL-1의 글에서 확인한다. Fetch Join Fetch Join은 실제로 DB에 존재하는 Join의 종류가 아니다. JPQL의 성능 향상을 위해 존재하는 개념이다. 이전에 성능 및 유지보수를 위하여 모든 연관 관계는 Lazy로 설정해두었다. 이렇게 설정하는 경우 N + 1 문제를 피하기 어렵다. Lazy로 설정되어 있는 Entity들도 한 번에 조회하기 위해 사용하는 것이 Fetch Join이다. 아래와 같이 택시 기사(TaxiDriver)를 조회하고 기사의 업체(..
[JPA] JPQL - 2 이번 장에서는 JPQL-1(링크)에 이어 JPQL의 기능들에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Class와 Entity에 대한 설명은 JPQL-1의 글에서 확인한다. 페이징 API JPA에서는 아래 두 개의 API로 추상화하였다. 이로인해 JPA가 지원하는 모든 DB의 종류에 상관없이 같은 방식으로 페이징 처리가 가능하다. setFirstResult(int startPosition): 조회 시작 위치 setMaxResult(int maxResult): 조회할 데이터의 수 100명의 택시 기사를 생성하고 이를 페이징 처리하는 코드는 아래와 같다. for (int i = 0; i < 100; i++) { TaxiDriv..
[JPA] JPQL - 1 이번 장에서는 객체지향 쿼리 언어인 JPQL에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 객체 지향 쿼리 언어 예를 들기위한 클래스와 테이블 구조는 아래와 같다. Class TaxiCompany: 택시 회사를 의미하며 여러 택시 기사를 보유하고 있다. TaxiDriver: 택시 기사를 의미하며 특정 택시 회사에 속해있다. TaxiEvent: 택시 기사가 고객을 태우는 하나의 이벤트를 의미한다. Customer: 택시에 승차하는 고객. Period: 기간을 나타내는 값 타입. Table JPA는 다양한 쿼리 방법을 지원하며 JPQL, QueryDSL이 있다. 이번 장에서는 JPQL에 대해서만 다루고 QueryDSL은 추후의 강..
[JPA] Value Type 이번 장에서는 JPA의 값타입에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. JPA에서 데이터를 분류하는 타입은 크게 엔티티 타입과 값 타입이 있다. 엔티티 타입의 경우 @Entity가 붙은 클래스로 정의되며 데이터가 변해도 식별자(id or sequence)로 추적이 가능하다. 아래와 같은 차량 엔티티가 있는 경우 차량의 번호가 변경되더라도 id는 고유하기 때문에 동일한 엔티티임을 인식할 수 있다. @Entity public class Car { @Id @GeneratedValue private Long id; @Column("number") private String number; } 값 타입은 Integer, String..
[JPA] Cascade 이번 장에서는 JPA의 영속성 전이(Cascade)에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 영속성 전이(Cascade) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶은 경우에 사용한다. 차량(Car)과 제조사(Manufacturer)를 예로 설명해본다. @Entity public class Car { @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "manufacturer_id") private Manufacturer manufacturer; } @Entity public ..
[JPA] Loading 이번 장에서는 프록시 (링크)에 이어 즉시 로딩과 지연 로딩에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 프록시에서 JPA에서 어떻게 프록시 객체를 관리하는지에 대해서 알아보았다. 이번에는 직접 차량(Car)과 제조사(Manufacturer)를 예로 직접 로딩과 지연 로딩을 구현해본다. 지연 로딩(Lazy Loading) 만약 차량을 조회할 때 제조사의 정보가 필요가 없다면 매번 제조사의 정보를 DB에서 조회하는 것은 불필요한 자원낭비가 된다. 이러한 경우 FetchType을 지정하여 지연 로딩을 설정할 수 있다. @Entity public class Car { @Id @GeneratedValue private Long id..
[JPA] Proxy 이번 장에서는 즉시 로딩과 지연 로딩을 이해하기 위해 프록시에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 프록시 서버 프록시를 이해하기 위해 프록시 서버에 대해서 간략하게 알아본다. 아래는 위키백과에 나와있는 프록시 서버의 정의다. 프록시 서버(proxy server)는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 간략하게 클라이언트와 서버간의 중개인 역할을 하는 서버를 프록시 서버라고 한다. 프록시란 개념이 서버에 적용되었다고 볼 수 있다. JPA의 프록시 JPA에서도 사용유무가 불분명한 데이터를 위한 DB조회수 감소와 메모리 사용량을 최..
[JPA] Relation Mapping - 3 이번 장에서는 기본적인 연관괸계 매핑 기초 (링크)와 다양한 연관관계 매핑 (링크)에 이어 상속관계 매핑에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 관계형 데이터베이스에는 상속의 개념이 없다. 슈퍼타입과 서브타입 관계라는 모델링이 객체의 상속과 유사하다. JPA에서 관계형 데이터베이스를 사용해서 상속관계를 매핑하는 방법은 총 세가지가 있다. 상위 클래스인 Person(사람)과 하위 클래스인 Teacher(선생), Student(학생)을 예로 들어 알아본다. 조인전략 하위 클래스를 전부 테이블로 만들고 하위 클래스의 테이블들은 부모의 기본 키를 기본 키 및 외래 키로 사용한다. 테이블이 깔끔하게 정규화되고 저장공간을 효율적으..