Spring/JPA 17

[JPA 활용1] 프로젝트 환경설정

프로젝트 환경설정 목차 프로젝트 생성 라이브러리 살펴보기 View 환경설정 H2 데이터베이스 설치 JPA와 DB 설정, 동작확인 프로젝트 생성 스프링 부트와 JPA를 가지고 프로젝트를 만듬. ※ 참고로 요즘은 JSP를 거의 안씀. 스프링 부트 스타터(https://start.spring.io/) 사용 가능 : web, thymeleaf, jpa, h2, lombok groupId : jpabook artifactId : jpashop 압축 해제하고 import lombok은 plugin을 깔아야 한다. File - Settings - Plugin - lombok 검색 라이브러리 살펴보기 ./gradlew dependencies spring boot starter는 logback을 기본적으로 사용한다. 핵..

Spring/JPA 2023.03.21

객체지향 쿼리 언어2 - 중급 문법

JPQL - 경로 표현식 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 정리 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 ( ex : m.username ) 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ex : m.team) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션(ex : m.orders) 경로..

Spring/JPA 2023.03.05

객체지향 쿼리 언어1 - 기본 문법

JPQL(Java Persistence Query Language) JPQL - 기본 문법과 기능 JPQL 소개 JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. JPQL 문법 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분O (Member, age) JPQL 키워드 대소문자 구분 X (SELECT, FROM, where) 엔티티 이름 사용, 테이블 이름이 아님(Member) 별칭은 필수(m) (as는 생략가능) 집합과 정렬 GROUP BY, HAVING ORDER BY T..

Spring/JPA 2023.03.01

객체지향 쿼리 언어 소개

JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 소개 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) 나이가 18살 이상인 회원을 모두 검색하고 싶다면? JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화..

Spring/JPA 2023.03.01

값 타입

기본값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입 분류 기본값 타입 자바 기본 타입 (int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입 컬렉션 값 타입 기본 값 타입 예) : String name, int age 생명주기를 엔티티에 의존 예) 회원을 삭제하면 이름, 나이 필드도 함께 삭제 값 타입은 공유하면 X 예) 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨 참고 : 자바의 기본 타입은 절대 공유 X int, double ..

Spring/JPA 2023.02.23

다양한 연관관계 매핑

목차 연관관계 매핑시 고려사항 3가지 다대일 [N:1] 일대다 [1:N] 일대일 [1:1] 다대다 [N:M] 실전 예제 - 3. 다양한 연관관계 매핑 연관관계 매핑시 고려사항 3가지 다중성 단방향, 양방향 연관관계의 주인 다중성 4가지를 지원하고 있다. 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A → B, B → A 처럼 참조가 2군데 객체 양방향 관계는 참조..

Spring/JPA 2023.02.22

연관관계 매핑 기초

목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 용어 이해 방향(Direction) : 단방향, 양방향 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요 목차 연관관계가 필요한 이유 단방향 연관관계 양방향 연관관계와 연관관계의 주인 실전 예제 2. 연관관계 매핑의 시작 연관관계가 필요한 이유 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계다. 객체를 테이블에 맞추어 모델링(연관관계가 없는 객체) 외래 키 식별자를 직접 다룸 //팀 저장 Team team = new Team(); team.s..

Spring/JPA 2023.02.19

실전 예제

실전 예제 1. 요구사항 분석과 기본 매핑 요구사항 분석 회원은 상품을 주문할 수 있다. 주문 시 여러 종류의 상품을 선택할 수 있다. 기능 목록 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문내역조회 주문취소 도메인 모델 분석 회원과 주문의 관계 : 회원은 여러 번 주문할 수 있다. (일대다) 주문과 상품의 관계 : 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러 번 주문될 수 있다. 주문상품이라는 모델을 만들어서 다대다 관계를 일대다, 다대일 관계로 풀어냄 테이블 설계 엔티티 설계와 매핑 데이터 중심 설계의 문제점 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식 테이블의 외래키를 객체에 그대로 가져옴 객체 그래프 탐색이 불가능 ..

Spring/JPA 2023.02.19

엔티티 매핑

목차 객체와 테이블 매핑 데이터베이스 스키마 자동 생성 필드와 컬럼 매핑 기본 키 매핑 실전예제 : 요구사항 분석과 기본 매핑 엔티티 매핑 소개 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리함 JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @Entity 속성 정리 속성 : name JPA에서 사..

Spring/JPA 2023.02.19

영속성 관리 - 내부 동작 방식

JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 ( ORM ) 영속성 컨텍스트 엔티티 매니저 팩토리와 엔티티 매니저 영속성 컨텍스트 JPA를 이해하는 데 가장 중요한 용어 "엔티티를 영구 저장하는 환경" 이라는 뜻 EntityManager.persist(entity); 영속성 매니저? 영속성 컨텍스트? 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않는다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed) 영속성 컨텍스트에 관리되는 상태 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제(delete) 삭제된 상태 비영속 Member member = ..

Spring/JPA 2023.02.18