본문 바로가기

데이터 접근 기술/JPA27

나는 지금 JPQL이 필요하다! JPQL를 이해하지 않고 QueryDSL이 좋다고 라이브러리를 바로 쓸 수는 없다고 판단했다. 그래서 미래의 나에게 미리 사과를 하고 JPQL을 활용해 이번 프로젝트를 마무리할 것이다. 물론 요즘 DDD관련 서적도 읽고 JPA 공부도 다시 시작했고 JPQL도 배워 즉시 사용할 것이기 때문에 프로덕트 환경이 아닌 로컬에서 조금씩 리팩터링과 기술의 변경을 적용할 예정이다. JPA 및 Spring-Data-JPA가 아무리 좋다한들 복잡한 로직에 대해선 결국 쿼리 작성이 필요하긴 한 것 같다. 그래서 이를 지원하는 기능을 찾아보았다. JPQL JPA Criteria QueryDSL Native SQL SpringJdbcTemplate 아 순수 JDBC와 MyBatis는 제외하려고 한다. 현재 우리 프로젝트에 뭐.. 2022. 10. 26.
주말 정리 PostgreSQL 타입 정리 DDD Start 주문 및 기본 개념 서칭 후 정리 UUID - JPA 매핑 ( UUID 버전 별 다른 점 정리 ) Spring Data Jpa 관련 강의 엔티티 설계 및 매핑 시 주의할점 2022. 10. 24.
영속성 컨텍스트 JPA가 컬렉션에 대해 변경 감지 이후 어떻게 SQL을 처리하는지 알기 전 책으로 읽었던 영속성 컨텍스트를 복습해보자. JPA에서 가장 중요한건 객체와 관계형 데이터베이스 매핑하는 것과 영속성 컨텍스트이다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻을 가지고 있다. 영속성 컨텍스트는 논리적인 개념으로 실제 JPA를 처음 사용하게 될 때는 엔티티 매니저 팩토리에서 엔티티 매니저를 사용하여 다음과 같이 사용하게 된다. EntityManger.persist(entity) 이는 실제 DB에 쿼리를 전송하는 것은 아니고 실제 DB에 쿼리를 전송하는 행위는 JPA에게 위임하게 되는데 JPA가 내부적으로 관리하게 되는 저장소라고 생각하면 될 듯하다. 하지만 persist()를 호출했다고 즉시 데이터베이스.. 2022. 10. 23.
Entity의 변경을 JPA에서 처리하는 방법 JPA를 공부하는 과정에서 여러 의문점이 들기 시작한다. 예를 들어 컬렉션을 포함하는 엔티티가 있는데 해당 엔티티의 컬렉션의 내용이 변경되어 엔티티에 변경된 컬렉션을 넣었다. 이 과정에서 JPA는 변경 감지, 병합(merge) 둘 중 하나로 처리하여 데이터베이스에 쿼리를 전송하여야 하는데, 변경되어 없어진 정보들은 JPA가 어떻게 처리하는 가에 대해서다. 상상해보자면 기존의 스냅숏에 저장된 컬렉션과 현재 저장된 컬렉션을 비교하여 제거된 엔티티들을 파악하고 해당 엔티티의 PK값을 통해 FK값을 자동적으로 지워 연관관계를 끊어버리는가? JPA를 공부할 수 록 이해가 잘 안 되는 부분들이 상당히 많다. 중요 논점 변경된 엔티티를 데이터베이스 테이블에 적용하기 위해 JPA는 어떤 방법을 사용하고 그 방법의 개념.. 2022. 10. 23.
JPA 공부하기 전 누구나 그렇겠지만 새로운 것을 받아들이는 것은 두려움을 마주치게 된다. 나는 개발바닥의 단톡방에서 항상 눈팅을 하는 것을 좋아한다. 다양한 사람들이 개발에 관한 이야기를 엿볼 수 있다는 것은 매우 행복한 일이 아닐 수 없다. 참여하신 분들은 항상 새로운 것을 미리 준비하시는 것 같다. 실무에서 사용하지 않더라도 궁금하다면? 아니면 의무처럼 공부하실지도 모르겠지만 이는 새로운 것을 언제든지 받아 빠르게 적응하는 기반을 닦는 것이 아닐까 생각된다. 나의 첫 실무는 내가 원하는 기술과 스택을 사용하지 않았다. SI에서 JPA와, Spring Boot, S3, EC2 를 경험할 일이 있을까? 당연하게도 레거시한 환경에 노출되었기에 레거시한 기술을 습득하고 일을 진행했다. 그렇지만 나도 대기업에서 사용하는 기술들.. 2022. 10. 22.
[JPA] 공부하면서 나중에 찾아볼 것들 보호되어 있는 글 입니다. 2021. 4. 17.
[JPA] 2차 캐시 JPA를 공부하는 중에 다음과 같은 의문이 들었다. 영속성 콘텍스트가 제공하는 1차 캐시의 범위는 아무리 길어도 요청과 응답 주기이다. 그럼 자주 사용되는 데이터를 애플리케이션 내부 메모리에 저장하여 DB 연결을 최소화하여 재사용하면 성능이 오르지 않을까? 그래서 해당 데이터를 메모리에 캐시했다고 했을 경우 DB가 외부 시스템에서 데이터를 변경 혹은 추가했다면 해당 캐시는 데이터의 동일성을 유지하지 못하지 않을까? 이러한 해결책은 무엇일까? 그래서 한번 찾아보았다. 첫 번째의 해답은 2차 캐시를 사용하는 것이며, 2차 캐시를 사용하기 위해선 JPA의 표준 캐시와 구현체인 Hibernate의 캐시 기능을 활용할 수 있었다. JPA의 표준 캐시는 루트 엔티티 수준에서 캐시를 적용할 수 있지만 Hibernat.. 2021. 4. 17.
[JPA] JPA 기본 정리 JPA 소개 - 자바 진영에서 하이버네이트를 기반으로 자바 ORM 기술 표준을 만들었다. 이 표준은 Interface로 구성되어 있으며, 구현체인 Hibernate, EclipseLink, DataNucleus 등이 존재한다. ORM 말 그대로 오브젝트와 관계형 데이터베이스를 매핑해준다는 말이다. 왜 JPA인가? 1. 유지보수 : SQL에 의존적이거나 비지니스로 로직이 대부분 SQL에 몰려 있는 경우 엔티티의 사소한 변경만으로도 DAO계층 까지 내려가서 코드를 모두 수정해야 했다. 이것은 SQL에 따라서 반환되는 엔티티가 정해져 있다는 것이고, 그렇기에 모든 계층에 영향을 미치게 된다. 깊이 들어가서 생각해 보자. 보통 JAVA를 사용해 개발을 할 때는 객체지향적인 코드를 작성한다. 따라서 도메인에 따라.. 2021. 4. 11.
[JPA] 벌크 연산 JPA에서 영속성 콘텍스트에 있는 엔티티를 수정하기 위해선 영속성 콘텍스트의 변경 감지 기능이나 병합을 사용하고, 삭제하려면 엔티티 매니저의 remove()를 사용한다. 하지만 여러 개의 엔티티가 존재한다고 했을 때 하나씩 처리하기에는 오래 걸린다. 이럴 때 여러 건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다. 벌크 연산은 메서드 체이닝 기준 마지막에. executeUpdate() 메서드를 사용한다. 반환 값은 벌크 연산의 영향을 받은 엔티티 수이다. String qlString = update Product p set p.price = p.price * 1.1 where p.stockAmount< 10; int resultCount = em.createQuery(qlString) .execut.. 2021. 1. 31.
[JPA] JPQL JOIN JPQL 조인은 SQL 조인과 기능은 같고 문법만 약간의 차이가 있다. 내부 조인 내부 조인은 INNER JOIN을 사용하며 INNER은 생략 가능하다. JPQL을 사용해 회원과 팀을 내부 조인하는 예시를 들고 실제 쿼리가 어떻게 나가는지에 대해서 비교해보자 JPQL SELECT m FROM Member m JOIN m.team t WHERE t.name = '팀A' 팀 A인 회원을 조호하는 JPQL이다. 생성된 내부 조인 SQL문을 보자 SELECT M.ID AS ID, M.AGE AS AGE, M.TEAM_ID AS TEAM_ID M.NAME AS NAME FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID WHERE T.NAME = '팀A' 여기서 큰 특징은.. 2021. 1. 31.