전체 글

Jisung Jung의 기술블로그
Algorithm

[Algorithm] Union-Find

Union-Find Union-Find 알고리즘은 서로소인 부분집합(그래프)을 표현하기 위한 알고리즘이다. union(x, y), find(x) 연산으로 이루어져 있으며 union(x, y)는 노드 x와 노드 y를 루트노드로 가지는 각 집합을 합하는 연산을 의미하고 find(x)는 x가 속한 집합의 루트노드를 확인하는 연산을 의미한다. Union-Find 알고리즘을 구현하기 위해서 필요한 자료구조는 각 노드의 부모노드를 저장하기 위한 배열이 필요하다. Union-Find 코드 public class Main { private static int[] parent; public static void main(String[] args) { parent = new int[N+1]; //union-find에 사용..

Algorithm

[Programmers] 미로 탈출 자바

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 기존코드 class Solution { //시작 좌표 private int sx, sy; //이동 변화값 배열 private int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //노드 방문 기록 배열 private boolean[][] vis; //최소 시간 기록 변수 private int answer = Integer.MAX_VALUE; public void init(String[] maps) { for(int i=0; i

NBCamp

[최종프로젝트] 상품 구매 동시성 처리

개요 프로젝트 통합테스트로 상품 구매에 대한 테스트를 진행하던 중 멀티스레드 환경에서 상품 구매 기능에 접근할 시 레이스 컨디션이 발생하는 문제를 인지할 수 있었다. 이러한 이유로 상품 구매 기능에 동시성 제어가 필요할 것이라고 생각했고 동시성 제어에 필요한 기술의 의사결정, 기술 적용, 테스트 코드 작성 및 회고를 진행하고자 한다. 동시성 처리가 필요한 이유 동시성 처리가 필요한 이유는 레이스 컨디션 발생에 있다. 레이스 컨디션이란 같은 자원(레지스터, 메서드)에 다수의 스레드가 동시에 접근해 값을 조작할때, 조작 순서가 보장되지 않아 잘못된 값이 저장되는 문제를 말한다. 레이스 컨디션의 가장 많이 알려진 예는 아래 코드라고 생각한다. 두 스레드가 동시에 count의 값을 증가시키려고 접근할때 coun..

NBCamp

[최종프로젝트] 상품 검색 서비스 스트레스 테스트

상품 검색 API Version 1 (성능 개선 이전) 상품 검색 API Version 2 (성능 개선 이후) Test 1 t2.medium: amazon linux 2023 ami / 2vCPU / 4 GiB memory 10 users 30m duration Test 2 t2.medium: amazon linux 2023 ami / 2vCPU / 4 GiB memory 99 users 30m duration Test 3 t2.medium: amazon linux 2023 ami / 2vCPU / 4 GiB memory 1000 users 30m duration

DevOps

[AWS] EC2에 CloudWatch agent 설치

EC2 내부의 자원 사용률을 보려면 직접 쉘스크립트를 작성해서 log를 찍어볼 수도 있지만, EC2에서 제공하는 CloudWatch를 사용하면 편하다. CloudWatch는 CPU Utilization의 경우 기본적으로 제공하지만 Memory 사용률을 측정하고싶다면 EC2 내부에 CloudWatch Agent를 설치하고 역할을 부여해주면 된다. 비용이 발생하긴 하지만 직접 쉘스크립트를 작성하는것보다 이 방법이 나은 것 같다. [ 참고자료 ] EC2에 CloudWatch Agent 사용하기 EC2에서 CloudWatch Agent를 설치하여 모니터링하는 것을 테스트해보겠습니다. medium.com

NBCamp

[최종프로젝트] 테스트 시나리오

최종프로젝트 테스트 시나리오 참고사항 nGrinder Controller/Agnet 실행 환경 - 로컬 환경에 설치해서 EC2 서버에 요청을 보내는 방식으로 테스트 - nGrinder Controller/Agent를 실행하는 비용도 존재하기 때문에 서버와 동일한 환경에 설치해서 진행하는것은 바람직하지 않고, 서버 환경에 대한 스펙은 명시하되 Controller/Agent가 실행되는 환경의 스펙은 명시하지 않아도 무관하다. 서버 스펙에 대한 참고사항 - t2.micro: amazon linux 2023 ami / 1 vCPU / 1 GiB memory - 위 서버 스펙은 aws freetier 스펙인데 실무에서는 4vCPU, 16GiB 환경을 주로 쓴다고 한다. 본 프로젝트는 학습의 목적이 크기 때문에 낮..

NBCamp

[최종프로젝트] 상품 검색 서비스 성능개선 회고

상품 검색 기능 성능 문제 발견 및 테스트 최종프로젝트에서 상품 검색 기능을 구현하고 프로젝트를 배포했을때, 아래와 같이 조회 속도가 매우 느린 문제가 발생했다. 이를 해결하고자 먼저 포스트맨을 이용해 응답시간을 체크해보았다. 포스트맨으로 확인해보았을때 5000~6000ms의 비정상적인 응답시간을 반환하는것을 확인할 수 있었다. 클라이언트의 입장에서 2000ms가 넘어가면 서비스를 제공하기 어렵다는 점을 기준으로 봤을때 확실히 개선히 필요한 부분이었다. nGrinder로 부하테스트를 진행했는데 TPS는 1.2, MTT는 8000ms로 매우 비정상적인 매트릭을 확인할 수 있었다. 반면, 메모리나 CPU가 매우 안정적인 모습을 보여주고 있는데 이를 확인했을때 서버 외부의 문제일 가능성이 크다고 예측했다. 상..

NBCamp

[최종프로젝트] WebSocket 실시간 채팅 서비스 개발

개요 최종프로젝트는 스포츠 경기 일정 및 결과를 제공하는 서비스인데 게임별 사용자가 소통할 수 있는 실시간 채팅 기능을 제공하고자 하였다. 네이버 스포츠, 아프리카TV 등과 같은 플랫폼에서 제공하는 실시간 채팅 기능을 모티브로하여 개발하였고 그 과정에서의 기술 의사결정과 개발과정 및 느낀점에 대한 회고를 진행하고자한다. Polling vs WebSocket 개발전 실시간 채팅에 사용할 수 있는 기술로 Polling 방식, WebSocket 중 어떤 기술을 채택해야할지 고민하는 시간을 가졌다. 결과적으로 WebSocket으로 개발하였고 WebSocket을 채택한 이유는 아래와 같다. 첫 번째로, Polling 방식은 지정한 interval마다 http요청을 보내기 때문에 서버에 많은 부담을 줄 것으로 판..

Backend, Spring

[Spring] nGrinder를 이용한 대용량 데이터 부하테스트

nGrinder 설치 및 실행 (로컬 환경) nGrinder를 로컬에서 구동하는 이유는 처음 Docker를 이용해 테스트하려고 했으나 M1 환경을 지원하는 nGrinder Docker 이미지가 존재하지 않고 JDK 설정 등 Docker로 할 경우 호환성 문제가 많아 로컬 환경에 controller와 agent를 다운로드 받아 진행했다. 아래 nGrinder 공식 깃헙에서 controller war 파일을 다운받아 실행한다. GitHub - naver/ngrinder: enterprise level performance testing solution enterprise level performance testing solution. Contribute to naver/ngrinder development..

Jisung Jung
Jisung Jung의 기술블로그