본문 바로가기

JPA

(12)
[JPA] 영속성 컨텍스트 JPA에서 가장 중요한 것이 2가지 있습니다. 1. 객체와 관계형 데이트베이스 매핑 2. 연속성 컨텍스트 입니다. EntityManagerFactory 요청이 들어올 때마다 EntityManager를 생성해 줍니다. EntityManager 내부적으로 DatabaseConnection을 사용하여 DB에 접근하게 됩니다. 영속성 컨텍스트에 접근할 수 있습니다. 영속성 컨텍스트 JPA를 이해하는데 가장 중요한 용어입니다. 엔티티를 영구 저장하는 환경이라는 뜻입니다. EntityManager.persist (entity); DB에 저장한다는 것이 아니라 persist는 영속성 컨텍스트에 저장합니다. 영속성 컨텍스트는 논리적인 개념입니다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근합니다. 엔티티 생명주기 비..
[JPA] Auditing 데이터의 기록을 남길 때 보통 공통적으로 가지고있는 컬럼이 있습니다. 바로 생성일자, 수정일자 등이 있습니다. JPA에서는 Audit라는 기능을 제공하고있는데, 이것은 JPA에서 도메인을 영속성 컨텍스트에 저장하거나 혹은 업데이트를 하는 경우에 자동으로 값을 넣어주는 편리한 기능입니다. 1. @EnableJpaAuditing 추가 @EnableJpaAuditing 어토네이션을 추가합니다. @SpringBootApplication @EnableJpaAuditing public class WhiteApplication { public static void main(String[] args) { SpringApplication.run(WhiteApplication.class, args); } } 2. Audi..
[Spring Boot] JPA application.yml (properties)기능 jpa: database-platform: org.hibernate.dialect.MySQL8Dialect hibernate: ddl-auto: create properties: hibernate: format_sql: 'true' show_sql: 'true' jpa.database-platform 접속할 데이터베이스의 SQL Dialect를 설정합니다. 더보기 Dialect(방언)란? JPA는 기본적으로 어플리케이션에서 직접 SQL을 작성하지 않고 JPA가 SQL을 작성하고 실행합니다. 그런데 DBMS 종류마다 사용하는 SQL이 다르기 때문에 JPA는 DBMS에 맞춰 SQL을 생성해야 합니다. 그렇기 때문에 JPA에게 어떤 DBMS를 사용하는지 알려주는 것을 방언을 설정하는 방법입니다. jpa.hib..
[JPA] 쿼리 작성 법 1. 메서드 이름으로 쿼리 생성 1) 순수 쿼리로 짰을 때 2) 메서드 이름으로 쿼리를 생성했을 때 두 개가 같은 동작으로 처리된다. 다양한 기능을 확인하려면 spring공식 문서에 있다. 규칙 1. find... By, read... By 이런 식으로 적어야 한다.( ' ... ' 에는 아무 말이나 들어가도 됨) 2. find...By 뒤에 아무것도 들어가 있지 않으면 전체를 조회한다. (제약조건 없음) 2. @Query를 사용하기 > DTO조회하기 DTO의 경로를 다 적어야 한다. 3. 파라미터 바인딩하기
[JPA] 페치 조인(fetch join)의 한계 1. 페치 조인 대상에는 별칭을 줄 수 없다. 이렇게 하면 나머지 누락 값들이 문제가 될 수 있기 때문이다. 2. 둘 이상의 컬렉션은 페치 조인할 수 없다. OneToMany -> Team - Member OneToMany -> Team - Order 이러한 상황에서 Team에서 Member와 Order를 fetch join은 할 수 없다.(fetch join 컬렉션은 하나만 할 수 있다.) 3. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다. 일대다 같은 경우에는 SQL입장에서 데이터가 뻥튀기되기 때문에 페이징 할 때 사이즈에 맞춰서 잘라지면 누락되는 값이 있을 수 있기 때문이다. 컬렉션을 페이조인할 때 페이징을 사용해서 경고 메시지가 뜨는 걸 확인할 수 있다. 해결방법 1) fetch joi..
[JPA] 페치조인(fetch join)이란? 페치 조인(fetch join)이란 JPQL에서 성능 최적화를 위해 제공하는 기능인데 SQL의 조인 종류와는 다르다. 예를 들어 Member와 Team의 간의 일대다 다대일 연관관계가 되어있고, Member와 Team은 지연 로딩이 설정되어있다. 여기서 Team ==> 팀1 팀 2 Member => 나무늘보, 나무늘보 2, 나무늘보 3 나무늘보, 나무늘보 2 => team 나무늘보 3 => team 2에 소속되어있다고 설정하고, JPQL를 사용해 Member를 가져온 뒤, for문을 사용해서 Member의 username과 관련된 team의 name을 가져온다고 한다면 우선 select를 통해 Member를 가져오고 Team은 지연 로딩, 즉 프록시 이므로 영속성 컨텍스트로 부터 요청하여 select문을..
[JPA] 지연 로딩과 즉시 로딩 예를 들어 두 개의 엔티티 Member와 Team이 서로 연관관계에 있다고 가정하자 나는 Member만 조회하고 싶은데 Team과 연관 관계에 있다고 해서 같이 조회해야 할까? 만약 90퍼센트 이상이 Member를 조회할 때 Team도 조회해야 한다고 한다면 상관없겠지만 그렇지 않다면 굉장히 비효율 적일 것이다. 이것을 더 효율적으로 할 수 있는 것이 지연 로딩이다. 지연 로딩 연관관계 매핑할 때 fetch = FetchType.LAZY를 넣어주면 지연 로딩이 설정된다. 이렇게 하면 Team은 프록시 객체를 조회하게 되는데, 즉 Member클래스만 DB에서 조회하게 되는 것이다. 만약 Member와 Team의 연관관계 매핑 시 지연 로딩을 설정하지 않고 find를 통해서 Member를 조회하게 되면 원하..
[JPA] 프록시란? 예를 들어) Member와 Team이 연관 관계를 가지고 비즈니스 로직을 설계할 때 member의 내용만 가져오고 싶어서 코드를 작성했더니 실제 쿼리에서는 Member와 Team 둘 다 가져오는 쿼리가 나가게 되기 때문에 이것을 최적화라고 볼 수 없다... 이것을 해결하기 위해 지연로딩을 설정해야 하는데 지연 로딩을 이해하기 위해서는 프록시를 이해하는 것이 우선이다. 프록시 DB에서 데이터를 조회하는 방법으로 find와 getReferece가 있다. - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 즉, 결론적으로 디비에 쿼리가 안 나가는데 조회가 되는 것이다. 실제로 조회 (사용되는 시..