JPA

Dev/JPA

API 설계시 DTO를 주고받아야 한다. 엔티티 말고

@GetMapping("/api/v1/members") public List membersV1() { return memberService.findMembers(); } 이런 식으로 api를 만들면 Member 엔티티가 그대로 외부에 노출된다. 이로인한 문제점이 많다. 1. 엔티티에 화면과 관련된 로직이 추가된다. 엔티티는 엔티티 역할만 하게 두어야 한다. 2. 쓸데없는 정보가 들어간다. 그렇다고 @JsonIgnore해서 안보이게 하면 위에 1번 문제가 생긴다. 3. 엔티티를 수정하면 API 스펙이 바뀐다. API 쓰는 모두가 혼란에 빠질것이다. 4. 좀 별개로 리스트를 반환하면 API 스펙 변경이 힘드니 result 클래스를 생성해야한다. 그러니까 이렇게 작성해야 한다. @GetMapping("/api..

Dev/JPA

[강의정리] N+1 문제와 JPQL fetch join을 통한 해결

출처: 자바 ORM 표준 JPA 프로그래밍 N + 1 문제 N + 1 문제는 내가 예상했던 것보다 훨씬 많은 쿼리가 나가는 문제를 뜻한다. 여기서 1은 내가 예상한 (당장 보이는) 하나의 쿼리이고, N은 데이터의 개수 N만큼 발생하는 예상치 못한 쿼리이다. 다양한 예시 Member 엔티티와 Team 엔티티가 있다고 가정하자. 이들은 다대일 관계이며, Member에서 Team을 참조할수있다. 이런 상황에서 Member를 조회해보자. 1. em.find()로 조회 연관관계 매핑 시, 즉시 로딩으로 했는지, 지연 로딩으로 했는지가 중요하다. 즉시 로딩으로 설정시, 쿼리가 나갈때 즉시 로딩으로 설정된 엔티티들을 전부 조인해서 가져온다. 지연로딩으로 설정시, 쿼리가 나갈때 일단은 조회한 엔티티 자체만 가져온다. ..

Dev/JPA

[강의정리] 값 타입

출처: 자바 ORM 표준 JPA 프로그래밍 JPA의 데이터 타입은 2개이다. 엔티티 타입, 값 타입이 그 2개이다. 엔티티타입 -@Entity로 정의함 -값이 변경되면 식별자로 추적 가능 값 타입 - 값이 변경되어도 추적 불가능 - 그냥 자바 클래스, primitive 타입, wrapper class 등 - 생명주기를 엔티티에 의존함 값 타입 분류 - 기본 값 타입: 말그대로 기본으로 제공되는 값 타입 • 자바 기본 타입(int, double) • 래퍼 클래스(Integer, Long) • String - 임베디드 값 타입: 사용자가 정의한 값 타입 - 컬렉션 값 타입: 값 타입의 컬렉션 값 타입 컬렉션 실무에서는 이것 대신 일대다 관계를 고려함 영속성 전이(Cascade) + 고아 객체 제거를 사용해서..

Dev/JPA

[강의정리] 영속성 전이, 고아객체, 생명주기

출처: 자바 ORM 표준 JPA 프로그래밍 영속성 전이 영속성 전이(cascade)를 사용하면 말그대로 영속성을 전이시킬수 있다. A 엔티티를 영속화하면, 그에 연관된 B 엔티티도 자동으로 영속화 하는것이 가능해진다. 예시) @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) 종류도 다양하다. CASCADE의 종류 • ALL: 모두 적용 • PERSIST: 영속 • REMOVE: 삭제 • MERGE: 병합 • REFRESH: REFRESH • DETACH: DETACH 오해하면 안되는점은, 이건 연관관계 매핑과 아무상관이 없다. 그저 편하라고 있는 기능을 제공해줄 뿐이다. 고아 객체 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 고아 객체라고 한다. ..

Dev/JPA

[강의정리] 프록시와 연관관계 관리

출처: 자바 ORM 표준 JPA 프로그래밍 프록시 객체는? 엔티티를 조회할때, 프록시 객체를 생성하여 그것을 대신 조회할수있다. em.find() 말고 em.getReference()를 호출하면, 일어나는 일들이다: 1. 진짜 엔티티를 상속하고 구조도 같은 프록시 객체가 만들어짐. 이 안에 실제 데이터는 없다. 2. 이렇게 얻은 객체에서 필드를 호출함 3. 그 순간 영속성 컨텍스트로 초기화 요청이 오고, 진짜 엔티티를 생성함 4. 프록시 객체가 진짜 객체로 요청을 다시 보내고 받아온 후 반환함. 한번만 초기화 되며, 프록시 객체 생성 전에 이미 영속성 컨텍스트에 진짜 엔티티 객체가 들어와 있으면, 그냥 진짜를 반환함. . . . 이런 프록시 객체는 어디에 사용될까? 지연로딩(lazy loading)에 사..

Dev/JPA

[강의정리] 상속관계 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 계속 언급했지만 객체지향 언어와 관계형 DB는 패러다임의 불일치가 있다. 관계형 데이터베이스는 상속관계가 없고, 이와 유사한 슈퍼타입 서브타입 관계를 자바에 매핑해야한다. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) • JOINED: 조인 전략 • SINGLE_TABLE: 단일 테이블 전략 • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 상속관계 매핑의 종류 1. 조인전략 장점 - 테이블 정규화가 잘됨 - 저장공간 효율적임: 각 엔티티 클래스가 필요한 필드만 가지고 있어서 null로 채워줄 필요 없음 - 외래 키 참조 무결성 제약조건 활용 단점 - 조회시 조인이 많이 발생(조회 쿼리가 복잡함)->성능..

Dev/JPA

[강의정리] 연관관계 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 객체와 테이블을 매핑하기위해서 페러다임의 불일치를 해결해야 한다. 객체의 참조와, 테이블의 외래 키를 매핑해야 하는것이다. JPA의 @JoinColumn를 사용하면 이를 쉽게 해결할수있다. 용어 정리, 설명 • 방향(Direction): 단방향, 양방향 -객체는 참조의 방향이 있다. A 객체가 B 객체를 참조하면 단방향 매핑이 하나 있는것이며, B 객체가 A 객체를 참조하면 단방향 매핑이 두개 있는것이고, 이를 양방향 매핑이라 부른다. 양방향 매핑을 하면, 1. 연관관계의 주인을 설정해주어야 한다. 2. 연관관계 편의 매소드를 작성해야 한다. 양방향 매핑은 나중에 필요하면 추가하는 식으로 작성하는것이 바람직하다. • 다중성(Multiplicity): 다대일(N:..

Dev/JPA

[강의정리] 엔티티 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 ㅇ 자주 쓸것같은것만 아주 간단하게 정리해보겠다. • 객체와 테이블 매핑: @Entity, @Table • 필드와 컬럼 매핑: @Column @Enumerated @Temporal @Lob @Transient • 기본 키 매핑: @Id @Entity 테이블과 매핑할 클래스에 사용. JPA 관리하에 두게함. 기본 생성자 필수. @Table (name = blabla)통해 테이블 이름 설정가능 @Column (name = blabla)통해 칼럼 이름 설정가능 insertable 옵션도 있음 @Enumerated EnumType.STRING으로 해야 나중에 대참사 예방가능 @Temporal :LocalDate, LocalDateTime 쓰면 안해도 괜찮음 @Lob 지..

ChoiBulldog
'JPA' 태그의 글 목록