본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 경로 표현식경로 표현식은 .(점)을 찍어 객체 그래프를 탐색하는 것이다.상태 필드(static field) : 단순히 값을 저장하기 위한 필드연관 필드(association field) : 연관관계를 위한 필드단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 특징상태 필드 : 경로 탐색의 끝이며, 더이상 탐색이 불가능하다.String query = "select m.username, m.age from Member m";단일 값 연관 필드 : 묵시적 내부 조인이 발생하며, 탐색을 ..
OSIV란? Open Session In View 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 클라이언트 요청이 들어올 때 영속성 컨텍스트를 생성해서 요청이 끝날 때까지 같은 영속성 컨텍스를 유지한다. 하여 한 번 조회된 엔티티는 요청이 끝날 때까지 영속 상태를 유지한다. 뷰까지 영속성 컨텍스트가 살아있음에 따라 컨트롤러나 뷰에서도 지연 로딩을 사용할 수 있게 된다. Spring Boot JPA 의존성을 주입 받아 애플리케이션을 구성할 경우 기본적으로 OSIV가 적용된다. (default: true) OSIV ON spring.jpa.open-in-view: true 트랜잭션 시작 시점에 영속성 컨텍스트가 데이터베이스 커넥션을 가져오며, 트랜잭션 종료 시점이 아닌 API 응답이 끝날 때까지 영속성 컨텍스..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. JPQL이란?객체지향 쿼리 언어테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리한다.JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다는 장점이 있다.JPQL도 결국 SQL로 변환되어 실행된다. JPQL 기본 문법select, update, deleteselect m from Member as m where m.age > 18SQL 문법과 동일하다. 엔티티, 속성은 대소문자를 구분한다. (Member, age)JPQL 키워드는 대소문자를 구분하지 않는다. (SELECT, FROM, WHERE)테이블 이름이 아닌 엔티티 이름을 사용한다.별칭을 필수로 사..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. JPA는 매우 다양한 쿼리 방법을 지원한다.JPQLJPA CriteriaQueryDsl네이티브 SQLJDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용하나씩 알아보자. JPQLJPA를 사용하면 엔티티 객체를 중심으로 개발해야 한다.문제는 검색 쿼리인데, 테이블이 아닌 엔티티 객체를 대상으로 검색하기 때문에 모든 DB 데이터를 객체로 변환해 검색하는 것은 불가능하다. 따라서 검색 조건이 포함된 SQL을 통해 필요한 최소한의 데이터만 DB에서 불러와야 한다. JPA는 이러한 문제를 위해 JPQL을 제공한다.SQL을 추상화한 객체 지향 쿼리 언어SQL과 문..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. JPA의 데이터 타입 종류💡 엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 추적 가능ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능💡 값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있어 변경 시 추적 불가능ex) 숫자 10을 20으로 변경하면 완전히 다른 값으로 대체값 타입의 종류기본값 타입임베디드 타입컬렉션 값 타입 값 타입기본값 타입ex) String name, int age생명주기를 엔티티에 의존한다.회원 삭제 시 이름, 나이 필드도 함께 삭제값 타입은 공유하면 안된다.Side ..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 영속성 전이 (CASECADE)특정 엔티티를 영속 상태로 만들 때 그와 연관된 엔티티도 함께 영속 상태로 만드는 기능이다.예) 부모 엔티티 저장시 자식 엔티티도 함께 저장영속성 전이는 연관관계를 매핑하는 것과 아무 관련 없다. 부모 엔티티를 영속화(persist)할 때, 자식 엔티티도 함께 영속화하는 편리함을 제공해주는 기능일 뿐이다.부모 엔티티와 자식 엔티티를 저장하는 간단한 예제를 통해 확인해 보자. 👉🏻 영속성 전이 적용 전@Entitypublic class Parent { ... @OneToMany(mappedBy = "parent") private Lis..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 즉시로딩 vs 지연 로딩 회원을 저장하고 조회해오는 간단한 로직이다.즉시로딩을 사용했을 때와 지연로딩을 사용했을 때의 차이점이 무엇일까?Member member = new Member();member.setUsername("member");em.persist(member); // 저장em.flush();em.clear();Member findMember = em.find(Member.class, member.getId()); // 조회tx.commit(); 지연로딩@Entitypublic class Member extends BaseEntity { ... @ManyToOne(fe..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 프록시JPA를 사용하면 객체 그래프를 통해 연관관계를 탐색할 수 있다는 장점이 있다.그런데 엔티티들은 데이터베이스에 저장되어 있기 때문에 하나의 객체를 조회할 때 그와 연관되어 있는 엔티티들을 모두 조회하는 것보다는필요한 연관관계만 조회해 오는 것이 효과적일 것이다. 예를 들어 Member와 Team이 있을 때, Member 조회 시 항상 Team의 정보도 함께 조회해야 할까?실제 필요한 비즈니스 로직에 따라 다르다.Member와 Team을 거의 항상 같이 사용하는 경우Member와 Team을 거의 같이 사용하지 않고, Member만 출력하는 경우가 많으며 Team은 정말 어쩌다 호출하는 ..