Web/JPA

    EP2. 지연 로딩과 조회 성능 최적화

    주문을 조회하는 API를 설계해보았다. package jpabook.jpashop.api; import jpabook.jpashop.domain.Order; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repository.OrderSearch; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * XToOne (ManyToOne, One..

    EP1. 회원관리 API 만들기

    @RequestBody를 이용해 Json 요청을 DTO로 받을 수 있다. 그리고 @RestController를 클래스 레벨에 적어주면 반환할때 DTO를 반환하면 JSON으로 변환해준다. 자세한 내용은 MVC 정리에서 볼 수 있다. 2021.03.29 - [Web/MVC] - EP6. HTTP 요청 데이터 처리 EP6. Http 요청 데이터 처리하기 Http 헤더 꺼내기 docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-annarguments Web on Servlet Stack Spring Web MVC is the original web framework built on the Servlet API and.. ksabs.t..

    EP13. JPQL 경로표현식, 페치조인, 다형성, named, 벌크연산

    경로표현식 구분 점을 찍어 객체 그래프를 탐색하는 것 상태필드 단순히 값을 저장하기 위한 필드 경로 탐색의 끝. 더이상 탐색 X 연관필드 : 연관관계를 위한 필드 단일 값 연관 경로 묵시적 내부 조인 발생 (묵시적 내부조인은 사용하지 않는 것이 좋다) 탐색 더 가능 컬렉션 값 연관 경로 (1 대 다 관계) 묵시적 내부 조인 발생 탐색 X (from절에서 명시적 조인을 사용해서 별칭을 얻어서 사용하면 탐색이 가능하다) 결론 : 실무에서는 묵시적조인을 사용하지 않고 명시적 조인만 사용한다. fetch join (페치조인) JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 로 사용 사용예제 회원 1 : teamA 회원 2 : team..

    EP12. JPQL (SQL식 JPQL변환)

    JPQL 프로젝션 엔티티 프로젝션 영속성 컨텍스트로 관리돼서 set으로 수정해도 update 쿼리 나간다. SELECT m FROM Member b SELECT m.team FROM Member b -> SELECT t FROM Member m JOIN m.team t m.team은 오른쪽껄로 사용해야한다. 둘다 동일한 쿼리가 나가지만 왼쪽은 JPQL을 봤을때 어떤 SQL이 나갈지 쉽게 유추가 안되기 때문에 쉽게 예측이 가능한 오른쪽꺼 처럼 JOIN 명시해서 사용한다. 임베디드 타입 프로젝션 SELECT m.address FROM Member b 스칼라 타입 프로젝션 SELECT m.username, m.age FROM Member b 여러가지를 가져오면 타입을 모르기 때문에 new 명령어로 조회한다. ..

    EP11. JPQL소개, 기본문법

    원래의 조회방법 EntityManager.find() a.getB().getC() 그런데 나이가 18살 이상인 회원을 모두 검색하고 싶을 때 어떻게 조회할까? -> SQL을 날려야 한다. 엔티티 중심으로 개발하기 위해 JPQL이 등장한다. JPQL : 엔티티 객체를 대상으로 쿼리 SQL : DB테이블 대상으로 쿼리 JPQL 예시코드 List result = em.createQuery( "select m From Member m where m.username like '%kim%'", Member.class ).getResultList(); 변환된 SQL Criteria java 코드로 jpql을 짤 수 있게 해준다. (jpa 표준스펙) 유지보수가 어려워서 실무에서는 사용하지 않는다. QueryDSL ja..

    CascadeType.REMOVE vs orphanRemoval = true

    CascadeType.REMOVE vs orphanRemoval = true 얼핏 보면 위 두 개의 옵션은 같아보인다. 사실상 같다고 생각해도 괜찮지만 자세하게 들어가면 차이점이 있다. CascadeType.REMOVE는 말그대로 부모객체의 "삭제"라는 동작이 자식객체에게 영향을 미치는 것이다. CascadeType.REMOVE는 그래서 a.setB(null) 을 했을때 기존의 자식객체 B가 삭제되지 않는다. 하지만 orphanRemoval=true 일때는 자식객체에서 부모객체가 존재하는지를 참조로 확인하기때문에 a.setB(null) 을 했을때 기존의 자식객체 B가 삭제된다. a.setB(null) CascadeType.REMOVE : 자식객체 삭제 X (삭제 동작을 할때 작동하기 때문) orphanR..

    EP10. 값 타입

    엔티티 타입 vs 값 타입 엔티티 값을 변경해도 식별자로 인식 가능. 값 값을 변경하면 그냥 바뀜 값 타입의 종류 기본값 타입 int, double, Integer, Long, String int는 공유가 안되는데 Integer 같은 래퍼 클래스는 참조로 가져가기 때문에 값을 변경하면 다른것도 바뀜 그렇지만 값이 변경이 안되어서 괜찮다. 임베디드 타입 객체로 값타입들을 모은 타입 (복합 값 타입) @Embeddable : 임베디드 타입을 정의 한 곳에. (기본 생성자를 만들어주고 사용해야한다.) @Embedded : 임베디드 타입을 사용할 곳에 임베디드 타입을 사용해도 매핑되는 테이블은 똑같다. 정의되는 곳에 엔티티를 넣을 수도 있다. 같은 값 타입을 중복해서 사용할 때는 @AttributeOverrid..

    EP9. 프록시와 연관관계 관리

    프록시 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 실제 클래스를 상속받아 만들어져서 모양이 같다. 그래서 사용자입장에선 그냥 진짜인지 프록시인지 구분하지 않고 사용할 수 있다. 프록시 초기화 프록시 객체에서 메소드 하나를 호출하면 영속성 컨텍스트가 DB를 조회해 실제 엔티티를 생성한다. 그리고 프록시 객체는 실제 엔티티를 가리킨다. 프록시 특징 프록시객체를 초기화할때 프록시객체가 실제 엔티티로 바뀌는게 아니다. 실제 엔티티에 접근이 가능한 것이다. 실제 엔티티와 프록시끼리 타입비교시에 ==비교가 안되고 instance of 로 비교해야한다. (실제 엔티티가 아니라서 !) 프록시가 언제들어올지 모르기때문에 엔티티끼리 비교할땐 instance of 비교로 ..

    EP8. 고급 매핑

    상속관계 매핑 조인전략 단일테이블전략 구현클래스마다 테이블전략 어떤 전략이든을 선택하든 객체는 똑같이 구현된다. 하지만 DB 설계에서는 전략에따라 테이블 구성이 달라진다. 주요 어노테이션 @Inheritance(strategy = InheritanceType.XXX) JOINED : 조인전략 SINGLE_TABLE : 단일테이블전략 TABLE_PER_CLASS : 구현클라스당 테이블 전략 @DiscriminatorColumn(name='DTYPE') : DTYPE 부분 컬럼 이름 지정 가능 @DiscriminatorValue("XXX") : DTYPE부분 도메인 이름 지정 가능 조인전략 테이블 ITEM 테이블이 존재한다. 그리고 각 ALBUM, MOVIE, BOOK 테이블이 존재하고 ITEM 테이블을 상..

    EP7. 다양한 연관관계 매핑

    연관관계 매핑시 주의할 점 다중성 단방향, 양방향 연관관계의 주인 다중성 다대일 : 중요 일대다 : 잘 안씀 일대일 : 별로 안씀 다대다 : 아예 안씀 단방향, 양방향 테이블 : 외래키 하나만 있어도 가능하니까 방향의 개념이 없다. 객체 : 한쪽에서 다른쪽을 보려면 참조를 해야한다. 그래서 방향이 있다. (사실 양방향은 서로 단방향이 2개 있는 것이다.) 연관관계의 주인 외래키가 있는 곳 다양한 연관관계 매핑 방법 다 대 일 : @ManyToOne 단방향 외래키가 있는 곳에 참조를 넣고 매핑시킨다. 코드 Member @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; 양방향 다대일 관계에 일대다를 추가한 것이 양방향이다. (추가해준다해도 테이블에 영..