[Spring Boot] 지도 서비스 대용량 DB 조회 성능 개선
·
Trouble Shootings/성능 개선
문제 상황소프티어 부트캠프 5기에 참여해서 개발한 팀 프로젝트에서,대학생을 위한 버스 쉐어링 예매 서비스를 개발했다.  서비스의 큰 특징은 유저가 원하는 탑승지를 설정할수 있다는 것이다.후에 어드민이 버스 노선을 배차해준다. (버스의 정원은 15명 이기 때문에, 최대 15명의 유저를 경유하도록 노선을 배차해준다) 노선을 배차해줄때는, TMAP의 경유지 최적화 api를 이용하였다.https://openapi.sk.com/products/detail?linkMenuSeq=38 SK open API장소 장소 검색 장소 통합 검색 장소 상세 정보 검색 주변 카테고리 검색 읍면동/도로명 검색 지역 분류 코드 검색 경로 반경 검색 지오펜싱 공간 검색 영역 검색 지오코딩 Reverse Geocoding Geocodi..
[Spring boot] Spring AOP - CGLIB Proxy vs Dynamic Proxy
·
Backend/Spring Boot
문제 상황usecase를 작성중 , 메소드에 @Transactional 컴포넌트를 붙이자 오류가 발생하였다 나는 이 class를 다른 클래스에 상속한 적이 없었는데, 오류 메세지를 보니 해당 클래스는 implicitly subclassed이기 때문에 open 키워드를 명시해주어야 한다고 적혀있다.즉 , 이 클래스가 나중에 상속될 가능성이 있는 클래스라는 것이다.메소드에 @Transactional 어노테이션을 제거하면, 오류가 사라지는것을 보아, 해당 문제의 원인이 @Transactional이라고 생각을 했다.  문제 원인어노테이션에 적용되는 Spring AOP의 내부적인 구조를 알게 되면 이 문제의 원인을 알 수 있다. Spring AOP는 Proxy패턴을 기반으로 동작하는데, 런타임시 동적으로 프록시 ..
[SpringBoot] QueryDsl의 Pagenation + PageableExecutionUtils을 이용해 count 쿼리 최적화
·
Backend/Spring Boot
JPA Repository를 사용할 때 public interface PostRepository extends JpaRepository { Page findByTitle(String title, Pageable p); } JPA repository는 Pageable을 매개변수로 받을 시 , 반환형을 Page로 추상화 해준다.    QueryDsl을 사용할 때@Repository@RequiredArgsConstructorpublic class PostRepositoryImpl implements PostRepositoryCustom { private final JPAQueryFactory queryFactory; @Override public Page findByTitleCustom(Str..
[JAVA] 백준 7579 - 앱
·
PS/다이나믹프로그래밍
https://www.acmicpc.net/problem/7579 DP 풀이Knapsack문제를 완벽히 체득하고 외울정도까지 되었으면 이를 응용하는버전으로 구할수있다.하지만 주의해야할건 dp[i][w]에서 1~i까지 어플중에 메모리가 w일때 최소 시간 이라고 정의하면, 메모리 부족이 뜬다.dp[i][t] =  1~i까지 어플이있을때, t시간을 소요하는 최대 메모리라고 dp를 선언할수 있느냐 없느냐를 물어보는게 이문제의 핵심같다. 그렇게하면 점화식을 다음과 같이 세울 수 있다 dp[i][t] => max(dp[i -1][t - cost[i]] + memory[i] ( i번째를 담았을 때) , dp[i - 1][t] (i번째를 안담았을 때)) 그후 0이 엣지케이스이므로 index문제만 해결해주면된다. 왜 최..
[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 ..
[Spring boot] soft delete에서 duplicate entry 문제
·
Trouble Shootings/버그 해결
현재 상황현재 나는 모든 Entry를 soft delete로 구현을 하였다.soft delete를 적용한 이유는, 현재 프로젝트가 3D모델 저장소인 만큼, 삭제 복구 기능이 필요할 것이라고 판단하였기 때문이다.따라서 유저는 삭제(회원 탈퇴, 리포지토리 삭제)를 해도, 물리적 DB에서 해당 튜플이 삭제되는것이아닌,Entry의 delete_at 필드가 갱신된다. 삭제가 되지 않은 entry는 deleted_at IS NULL로 구분하고 있다. 또한, JPA의 Unique Constraints로 {userId,title} 를 설정해 두었다. 이는 유저가 중복된 title의 게시글을 막기위해서인데, 여기서 문제가 발생했다. 문제가 발생한 상황테스트를 하고있었는데, 어느순간 갑자기 duplicate title이 ..
[JAVA] 백준 2608 - 로마숫자
·
PS/구현
https://www.acmicpc.net/problem/2608  완전한 구현문제이고,나는 처음에 똑같은 길이의 로마숫자가 여러개가 나오면 어떡하나 걱정했었는데,숫자하나당 로마숫자하나로 귀결되도록 적절히 문제 조건을 잘 설정했겠지?? 라고 믿었다. 왜냐하면 그러지 않으면 문제가 너무 복잡해지기 때문이다. 전체 숫자에서 크기가 큰 로마숫자를 하나씩 뺴가며, 0이 될떄까지 반복한다.그리고 각 로마숫자 사용에 제한이있으므로, 한번 로마숫자를 사용할때마다  횟수를 차감시킨다. 갑자기 null pointer가 떠서 당황했는데, IVIV 입력값을 넣고 알수있었다. "IV".replace("IV", "")을 하게되면 문자열이 ""만 남게된다. "".split("");를 하게되면 나는 길이가 0인 문자열 배열을 반환..
[JAVA] 백준 1890 - 점프
·
PS/다이나믹프로그래밍
https://www.acmicpc.net/problem/1890 솔직히 맞을줄몰랐는데 맞아서 신기했다 어차피 오른쪽 또는 아래로만 갈수있으므로,그리디를 적용해서 메모이제이션으로 풀 수있었다. 그리디를 적용했다는것은 , 지도를 왼쪽 -> 오른쪽 , 위 -> 아래 순으로 이중 for문을 돌렸을때,한번 방문한것은 다시 방문 안해도 되는것을 깨닫고 적용해보았다. import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;public class Main { static int N; static int[][] map; static long[][] dp; public static void main(..