![[Spring Data JPA] Spring Data JPA](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdkzxgg%2FbtsI0y0Jv3E%2FSbZegYn7UyypkLQhvHqtwK%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.Spring Data JPA는 스프링 프레임워크에서 제공하는 데이터 접근 계층(Data Access Layer)을 쉽게 구현할 수 있도록 지원하는 모듈이다.JPA(Java Persistence API)를 사용하여 데이터베이스와의 상호작용을 단순화하고, 보일러플레이트 코드를 최소화하는 데 중점을 둔다. 레포지토리 추상화Spring Data JPA는 JPA 엔티티를 관리하기 위한 기본적인 CRUD(Create, Read, Update, Delete) 작업을 자동으로 생성해주는 레포지토리 인터페이스를 제공한다.JpaRepository, CrudRepository, PagingAndSortingRepository와 같은..
![[JPA] 컬렉션 조회 최적화(OneToMany)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPEBjp%2FbtsIZJ2TTLZ%2FwbfdGzjr0o4wvBBzeYcV6K%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.컬렉션인 일대다 관계(OneToMany) 를 조회하고, 최적화하는 방법 아래의 순서대로 최적화를 진행하는 것이 좋다.1. DTO를 반환2. 컬렉션 최적화 - 페이징 필요시 : hibernate.default_batch_fetch_size , @BatchSize 로 최적화 - 페이징 필요 없을시 : FETCH 조인으로 최적화3. DTO를 직접 조회(이 부분은 이해가 잘 되지 않아서 글에 적지 않음) DTO를 반환@RestController@RequiredArgsConstructorpublic class OrderApiController { private final OrderRepository ord..
![[JPA] 지연 로딩과 조회 성능 최적화(ManyToOne, OneToOne)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd6go1%2FbtsIZZEt1Wz%2FkeY7mBSzSQkisdCjLk1i21%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.API를 만들 때 엔티티 자체를 리턴하는 방식을 절대로 사용하면 안된다.기본적으로 엔티티를 DTO로 바꾸어서 리턴해야 한다. 또한 트래픽이 낮다면 굳이 성능 최적화가 필요 없겠지만, 사용자가 늘어난다면 성능 최적화를 고려해야한다. 성능 최적화 순서엔티티를 DTO로 변환하는 방법을 선택필요하면 FETCH 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결그래도 안되면 DTO로 직접 조회하는 방법을 사용최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용 엔티티를 DTO로 변환@Datastatic class SimpleOrderDto { priv..
![[JPA] 병합(Merge)과 변경 감지(Dirty Checking)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFZDNu%2FbtsIWaxR2k8%2FcSvhbm9EekSz6ubAKDeTkK%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.JPA(Java Persistence API)에서 변경 감지(Dirty Checking)와 병합(Merge)은 엔티티 상태 관리를 위한 중요한 개념이다. 이 두 가지는 데이터베이스와 애플리케이션 간의 동기화를 효율적으로 관리하는 데 사용된다. 결론부터 말하면 두 방법중에 변경 감지를 사용하는 것이 더 좋다. 병합병합(Merge)은 JPA에서 준영속 상태의 엔티티를 영속성 컨텍스트에 포함시키고, 해당 엔티티의 상태를 데이터베이스에 반영하는 작업이다.이 과정은 데이터베이스에 이미 저장된 데이터를 수정할 때 사용된다.@PostMapping(value = "/items/{itemId}/edit")public String..
![[JPA] JPQL 고급](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAEePT%2FbtsITTjajps%2FTK6s3GWqhaIQzkR7cFKwu1%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.경로 표현식JPQL(Java Persistence Query Language)에서 경로 표현식(Path Expression)은 엔터티의 속성에 접근하거나 연관된 엔터티를 탐색하기 위해 사용된다. 이는 객체 그래프를 따라갈 수 있게 하며, 다양한 쿼리에서 데이터를 필터링하고 조회하는 데 중요한 역할을 한다. 쉽게 말하자면 .(점)을 찍어 객체 그래프를 탐색하는 것이다.select m.username -> 상태 필드from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A' 경로 표현식 용어 정리상태 필..
![[JPA] JPQL 기본 문법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyVa8%2FbtsIOUcy4qH%2FfsVetX3LWQGherzVXDTV7k%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.Java Persistence Query Language (JPQL)은 Java Persistence API (JPA)에서 사용하는 쿼리 언어이다. JPQL은 객체 지향 쿼리 언어로, SQL과 유사하지만 엔티티 객체를 대상으로 하여 데이터베이스와 상호작용한다. JPQL을 사용하면 데이터베이스의 특정 데이터를 조회하거나 조작할 수 있다.JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원JPQL은 엔티티 객체를 대상으로 쿼리(테이블과 컬럼이 아닌 엔티티와 엔티티의 속성을 대상)SQL은 데이터베이스 ..
![[JPA] 값 타입(Value Type)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7u9Ka%2FbtsIOTEzwba%2Ft8mRLZ9n6tmtpKQw9iKZCk%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.JPA에서 값 타입(Value Type)은 엔티티(Entity)와는 다른 개념으로, 데이터베이스의 테이블에 독립적으로 저장되지 않으며 엔티티에 포함되는 속성을 말한다.JPA 값 타입은 크게 세 가지로 구분된다기본 값 타입-자바 기본 타입(int, double)-래퍼 클래스(Integer, Long)-String임베디드 값 타입(embedded type, 복합 값 타입)컬렉션 값 타입(collection value type)이를 통해 객체지향적으로 데이터를 더 효율적으로 관리할 수 있다. 엔티티 타입과 값 타입의 구분엔티티 타입값 타입@Entity로 정의하는 객체int, Integer, String처럼 단순히 값으..
![[JPA] 즉시 로딩, 지연 로딩, 영속성 전이, 고아 객체](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVlPx3%2FbtsIOsfQZjL%2FLApx24Br4GngX4KiX1UKK0%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.즉시 로딩과 지연 로딩public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName());}회원과 팀을 함게 출력해야하는 로직에서는 상관 없지만, 단순히 회원만 출력하는 로직에서는 굳이 팀까지 DB에서 조회해서 가져올 필요가 없다.public void print..