본문 바로가기

개발/JPA

(17)
[JPA] week8 컨트롤러에서는 Entity를 반환하지말고, DTO를 반환하자. * Order -> OrderDto 변경시 주의 사항 - OrderItems 도 entity이므로, 함께 DTO로 변경해야한다. tip: orderItems는 List의 형태. Dto로 반환시, Summary 정보를 원하기 때문에, api 스펙대로 요약하면 1detph 줄어든다. 예) orderItems: { orderItem: { orderNo: 1 item : { name: "바나나", count: 1 } }, orderItem: { orderNo: 1 item : { name: "딸기", count: 3 } }, } -> orderItems: { orderItem: { {바나나, 3} } } -> 1 depth 줄어들어 가독성 올라감. ..
[JPA 활용2 스터디] week 7 API 개발 기본 Controller에서 Entity를 바로 받거나 반환하면 안되는 이유 예) saveMember(@RequestBody @Valid Member member) // Member는 Entity 1) 요청마다 Member 내 validation의 조건이 달라진다. : 회원가입시 전화번호가 필수지만, 회원 수정시 전화번호는 null 가능. 2) Entity의 column명 변경시, api의 스펙이 변경되는 문제 발생. 3) parameter 파악 위해 Dto만 열어보면 되는데, Entiy 받으면 api 스펙 문서를 열어봐야함. -> 요청 파라메터/응답은 dto를 쓰자 4) 필요하지 않은 필드 (예. member의 order)도 가져오므로 성능 이슈 참고: @Data 애노테이션 사용 유무 En..
[JPA] 쿼리 언어 문법 (기본, 중급) 기본: JPA에서 지원하는 쿼리 방법 - JPQL : 객체 지향 쿼리 : 동적쿼리를 짜는데 불편. -> 대책: Criteria (실무에서 안 쓴다.) - QueryDSL * 특수한 경우만 JDBC API, MyBatis, SpringJdbcTemplate 함께 사용 Note OneToMany 관계 설정시, 메모리 낭비가 있더라도 바로 초기화하자. @OneToMany(mappedBy = "team") private List members = new ArrayList(); @Embedded, @Embedable 1) @Embedded: Entity내 객체에 붙이기 (예. Person 내 Address에) 2) @Embedable: 클래스에 붙이기 (예. Address class 위) 기본: JPQL 문법 기..
[JPA 기본] 9. 값 타입 주요 개념 1. 임베디드 타입 2. 값 타입 컬렉션 JPA의 데이터 타입 1. 엔티티 타입 - @Entity 애노테이션 붙는 객체 - 데이터 변해도 PK 사용하여 추적 가능. (예. 6번 학생의 키가 바뀌어도, 6번 학생은 찾을 수 있다.) 2. 값타입 - 자바 기본 타입, 객체 (int, Integer, String...) - 식별자 없다. 값 변경시 추적 불가 - 예. 100 -> 200 으로 변경 값타입 종류 1. 기본 값 타입 - 기본 타입 (int, double) / 래퍼 클래스 (Ineger, Long) / String ** 래퍼 클래스나 String은 공유 가능하지만 (= 같은 주소값 가지지만) setter 제공하지 않아서 변경 불가. - 생명주기를 엔티티에 의존 (예. 회원 삭제시 나이 삭..
[JPA 기본] 8. 프록시와 연관관계 정리 프록시 프록시 등장 배경 : Member가 Team의 정보를 가지고 있다. 그런데 Member의 정보를 조회할 때 Team도 같이 조회되는 비효율 발생 해결법: Proxy, 지연 로딩 em.find vs em.getReference em.find(): DB에서 실제 엔티티 조회 em.getReference: DB 조회를 미룬다. 대신 프록시 객체 조회 프록시 특징 - 실재 클래스 상속 받아 만듦. - 프록시 객체는 실제 객체의 참조 보관 - 처음 사용시 한 번만 초기화 프록시 주의 사항 - 프록시 객체를 초기화할 경우, 실제 엔티티로 바뀌지 x. - 타입 체크시 == 비교 대신 instance of 사용 - 영속성 컨텍스트에 내가 찾는 엔티티가 있다면, em.getReferene()도 실제 엔티티 반환 ..
[JPA 기본] 7. 고급 매핑 1. 상속관계 매핑 - 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑 1.1 테이블 구성 전략 (이론) 조인 전략 ITEM의 하위에 ALBUM, MOVIE, BOOK 테이블 둠. ITEM 테이블의 DTYPE에 따라 조인할 테이블 결정 단일 테이블 전략 ITEM 테이블에 하위 테이블의 속성 값(ARTIST, AUTHOR등)을 모두 넣음. 보통 성능 때문에 사용 클래스별 테이블 전략 공통요소(NAME, PRICE)를 각 테이블이 지님. 예. ITEM 테이블 없이 3개의 테이블 가져감 (ALBUM, MOVIE, BOOK) 2. 슈퍼타입-서브타입을 JPA에서 매핑하는 방법 extends 키워드 사용 public class Album extends Item 3. 각 전략별 특징 상세 내용 조인 전략 ..
[JPA 기본] 6. 다양한 연관관계 매핑 연관관계 매핑시 고려사항 3가지 1. 다중성 예) ManyToOne, OneToMany, OneToOne, ManyToMany 2. 단방향인지 양방향인지 3. 연관관계의 주인 다중성 - 주의: ManyToMany는 실무에서 쓰면 안된다. - ManyToOne, OneToMany를 주로 쓰며, OneToOne은 가끔 나온다. 양방향 vs 단방향 - 테이블은 외래 키 하나로 양쪽 조인 한다. 따라서 방향이라는 개념이 없다. - 반면 객체는 참조용 필드로 참조 가능. 따라서 방향 개념 존재 (양방향, 단방향) 연관 관계의 주인 객체 2개가 양방향 관계를 맺을 때, 둘 중 테이블의 외래키를 관리할 곳을 찾아야 함. - 주인 : 외래 키를 관리 - 주인 반대편: 외래 키 영향 x. 단순 조회만 가능. 1. 다대일..
[JPA 기본] 5. 연관관계 매핑 기초 단방향 연관관계 목표 - 객체와 테이블 연관관계 차이를 이해한다. - 객체의 참조와 테이블의 외래 키를 매핑한다. 용어 - 방향: 단방향 , 양방향 - 다중성: 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) - 연관관계의 주인(Owner): 양방향 연관관계에서는 관리의 주인이 필요하다. 객체를 테이블에 맞추어 모델링할 경우의 문제점. - 식별자로 다시 조회하는데, 이는 객체 지향적인 방법은 아니다. 객체와 테이블의 데이터 검색 방식 - 테이블: 외래 키로 조인을 사용하여 연관 테이블을 찾는다. - 객체: 참조를 사용하여 연관 객체를 검색 객체지향 모델링시 주의점 1:N에서 N의 위치를 파악해야한다. 예. TEAM, MEMBER -> MEMBER 가 N 양방향 연관관계와 연관관계의 ..