Spring
-
JPA - Entity 설계시 주의점Spring/JPA 2022. 3. 16. 19:18
Entity 설계 시 주의점 Entity 설계 시 다음과 같은 사항들을 주의해야한다. 엔티티에는 가급적 Seter를 사용 금지 Setter를 무분별하게 사용하게 되면 어디서 해당 값이 변경되었는지 추적하기가 힘들어진다. 즉, 유지보수가 어려워지기 때문에 사용하지 않는 것이 좋다. Setter가 필요할 경우에는 추적하기 쉽도록 메서드를 따로 생성해준다. @Entity @Getter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; // Setter 대신 생성해준 메서드 pub..
-
JPA - 설계 순서Spring/JPA 2022. 3. 16. 15:50
김영한님이 추천하는 설계 순서는 다음과 같다. 1. 엔티티 클래스 설계 엔티티 클래스를 설계하고 필요하면 엔티티를 UML로 그린다 2. DB 테이블 설계 엔티티 클래스 설계 단계에서 사실 필요한 DB 테이블의 그림 어느정도 그려진다 여기서 ERD를 그리고 DB 특성에 맞는 PK, FK, INDEX, 제약조건 같은 부분에 초점을 맞춘다. 3. 엔티티 클래스와 DB 테이블 설계를 성능과 제약에 맞추어 양방향으로 조율 엔티티 클래스 객체를 중심으로 설계해도, 현실적으로 DB에 데이터를 넣어야 하므로, 구조적 한계가 있을 수 있다. 성능 때문에 역정규화가 필요할 때도 있다. 이런 부분을 고려해서 엔티티 클래스를 DB에 맞추는 과정을 반복한다.
-
JPA - JPQL 기본 문법 2Spring/JPA 2022. 3. 11. 17:56
기본 문법 2 경로 표현식 용어 특징 탐색 명시적 조인과 묵시적 조인 페치 조인(fetch join) 엔티티 페치 조인 컬렉션 페치 조인 페치 조인과 일반 조인의 차이 페치 조인의 한계 다형성 쿼리 쿼리에 엔티티 직접 사용 벌크 연산 경로 표현식 점( . )을 찍어 객체 그래프를 탐색하는 것을 말한다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 상태 필드(state filed) : 단순히 값을 저장하기 위한 필드(예시 : m.username) 연관 필드(association field) : 연관관계를 위한 필드 - 단..
-
JPA - JPQL 기본 문법과 기능Spring/JPA 2022. 3. 11. 14:56
JPQL 기본 문법과 기능 JPA가 지원하는 다양한 쿼리 JPQL 기본 문법 집합과 정렬 반환 타입 결과 조회 파라미터 바인딩 프로젝션(SELECT) 프로젝션(SELECT) - 여러 값 조회 페이징 API 조인 ON절을 활용한 조인 서브 쿼리 JPQL 타입 표현 조건식 - CASE JPQL 기본 함수 JPA가 지원하는 다양한 쿼리 JPQL 검색을 할 때 테이블이 아닌 엔티티 객체를 대상으로 검색 필요한 데이터만 DB에서 불러오기 위해 검색 조건이 포함된 SQL SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어(특정 DB SQL에 의존 X) SQL과 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리를 작성한다. //검색 ..
-
JPA - 값 타입(기본값, 임베디드, 불변 객체, 컬렉션Spring/JPA 2022. 3. 10. 17:49
값 타입 기본값 타입 임베디드 타입(복합 값 타입) 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 JPA의 데이터 타입 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 - int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입 기본값 타입 - 자바 기본 타입(int, double) - 래퍼 클래스(Integer, Long) - String 임베디드 타입 - 복합 값 타입 컬렉션 값 타입 기본값 타입 String, int 등 생명주기를 엔티티에 의존 (예시 : 회원을 삭제하면 이름, 나이 필드도 함께 삭제) 값 타입은 공유하면 안된다.(예시 : 회원 이..
-
JPA - 프록시와 연관관계(즉시 로딩, 지연 로딩, CASCADE)Spring/JPA 2022. 3. 10. 13:12
프록시와 연관관계 프록시 즉시 로딩과 지연 로딩 영속성 전이(CASCADE)와 고아 객체 프록시 프록시란? 실제 클래스를 상속받아서 만들어지는 객체 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드 호출한다. em.find()와 em.getReference() 차이 - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 객체의 초기화 프록시 객체는 처음 사용할 때 한 번만 초기화된다. 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것이 아닌 프록시 객체를 통해서 실제 엔티티에 접근한다. 프록시 객체는 원본 엔티티를 상속받..
-
JPA - 상속관계 매핑Spring/JPA 2022. 3. 9. 18:05
상속관계 매핑 관계형 데이터베이스는 상속 관계라는 개념이 없다. 대신에 슈퍼타입 서브타입 관계라는 모델링 기법이 있는데 이를 이용하여 객체의 상속과 DB의 슈퍼타입 서브타입 관계를 매핑하여 사용한다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블을 생성하는 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXXX) - JOINED : 조인 전략 - SINGLE_TABLE : 단일 테이블 전략 - TABLE_PER_CLASS : 구현 클래스마다 테이블 생성 전략 @DiscriminatorColumn(name="DTYPE"..
-
JPA - 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)Spring/JPA 2022. 3. 9. 15:43
다대일 [ N : 1 ] 일대다 [ 1 : N ] 일대일 [ 1 : 1 ] 다대다 [ N : M ] 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다) 테이블은 외래 키 하나로 서로 양쪽 조인이 가능하지만 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 즉, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이 된다. 객체 양방향 관계는 A->B, B->A 처럼 참조를 양쪽에서 해줘야 한다. 여기서 중요한 것은 외래 키를 관리할 연관관계 주인을 지정해줘야 한다. 연관관계의 주인은 외래 키를 관리하는 참조이며 연관관계의 주인이 아닌 객체들을 외래 키에 영향을 주지 않는다. 즉, 읽기만 가능하고 쓰기, 업데이트, 삭제가 안된다는 뜻이다. 다대일 [ N : 1 ] 단방향과 양방향 [N : 1] 에..