Spring/JPA (48) 썸네일형 리스트형 [JPA] Merge 이번 장에서는 JPA의 병합(이하 Merge)에 자세하게 알아본다. Merge를 이해하기 위해서는 Entity의 생명주기 (링크)를 이해하고 있어야한다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 준영속 Entity 준영속 상태의 Entity는 id가 존재해야한다. id가 존재한다는 것은 DB에 한 번이라도 Insert되었다는 의미가 된다. id는 존재하지만 영속성 컨텍스트의 관리를 받지 못하는 상태를 의미한다. 이번 장에서는 잘못된 API 설계로 클라이언트가 Entity를 수정하기 위해서 서버로 Entity를 전달하고 수정하는 상황을 만들어본다. 이러한 상황에서 Merge를 사용하면 발생하는 문제를 확인해보고 어떠한 방식으로 풀어야하는지에 .. [JPA] JPQL - 3 이번 장에서는 JPQL-1(링크)에 이어 JPQL의 기능들에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Class와 Entity에 대한 설명은 JPQL-1의 글에서 확인한다. 엔티티 직접 사용 우리는 쿼리를 작성할 때 대부분 PK나 FK를 사용하여 조회한다. 이러한 검색 조건들은 객체가 아니라 대부분 숫자로 구성되어 있을 것이다. 하지만 JPQL에서 쿼리를 작성할 때 Entity의 id를 사용하는 것과 Entity 자체를 사용하는 것이 동일하게 취급된다. 예를 들어 아래는 Customer Entity에서 특정 결과를 카운트 하는 코드다. SELECT COUNT(C) FROM Customer C WHERE C.id > 50; .. [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.. 이전 1 2 3 4 5 6 다음