728x90
반응형

JPA 24

DataIntegrityViolationException에 대해서

짧은 근황을 먼저 얘기하자면...올해 3월부터 이직을 하게되어 삼쩜삼(자비스앤빌런즈) 백엔드 엔지니어로 현재 이직하여 회사를 다니고 있다.나중에 다른 포스팅으로 해당 부분은 잘 작성해보도록 하겠다.이전 포스팅인 @Transactional 제대로 알고쓰기 에서는 무지성 중첩 트랜잭션에 대한 포스팅이었는데,이번에는 좀 다른 케이스였다.해당 예외가 발생하는 것이었다.회사에서는 Mysql을 RDBMS로 채택하여 사용해서 아래와 같은 예외가 보였지만, 예제에서는 H2 DB를 사용하기 때문에 같은 에러메시지는 아니지만,내용은 똑같다는 점을 일단 알고 넘어가면 좋을 것 같다.HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, ..

JPA 2024.08.20

JPA template 이슈

템플릿 이슈 제목과 그리고 최상단의 주제인 템플릿 이슈 사항에 대해서 정리한다. 먼저 업무에서 생겼던 이슈사항부터 소개한다. 회사에서 postgreSQL을 사용한다. 그게 중요한 것은 아닌데, 각자의 db마다 방언이 있기 나름이고 테스트에서는 h2DB로 테스트를 하면서 방언도 h2방언을 설정해주었다. 로직중에 특정 date가 현재 시간보다 작은 경우를 쿼리로 찾아야했었는데, to_date() 함수를 어떻게 적을것인가에 대한 문제였다. 왜 이 문제가 발생했냐면, 일단 기본적으로 여러개의 조건중에 저 하나가 들어가있었고, 문자열로 된 시간형식인 yyyyMMddHHmm 형식을 가지고 비교를 했어야 했기 때문이다. 이슈 파헤치기 일단 queryDsl에서는 서브쿼리나 랜덤 등등 어떤 특정 조건을 만족해야 하는 식..

JPA 2022.08.07

고급 주제와 성능 최적화 1

스터디도 시작한지 3개월이 되었다. 시간 참빠른것 같다. 진도가 이제 15장을 둘로 쪼개고 16장 해도 9월에는 종료가 될것이다. 😂 예외처리와 엔티티 그리고 프록시에 대해 정리한다. 예외 처리 {: text-center} JPA는 그림과 같이 javax.persistence.PersistenceException의 자식 클래스이다. 그리고 이 예외 클래스는 RuntimeException의 자식이다. JPA 예외는 모두 uncheck Exception이다. JPA 표준예외 트랜잭션 롤백을 표시하는 예외 트랜잭션 롤백을 표시하지 않는 예외 서비스 계층에서 데이터 접근 계층의 구현 기술에 직접 의존하는 것은 좋지 않다. SOLID원칙 생각해보자. 이것이 예외에서도 마찬가지가 된다. 서비스에서 JPA의 예외를 ..

JPA 2022.08.06

컬렉션과 부가기능

코드는 모두 깃허브에 있음. 일단 자바의 컬렉션 인터페이스들의 특징부터 나열한다. 컬렉션 Collection 자바가 제공하는 최상위 컬렉현, Hibernate는 중복을 허용하고, 순서를 보장하지 않는다고 가정 Set 중복을 허용하지 않고, 순서도 보장하지 않는다. List 순서가 있는 컬렉션아며 중복을 허용한다. Map Key, Value 구조로 되어있는 컬렉션이다. JPA와 Collection Hibernate는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 Hibernate가 준비한 컬렉션으로 감싸서 사용한다. 다음 예시를 보자 @Entity public class Team { @Id @GeneratedValue private Long id; @OneToMany private Collection mem..

JPA 2022.08.06

준영속 상태의 지연로딩을 해결하는 방법

준영속 상태의 지연로딩을 해결하는 방법 JPA에서 항상 생각을 해야되는 것이 바로 영속상태, 영속성 컨텍스트위에 있는가? 를 생각해야된다. 예를 들어 우리는 DAO층에서 실제 DB와 통신을 보편적으로 진행하는데, 이쪽은 영속성 컨텍스트에 의해 관리가 되어 영속 상태를 유지한다. 하지만, Controller, View 이런 계층에서는 준영속 상태가 된다. 그래서 영속상태와 다르게 변경감지, 지연로딩이 동작하지 않게 된다. 지연로딩이 동작하지 않기 때문에 이때 지연 로딩을 시도하면 문제가 발생하는게 당연하다. 하이버네이트가 구현체라면 org.hibernate.LazyInitializationException이 발생한다. 이것을 해결하는 문제는 두가지가 있다. 뷰가 필요한 엔티티를 미리 로딩 OSIV를 사용해..

JPA 2022.08.06

JPA metamodel must not be empty!

JPA에러 JPA실습을 위해 준비한 그리고 동시에 api를 만들어보기 위해서 실습하던 JPA 미니 프로젝트에서 에러가 발생했다. {: .text-center} {: .text-center} 오류내용 오류는 바로 JPA metamodel must not be empty! 이다. 분명 나는 @EnableJpaAuditing @SpringBootApplication public class BoardApplication { public static void main(String[] args) { SpringApplication.run(BoardApplication.class, args); } } 스프링부트 실행 application 클래스에 JPAAuditing을 추가해주었다. 그리고 MockBean을 전부 넣..

JPA 2022.08.06

[JPA] findAll, findById 차이

토이 프로젝트 관련 JPA 스터디를 하면서 배운 내용을 토대로 하여 Spring Data JPA를 더 유연하게 사용하기 위해 토이프로젝트를 진행했다. 이슈사항이 될 수도 있겠다 싶어서 삽질 아닌 삽질을 하다가 알게된 사실이다. 사실, 계속 궁금했다. 🤔 코드로 보면 아래와 같은 궁금증이었다. @Test void findById() { memberRepository.save(member); Optional result = memberRepository.findById(1L); result.ifPresent(m -> { assertThat(m.getName()).isEqualTo("홍길동"); }); } @Test void findAll() { memberRepository.save(member); List..

JPA 2022.08.06

[JPA] 객체 지향 쿼리 언어 - Native SQL

네이티브 SQL JPQL은 표준 SQL이 지원하는 대부분의 문법과 SQL함수를 지원한다. 근데 특정 DB의 방언과 같은 종속적 기능은 지원하지 않는다. 특정 DB만 지원하는 함수, 문법, SQL 쿼리 힌트 인라인 뷰(from절 서브쿼리), UNION, INTERSECT 스토어드 프로시저 종속적인 기능을 지원하는 방법은 특정 DB만 사용하는 함수 특정 JPQL에서 네이티브 SQL 함수를 호출할 수 있다. Hibernate는 DB 방언에 각 DB에 종속적 함수를 정의했다. 그리고 직접 호출할 함수를 정의하기도 가능하다. 특정 DB만 지원하는 힌트 Hibernate를 포함한 몇몇 JPA구현체가 지원한다. 인라인 뷰(from절 서브쿼리), UNION, INTERSECT JPA구현체들이 지원한다. Hibernat..

JPA 2022.08.05

[JPA] 객체 지향 쿼리 언어 - Querydsl 2

이번 포스팅에서는 조인에 대해 알아볼 것이다. 조인 조인은 innerJoin(join), leftJoin, rightJoin, fullJoin을 사용할 수 있고 추가로 JPQL의 on과 성능 최적화를 위한 fetchJoin을 사용할 수 있다. jpaQueryFactory.selectFrom(item).join(조인할 쿼리클래스).fetch(); 연관관계가 있으면 그냥 join만 사용해도 되지만 지금은 on이 추가되어 on() 절로 연관관계 없이 조인도 가능하다. jpaQueryFactory.selectFrom(item).join(chair).on(chair.name.eq(item.name)).fetch(); from절에 여러 조건을 사용해서 세타조인도 가능하다. 서브 쿼리 서브 쿼리는 예전 버전에서는 J..

JPA 2022.08.05

[JPA] 객체 지향 쿼리 언어 - Querydsl

QueryDSL Criteria의 단점 너무 복잡하고 어렵다는 것 그래서 JPQL이 어떻게 생성되는지 파악이 어렵다. 그래서 나온게 이 QueryDSL이다.. 코드로 작성하는데 간결하고 알아보기 쉽다. QueryDSL은 오픈소스 프로젝트이다. 단순 CRUD보다는 이름에 걸맞게 데이터를 조회 그러니까 통계형 쿼리를 짤때 적합하지 않을까 생각한다. QueryDSL Setting build.gradle buildscript { ext { ... querydslVersion = '1.0.10' } dependencies { .... classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:$querydslVersion" } } subprojects {..

JPA 2022.08.05
728x90
반응형