[Spring Boot] 지도 서비스 대용량 DB 조회 성능 개선
·
Trouble Shootings/성능 개선
문제 상황소프티어 부트캠프 5기에 참여해서 개발한 팀 프로젝트에서,대학생을 위한 버스 쉐어링 예매 서비스를 개발했다.  서비스의 큰 특징은 유저가 원하는 탑승지를 설정할수 있다는 것이다.후에 어드민이 버스 노선을 배차해준다. (버스의 정원은 15명 이기 때문에, 최대 15명의 유저를 경유하도록 노선을 배차해준다) 노선을 배차해줄때는, TMAP의 경유지 최적화 api를 이용하였다.https://openapi.sk.com/products/detail?linkMenuSeq=38 SK open API장소 장소 검색 장소 통합 검색 장소 상세 정보 검색 주변 카테고리 검색 읍면동/도로명 검색 지역 분류 코드 검색 경로 반경 검색 지오펜싱 공간 검색 영역 검색 지오코딩 Reverse Geocoding Geocodi..
[JAVA] 백준 2629 - 양팔 저울
·
PS/다이나믹프로그래밍
https://www.acmicpc.net/problem/2629  추를 (저울에 올리지 않는경우) , (오른쪽에 올리는 경우), (왼쪽에 올리는 경우)총 세개로 재귀함수를 돌리면되는데, 그렇게 하면 문제의 조건에의해 시간 초과가 나므로, 메모이제이션을통해 가지치기를 해야한다  dp[i][w] = i번째 추까지 있을때, 그것으로 만들수있는 무게 w dp[i][w]의 의미를 제대로 규정짓지못해서 풀기 어려웠던 문제였다..  import java.io.BufferedReader;import java.io.InputStreamReader;public class Main { static int N; static int[] weight; static boolean[][] dp; static ..
[JAVA] 백준 1941 - 소문난 칠공주
·
PS/브루트포스(dfs,bfs,backtracking)
https://www.acmicpc.net/problem/1941  언뜻 보면 쉬워보였는데, 순수 dfs로 풀게되면 풀기 매우 까다롭다 1. 25C7로 25개의 좌표중에 7개를 고른 후, 2. S의 수가 4 이상인 좌표만 추린다.3. 그 좌표들을 dfs로 탐색하여 연결되어있는지 확인한다. 이정도인데, 1번은 조합을 구하는 dfs로 구하면 쉽게 구할수있고,2번도 조건문으로 쉽게 구할수있다.3번은 구현하면서 조금 해멨는데 연결만되어있는지 확인하기위해선 visited를 백트래킹할 필요없다는것을 생각하지못하였다.   import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;public class Main { ..
[JAVA] 백준 27172 - 수 나누기 게임 (에라토스 테네스의 체)
·
PS/기타 알고리즘
https://www.acmicpc.net/board/view/108208  문제 유형은 브루트포스였으나, 이중for문을돌면 5억번을 도므로, 시간초과가 나기때문에최대한 가지치기를하거나, 중복되는 케이스를 피해야하는데도저히 떠오르지 않아서 검색을 해보니 에라토스 테네스의 체를 응용하는 문제였다고 한다.   import java.io.BufferedReader;import java.io.InputStreamReader;public class Main { static int[] arr = new int[1000001]; static int[] num ; static int[] ans; static int N; public static void main(String[] args) t..
[Spring boot] JPA에서 Slice와 Page의 차이
·
Backend/Spring Boot
Slice public interface Slice extends Streamable { int getNumber(); int getSize(); int getNumberOfElements(); List getContent(); boolean hasContent(); // ...} JPA에서 정의한 Slice 인터페이스는 다음과 같다. 현재 페이지의 데이터들을 불러오고, 다음 페이지가 있는지 여부를 확인한다. Page public interface Page extends Slice { long getTotalElements(); int getTotalPages(); //...} Page 인터페이스는, Slice를 상속받기..
[Spring Boot] JPA N + 1 문제 직면과 해결, 그리고 Fetch Join
·
Trouble Shootings/성능 개선
문제 상황내 프로젝트에는 최근 DDD와 헥사고날 아키텍쳐로 리팩토링을 하게되었는데 JPA 영속성 객체인 UserEntity와 User라는 POJO 도메인을 따로 분리시켜서 관리하고있다따라서 모든 도메인로직은 외부 의존성이 없는 순수 자바 코드로 구현하고, 영속성은 JPA Entity가 따로 맡아서 관리한다. 그렇게 분리하게되면, Entity 객체 Domian 객체간의 mapping이 필요하다. (나의 경우 PersistenceAdapter에서 UserEntity를 DB에서 로드한후에, Mapper를통해 User 도메인으로 변환시켜서 Service에게 반환한다.) 그런데 여기서 문제가 발생했다. UserEntity에는 OneToMany로 이루어진 관계들이 많았기에, N+1문제가 발생하는것이었다. UserE..
[Springboot + Redis] 레디스를 이용한 캐싱을 통해 API 성능 개선하기 ( +JMeter)
·
Trouble Shootings/성능 개선
Github를 오마주한 3D model 버전 관리 웹 사이트를 만드는 프로젝트를 하던중 한가지 문제점을 발견했다.유저가 Mypage에 들어갈때마다, 매번  내 정보 (닉네임, 이메일 , 팔로워 수, 팔로잉 수)를 받아오는 API와, 내 리포지토리 리스트를 불러오는 API를 매번 호출하게되어, 응답시간이 매우 느리다는 것이었다. 유저가 새로고침할때마다, API호출을 매번 하게되면 서비스가 성장하여 유저 트래픽이 많아지게되면 DB에 큰 부하가 가게 된다. 따라서 나는 처음에 Spring boot 프레임워크에서 자체적으로 지원하는 Cache 라이브러리를 사용해 , 서버의 로컬 메모리에서 캐싱을 하도록 구현하였다.  결과적으로 응답속도는 매우 빨랐다. 왜냐하면 서버 내부의 메모리에서 다이렉트로 접근하기 때문에,..
[Spring Boot] Pageable을 이용해 페이지네이션구현(+JPA)
·
Backend/Spring Boot
페이지네이션이란?페이지네이션이란, 게시글이 많을 때 , 이를 전부 보여주지않고 페이지화 시켜서 보여주는것을 의미합니다.보통 적은 규모의 데이터는 , 리소스를  서버에서 클라이언트로 전부 전달해도 성능에 큰 지장이없지만,큰 규모의 데이터를 전달할 때(혹은 트래픽이 많은 서버), 쓸데 없이 모든 리소스를 전달하는 것보다.해당 페이지의 리소스만 전달하는것이 서버 입장에 있어 부담이 덜 하기 때문에 사용합니다.  RESTFUL API로 설계된 서버에서, 페이지네이션을 구현하려면두가지 단계가 필요합니다. 첫번째로, 총 페이지가 몇 페이지인지 클라이언트에게 전달해야합니다. 그래야만이 클라이언트는 이 리소스가 총 몇페이지가 있는지 확인 할 수 있습니다. 또한, 현재 페이지가 몇페이지인지 , 마지막페이지인지 첫번째페이..