JPA

· Java
⚡ 개요근본적으로 동적 쿼리를 작성해야 하는 이유가 뭘까에 대해서 생각을 해봐야 한다.데이터 베이스의 테이블 구조 또는 사용자 입력에 따라 조건 변경, UI에 따른 세부 조건 변경등 여러가지 이유가 있을수 있다. 만약 조회 하는 테이블은 같은데 조건만 달라지는 경우라면 동적 쿼리를 사용하지 않는다면 중복된 코드가 발생하고 이는 생산성 및 유지보수 측면에서 좋지 않은 결과를 가져온다고 생각을 한다. 예전에는 myBatis에서 쿼리를 작성할떄는 동적으로 param을 보내서 조회 하도록 작업을 하고 있었을 것이며, JPA를 사용 하는 개발자의 경우 초기에는 어떻게 동적 쿼리를 작업 해야하는지 모르는 사람한테 유용한 정보가 될거라고 생각한다. 내가 JPA를 사용하면서 동적 쿼리 및 배치 쿼리를 작업하는 방법에 ..
· Java
⚡ 개요 내부에서 JPA를 사용하면서 entity에서 Cascade 옵션을 사용한 개발자분이 있었고, 이때 일부 데이터가 아무 값 없이 생성이 되거나 삭제되는 이슈가 발생을 했다. 다행히 문제점이 Cascade에 있다고 판단을 해서 수정을 했지만 실제 고객사에 반영이 되었다면 큰 문제가 발생했을것이다. 그래서 사용시 주의 사항 및 내용을 정리 하려고 한다. 📒 Cascade (영속성 전이) 특정 엔티티를 영속상태로 만들 때 연관관계에 있는 엔티티도 함께 영속상태로 만들기 위해서 사용한다. 부모 엔티티를 다룰때 연관 되어있는 자식 엔티티까지 다룰수 있게 해준다. JPA에서는 Cascade 을 통해서 영속성을 다룰수 있도록 도와준다. 이와 관련된 옵션들이 존재한다. CascadeType.ALL: 모든 Cas..
· Spring
⚡ 개요 내부적으로 spring boot 2.6.6 버전을 사용 중이며, 이제 곧 2.6.x 버전의 지원이 종료가 된다. java 21 도 나왔고, 가상 스레드를 실무에서 사용해 보고 싶은 생각도 있다. 겸사겸사 spring boot에 대한 버전을 업데이트하면서 변경된 내용과 오류를 잡은 과정에 대해서 내용을 정리하려고 한다. 일단 먼저 내부적으로 사용중인 일부 라이브러리 버전에 대해서 공유하도록 하겠다. (이외 다른 라이브러리도 사용 하고 있지만 버전을 올리면서 문제가 발생하는 경우에만 따로 버전 및 이슈를 공유하도록 한다.) spring boot 2.6.6 java 17 queryDsl 5.0 spring boot 를 버전을 올리면서 이외 다른 라이브러리 버전도 올려야 하는 부분이 발생할 수도 있다...
· Spring
⚡ 개요 save()와 saveAndFlush()의 차이점에 대해서 정리하기 전에 결론부터 얘기하면 두 개의 함수 모두 메서드가 끝나는 시점에 DB에 데이터가 저장이 된다. @Transactional 어노테이션에 따라서 동작하는 방식의 차이는 있을 수 있지만 결론은 동일하다. 아래의 사용 방법에 대해서 보기 전에 JPA 영속성에 대해서 잘 모른다면 한번 찾아보고 내용을 본다면 좀 더 도움이 된다. 추가적으로 JPA 영속화 과정에 대해서 정리를 하려고한다. ⚡ 사용 방법 📔 save() entity 데이터 한건을 저장하는 데 사용을 하는 함수이다. entity의 키의 존재 여부를 판단하고 신규 entity라고 판단을 하면 영속성 상태로 바꾸고 기존에 존재하는 entity이면 준영속 상태를 영속 상태로 바꿔..
· Spring
⚡ 개요 비지니스 로직을 작업하면서 일부 컬럼만 조회해서 사용하는 경우가 존재한다. 이때 나는 보통 queryFactory를 통해서 일부 컬럼에 대한 조회를 하는것이 익숙해서 이렇게 조회를 했다. 그러다가 문득 JPA 의 repository를 통해서 단일 컬럼 또는 일부 컬럼을 조회를 하는 것이 가능할 텐데 어떻게 하는지 궁금해졌다. queryFactory를 사용하든 repository를 사용하든 대용량 데이터를 조회하는 게 아닌 이상 속도적인 측면은 잠시 미뤄놓고 어떤 게 더 편하게 개발을 할 수 있는지가 궁금했고 방법을 찾아보게 되었다. :) ⚡ 일부 컬럼만 조회하는 방법 결론부터 이야기 하자면 일부분 컬럼만 가져오고 싶다면 Mapping Interface를 별도로 만들고 리턴을 받을 때 Entity..
· Spring
⚡ 개요 Spring Boot에서 QueryDsl을 사용하는 방법에는 여러 가지 방법이 존재한다. 내가 가장 많이 사용하는 방식은 queryFactory를 이용하는 방식을 사용한다. 회사에서 개발을 하면서 단일 테이블 기준으로 데이터를 뽑아낼 수 있는 부분이 적고 데이터량이 많다. 이외, 다른 방식들이 있는데 이부분에 대해서 정리를 하면서 잘못 쓰고 있는 부분이 있는지 체크를 해보려고 한다. ⚡ 사용 방법 querydsl을 사용하는 이유부터 생각을 해보자. 만약 spring boot JPA 및 JPQL을 사용해서 쿼리를 구현 한다고 생각해봤을때 단건 조회 또는 적당한 조건에 따른 조회는 크게 문제가 되지 않는다. 하지만 쿼리가 복잡해지고 조건이 많아지는 순간 실수가 발생할 가능성이 존재하고 유지보수에 어..
· Java
⚡ Hibernate ? 하이버네이트(Hibernate)는 자바 언어로 작성된 오픈 소스 ORM(Object-Relational Mapping) 프레임워크다. 하이버네이트의 설계 목표는 SQL과 JDBC를 사용한 수동 데이터 지속성 관련 프로그래밍 작업의 95%를 개발자가 해방시키는데 있다고 한다. 그렇다고 해서 SQL을 모르면 안 되며 오히려 더 많은 기술과 지식에 대한 투자가 필요하다. 객체 지향 프로그래밍에서 사용되는 클래스와 관계형 데이터베이스 테이블 간의 매핑을 단순화하고 추상화하여 개발자가 데이터베이스를 다루는 작업을 더욱 편리하게 하기 위해서 만들어졌다. 조금 더 쉽게 설명해서 JAVA 클래스를 통해서 Oracle, mssql, mraia 등의 DB에 상관없이 일관된 코드로 데이터 베이스 작..
· Spring
⚡ 개요 기본적으로 QueryDsl을 사용할때 QClass가 생성이 된다. 초기에 QueryDSL을 사용하면서 궁금했던 내용은 그냥 Entity를 사용해도 될거같은데 굳이 QClass를 만들어서 사용을 할까? 어떻게 만드는거지? 라는 기본적인 궁금증에서 래퍼런스 문서 부터 많은 블로그의 내용을 찾아봤으며 해당 내용을 정리 해보려고 한다. JPA_APT(JPAAnnotationProcessorTool)가 @Enttiy 와 같은 특정 어노테이션을 찾고 해당 클래스를 분석해서 QClass를 만들어 준다. 빌드 도구를 통해서 만드는 방법은 다른곳을 찾아봐도 나오니 생략한다. (Gradle의 경우, 버전별로 설정을 하는 방식이 다르기 때문에 버전에 맞게 잘 찾아서 사용 해야 한다.) ✋ APT 란 ? Annota..
· Java
⚡ 개요 이번에는 QueryDsl에서 DateType을 사용하는 방법에 대해서 정리를 해보려고 한다. QueryDsl을 사용하면서 Projections을 통해 쿼리 결과를 DTO 클래스로 변환해서 반환을 받고 리턴을 하는 경우가 종종 있다. 이때 조회 Entity 의 타입이 Date Type인 경우 변환을 할때 타입 에러가 발생하게 된다. 우리의 경우 데이터를 조회할때 예를 들어 1000개의 데이터중 필요한 Entity를 조회 해서 DTO로 변환을 하는 작업을 한다. 데이터의 양이 적다면 속도적인 측면에서 크게 문제가 되지 않지만 이력쪽 데이터를 조회하는 경우에는 속도적인 측면에서 많은 저하가 발생을 하게 되었다. 또한 데이터가 적더라도 컬럼의 타입 그대로가 아닌 변환을 해서 사용 해야하는 경우에도 En..
HaeTae
'JPA' 태그의 글 목록