JAVA/SpringBoot26 [Querydsl] QueryDsl SpringBoot 버전 별 gradle 설정 Q객체는 생성되는데 gradle build하거나 run했을 때 에러가 발생해 설정법을 수정해 해결하여 정리 Querydsl 부트 3.x 설정 plugins { id 'java' id 'org.springframework.boot' version '3.0.6' id 'io.spring.dependency-management' version '1.1.0' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation.. 2023. 11. 24. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 9. @ElementCollection, @CollectionTable 값 타입을 하나 이상 저장할 때 사용 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요함 @ElementCollection, @CollectionTable (요약) 값 타입 컬렉션을 사용하기보다는 실무에서는 상황에 따라 값 타입 컬렉션 대신에 일대다 관계를 고려 일대다 관계를 위한 엔티티를 만들고, 여기에서 값 타입을 사용 소스코드 예제 1. private Set favoriteFoods = new HashSet(); @Column 선언 가능 => Set의 값타입으로 String 하나라서 2. private List addressHistory = new ArrayList(); => @JoinColumn으로 선언된 키값과, Address 에 선언되어있는 필.. 2023. 11. 6. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 9. @Embedable, @Embedded, @AttributeOverrides 값 타입과 임베디드 타입, 불변객체에 대해 설명 @Embedable, @Embedded, @AttributeOverrides (요약) 테이블의 구조는 변경점이 없다. 객체 모델링을 다양하게 사용할 수 있다. 1) 객체지향적인 프로그래밍을 할 수 있도록 별도의 클래스로 추상화할 수 있다. 2) 반복되는 필드의 경우 객체로 선언함으로서 반복되는 코드를 줄일 수 있다. 3) 공통된 유효한 메소드를 사용할 수 있다. 1. 기본값 타입 • 새로운 값 타입을 직접 정의할 수 있음 • JPA는 임베디드 타입(embedded type)이라 함 • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 • int, String과 같은 값 타입 2. 임베디드 타입 ( 중요 ) • 새로운 값 타입을 직접 정의할 수 .. 2023. 11. 5. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 8. cascade, orphanRemoval 영속성 전이: CASCADE 고아객체: orphanRemoval 영속성 전이 + 고아 객체, 생명주기 (요약) mappedBy를 사용하고 있는 곳에 cascade, orphanRemoval 1. cascade=CascadeType.PERSIST , ALL => 연관관계 주인인 엔티티만 persist해도 참조하는 객체들도 같이 영속성 컨텍스트에 저장된다. ( 같이 save가 된다 ) 2. orphanRemoval = true => orphanRemoval를 선언하면 자바 컬렉션에서 remove를 했을 때 DB까지 delete 쿼리가 나간다. (주의사항) 참조를 한 곳에서 사용할때만 사용해야한다. 영속성 전이 CASCADE ( 소스코드 예제 ) => 일반적으로 사용할때는 영속성 컨텍스트에 넣으려면 각 객체에.. 2023. 11. 1. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 8. 즉시로딩과 지연로딩 프록시와 연관관계 관리 - 즉시로딩과 지연로딩 즉시로딩과 지연로딩 (요약) 1. FetchType.EAGER => 연관관계에 있는 테이블까지 Join해서 즉시 가져온다. 2. FetchType.LAZY => 연관관계에 있는 엔티티는 프록시 객체로 가지고 있다가 부모가 참조하는 자식의 객체를 .getXX를 가져오려고할 때 그때 쿼리가 수행된다. 3. @XXXToOne 은 모두 Default: FetchType.EAGER로 선언되어있다. ( @XXXToMany 는 Default: FetchType.LAZY ) => 모든 연관관계에 지연로딩으로 사용하라! 성능을 위해 연관관계에 있는 객체까지 DB쿼리를 한번에 수행하고자 한다면 fetch join이나 엔티티 그래프를 사용하라 지연로딩 즉시로딩 - 주의사항 소스.. 2023. 10. 31. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 8. 프록시 프록시와 연관관계 관리- 프록시 프록시 (요약) 1) 프록시에 대한 매커니즘은 뒤에 즉시로딩과 지연로딩의 원리를 설명한다. 2) org.hibernate.LazyInitializationException, could not initialize proxy 에러가 발생했을 때, JPA의 엔티티 객체 조회는 트랜잭션 커밋시점에 초기화되므로, 트랜잭션 종료 후 엔티티 getXXX 하게되면 위와같은 에러가 발생할 수 있으니 이 내용을 참고하자. 소스코드로 확인 ==> EntityManager에는 .find()와 .getReference() 메서드가 있다. .find(): 실제 DB에 접근해 가져오는 엔티 .getReference(): 하이버네이트가 강제로 만든 가짜 클래스(프록시 클래스)를 생성한다. ==> 사용.. 2023. 10. 31. [김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 7. @MappedSuperclass DB는 완전히 달라 따로 쓰는데 공통된 속성이 반복될 때, 객체 입장에서 속성만 상속받아서 쓰고 싶을때 @MappedSuperclass - @MappedSuperclass 예제1 ===> 속성을 같이 쓰고 싶을 때 사용한다. (상속클래스는 추상클래스 선언을 권장) - @MappedSuperclass 예제2 (DB컬럼명을 명시하고 싶을 때) ===> DB컬럼명은 디폴트로 엔티티의 변수명으로 생성되고 (name = "DB컬럼명")을 선언하면 DB컬럼명도 직접 명시해서 생성할 수 있다. 2023. 10. 26. 이전 1 2 3 4 다음