Spring Boot/JPA
-
2024 - QueryDSL 근황Spring Boot/JPA 2024. 8. 22. 22:24
QueryDSL은 동적 쿼리를 type-safe하게 작성할 수 있도록 도와주는 오픈소스 JPQL 쿼리 빌더이다. 3년 전부터 큰 릴리스가 없어, 해외에서는 JOOQ라는 기술보다 사용 선호도가 낮으나,우리나라에서는 채용 시장과 기업에서 주류로 자리 잡고 있다. 그 이유로는,인프런 김영한 님의 인터넷 강의로 QueryDSL의 입문 문턱이 상대적으로 낮고,대기업에서 수백만 트래픽도 안정적으로 운영할 수 있다는 검증과 노하우가 세미나로 공유되어Java/Spring/JPA를 사용하고 있다면 필수 기술로 여겨지고 있다. 그런데 최근 주변에서 QueryDSL 이외의 쿼리빌더를 도입하며 트러블슈팅 문의가 오픈카톡에 채팅으로 올라오곤 한다.현재 QueryDSL에 어떤 일이 벌어지는지 알아본다. [JOOQ, vs Que..
-
QueryDsl projections 자바 Record에 적용하기Spring Boot/JPA 2024. 4. 23. 01:58
QueryDsl을 이용하는 경우 반환 타입이 Entity가 아닌 다른 응답 객체(DTO)일때 Projection 기능을 제공해서 원하는 응답 객체로 변환할 수 있다.Projections.beanProjections.constructorProjections.fields@QueryProjection아니면 projection 기능을 포기하고 변환하는 로직을 작성해야하는데, 데이터 size가 크면 성능 이슈가 있을 수 있다. 위 4개 기능들의 사용법과, 장단점을 비교해보자. 결론부터 말하자면 Record는 Projections.constructor로만 데이터 바인딩이 가능하다. constructor 방식은 버그를 만들수 있어서, QueryDSL 응답객체는 Record 대신 class를 이용하고 fields pr..
-
JPA 주의점 (1) - OSIV false 설정 (open-in-view)Spring Boot/JPA 2024. 4. 19. 23:25
웹 서비스 성능에 중요한 지표로 "처리량"과 "응답시간"이 있다. 처리량 (throughput) - https://www.youtube.com/watch?v=JJJ4LReZ5q4서버에서 들어온 요청이 처리되는시간을 말한다.db connection 획득 시간db statement 전송 및 쓰기 시간요청 받은 statement 처리 시간db clent에게 result set 반환하는데 걸리는 시간db connection을 반환하고 Transaction이 idle되는 시간처리량을 숫자로 표현할때 TPS (Transaction Per Second)를 사용한다. TPS = transaction count / time초당 몇개의 클라이언트 요청 처리할 수 있는지 지표응답 시간 (response time) - 아래의..
-
[JPA] 간단하게 OneToMany 데이터 API 구현하기 - @Embeddable, @Embedded, @ElementCollection 활용하기Spring Boot/JPA 2023. 10. 15. 23:14
요구사항 레시피를 저장하고 조회, 삭제할 수 있는 API를 구성한다. JPA 연관관계 설정 없이 OneToMany 데이터 모델링 방법을 정리한다. API Spec 레시피 저장 api POST localhost:8881/api/recipe/new # requestBody { "name": "Fresh Mint Tea", "description": "Light, aromatic and refreshing beverage, ...", "ingredients": ["1 inch ginger root, minced", "1/2 lemon, juiced", "1/2 teaspoon manuka honey"], "directions": ["Place all ingredients in a mug and fill wit..
-
[JPA] Repository단에 Transactional을 선언하는 이유Spring Boot/JPA 2023. 10. 5. 22:37
적어도 일년 이상 궁금했던 의문이 풀려서 정리해본다. Mybatis를 쓰다가 처음로 JPA를 실무에 도입을 할때,위에 코드처럼 Repository단에 @Transcational를 선언하는 경우가 있었다. Service단에 @Transcational을 선언하면 Spring이 AOP로 하나의 Transcation으로 전파되는데왜 굳이 Repository에 선언해야할까?Github에 유명하신 분들 코드를 뜯어봐도,새로 이직한 회사의 코드를 뜯어봐도,ChatGPT, 구글, 공식문서 다 찾아봤지만 알 수 없었는데... 드디어 알게 되었다. 요약하면 Transaction이 너무 긴 Long Transaction이고 동시적인 요청을 받고 있을때 성능적으로 단점이 있기 때문이다. 스프링은 Transaction이 시작..
-
JPA 애플리케이션 데이터베이스 초기화Spring Boot/JPA 2023. 9. 17. 18:16
애플리케이션의 TestCode를 작성하려고 하면, 테스트를 위한 초기 데이터 (test fixture)가 필요하다. 당연히 H2 같은 in-memory DB로 테스트가 될 것을 기대하고 BeforeAll, AfterAll로 Setting하는 것으로 기대했지만, 현실은 build할때 실제 DB가 붙어서 동작하고 있었다. 어떻게 하면 Test Fixture를 분리 고립시킬 수 있을까? 지금까지 결론은 build 환경에서 DB 환경을 구성하고 @Sql로 관리하는 것이 가장 조작하기 쉬운 방법으로 보인다. SpringBoot에서 제공하는 데이터베이스 초기화 Spring boot에서는 데이터베이스 변경에 대한 관리 방법을 제공한다. default 설정은 package에 entity를 감지하여 각각의 테이블을 자동..
-
Spring boot JPA/하이버네이트?Spring Boot/JPA 2022. 1. 4. 10:54
"JPA는 데이터베이스 기술이라기보다 애플리케이션의 데이터를 객체지향으로 볼 수 있게 해주는 객체 지향 기술이다." 전자정부 프레임워크에는 몇 가지 데이터 액세스 기술을 제공하는데. JPA는 데이터에 접근하는 방법 중 하나 1) 아이바티스(or 마이바티스) 2) 하이버네이트 3) JPA 4) 스프링 JPA 5) 스프링 몽고 DB ... 등등 목차 JPA란 하이버네이트란? JPA란? JPA(Java Persistence API)는 자바 진영의 ORM 표준 기술이다. ORM - Oriented Relational Mapping 은 이름 그대로 객체와 RDBMS를 매핑해주는 기술이다. SQL을 작성하는게 아니라, 자바 컬렉션 저장하듯이 객체를 ORM 프레임워크에 저장하고 프레임워크가 데이터베이스에 알아서 저장..