Backend

    JPQL 기본

    JPQL 기본

    소개 EntityManager.find → 이후 필요시 객체 그래프 탐색 검색을 하는 경우 엔티티 객체를 대상으로 쿼리를 작성해야한다. 모든 DB 데이터를 객체로 변환하는 것은 좋지 않기 때문에 필요한 데이터만 불러오기 위해 검색 조건이 포함된 SQL을 사용한다. JPQL은 객체 지향 쿼리 언어이고 엔티티 객체를 대상으로 쿼리를 날린다. (SQL은 DB 대상 쿼리) SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. List members = em.createQuery( "select m from Member m where m.username like '%kim%'", Member.class ).getResultList(); Criteria JPQL은 동적 쿼리를 만드는 것이 어렵다. 또한 ..

    값 타입

    값 타입

    엔티티 타입 @Entity 데이터가 변해도 식별자를 이용해 추적하는 것이 가능하다. 즉 컬럼의 데이터가 변경되더라도 @Id로 데이터를 추적하는 것이 가능하다. 값 타입 int, Integer, String 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경되더라도 추적이 불가능하다. 값 타입 분류 기본값 타입 : 자바 기본 타입 (프리미티브 타입), 래퍼 클래스, String 임베디드 타입 (Embeddet Type, 복합 값 타입) : 커스텀 클래스 같은 형태 ex) Position (x, y), Address (city, street, zipcode) 컬렉션 값 타입 : 기본 값타입 , 임베디드 타입을 컬렉션에 넣은 형태 기본값 타입 생명주기를 엔티티에 의존한다..

    즉시 로딩과 지연 로딩

    즉시 로딩과 지연 로딩

    지연 로딩을 통해 연관관계 데이터를 실제 조회 시점에 가져오는 것이 가능하다. fetch = FetchType.LAZY @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩으로 세팅 @JoinColumn(name = "TEAM_ID") private Team team; 연관 관계 엔티티를 지연 로딩으로 세팅하면 프록시로 가져온다. 지연 로딩으로 가져온 엔티티는 실제 값을 사용하는 시점에 프록시를 초기화한다. Member member1 = new Member(); member1.setUsername("zayson1"); member1.setTeam(team); // Team의 데이터는 프록시로 가져온다. (Team 조회 쿼리 안날아감) Member member = em.find(M..

    프록시

    프록시

    연관관계가 있는 엔티티를 조회 시에 상황에 따라 한번에 연관관계 데이터까지 가져오거나 조회를 원한 특정 엔티티만 조회하고 싶은 경우가 있다. 회원과 팀이 연관관계가 있는 경우 회원 정보를 조회하면서 회원이 속한 팀의 정보도 함께 조회하고 싶은 경우 회원과 팀이 연관관계가 있는 경우 회원 정보만 조회하고 팀의 정보는 조회하고 싶지 않은 경우 JPA는 이러한 상황을 해결하기 위해 프록시와 지연로딩을 통해 해결해준다. 프록시 기초 em.getReference() : 데이터베이스 조회를 미루는 프록시(가짜) 엔티티 객체를 가져온다. 따라서 쿼리가 실행되지 않는다. Member findMember = em.getReference(Member.class, member.getId()); System.out.print..

    상속관계 매핑

    상속관계 매핑

    객체지향은 상속관계가 존재하지만 RDB는 상속 관계가 없다. RDB에는 슈퍼타입/서브타입 관계같은 상속 관계와 비슷한 모델링 기법이 있다. 물품을 RDB 논리 모델링을 진행하는 경우 물품 > 음반, 영화, 책 → 공통된 데이터를 물품이 갖는다 (슈퍼타입 / 서브타입) 슈퍼타입/서브타입 → 객체 상속관계 변환 방법 조인 전략 : 슈퍼타입용 테이블과 서브타입 테이블을 따로 구성하고, 슈퍼타입 테이블에 구분 컬럼을 둔다. 정규화가 잘 된 테이블 전략이다. 단일 테이블 전략 (Default) : 서브타입 테이블 컬럼을 슈퍼타입 테이블 하나에 모은다. 구분 컬럼을 둔다. 성능적인 측면에서 장점이 있다. 구현 클래스 별 테이블 전략 : 슈퍼타입의 공통 데이터를 서브타입 테이블에 컬럼으로 넣어 사용한다. 조인 전략 ..