일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 인텔리제이
- 빈생성안됨
- jwt메서드
- spring서버
- Filter
- Error creating bean with name
- jpa회원가입
- git
- REST API 규칙
- queryDSL
- JPA주의사항
- 스프링 부트 기능
- json gson 차이
- Q 클래스
- JPA
- Spring Spring boot 차이
- JoinColumn
- REST란
- Unsatisfied dependency
- json
- 1차캐시
- @IdClass
- github
- 스프링 부트 공식 문서
- 최종 프로젝트
- ERD 작성
- uncheck Exception
- 복합키
- 스프링부트오류
- jpa에러
- Today
- Total
목록내배캠 주요 학습/JPA 심화 (18)
Everyday Dev System
@Transaction propagation 1. Propagation_required → 일반적인 전파유형으로 생략 가능 부모 Tran이 존재 : 부모 Tran 에 참여 부모 Tran이 미존재 : 새 Tran 생성 2. Propagation_supports 부모 Tran이 존재 : 부모 Tran 에 참여 부모 Tran이 미존재 : non-Tran 환경에서 실행 3. Propagation_mandatory → Tran에 참여하도록 강제하는 유형 부모 Tran이 존재 : 부모 Tran 에 참여 부모 Tran이 미존재 : Exception 발생 4. Propagation_Requires_new → 무조건 새 Tran 생성 부모 Tran이 존재 : 부모 Tran 종료 후에 새 Tran 생성 부모 Tran이 미..
1. JPA 가 1차 캐시(영속성 컨텍스트) 를 통해 필요없는 쿼리는 날라가지 않도록 쿼리를 최적화함. 그런데, insert와 delete 쿼리문이 다 날라가는 경우가 있다. 이때 확인해야 할 사항은? 1) 해당 함수나 클래스안에 Transaction가 포함되고 있는지 확인 @Transactional 으로 함께 감싸져 있어야 최적화 수행. Transactional 없이 Repository 메소드 호출 형태일 경우라면 Repository 내부에서만 @Transactional이 최적화 Propagation (전파) 전략 체크해봐야 합니다. 2) 해당 Entity의 ID 식별자 생성 전략을 IDENTITY 로 설정했는지 확인 GenerationType.IDENTITY 로 키필드가 설정되어 있으면 DB에 실제로..
JPAQueryFactory을 빈으로 등록하기 위해 configuration 클래스를 생성한다. package me.chaeyoung.jpa.configuration; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JPAConfiguration { @Persiste..
JPA(Jakarta Persistence API)는 Java 프로그래밍 언어를 사용하여 관계형 데이터베이스를 다루기 위한 자바 ORM(Object-Relational Mapping) 기술입니다. JPA를 사용하는 이유와 그것이 어떻게 데이터 모델을 단순화하고 데이터 흐름을 정교하게 만드는 데 도움이 되는지 설명드리겠습니다. ORM의 편리함: JPA는 ORM의 한 종류로, 개발자가 데이터베이스와 객체 지향 프로그래밍 언어 간의 간격을 줄여줍니다. 즉, 개발자가 직접 SQL 쿼리를 작성하지 않고도 객체를 데이터베이스 테이블에 매핑하고 데이터를 읽고 쓸 수 있게 해줍니다. 이렇게 하면 데이터베이스와의 상호작용이 단순화되고, 개발자가 데이터베이스 세부 사항에 신경 쓰지 않고도 빠르고 효율적으로 개발할 수 있습..

먼저, 선행되어야 하는 것들 입니다. 1. application에 @EnableJpaAuditing 추가 2. TimeStamp 클래스 생성 후 엔티티 클래스에서 상속 (Channel, Thread, Mention) 아래와 같이 TimeStamp 를 상속한 Channel 클래스의 createdAt, modifiedAt은 Auditing 을 통해 자동으로 들어가는 것을 알 수 있습니다. createdAt, modifiedAt 은 구현체 없이 동작하지만 createdBy, modifiedBy 는 구현체가 필요합니다. @Entity public class Channel extends TimeStamp { } package me.chaeyoung.jpa.common; import jakarta.persisten..

Repository 인터페이스의 메소드 이름을 기반으로 쿼리를 생성하는 기능에 한계가 있는 경우, Q 클래스를 사용하여 더 복잡하고 유연한 쿼리를 작성할 수 있습니다. QueryDSL을 사용할 때, @Entity 어노테이션이 붙은 클래스에 대해 자동으로 Q 클래스가 생성됩니다. Q 클래스는 해당 엔티티 클래스와 동일한 패키지에 위치하며, 자동으로 생성됩니다. 따라서, QUser 클래스를 사용하기 위해서는 해당 클래스를 import하고, 인스턴스를 생성해야 합니다. 아래 예시에서 QThread 클래스는 me.chaeyoung.jpa.thread 패키지에 위치하고 있기 때문에, ThreadServiceImpl 클래스 내부에서는 QThread 클래스를 import하지 않고도 사용할 수 있습니다. 아래처럼 Th..

참조 : 내배캠 JPA 심화 강의 자료 https://teamsparta.notion.site/SpringData-QueryDSL-85b57e18a5204e70b6035a319d63f866 오류 시 해결 1. QChannel 이 활성화가 안될 경우 main 메서드가 있는 클래스를 다시 실행. 2. 테스트 코드시 Repository의 Bean 생성이 안될 경우에는 1) main 메서드가 있는 클래스에 아래 어노테이션 기재 여부 확인 @SpringBootApplication @EnableJpaRepositories 2) 그럼에도 안 될 경우에는 테스트 코드에 @SpringBootTest 어노테이션이 명시되어있는지 확인 3) 그래도 안된다면, Repository 클래스에 상속한 클래( JpaRepository..
Repository 에 기능 추가하기 delete() 메소드의 내부 기능 확인하기 delete 호출 시 영속성 상태인지 확인한다. 영속성 컨텍스트에 없다면(!em.contains(entity)) 엔티티를 조회해서 영속성 상태로 바꾼다. 왜 이렇게 해야 할까? Cascade, orphanRemoval에 의한 자식도 삭제가 누락되지 않도록 해야 한다. → 그렇지만, Cascade, orphanRemoval 상관없이 delete 쿼리를 바로 날려도 될 경우, (관계 매핑할 게 없고 영속성 전이를 할 필요가 없을 경우)에는 delete 를 오버라이딩하여 성능 향상을 할 수 있다.

Repository의 기능을 제한하거나 추가해야 할 필요가 있다. JpaRepository는 기본적으로 모든 기능을 제공하기 때문에 리스크 따라서 원하는 기능 메소드만 구현하도록 제한해야 한다. @RepositoryDefinition @RepositoryDefinition 을 인터페이스에 기재하여 인터페이스 내에 명시된 메소드만 호출 할 수 있도록 제한 가능하다. @RepositoryDefinition(domainClass = User.class, idClass = Long.class) 를 기재할 경우에는 extends JpaRepository 를 따로 기재할 필요가 없다. package me.chaeyoung.jpa.user; import java.util.Optional; import org.spri..
Cascade.REMOVE Cascade.REMOVE는 일에 해당하는 부모 엔티티를 삭제할 때 그 아래에 있는 다에 해당하는 자식 엔티티들이 모두 삭제되는 것이다. orphanRemoval=true 위 케이스도 포함 일에 해당하는 부모 엔티티의 리스트에서 요소를 삭제하면 다에 해당하는 자식 엔티티가 delete 되는 기능까지 포함한다. Channel 클래스 코드에 Thread 멤버필드 코드 @OneToMany(mappedBy="channel", cascade = CascadeType.ALL, orphanRemoval=true) private Set threads = new LinkedHashSet (); 테스트 코드 @Test void deleteThreadByOrphanRemovalTest() { //..