JPA

    [JPA] 객체지향 쿼리 언어

    자바 ORM 표준 JPA 프로그래밍 섹션10. 객체지향 쿼리 언어1 - 기본 문법 객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원하는데 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL 등이 있다. 혹은 JDBC API를 직접 사용하여 MyBatis, SpringJdbcTemplate과 함께 사용할 수도 있다. JPQL JPQL은 가장 단순한 조회 방법으로 EntityManager.find()랑 객체 그래프 탐색(a.getB().getC())가 가능하다. JPA를 사용하면 엔티티 객체를 중심으로 개발해야 하는데 이때 문제는 검색 쿼리이다. 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 하는데 모든 DB 데이터를 객체로 변호나해서 검색하는 것은 불가능하다. ..

    [JPA] 값 타입 (기본값, 임베디드 타입, 불변객체, 비교, 컬렉션)

    자바 ORM 표준 JPA 프로그래밍 섹션9. 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체로 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능한 경우이다. 추가로 공유가 가능하며 생명 주기 관리가 가능하다. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있기 때문에 변경 시 추적이 불가능하다. 예를 들면 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체되는 경우이다. 추가로 생명 주기가 엔티티에 의존되며 공유하지 않는 것이 안전하며 불가피할 경우 복사해서 사용할 수 있다. 이런 특성 때문에 불변 객체로 만드는 것이 ..

    [JPA] 프록시, 즉시/지연 로딩, 영속성 전이(CASCADE), 고아 객체

    자바 ORM 표준 JPA 프로그래밍 섹션8. 프록시와 연관관계 관리 프록시 아래와 같은 상황에서 Member을 조회할 때 Team도 매번 조회해야 할까? 답은 비즈니스적인 상황마다 다르다. 따라서 Member을 조회할 때마다 Team을 무조건 조회하는 것이 자원 낭비일 수 있다. 이런 문제를 JPA는 지연로딩과 프록시로 해결한다. JPA에는 em.find() 말고도 em.getReference() 가 있다. em.find()는 DB를 통해서 실제 엔티티 객체를 조회하는 것이고 em.getReference()는 DB 조뢰를 미루는 가짜(프록시) 엔티티 객체를 조회하는 것이다. Member member = new Member(); member.setName("bella"); em.persist(member)..

    [JPA] 상속관계 매핑

    자바 ORM 표준 JPA 프로그래밍 섹션7. 고급매핑 상속관계 매핑 관계형 DB는 상속관계가 없다. 대신 슈퍼타입, 서브타입 관계라는 모델링 기법이 있는데 이가 객체 상속 관계와 유사하다. 따라서 상속 관계 매핑은 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑하는 것이다. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name=“DTYPE”) 부모 입장에서 DTYPE의 기본값은 자식의 Entity명이다. @DiscriminatorValue(“XXX”) 자식 입장에서 자신의 DTYPE ..

    [JPA] 연관관계 매핑 (단방향, 양방향, 연관관계의 주인)

    자바 ORM 표준 JPA 프로그래밍 섹션5. 연관관계 매핑 기초 기본 용어 1. 방향 (Direction) : 단방향, 양방향 2. 다중성 (Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 3. 연관관계의 주인 (Owner) : 객체 양방향 연관관계는 관리 주인 필요 테이블에 맞춘 모델링 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계다. 객체를 테이블에 맞추어 모델링할 경우 테이블에 맞춘 모델링의 경우, 객체와 테이블 연관관계는 아래와 같다. 객체를 테이블에 맞추어 모델링할 경우 참조 대신에 외래 키를 그대로 사용해야 하므로 Entity 관련 코드는 아래와 같다. @Entity public class M..

    [자바 ORM 표준 JPA 프로그래밍] 섹션3. 영속성 관리 - 내부 동작 방식

    영속성 컨텍스트 영속성 컨텍스트의 의미 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 이는 DB에 저장한다는 의미보다는 영속성 컨텍스트를 통해 엔티티를 영속화 한다는 의미를 가진다. 따라서 엔티티를 영속성 컨텍스트에 저장한다는 뜻이다. 이후 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다. 엔티티매니저와 영속성 컨텍스트는 N:1의 관계를 가진다. 엔티티의 생명주기 1. 비영속 (new, transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 2. 영속 (managed) : 영속성 컨텍스트에 관리되는 상태 엔티티 매니..

    [자바 ORM 표준 JPA 프로그래밍] 섹션2. JPA 시작하기

    Hello JPA - 프로젝트 생성 강의와 다르게 진행한 점 DB 사용을 H2가 아닌 MySQL 사용 pom.xml 설정 dependency에 사용할 라이브러리를 적는다. 4.0.0 org.example ex1-hello-jpa 1.0-SNAPSHOT Archetype - ex1-hello-jpa http://maven.apache.org org.hibernate hibernate-entitymanager 5.3.10.Final mysql mysql-connector-java 8.0.28 라이브러리 버전 선택하는 방법 아래 페이지에서 내가 선택한 스프링 부트 버전의 Reference Docs > Dependency Versions를 확인한다. https://spring.io/projects/spring-..

    [자바 ORM 표준 JPA 프로그래밍] 섹션1. JPA 소개

    개요 JPA가 하는 일 반복적이고 단순한 SQL을 자동화하여 처리해준다. 과거에는 SQL을 직접 작성해야 했지만, 이제는 JPA에게 시키면 된다. JPA를 사용해서 얻는 이점 개발 생산성, 개발 속도가 증가하고 유지 보수에 용이하다. JPA를 실무에서 사용하기 어려운 이유 객체와 테이블을 올바르게 맵핑하고 설계하기 어렵기 때문이다. SQL 중심적인 개발의 문제점 SQL에 의존적인 개발 우리가 만드는 객체는 관계형 DB에 보관한다. 이 객체를 관계형 DB에 보관하려면, (저장하고/수정하고/삭제하고/조회하고 하려면) 수많은 쿼리 작성이 필요하다. 이게 바로 SQL 중심적인 개발의 문제점이다. 계속해서 INSERT INTO, UPDATE, SELECT, DELETE 쿼리를 무한 반복해야 하기 때문에 지루하다...

    [스프링부트와 JPA 활용 2] Section2. API 개발 고급 - 준비

    API 개발 고급 소개 조회용 샘플 데이터 입력 지연 로딩과 조회 성능 최적화 컬렉션 조회 최적화 페이징과 한계 돌파 OSIV와 성능 최적화 조회용 샘플 데이터 입력 userA JPA1 BOOK JPA2 BOOK userB SPRING1 BOOK SPRING2 BOOK 두 건의 주문이 접수된 것이다. jpashop/src/main/java/jpabook/jpashop/InitDb.java 추가 package jpabook.jpashop; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item...

    [스프링부트와 JPA 활용 2] Section1 중 "회원 삭제 API"

    JPA 활용2를 듣던 도중, 회원 등록, 조회, 수정 API는 강의에서 다루나 삭제 API를 강의에서 안 다루어 직접 코드를 짜 보았다. MemberApiController.java 에 코드 추가 //회원 삭제 API @DeleteMapping("/api/v3/members/{id}") public ResponseEntity deleteMemberV1(@PathVariable ("id") Long id) { memberService.delete(id); return new ResponseEntity("회원이 성공적으로 삭제되었습니다", HttpStatus.OK); } MemberService.java 에 코드 추가 //회원 삭제 API @Transactional public void delete(Long..