SQS
·
DevOps/AWS
❐ Description페이스콕 프로젝트를 진행하면서 도입하게 된 SQS에 대해서 자세히 알아보자.더 나아가 Kafka와 어떠 차이점이 있는지도 알아보자!     ❐ SQS란?SQS(Simple Queue Service)는 AWS에서 제공하는 완전 관리형 메시지 큐 서비스로,애플리케이션 간의 비동기 메시지 전달을 안전하게 처리하는 서비스다. ✔︎ 메시지를 안전하게 보관하고 전달✔︎ 비동기 방식으로 분산 시스템 간의 결합도를 줄여줌✔︎ 메시지 브로커(Kafka, RabbitMQ) 없이 운영 가능✔︎ 서버리스 환경(Lambda, ECS, Fargate)과 쉽게 연동 가능     ❐ 특징1️⃣ 완전 관리형 서비스AWS가 인프라를 관리해주므로, 직접 메시지 브로커를 운영할 필요 없음자동 확장 지원 (대량의 메시..
AWS SQS 도입기
·
Project/페이스콕
❐ DescriptionSQS가 무엇이고, 왜 SQS를 도입하기로 했는지 기록해보자.AWS SQS란?     ❐ SQS를 도입하자.현재 페이스콕 프로젝트의 Member 테이블은 Cafe24에 위치해 있고, Firebase에서 이를 복사해서 사용하는구조로 되어있다. 여기에 더해 이번에 추가하는 Lesson 도메인에서도 Member 정보가 필요한 상황이다.왜냐면 Lesson 도메인에서는 Member와 다른 테이블을 Join해서 데이터를 조회해야 하기 때문이다. 단순히 Member 테이블을 AWS Rds로 옮기면 해결될 문제라고 생각할 수 있지만, 아래의 문제가 발생한다.Member 도메인에 관련된 비즈니스 로직을 모두 가져와야 한다.OAuth 구현까지 가져와야 한다.시간이 무한정이라면 충분히 할 수 있는 작..
API Gateway 구축하기
·
Project/페이스콕
개발 일정과 Spring Cloud Gateway에 비해 간편하게 SSL인증 및 DNS 연동을 할 수 있기 때문에AWS API Gateway를 사용추후 비용 발생이 커질 경우 Spring Cloud Gateway 구축API Gateway 리전별 허용 IP 범위
Redis로 동시성 제어해보기
·
Back-End/Redis
❐ Description과거 위웃 프로젝트를 담당하고 있던 때, 초대코드 `입력시 동시성 이슈 + Dead Lock` 를 마주친 적이 있다.빠른 대응이 우선되었기 때문에, 비관적 잠금을 통해 이슈를 대응했다. 하지만, 위와 같이 잠금 매커니즘으로 대응하는 방법은 추후 `Dead Lock`을 유발할 수 잇는 위험성이 있다.아니나 다를까 간헐적으로 CannotAcquireLockException이 Slack(Sentry 연동) 알람으로 날아온 기억이 난다.따라서 추후에 DB 잠금을 걸지 않고 Redis로 동시성을 제어하도록 개선한 경험이 있는데 이것을 기록해봐야겠다.테스트 도구로 JMeter를 사용했다.     ❐ 과거 문제 및 재현1. 문제 상황120명이 동시에 A라는 사람의 초대코드를 사용해서 회원가입을..
[LeetCode#15] 3Sum
·
Algorithm/문제풀이
❐ Description문제 링크https://leetcode.com/problems/3sum/description/난이도Medium(골드Ⅴ~Ⅲ)     ❐ 문제 분석주어진 `nums[]`에서 서로 다른 세 수의 합이 0이 되는 조합을 찾아야 한다.  🧩 Step 1. Two Pointer를 사용하기세 숫자의 합을 찾는 대신, 첫 번째 숫자를 기준으로 나머지 두 숫자를 Two-Pointer 방식으로 탐색한다. 🧩 Step 2. 주어진 nums[] 정렬하기배열을 오름차순으로 정렬해준다. 이는 Two Pointer 방식을 효율적으로 사용하기 위함이다.  🧩 Step 3. 중복 방지하기같은 숫자가 여러 번 사용되면 결과에 중복된 조합이 포함되므로 이를 방지해야 한다.같은 숫자를 연속적으로 사용할 경우 이..
Counting Sort
·
Algorithm/내용 정리
❐ Description[LeetCode#274] HIndex를 풀면서 Counting Sort를 알게 됐다. 이를 직접 구현해보자!     ❐ 특징시간 복잡도최선, 평균, 최악 모구 O(n+k)n : 정렬할 데이터의 개수k : 데이터 값의 범위비교 기반이 아님데이터를 비교하지 않고, 데이터의 출현 횟수만 이용하여 정렬한다.안정정렬데이터의 순서를 유지하며 정렬한다.한계점데이터 범위가 크면 비효율적이다.정수 또는 정수로 변환 가능한 데이터에만 사용할 수 있다.부동소수점이나 복잡한 객체에는 적합하지 않다.     ❐ 순서대로 구현해보기Step1. 주어진 배열의 요소 중 최댓값 찾기int maxElement = Arrays.stream(nums).max().getAsInt();  Step2. 길이가 `최대값 ..
[LeetCode#152] Maximum Product Subarray
·
Algorithm/문제풀이
❐ Description문제 링크https://leetcode.com/problems/maximum-product-subarray/description/난이도Medium      ❐ 문제 분석이 문제는 배열 내 음수, 0, 양수의 특성을 고려해야 하기 때문에 단순히 한 번의 반복으로 최대값을찾을 수 없다. 대신 DP를 사용하여 최대값과 최소값을 동시에 추적하여 풀이해야 한다. 그럼 왜 최소값도 추적해야 할까? 음수가 곱해질 경우, 최소값이 최대값으로 변할 수 있기 때문이다.예를들어, `[-2, 3, -4]`에서는`-2`를 시작으로 음수를 만나면 곱셈 결과가 양수가 된다.따라서 현재 최소값을 함께 고려해야 최대값을 얻을 수 있다.     ❐ 문제 풀이1. Dynamic Programmingpublic cl..
[LeetCode#300] Longest Increasing Subsequence
·
Algorithm/문제풀이
❐ Description문제 링크https://leetcode.com/problems/longest-increasing-subsequence/description난이도Medium     ❐ Dynamic Programming나의 경우 주어진 nums 배열을 거꾸로 순회하면서 풀이하는 방식으로 접근했다.우선 memo 배열은 1로 초기화해주었다. 왜냐면 최소 길이가 1 이기 때문이다. 작동 방식은 다음과 같다.// 1. idx = 7int target = nums[7] = 18최대 길이는 18 자신이므로 1// 2. idx = 6int target = nums[6] = 101101 다음 숫자가 18로, 101 보다 작기 때문에 현재 위치에서 최대 길이는 1// 3. idx = 5int target = num..