java 84

[JAVA] 프로젝션과 페이징

프로젝션이란? select 절에 조회할 대상을 지정하는 것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입 ( 숫자, 문자 등 기본 데이터 타입 ) select m from Member m → 엔티티 프로젝션 select m.team from Member m → 엔티티 프로젝션2 select m.address from Member m → 임베디드 타입 프로젝션 select m.username, m.age from Member m → 스칼라 타입 프로젝션 distinct 로 중복 제거 가능 엔티티 프로젝션 웬만하면 sql하고 jpql 문법하고 거의 비슷하게 명시 해야한다.( 예측이 가능하기 때문에 ) Member에서 Team 정보를 가져올 때 1번처럼하나 2번처럼 하나 쿼리는 같게 나가지만 개발자가..

JAVA 2022.01.13

[JAVA] 값 타입 컬렉션

값 타입을 하나 이상 저장할 때 사용 @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장 할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요 Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity","Street", "10000")); member.getFavoriteFoods().add("족발"); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(new Address..

JAVA 2022.01.13

[JAVA] 값 타입과 불변객체

값타입은 단순하고 안전하게 다룰 수 있어야 한다. 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함 부작용(side effect) 발생 한다. 예시 ) member1과 member2 모두 city, street, 1234 의 주소를 가진다. 이때 member1의 city명만 newCity로 변경해보자 Address address = new Address("city", "street", "1234"); Member member = new Member(); member.setUsername("hello"); member.setHomeAddress(address); em.persist(member); Member member2 = new Member(); member2.setU..

JAVA 2022.01.11

[JAVA] 임베디드 타입(복합값)

우리는 엔티티에 대해 설명할 때 보통 아주 상세 하게 설명하기 보단 추상적으로 설명한다. ex ) 회원 엔티티에는 이름, 근무 시작 날짜 , 근무 종료 날짜 , 주소 도시, 주소 번지, 주소 우편번호가 있다가 아닌 → 회원엔티티는 이름, 근무일, 집주소를 가지고 있다라고 추상적으로 설명 → 이렇게 묶어 낼 수 있는걸 객체로 뽑아내는게 임베디드 타입! 임베디드 타입 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입이라 함 주로 기본 값 타입을 모아서 만들어서 복합값 타입이라고도 함 여기서 기본 값 타입이란 int, String과 같은 값 타입 임베디드 타입 사용법 @Embeddable : 값 타입을 정의하는 곳에 표시 @Embedded : 값 타입을 사용하는 곳에 표시 기본생성자 필수 임베디드..

JAVA 2022.01.11

[JAVA] 영속성 전이(CASCADE) + 고아객체

CASCADE ALL : 모두 적용 PERSIST : 영속 REMOVE : 삭제 MERGE : 병합 REFRESH : refresh DETACH : DETACH Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2); 위 처럼 코드를 작성하면 parent, child1/2가 잘 들어감 근데 만약 persist를 세번 안하고 parent를 persist 하는 동시에 child 까지 동시에 넣고 싶다면?? → CASCA..

JAVA 2022.01.06

[JAVA] 즉시로딩과 지연로딩

지연로딩 Member만 조회하고 싶은데 굳이 Team까지 가져와야하나?? 지연로딩 사용! 지연로딩 : Member만 조회해옴! LAZY를 사용해서 프록시로 조회 /* Member.java */ @ManyToOne(fetch = FetchType.LAZY) // Member 클래스만 DB에서 조회한다. @JoinColumn private Team team; /* Main.java */ Team team = new Team(); team.setName("teamA"); em.persist(team); Member member1 = new Member(); member1.setUsername("member1"); member1.setTeam(team); em.persist(member1); em.flush()..

JAVA 2022.01.05

[JAVA] 프록시

em.find() VS em.getReference() em.find() : DB를 통해서 실제 엔티티 객체 조회 (DB에 쿼리 나감) em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회(DB에 쿼리가 안나가는데 객체가 조회됨) Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); // 영속성 컨텍스트 초기화 Member findMember = em.getReference(Member.class, member.getId()); System.out.println("findMember = " + findMember.getClass()); // ..

JAVA 2022.01.04

[JAVA] @MappedSuperclass

공통 매핑 정보가 필요할 때 사용한다.( id, name 과 같은 ) : DB 에서는 다른 컬럼이지만 객체에서 반복적으로 사용될때 ( 귀찮음을 줄이기 위한 것 ) 상속관계 매핑 불가. 엔티티, 테이블과 매핑이 불가하다 부모클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다. 조회, 검색이 불가(em.find(BaseEntity) X) 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장 예시 ) 만약 Member와 Team 테이블에 생성한 사람, 생성날짜, 수정한 사람 , 수정 날짜 를 공통적으로 사용하고 싶다면? 1. BaseEntity 생성 package hellojpa; import javax.persistence.MappedSuperclass; import java.time.LocalDateT..

JAVA 2022.01.04

[JAVA] JPA 고급 매핑 (상속 관계 매핑)

상속관계 매핑 관계형 데이터 베이스는 상속 관계를 구현 할 수 없다는 단점을 가지고 있다. 그나마 슈퍼타입, 서브타입 관계가 객체 상속과 유사하다. 슈퍼타입, 서브타입 논리모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 : 조인 전략(Joined) 통합 테이블로 변환 : 단일 테이블 전략 서브타입 테이블로 변환 : 구현 클래스마다 테이블 전략 매핑 시 주로 사용하는 어노테이션 1. @Inheritance(strategy=InheritanceType.XXXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 2. @DiscriminatorColumn(name="DTYPE") → default가 DTYPE 3. @..

JAVA 2021.12.16

[JAVA] JPA 다양한 연관관계 매핑

연관관계 매핑 시 고려사항 3가지 다중성 : 일대일, 일대다, 다대일, 다대다 단방향, 양방향 연관관계 주인 다중성 ※ 보통 일대다, 다대일 이런 경우 맨 앞에 있는 애가 연관관계 주인이다. 1. 다대일 외래키는 항상 다대일 중 '다' 쪽에 존재한다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 '다' 쪽이다. 양방향에서 '다' 쪽인 Member테이블이 Team 에 관한 외래키를 가지고 있으므로 연관관계의 주인이다. 2. 일대다 다대일 관계의 반대방향이다. 일대다에서는 엔티티를 하나 이상 참조 가능하므로 Collection, List, Map 중 하나 사용해야 한다. (실무에서 잘 사용하지 않는다.) '일' 이 연관관계의 주인이다. 2-1. 단방향 하나의 팀은 여러 회원을 참조 할 수 있다. (팀..

JAVA 2021.12.09