본문 바로가기

728x90
반응형

전체 글

(75)
객체지향 쿼리 언어 - (4) JPQL - (3)페치 조인JPQL에서 성능 최적화를 위해 제공하는 기능이다연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능으로 join fetch 명령어로 사용할 수 있다 엔티티 페치 조인 select mfrom Member m join fetch m.team회원과 팀을 함께 조회한다팀이 프록시가 아닌 실제 엔티티이므로 연관된 팀을 사용해도 지연 로딩이 일어나지 않는다  컬렉션 페치 조인 select tfrom Team t join fetch t.memberswhere t.name = '팀A'팀을 조회하면서 페치 조인을 사용해 연관된 회원 컬렉션도 함께 조회한다위의 JPQL 결과는 List 형태이다 같은 팀A가 회원 수 만큼 조회된다  페치 조인과 DISTINCT DISTINCT는 중복된 결과를 제..
객체지향 쿼리 언어 - (3) JPQL - (2)페이징 API데이베이스마다 페이징을 처리하는 SQL 문법이 다르다 JPA는 페이징을 다음과 같이 추상화한다  - setFirstResult(int startPosition): 조회 시작 위치(0부터 시작한다)  - setMaxResults(int maxResult): 조회할 데이터 수TypeQuer query = em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC", Member.class); query.setFirstResult(10);query.serMaxResult2(20);query.getResultList(); //11번 부터 20건의 데이터를 조회한다 페이징 SQL을 더 최적화하고 싶다면 JPA가 제공하는 페이징..
객체지향 쿼리 언어 - (2) JPQL - (1)기본 문법과 쿼리 APISQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있다 select m from Member as m where m.username = 'Hello' 대소문자 구분엔티티와 속성은 대소문자를 구분한다 (Member, username)JPQL 키워드는 대소문자를 구분하지 않는다 (select, from, as) 엔티티 이름Member는 엔티티 명으로 엔티티 클래스에 지정할 수 있다기본값은 클래스 명이다 별칭은 필수AS를 사용해 별칭을 주었는데 JPQL은 별칭이 필수이다AS 키워드는 생략 가능하다  TypeQuery, QueryJPQL을 실행하기 위한 쿼리 객체가 필요한데,반환할 타입을 명확하게 지정가능하면 TypeQuery 객체를 사용하고, ..
객체지향 쿼리 언어 - (1) 객체 지향 쿼리 소개식별자로 엔티티를 조회하는 기능을 넘어선 현실적이고 복잡한 검색 방법이 필요하다 모든 엔티티를 메모리에 올려두고 검색하는 것은 현실성이 없으므로 SQL을 통해 최대한 필터링해 조회해야 한다이때 검색을 데이터베이스가 아닌 엔티티 객체를 대상으로 하는 방법이 필요하다-> JPQL 사용 JPQL의 특징  - 테이블이 아닌 객체를 대상으로 하는 객체지향 쿼리이다  - SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다     - JPA는 JPQL을 분석해 적절한 SQL을 만들어 데이터베이스를 조회해 이를 엔티티 객체로 반환한다 JPA가 지원하는 기능  - JPQL  - Criteria  - Native SQL - QueryDSL  - JDBC 직접 사용, MyBatis 같은 SQL..
값 타입 - (2) 값 타입과 불변 객체값 타입 공유 참조값 타입을 여러 엔티티에 공유하면 위험하다 예로 들어, 회원1,2가 같은 값 타입을 공유할 때, 회원1의 값을 바꾸면 회원2의 값도 함께 바뀐다 이런 현상을 부작용이라 한다값 타입 복사값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다 자바는 기본 타입에 값을 대입(=)하면 값을 복사해서 전달한다 자바는 객체에 값을 대입하면 항상 참조 값을 전달한다복사하지 않고 원본의 참조 값을 직접 넘기는 것을 막을 방법이 없다불변 객체객체를 불변하게 만들면 값을 수정할 수 없으므로 부작용을 차단할 수 있으므로 값 타입은 가능하다면 불변 객체로 설계해야 한다 불변 객체는 수정자를 만들지 않는 형태로 구현되며, 값을 수정해야 할 경우 새로운 객체를 생성해 사용해..
값 타입 - (1) JPA의 데이터 타입은 두 가지로 분류되는데 엔티티 타입과 값 타입으로 분류된다 엔티티 타입은 @Entity로 정의하는 객체로 식별자를 통해 지속적인 추적 가능하다 값 타입은 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체로 속성만 존재하므로 추적 불가능하다값 타입은 다시 세 가지로 분류되는데 기본 값 타입, 임베디드 타입, 컬렉션 값 타입으로 분류된다 기본 값 타입 @Entitypublic class Member { @Id @GeneratedValue private Long id; private String name; private int age; ...} 위의 예시에서 String, int가 값 타입이다 엔티티는 id라는 식별자 값도 가지고 생명주기도 ..
프록시와 연관관계 정리 - (3) 영속성 전이: CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 영속 상태로 만들기 위해 영속성 전이 기능을 사용한다JPA는 CASCADE 옵션으로 영속성 전이를 제공한다 private static void saveNoCascade(EntityManager em) { Parent parent = new Parent(); em.persist(parent); Child child = new Child(); child.setParent(parent); parent.getChildren().add(child); em.persist(child)}JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다 영속성 전이를 사용하지 않으면 부모 엔티티와 자식 엔티티를 각각 영속 상태로 만..
프록시와 연관관계 정리 - (2) 즉시 로딩과 지연 로딩프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다 즉시 로딩엔티티를 조회할 때 연관된 엔티티도 함께 조회한다예로 들어 회원 조회 시 연관된 팀도 함께 조회한다 @ManyToOne(fetch=FetchType.EAGER)을 이용해 즉시 로딩을 사용할 수 있다 대부분의 JPA 구현체는 즉시 로딩을 최적화하기 위해 가능하면 조인 쿼리를 사용해 조회한다 즉시 로딩 실행 시 JPA가 내부 조인이 아닌 외부 조인을 사용한다 외래 키에 null 값을 포함하는 경우 내부 조인을 하면 외래 키가 null인 데이터를 조회할 수 없다이런 상황을 대비해 JPA는 외부 조인을 사용한다 하지만 외래 키가 not null인 경우 내부 조인을 사용해도 된다내부 조인을 사용하는 것이 성능 최적화에 더 ..

728x90
반응형