GitHub

https://github.com/Choidongjun0830

Spring 78

[JPA 활용 2편] API 개발 고급 - 지연 로딩과 조회 성능 최적화

주문 + 배송 정보 + 회원을 조회하는 API를 만들기 간단한 주문 조회 V1: 엔티티를 직접 노출 -> 무한 루프에 빠지게 됨. 주문에서 멤버로, 멤버에서 주문이 있네? 주문으로양방향이 걸리는 필드를 @JsonIgnore 해주어야 함.하지만 이러면 500 오류가 남.또는 Hibernate5Module을 등록해서 사용해야함.하지만 엔티티를 직접 노출하면 데이터 그대로 노출하는 것이라 좋지 않다. 이 방식을 사용하면 안된다.DTO로 변환해서 사용하는 것이 좋다.지연 로딩을 피하기 위해 즉시 로딩으로 바꾸면 안됨. 연관 관계가 필요없는 경우에도 데이터를 항상 조회해서 성능 문제가 발생한다. 간단한 주문 조회 V2: 엔티티를 DTO로 변환 이 방식이면 엔티티가 바뀌어도 api 스펙이 바뀌지 않아서 좋다. 하지..

Spring 2024.07.03

[JPA 활용1 복습] 도메인 분석 설계

멤버와 오더가 있을 때. 회원이 주문을 하는 것이지만, 멤버와 오더를 동급으로 두고 고민해야 한다.실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것으로 충분하다.  Getter는 모두 열어두는 것이 편하다.Setter는 모두 열어두면 엔티티가 왜 변경되는지 추적하기 힘들어지기 때문에 Setter를 제공하는 것 대신에, 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공해야 한다.  @Embeddable@Getterpublic class Address { private String city; private String street; private String zipCode; protected Address() {} public Address(Str..

Spring 2024.06.27

[JPA 기본편] 객체지향 쿼리 언어2 - 중급 문법

경로 표현식.(점)을 찍어 객체 그래프를 탐색하는 것select m.username -> 상태 필드from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A';m.team은 엔티티로 넘어가는 것. 이것을 단일 값 연관 필드라 함.m.orders. orders는 보통 컬렉션. 컬렉션으로 가는 것을 컬렉션 값 연관 필드라 함. 상태 필드(state field): 단순히 값을 저장하기 위한 필드연관 필드(association field):연관 관계를 위한 필드단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 ..

Spring 2024.06.26

[JPA 기본편] 객체지향 쿼리 언어1 - 기본 문법

JPQL은 엔티티 객체를 대상으로 쿼리. SQL은 데이터베이스 테이블을 대상으로 쿼리.JPQL을 한마디로 정의하면 객체 지향 SQL 하지만, JPQL로 동적 쿼리를 작성하기 불편하다.. Criteria //Criteria CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(Member.class); Root m = query.from(Member.class); String username = "aaaa"; CriteriaQuery cq = quer..

Spring 2024.06.25

[JPA 기본편] 값 타입

JPA는 데이터 타입을 두가지로 분류엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능.값 타입int, integer, string처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체값 타입은 기본값 타입, 임베디드 타입, 컬렉셔 값 타입이 있다.기본 값 타입자바 기본 타입(int, double)래퍼 클래스(Integer, Long)String임베디드 타입(복합 값 타입)컬렉션 값 타입기본 값 타입생명 주기를 엔티티에 의존회원을 삭제하면 이름, 나이 필드도 함께 삭제값 타입은 공유하면 안됨회원 이름 변경 ..

Spring 2024.06.24

[JPA 기본편] 프록시와 연관 관계 관리

프록시멤버와 팀이 연관된 정보라고 했을 때, 어떤 경우에는 멤버만 가져오고 싶고, 어떤 경우에는 멤버와 팀을 다 가져오고 싶을 수 있다.  프록시 기초em.find() vs em.getReference()em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 getReference()를 호출하는 시점에는 데이터베이스의 쿼리를 안하고, 실제 사용되는 시점에 쿼리를 날린다. getId로 사용할 때는 데이터베이스에서 가져오는 것이 아니라서 쿼리를 날리지 않는다. 프록시는 실제 클래스를 상속받아서 만들어지고, 실제 클래스와 겉 모양이 같다. 프록시 객체는 실제 객체의 참조(target)을 보관하고, 프록시 객체를..

Spring 2024.06.23

[JPA 기본편] 고급 매핑

상속 관계 매핑관계형 데이터베이스는 상속 관계가 없음슈퍼 타입 서브 타입 관계라는 모델링 기법이 객체 상속과 유사함상속 관계 매핑: 객체의 상속 구조와 DB의 슈퍼 타입 서브 타입 관계를 매핑슈퍼 타입 서브 타입 논리 모델을 실제 물리 모델로 구현하는 방법각각 테이블로 변환 -> 조인 전략장점테이블 정규화외래키 참조 무결성 제약조건 활용 가능저장공간 효율적 단점조회 쿼리가 복잡함조회시 조인을 많이 사용데이터 저장시 Insert sql 2번 호출@Inheritance(strategy = InheritanceType.JOINED)통합 테이블로 변환 -> 단일 테이블 전략@DiscriminatorColumn이 없어도 DTYPE이 생김.장점조인이 필요 없어서 일반적으로 조회 성능이 빠름조회 쿼리가 단순함단점자식..

Spring 2024.06.20
728x90