전체 글
-
엔티티의 1:N 관계에서의 QueryDsl fetch Join - (2) 페이지네이션 해결 방법Back-End/Querydsl 2022. 12. 27. 16:00
사실, 이 문제에 대한 해결법에 대해서 많이 구글링을 해 보았지만, 상황에 따라 굉장히 해결법이 다양했다. 그 중에서도 가장 확실하고, 보편적으로 쓰일 만 한 방법을 소개한다. fetch Join + @BatchSize 활용하기 먼저, fetch Join을 통해 ToOne 관계에 있는 모든 entity를 fetch join 한다. ToOne관계의 경우, row수를 증가시키지 않기 때문에 페이징 쿼리에 영향을 주지 않기 때문이다. 이 후, 컬렉션은 지연 로딩으로 조회를 한다. 여기서, 지연 로딩 성능을 최적화하기 위해서 @BatchSize를 사용하게 된다. BatchSize의 경우, 어노테이션을 사용하여 개별로 적용할 수도 있고 application.yml 파일 내에 설정을 통해서 글로벌 적용도 가능하다...
-
엔티티의 1:N 관계에서의 QueryDsl fetch Join - (1) 페이지네이션Back-End/Querydsl 2022. 12. 21. 19:32
QueryDsl은 쿼리 빌더 프레임워크로써, 동적 쿼리 작성과 컴파일 시점에서의 쿼리 오류 검출이라는 큰 장점을 가지고 있다. (동적 쿼리 예시 및 QueryDsl로의 해결법 : https://jaehoney.tistory.com/185 ) 그래서 Spring Data JPA를 사용하는 개발자라면 굉장히 유용하게 사용할 수 있는 프레임워크이다. 사내카페의 포스기 백엔드 서버를 개발하던 중이었다. 팀 동료의 사정으로 팀 동료의 파트를 대신 개발을 하게 되었는데, 포스기에서 판매하는 상품을 조회하는 과정에서 쿼리가 수 십 방이 나가고 있었다. 이유인 즉슨, 테이블의 구조가 다음과 같았는데, 상품과 상품 이미지는 1:N, 상품 이미지와 이미지는 1:1의 구조를 갖고 있었다. 그리고 메뉴를 조회하는 API에 대..
-
Spring Rest docs를 활용한 API 명세를 openapi3를 활용하여 swagger로 변환하기Back-End/Spring 2022. 12. 13. 17:21
최근 사내 카페 pos기 프로젝트에서 프로젝트의 API 명세를 어떠한 방법으로 사용 할 지를 팀원들과 고민하였고, Spring Rest Docs를 사용하되 해당 정보를 openapi3를 활용하여 swagger로 띄우는 방법을 사용하기로 했다. swagger보다 초기 설정이 어렵지만, 테스트코드를 강제할 수 있고 자동으로 API명세를 작성해주는 편리함이 있어서 사용을 한다. openapi란, Restful한 API 디자인 정의의 표준이다. 즉, Api 스펙을 json 혹은 yml 형식으로 표현한 것이라고 이해하면 된다. 참고로, swagger는 openapi의 실제 실행 툴이라고 생각하면 된다. 먼저, Spring Rest Docs 사용을 위한 설정을 진행한다. // build.gradle plugins ..
-
2022년 회고록Etc/Diary 2022. 11. 29. 18:02
올해 2월 입사한 이후로, (인턴 제외) 첫 회사생활을 해 보면서 많은 경험들을 하였다. 앞자리도 2->3으로 바뀐 기념(?)해서 개발 경험을 포함하여 지난 1년 간 내가 잘 했던 점과 보완해야 할 점을 한 번 정리를 해 보려고 한다. 그리고 내년에는 더 나은 내가 되기 위해 어떤 것을 해야 할 지를 돌아보려한다. 잘한 점 열심히 공부를 했다. 칼퇴를 한 날보다 안 한 날이 더 많았다. 정말 하루하루 열심히 살면서 나의 부족한 점을 메꾸기 위해 노력을 많이 했다. Kafka를 따로 공부를 하면서 토이프로젝트에서 카프카도 사용 해 보고, 사내 프로젝트의 로그인 로직(JWT)에 Redis도 사용 해 보면서 성능 향상을 위해 노력했다. 자바를 열심히 공부했고, 스프링, JPA 등 원리를 잘 이해하고 잘 사용하..
-
자바의 Stream이란?Language/JAVA 2022. 11. 29. 14:13
스트림(Stream)이란 자바 8 에서 추가된, 람다를 활용하는 기술이다.람다식이란, 함수형 인터페이스의 구현 객체를 간결하게 표현하는 표현식이다. List list = List.of("귀여운", "고양이");// arr를 오름차순으로 정렬Collections.sort(arr, (s1,s2) -> s2.compareTo(s1))자바 8 이전에는 컬렉션을 다룰 때 for문을 통해 다뤄야했기 때문에 로직이 복잡해 질 수록 여러 로직이 섞이면서 가독성이 떨어지는 문제가 있었는데, 이러한 문제들을 해결할 수 있게 되었다.스트림은 다음과 같은 특징이 있다.데이터 소스를 추상화하여 데이터를 다루는 방법들을 공통화하였다.List의 정렬은 Collections.sort()를 사용하고, Array를 정렬 할 때에는 A..
-
자바의 직렬화(Serialization)란?Language/JAVA 2022. 11. 29. 13:10
자바의 직렬화란? 객체의 상태를 바이트배열과 같은 바이트 스트림으로 만드는 기법라고 할 수 있다.사용 되는 경우는 객체의 상태를 영속해야 할 필요가 있을 때 사용한다. 여기서 객체가 영속되는 곳은 캐시와 같은 메모리에 저장할 수도 있고, DB나 파일일 수도 있다. 또한 다른 VM에 전송해야 할 때 바이트 스트림으로 변환해서 전송할 때 사용된다.직렬화된 객체는 바이트 스트림(이진 데이터)으로 저장되며, 파일이나 네트워크로 전송될 수 있다.사람이 읽을 수 있는 형식이 아니며, 바이트 단위로 객체의 상태와 정보가 저장된다. 사용 방법 영속화하고자 하는 클래스에 Serializable 인터페이스를 implements하면 된다. 직렬화가 잘 사용되지 않는 이유? 보안 직렬화 시 byte[] 형식의 값을 ..
-
JPA의 연관관계에 대한 고찰Back-End/JPA 2022. 11. 18. 13:58
JPA의 XtoOne 관계를 설정할 때, fetchType 옵션은 기본적으로 eager로 설정되어있다. 따라서, 따로 Lazy 타입으로 설정을 하지 않는 경우 자신과 연관관계가 있는 엔티티를 호출하는 쿼리가 자동으로 나가게 되고 성능상으로 굉장한 손해가 온다(고 한다). 이론상으로만 배워왔기에 매번 헷갈리는 경우가 많았고, 따라서 한 번 실습을 진행 해 보면서 실제로 쿼리가 동작하는 것을 관찰 해 보려고 한다. 또한, eager로 fetch된 엔티티와 연관관계가 있는 또 다른 entity가 있고, 이들 또한 eager로 설정이 되어있다면 어떻게 query가 나가게 되는지를 관찰 해 보려 한다. 먼저, 예시 Entity를 만들기 위해, 다음과 같이 Entity 관계를 설정하였다. 만들고 나니 굉장히 이진트..
-
맥OS 자바 버전 바꾸기(M1)Etc/기타 지식 2022. 11. 9. 13:37
최근 spring 대신 사내 자바 프레임워크를 사용해야 할 일이 생겼다. 그리고 build 작업을 intellij를 활용하지 않고 직접 쉘에서 진행해야 했기에, 기존에 쓰던 Java version을 17로 업그레이드해야했다. 그런데 운영체제별로, 또 shell 별로 설정 부분이 서로 다르기에 내가 사용하는 macOS M1칩 기준으로 설정을 하였고 이 부분을 기록한다. 현재 shell 창에서만 임시적으로 환경변수를 변경하고 싶은 경우 $ export PATH="/Library/Java/JavaVirtualMachines/'본인이 설치한 버전의 jdk'/Contents/Home" 하지만 이 방법의 경우, 새로운 터미널 창을 키는 경우 기존의 환경변수 설정으로 초기화되버리기 때문에, 근본적으로 설정을 바꾸려면..