Spring Data 8

Querydsl 중급 문법

QueryDSL 중급 문법 1. 프로젝션과 결과 반환 - 기본 프로젝션 대상이 하나일 경우 @Test public void simple_projection() throws Exception { List result = queryFactory .select(member.username) .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } 프로젝션 대상이 둘 이상일 경우 - 튜플 조회 @Test public void tuple_projection() throws Exception { List result = queryFactory .select(member.username, member.age) .from(..

Spring Data 2021.11.04

Querydsl 초급 문법

QueryDSL 초급 문법 0. 소개 쿼리를 자바 코드로 작성한다. 동적 쿼리 문제를 깔끔하게 해결해준다. 쉬운 SQL 스타일 문법 JPQL 은 쿼리가 실제로 동작하는지 런타임 시점에서 밖에 확인이 되질 않는다. QueryDSL 은 자바 코드로 작성하기 때문에 컴파일 시점에서 문법 오류를 체크할 수 있다. QueryDSL 은 자바 코드이기 때문에, 쿼리를 메소드로 추출하여 재사용이 가능하다. 따라서, 엔터프라이즈 애플리케이션을 위한 마지막 퍼즐이다! ( Spring boot + Spring Data JPA + QueryDSL ) 1. 환경 세팅 build.gradle plugins { id 'org.springframework.boot' version '2.5.2' id &#..

Spring Data 2021.11.04

JPA Open Session In View

JPA OSIV ( open-session-in-view ) OSIV ON JPA 는 트랜잭션 시작 시점에 맞춰 영속성 컨텍스트가 DB 커넥션을 가져온다. 그리고 OSIV 가 켜져있는 경우, 서비스 단의 트랜잭션이 끝나더라도 DB 커넥션을 반환하지 않는다. 이유는 컨트롤러 단에서 연관 관계에 있는 엔티티가 LAZY LOADING 이 일어나게 되고, 그로 인한 프록시 객체를 초기화하기 위해서이다. 따라서 영속성 컨텍스트는 DB 커넥션을 물고 살아있어야 한다. 그렇다면 언제까지 살아있을까? API 의 경우 응답이 유저에게 반환될 때 까지, 화면의 경우 뷰 템플릿이 렌더링될 때까지 살아있다. 그래서 지금까지 View Template 이나 API 컨트롤러에서 LAZY LOADING 이 가능했던 것이다. 하지만 ..

Spring Data 2021.11.03

JPA Proxy

JPA Proxy 프록시 기초 em.find() : DB 를 통해서 실제 엔티티 객체를 조회 em.getReference() : DB 조회를 미루는 가짜( 프록시 ) 엔티티 객체 조회, 즉 결론적으로 DB 에 쿼리가 나가지 않는데 객체가 조회되는 것이다. 프록시는 실제 클래스를 상속 받아서 만들어진다. 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. ( 이론상이고 몇 가지 조심해야할 부분이 있다. ) 프록시 객체는 실제 객체의 참조 ( target ) 를 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. member.getName() 을 호출하면 MemberProxy 의 Member target 의 값이 없으므..

Spring Data 2021.11.03

연관관계 주인과 mappedBy

연관관계 주인과 mappedBy 핵심은 객체와 테이블이 연관관계를 맺는 차이를 이해해야한다. 객체 연관관계 = 2개, 즉 객체의 양뱡향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다. 회원 -> 팀 연관관계 1개 ( 단방향 ) 팀 -> 회원 연관관계 1개 ( 단방향 ) 테이블 연관관계 = 1개, 즉 테이블은 외래키 하나로 두 테이블의 연관관계를 관리한다. 회원 팀의 연관관계 1개 ( 양뱡향 ) 그렇다면 객체 Member 의 team 값이 바뀌었을 때 테이블 MEMBER 의 외래키 값으로 업데이트 되야하나? 아니면 객체 Team 의 members 의 값이 바뀌었을 때 업데이트 되야하나? 따라서 둘 중하나로 외래키를 관리해야한다. 그래서 나온 개념이 연관관계의 주인 ( Owner ) 이다..

Spring Data 2021.11.03

@OneToOne, @ManyToMany

@OneToOne 과 @ManyToMany @OneToOne ( 1 : 1 관계 ) 일대일 관계는 그 반대도 일대일이다. 주 테이블이나 대상 테이블 중 외래 키를 어디에 둘 것인지 선택이 가능하다. 외래 키에 DB 유니크( UNI ) 제약조건이 추가되어야 1:1 매핑이 가능하다. 일대일 : 주 테이블에 외래 키 단방향 다대일( @ManyToOne ) 단방향 매핑과 유사하다. 양방향의 경우도 다대일( @ManyToOne ) 과 유사한 로직으로 구현한다. 일대일 : 대상 테이블에 외래 키 단방향 허용되지 않는다. 지원도 되지않고 방법도 없다. 양방향 관계는 지원된다. 일대일 : 대상 테이블에 외래 키 양방향 사실 매핑되는 과정은 일대일 주 테이블에 외래 키 양방향과 같다. 그렇다면 일대일 관계에서 주 테이블..

Spring Data 2021.11.03

JPA 영속성 컨텍스트

영속성 컨텍스트 JPA 에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 ( Object Relational Mapping ) -> 정적인 매핑과정 영속성 컨텍스트 - 실제 JPA 가 어떻게 내부적으로 동작하는지에 대한 이해 -> 동작하는 메커니즘 엔티티 매니저 팩토리와 엔티티 매니저 웹 어플리케이션을 만든다고 했을 때, entityManagerFactory 는 고객의 요청에 의해 entityManager 를 생성한다. entityManager는 내부적으로 DB connection 을 사용하여 DB 와 통신한다. 영속성 컨텍스트란? JPA 를 이해하는데 가장 중요한 용어로, 엔티티를 영구 저장하는 환경 이라는 뜻이다. ( EntityManager.persist(entity); ) 에서 pers..

Spring Data 2021.11.03