🌱 Spring/JPA

본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 경로 표현식 경로 표현식은 .(점)을 찍어 객체 그래프를 탐색하는 것이다. 상태 필드(static field) : 단순히 값을 저장하기 위한 필드 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 특징 상태 필드 : 경로 탐색의 끝이며, 더이상 탐색이 불가능하다. String query = "select m.username, m.age from Member m"; 단일 값 연관 필드 : 묵시적 내부 조인이 발생..
데이터베이스 연동 📁 application.yml spring: datasource: url: jdbc:h2:tcp://localhost/~/test username: sa password: driver-class-name: org.h2.Driver spring.datasource : DB 연결정보 JPA ddl-auto 옵션 📁 application.yml spring: jpa: open-in-view: false hibernate: ddl-auto: create open-in-view : osiv 웹 요청이 완료될 때까지 영속성을 가지는 옵션 (켜두면 성능상 안 좋기 때문에 false 사용) hibernate.ddl-auto : create : 기존 테이블 삭제 후 다시 테이블 생성 (DROP + C..
Auditing 기능이란? JPA를 사용해 도메인을 관계형 데이터베이스 테이블에 매핑할 때 도메인들이 공통적으로 가지고 있는 컬럼이 존재한다. 대표적으로 생성일, 등록일 같은 것들이 있다. 데이터베이스에 누가, 언제했는지 기록을 남기는 생성일, 수정일 컬럼은 굉장히 중요한 데이터라고 할 수 있다. 그래서 Spring Data JPA는 Auditing이라는 기능을 제공해준다. 이 기능은 시간에 대해 자동으로 값을 넣어주는 기능으로, 도메인을 영속성 컨텍스트에 저장하거나 조회 후 수정하는 경우 자동으로 시간을 매핑해 데이터베이스의 테이블에 넣어준다. 사용방법 👉🏻 의존성 추가 📁 build.gradle dependencies { implementation 'org.springframework.boot:spr..
OSIV란? Open Session In View 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 클라이언트 요청이 들어올 때 영속성 컨텍스트를 생성해서 요청이 끝날 때까지 같은 영속성 컨텍스를 유지한다. 하여 한 번 조회된 엔티티는 요청이 끝날 때까지 영속 상태를 유지한다. 뷰까지 영속성 컨텍스트가 살아있음에 따라 컨트롤러나 뷰에서도 지연 로딩을 사용할 수 있게 된다. Spring Boot JPA 의존성을 주입 받아 애플리케이션을 구성할 경우 기본적으로 OSIV가 적용된다. (default: true) OSIV ON spring.jpa.open-in-view: true 트랜잭션 시작 시점에 영속성 컨텍스트가 데이터베이스 커넥션을 가져오며, 트랜잭션 종료 시점이 아닌 API 응답이 끝날 때까지 영속성 컨텍스..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 서브 쿼리 JPQL도 SQL처럼 서브 쿼리를 지원한다. 서브 쿼리는 쿼리 안에서 또 다른 쿼리를 말한다. 다음은 서브 쿼리를 사용한 예시이다. /* 나이가 평균보다 많은 회원을 조회 */ select m from Member m where m.age > (select avg(m2.age) from Memver m2) 예시를 보면 메인 쿼리와 서브 쿼리는 서로 전혀 관계가 없도록 한 것을 알 수 있다. 메인 쿼리에서는 m을 사용하지만, 서브 쿼리에서는 m2로 따로 정의해서 둘이 전혀 연관이 없도록 작성되어 있다. 이렇게 서브 쿼리를 짜야 성능이 잘 나온다. /* 한 건이라도 주문한 고객을 조..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 조인 // 내부 조인 SELECT m FROM Member m [INNER] JOIN m.team t // 외부 조인 SELECT m FROM Member m LEFT [OUTER] JOIN m.team t // 세타 조인 SELECT count(m) FROM Member m, Team t WHERE m.username=t.name 내부 조인 : 조인 대상(team)이 없으면 데이터(member)를 출력하지 않는다. 외부 조인 : 조인 대상(team)이 없어도 데이터(member)를 출력한다. 세타 조인 : 막 쿼리 내부(이너) 조인 Member member = new Member(); m..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. 페이징 JPA는 다음 두 API를 사용해 페이징 처리를 할 수 있다. setFirstResult(int startPosition) 조회 시작 위치 setMaxResults(int maxResult) 조회 할 데이터의 수 거두절미하고 바로 코드로 알아보자. List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(1) // 1번째 부터 .setMaxResults(10) // 10개를 가져오겠다 .getResultList(); System.out.println("r..
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다. JPQL이란? 객체지향 쿼리 언어 테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다는 장점이 있다. JPQL도 결국 SQL로 변환되어 실행된다. JPQL 기본 문법 select, update, delete select m from Member as m where m.age > 18 SQL 문법과 동일하다. 엔티티, 속성은 대소문자를 구분한다. (Member, age) JPQL 키워드는 대소문자를 구분하지 않는다. (SELECT, FROM, WHERE) 테이블 이름이 아닌 엔티티 이름을 사용한다. ..
an2z
'🌱 Spring/JPA' 카테고리의 글 목록