[모놀리식 to MSA 전환기] 서비스 모듈 분리에 대한 의사 결정
·
프로젝트
Introduction이번 포스팅에서는 개인 프로젝트에서 MSA를 도입하게 된 배경과 서비스 모듈 분리에 대한 고민과 결정 사항을 기록하려고 합니다. 도입 배경소규모 프로젝트로 정산 시스템을 구현하고자 했기 때문에, 처음에는 모놀리식 구조의 레이어드 아키텍처를 사용해 프로젝트를 설계했습니다. 기존의 구조는 하나의 어플리케이션 안에 서비스의 모든 로직이 포함된 전통적인 소프트웨어 개발 방식으로, 초기 개발 단계에서 빠르게 기능을 구현하기에 적합합니다. 실제로 지금까지는 해당 구조로 개발을 진행하며 프로젝트를 진행해왔습니다. 하지만 개인 프로젝트에서도 더 나은 확장성과 안정성을 갖춘 설계를 학습하는 것이 필요하다고 판단했습니다. 특히, 정산 시스템은 데이터가 점점 증가하고 기능이 복잡해지는 특성이 있기 때문..
[프로그래머스] 60059 자물쇠와 열쇠 (JAVA) - 풀이
·
코딩테스트
문제 분석자물쇠 영역을 벗어나면자물쇠를 여는데 영향을 주지 않는다.자물쇠 영역 내에서는열쇠의 돌기와 자물쇠의 홈이 정확히 일치해야 한다.열쇠 돌기와 자물쇠 돌기로는 열지 못한다.자물쇠의 모든 홈을 채워서 비어있는 곳이 없어져야 좌물쇠를 열 수 있다.의사 결정배열을 확장시켜서 열쇠를 이동, 회전 시키고, 자물쇠와 일치하는지 확인합니다.확장시킨 배열에 자물쇠 배열의 값을 위치에 맞게 입력합니다.열쇠를 이동시키면서 자물쇠에 맞는지 확인합니다.열쇠가 맞지 않는다면 시계 방향으로 90도 회전시키면서 확인합니다. (총 4번 반복) 코드 구현1. 열쇠와 자물쇠의 길이를 사용해 배열을 확장자물쇠의 길이 + (열쇠의 길이-1) *2 의 크기로 배열 map[][]을 생성합니다.int m = key.length;int n ..
[트러블 슈팅] Redis에서 List<Dto> 역직렬화 문제 해결 과정
·
프로젝트
Introduction정산 조회 API의 성능을 개선하기 위해 Redis 캐싱을 도입했습니다. 캐싱된 데이터가 Redis에 이미 존재하면 DB 조회를 생략하고, Redis에서 데이터를 바로 가져올 수 있도록 설정했습니다. 처음에는 DB에서 조회한 데이터를 직렬화하여 Redis에 저장하는 부분까지는 순조롭게 진행됐지만, Redis에 저장된 값을 역직렬화한 후 조회할 때 오류가 발생했습니다. 이번 포스팅에서는 Redis에서 List 타입의 데이터를 역직렬화하는 과정에서 발생했던 문제와 이를 해결하기 위한 과정을 기록하고자 합니다. Serializer 선택 고민Redis 캐싱을 도입하면서 어떤 Serializer를 사용할지에 대해 크게 2가지로 고민했습니다. 첫째, GenericJackson2JsonRedis..
[성능 최적화] 300만 건의 배치 작업을 성능 개선해보자 (82.35% 개선)
·
프로젝트
Introduction개인 프로젝트로 진행한 정산 시스템에는 통계 및 정산 조회 기능을 위해 대규모 데이터를 처리하는 배치 작업이 있습니다. 이 배치 작업의 목적은 판매자가 일간, 주간, 월간 단위로 정산 및 통계를 조회할 때, 데이터의 일관성을 유지하고 빠른 응답 속도를 제공하는 것 입니다. 제가 구현한 배치 작업이 얼마나 많은 데이터를 처리할 수 있을지 궁금해졌습니다. 대규모 데이터를 다룰 때 배치 작업이 얼마나 성능을 발휘하는지, 그리고 성능 최적화를 통해 더 개선할 수 있는 부분은 무엇인지 확인하고 싶었습니다. 이번 포스팅에서는 정산 및 통계 배치 작업의 성능 최적화 과정을 기록하려고 합니다. 최적화 하려는 배치의 흐름도와 테스트, 최적화 과정을 작성했습니다.   일별 통계 배치를 성능 최적화 하..
[백준] 5972 택배 배송 (JAVA) - 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석1번 헛간에서 N번 헛간까지 가는 동안 만나는 모든 소에게 여물을 줘야 함가능한 적은 수의 소를 만나고, 최소한의 여물을 주면서 N번 헛간에 도착할 수 있는 경로 찾아야 함최소 합의 여물 구하기 의사 결정우선순위 큐(최소 힙)을 사용해서 최소 여물 수를 먼저 계산할 수 있도록 했습니다.연결된 경로와 가중치(여물)을 저장하기 위해 ArrayList arr 배열을 인접 리스트로 사용하여 양방향 간선 정보를 저장했습니다.다익스트라 알고리즘을 사용하여 출발지에서 목적지까지 필요한 최소 여물의 합을 구했습니다. 코드 구현1. Node 객체 선언이동할 노드와 가중치(여물의 양)을 저장할 Node 객체를 선언했습니다. 우선순위 큐에서 여물의 양이 더 적은 경로를 먼저 처리하기 위해, Comparable 인터..
[백준] 2660 회장뽑기 (JAVA) - 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석친구 관계를 통해서 회장 후보를 선정하기각 회원은 다른 모든 회원들과의 친구 관계를 통해 점수를 가지게 되며가장 적은 점수를 가진 회원이 회장 후보가 됨회장의 점수와 후보의 수, 회장 후보 목록을 출력하기 의사 결정친구 관계는 바로 연결된 친구 뿐만 아니라 친구의 친구까지 포함되기 때문에 양방향 간선을 사용했습니다.A가 B의 친구면, B도 A의 친구 입니다.회원 간의 관계를 인접 행렬로 사용하였고, 플로이드-워셜 알고리즘을 통해 정점 사이의 최단 경로를 구했습니다. 코드 구현1. 회원의 수 입력 및 인접 행렬 선언, 초기화회원 수를 입력 받고, 이 수에 맞게 인접 행렬을 선언했습니다.최대 회원 수는 50명이고, 초기값을 무한대로 설정하기 위해 51로 설정했습니다.자기 자신과의 경로는 0으로 초기..
[백준] 2212 센서 (JAVA) - 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석직선의 고속도로에 원점을 기점으로 N개의 센서가 설치되어 있음N개의 센서가 적어도 1개의 집중국과 통신되어야 하고, 최대 K개의 집중국을 세울 수 있음각 집중국의 수신 가능 영역 길이(0 이상) 합의 최소값을 구하기 의사 결정K개의 집중국을 세우면, 집중국 사이의 빈공간이 K-1개가 생깁니다.센서 사이의 거리를 내림차순하여 정렬합니다.큰 거리부터 K-1개의 공간을 제외하고, 나머지 공간을 모두 더하는 방식을 사용했습니다. 코드 구현1. 센서와 집중국의 개수, 센서 좌표 입력 받기각 센서의 위치는 배열에 저장했습니다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(..
[백준] 14916 거스름돈 (JAVA) - 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석2원과 5원으로만 거스름돈을 줄 때, 최소로 거슬러 줄 수 있는 개수 구하기만약, 거슬러 줄 수 없다면 -1 출력 의사 결정주어진 거스름돈 액수가 5로 나누어질 때까지 2씩 빼는 방식을 사용했습니다. 코드 구현1. 거스름돈 액수 입력받기 StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num = Integer.parseInt(br.readLine());  2. 거스름돈 액수 계산 및 결과 출력입력받은 num이 먼저 5로 나누어떨어지는지 확인했습니다.5의 배수면 나눈 값을 바로 결과로 출력했습니다. 5의 배수가 아니면, while문..
[백준] 2631 줄세우기 (JAVA) - 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석아이들의 번호 순서가 뒤바뀐 상태에서 오름차순으로 정렬하려고 할 때위치를 옮기는 아이들의 최소 횟수 구하기 의사 결정번호가 뒤바뀐 상태에서 LIS(최장 증가 부분 수열)의 갯수를 구하고, 전체 아이들 수에서 횟수를 빼는 방식을 사용했습니다. 코드 구현1. 아이들의 수 입력, 배열에 번호 순서 저장번호가 증가하는 순서대로 횟수를 저장하기 위해 배열을 선언하고, count 배열의 모든 인덱스를 1로 초기화 했습니다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int[] a = new int[N]; int[] count..
[백준] 1965 상자넣기 (JAVA) - DP 풀이
·
코딩테스트/백준(Beakjoon)
문제 분석앞에 있는 상자 크기가 뒤에 있는 상자 크기보다 작으면, 뒤에 있는 상자 안에 앞 상자를 넣을 수 있음한번에 넣을 수 있는 최대 상자 갯수를 출력하기상자 순서는 변경할 수 없다. 의사 결정상자의 크기를 비교하면서 한번에 넣을 수 있는 상자 갯수를 저장하고, 갯수의 가장 큰 값을 출력하는 방식을 사용했습니다. 코드 구현1. 상자의 갯수와 크기 입력, 배열에 상자 크기 저장 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int[] a = new int[N+1]; StringTokenizer st = new StringTokenize..
BE_ranny
'분류 전체보기' 카테고리의 글 목록