Spring/JPA 14

[JPA] OSIV란?

모든 출처는 김영한 개발자님 [자바 ORM 표준 JPA 프로그래밍] 입니다. 예전에 정리한 적 있었는데, 당최 이해가 가야말이지... 그래서 결국 또다시 정리한다;;; (파도파도 끝이 없는 코딩의 세계) ✔️ OSIV란? OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다. 영속성 컨텍스트가 살아있으면, 엔티티는 영속 상태로 유지된다. 따라서 View에서도 지연 로딩을 사용할 수 있다. ※ 영속성 컨텍스트(persistence context) : 엔티티를 영구 저장하는 환경 ※ 영속성 컨텍스트에 엔티티를 저장하면, 이 엔티티는 언제 데이터베이스에 저장될까? → JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영한다. ..

Spring/JPA 2023.02.07

[JPA] Querydsl 찍먹해보기

Querydsl에 들어가기 전... 먼저 ✔️ JPQL이란? JPQL(Java Persistence Query Language)은 엔티티 객체를 조회하는 객체지향 쿼리다. → JPQL을 한마디로 정의하면 객체 지향 SQL. @Query 어노테이션 이용. 문법은 SQL과 비슷하고, SQL이 제공하는 기능을 유사하게 지원한다. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다. JPQL은 SQL을 추상화하기 때문에 특정 데이터베이스에 의존하지 않는다. 데이터베이스 방언(Dialect)만 변경하면, JPQL을 수정하지 않아도 자연스럽게 데이터베이스를 변경할 수 있다. SQL보다 간결하다. SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ..

Spring/JPA 2023.02.06

[JPA] MyBatis와 JPA, 도대체 뭐가 다를까?

✔️ 들어가기 전... 왜 이 포스팅을 작성하나? (긴 글 주의) 먼저 난, MyBatis와 JPA에 한이 맺힌 사람이다. 국비학원에서 배운 MyBatis... 모든 걸 처음 배웠던 때이기도 했다. 그리고 국비학원 후기에도 올렸듯이, 규모가 큰 국비학원 과정이었던지라 당연히 취업깡패 커리큘럼인지 알았다. 이때까지만 해도, 힘들었던 내 인생 드디어 보상받는 줄 알았다. 왜 힘들었는지는 '국비학원 후기'에 대략 적혀있음. (아, 취업깡패 커리큘럼 맞긴 맞다. 다만 SI 깡패라서 그렇지.) 따라서 난, 학원 과정을 성실히 밟아가면 취업이 원활하게 될 수 있을 줄 알았다. (나름 학원에서 우수 학생 선정도 되고 그랬었음) 그리고 학원에서 누구보다 더 열심히 할 자신이 있었던 게, 좀 거만한 얘기일수도 있지만....

Spring/JPA 2023.02.06

스프링 데이터 JPA - (2)

출처 : 실전! 스프링 데이터 JPA 내가 보려고 씀 섹션 4. 쿼리 메소드 기능 8. 순수 JPA 페이징과 정렬 JPA에서 페이징을 어떻게 할 것인가? 9. 스프링 데이터 JPA 페이징과 정렬 페이지를 유지하면서 엔티티를 DTO로 변환하기 → 엔티티를 외부에 그대로 반환하면 안 됨. 10. 벌크성 수정 쿼리 JPA는 엔티티 객체 중심 11. @EntityGraph ※ 선행 : 페치조인이란? → 지연로딩과 그로인해 발생하는 문제들을 이해해야 함. → N + 1 문제 : 페치조인으로 해결 // 영속성 컨텍스트에 있는 캐시 정보들을 DB에 완전히 다 반영을 해서 // insert를 정확하게 다 하고, // 데이터베이스에 다 반영을 시킨 다음에 // 영속성 컨텍스트를 다 날리는 것 em.flush(); em...

Spring/JPA 2022.12.20

스프링 데이터 JPA - (1)

출처 : 실전! 스프링 데이터 JPA 섹션 1. 프로젝트 환경설정 @Setter를 넣기 보다는 package study.datajpa.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; protected Member() { } public Member(String username) { this..

Spring/JPA 2022.12.19

JPA 활용 2 - API 개발과 성능 최적화

출처 : 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 섹션 1. API 개발 기본 1 - 1. 회원 등록 API @Controller + @ResponseBody == @ RestController (스프링 MVC 강의에 나옴) @RequestBody : JSON으로 온 Body를 Member에 그대로 매핑해서 쫙 넣어준다. 즉, JSON data를 Member로 쫙 바로 바꿔준다. (MVC에 관련된 내용) 🚨 API를 만들 때는 엔티티를 파라미터로 받지 말아라 & 엔티티를 외부에 노출해서도 안 됨. 즉, API는 항상 요청이 들어오거나 나가는 건 전부 다 엔티티를 사용하지 않고, DTO(객체)를 사용해서 등록이랑 응답을 받는 걸 권장함. // 예시 코드 : Member 엔티티 대신..

Spring/JPA 2022.12.19

JPA 강의 8 - 객체지향 쿼리 언어 2, JPA N + 1 문제 (중급 문법)

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션 11. 객체지향 쿼리 언어2 - 중급 문법 1. JPQL - 경로 표현식 1 - 1. JPQL - 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 1 - 2. 경로 표현식 용어 정리 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username) 연관 필드(association field): 연관관계를 위한 필드 • 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) • 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 1 - 3. 경로 표현식 특징 상태 필드(state field): 경로 탐색의 끝,..

Spring/JPA 2022.12.19

JPA 강의 7 - 객체지향 쿼리 언어 1 (기본 문법)

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션 10. 객체지향 쿼리 언어1 - 기본 문법 💡 flush가 동작하는 때 : commit, query (DB에 반영. em.persist()만 하면 DB 반영 안 됨 0. 객체지향 쿼리 언어(JPQL) 소개 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리 SQL은 데이터베이스 테이블을 대상으로 쿼리 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화해서 특정 데이터베이스 SQL에 의존X JPQL을 한마디로 정의하면 객체 지향 SQL MyBatis의 장점 : 동적 쿼..

Spring/JPA 2022.12.19

JPA 강의 6 - 프록시와 연관관계 관리, 값 타입

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션 8. 프록시와 연관관계 관리 1. 프록시 1 - 1. 프록시 기초 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 (실제 값이 사용되는 시점에 DB 쿼리를 함) 1 - 2. 프록시 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 1 - 3. ⭐ 프록시의 특징 ..

Spring/JPA 2022.12.19

JPA 강의 5 - 고급 매핑

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션 7. 고급 매핑 🚨 에러 WARN: HHH000457: Joined inheritance hierarchy [hellojpa.Item] defined explicit @DiscriminatorColumn.실습을 하다 생긴 에러이다. (제일 처음에 난 에러. 💡 에러가 날 때는 제일 먼저, 에러가 난 첫 번째 지점의 에러부터 해결한다. 첫 번째 에러 해결하면 그 뒤에 에러 줄줄이 해결 될 가능성 높음) 난 분명히 로 했는데, 실행할 때마다 테이블이 삭제되고 새로 생성되지 않는 것이다? 아마 삭제할 때 에러가 난 듯 하고, 값도 새로 설정이 되는 게 아니라 자꾸 추가가 되었다. 그래서 구글링... 이 질의응답 보고 해결했다! 난 JPA 활용 1 강..

Spring/JPA 2022.12.19