전체 글 122

[네트워크]로드밸런서의 개념과 실제 구현까지

로드밸런서에 대한 개념과 구현을 어떻게 하는지 학습한 내용을 정리했습니다.로드밸런서(Load Balancer)?로드밸런서(Load Balancer)는 클라이언트로부터 들어오는 네트워크 트래픽을 여러 백엔드 서버로 분산시키는 장치 또는 소프트웨어다. 교통경찰처럼 수많은 요청(차량)을 각 서버(도로)로 적절히 흘려보내, 특정 서버에 트래픽이 몰려 죽는 일을 방지한다. 현대 서비스에서 고가용성(HA), 수평 확장(Scale-out), 무중단 배포는 로드밸런서 없이는 불가능하다. 핵심 이점은 다음과 같다: 가용성(Availability): 특정 서버 장애 시 나머지 서버로 즉시 트래픽 전환확장성(Scalability): 서버를 추가하는 것만으로 처리 용량 증가보안(Security): DDoS 방어, SSL 터미..

[K8S]클러스터 아키텍처

쿠버네티스 백엔드 구조와 설계에 대한 공부 내용을 정리했습니다.컨트롤 플레인과 워커 노드쿠버네티스 클러스터는 컨트롤 플레인과 워커 노드로 구성되어 있다.워커 노드들은 우리가 원하는 애플리케이션의 이미지 기반의 컨테이너화된 애플리케이션을 실행한다.모든 클러스터는 파드를 실행하기 위해 최소한 하나의 워커 노드가 필요하다.워커 노드는 애플리케이션 워크로드의 구성 요소인 파드를 호스팅한다.컨트롤 플레인은 클러스터 내의 워커 노드와 파드를 관리한다. 프로덕션 환경에서, 컨트롤 플레인은 보통 여러 대의 컴퓨터에서 실행되며, 클러스터는 일반적으로 여러 개의 노드를 실행하며 장애를 컨트롤하고 고가용성을 제공한다. 노드와 파드노드는 서버(컴퓨터), 파드는 그 위에서 돌아가는 앱 실행 단위다.보통 노드는 마스터 노드(컨트..

[Spring]heapdump를 이용해서 메모리 누수(Memory Leak) 찾아보기 feat. Eclipse Memory Analyzer

들어가며Spring 서버에서 메모리 누수가 있는지 확인하는 방법을 공부해서 정리해봤습니다. 메모리 누수(Memory Leak)??동적으로 할당하여 사용한 메모리가 해제될 수 없는 상태가 된 것을 누수라고 표현하곤합니다.쓸모 없는 데이터가 계속 쌓이니까 어느 순간 실제 필요한 데이터를 불러와야하지만 꽉차서 여러 오류가 발생합니다.그걸 해결하기 위한 대표적인 해결책이 가비지 콜렉터이나 이 방법으로 해결하지 못하는 경우도 많습니다.그럴 땐 직접 메모리힙을 보면서 뭐가 지금 누수가 생긴 지 확인해야 합니다.heapdump를 사용해서 분석하면 더욱 더 편하게 할 수 있습니다.Heapdump가 뭐에요?애플리케이션이 실행 중인 특정 시점에서 JVM의 힙 메모리 영역을 스냅샷으로 캡처하여 저장한 파일입니다.힙 메모리라..

[Kotlin]코루틴(Kotlin Coroutine)에 대해 알아보자

들어가며코틀린 비동기 처리에서 사용하는 코루틴에 대해 공부한 내용들을 정리해보았습니다. 코틀린 코루틴이 뭔가요?비동기적으로 실행되는 코드를 간소화하기 위한 동시성 설계 패턴의 일종입니다.비동기 처리는 보통 동시성이나 병렬성을 높이기 위해 사용됩니다.여러 코드를 활용하는 병렬 처리를 위해 다중 스레드를 사용하기도 하지만, 코루틴은 주로 하나의 스레드에서 여러 작업을 번갈아 처리할 수 있는 동시성을 매우 효율적으로 다루기 위해 설계되었습니다.하지만 코루틴은 스레드와 달리 시스템 리소스를 거의 차지하지 않습니다. 따라서 수 천개, 수 만 개의 코루틴을 생성해도 전혀 문제가 없는 겁니다.그런데도 동시 작업을 효율적으로 처리할 수 있는 거죠 어떻게 스레드와 달리 시스템 리소스를 거의 차지 않게 만든 건가요?코루틴..

[백준]1039 - 교환 문제 풀이(자바,Java)

문제1039번: 교환들어가며완전 탐색 기법으로 문제를 풀었습니다.다만, dfs를 처음 이용했는데 메모리 초과로 계속해서 못풀었습니다.겨우 답지보고 bfs 접근을 해야 함을 깨달았습니다.풀이 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class 백준1039_교환 { static int k; static String originalNum; static int result = Integer.MIN_VALUE; public static void main(String[] args) throws IOException { ..

[Spring]부하테스트 후 서버 성능 개선해보기(feat. Valkey)

들어가며안녕하세요. 현재 크래프톤 정글에서 "넌! 런"이라는 러닝앱을 개발하고 있습니다. 핵심 기능 개발이 끝나고 나서 서버 성능 테스트를 해보고 한계를 확인하고 이를 개선하고자 공부한 내용을 글로 남기고자 합니다. 초기 아키텍처초기엔 개발이 급선무였기에 최대한 아키텍처를 잘 짜고 싶다는 사심을 배제해서 구성했습니다. 단일 인스턴스로 구축되었으며 HTTPS SSL/TLS 통신은 nginx가 담당하고 있었습니다. CI/CD는 Github Actions을 이용해서 Develop 브랜치에 코드가 머지가 되면 AWS ECR에 Docker Image를 저장하고 인스턴스에 ssh 접속해서 pull 해서 컨테이너를 올리는 방식으로 진행했습니다. 이 과정 속에서 nginx 또한 관리해야하므로 Docker Compose..

[Spring]Google Static Maps API 적용기(지도 로딩 속도 최적화하기)

들어가며안녕하세요. 현재 크래프톤 정글에서 "넌! 런"이라는 러닝앱을 개발하고 있습니다. GPS 경로를 저장하고 이미지로 보여줘야 하는 문제로 Google Static Maps API를 사용하게 되었습니다. 그 과정 속에서 겪었던 문제에 대해 적어봤습니다.Google Static Maps API 사용하기 이전엔.. https://namamim.tistory.com/114 [Spring]지도 경로 로딩 최적화 문제 해결하기 (feat. PostGIS, Ramer-Douglas-Peucker)들어가며안녕하세요. 현재 크래프톤 정글에서 "넌! 런"이라는 러닝앱을 개발하고 있습니다. GPS를 많이 사용하는 러닝앱 특성상 수많은 좌표들을 최적화하는 문제에 직면하여 고생한 내용을 글namamim.tistory.co..

[백준]1033 - 칵테일 문제 풀이(자바,Java)

문제https://www.acmicpc.net/problem/1033들어가며bfs로 접근하는 것까진 성공했지만 최소 공배수, 최대 공약수를 어떻게 구해야 하는지 잊어먹어서 못 풀었다. 풀이 코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class 백준1033_칵테일 { private static ArrayList> arr = new ArrayList(); private static long[] amount; private static ArrayList ratio = new ArrayList(); public static ..

[Spring]지도 경로 로딩 최적화 문제 해결하기 (feat. PostGIS, Ramer-Douglas-Peucker)

들어가며안녕하세요. 현재 크래프톤 정글에서 "넌! 런"이라는 러닝앱을 개발하고 있습니다. GPS를 많이 사용하는 러닝앱 특성상 수많은 좌표들을 최적화하는 문제에 직면하여 고생한 내용을 글로 남기고자 합니다. 어떤 문제가 있었나요?저희 앱에 지정된 경로들을 사용자에게 제시해주고 그중 하나를 선택하여 그걸 경로 안내와 함께 달리고 랭킹을 세우는 기능이 있었습니다.이 기능을 위해 지도의 경로를 리스트형식으로 띄워야 했습니다. 딱 이 기능을 구상했을 때, 정말 쉬울 거라고 생각했습니다. 경로는 위경도 좌표들의 배열이니까.. 배열로 저장하면 되지 않을까..??근데 잠깐만 이러면 DB Table을 어떻게 구성해야 하는 거지?? 그렇습니다.첫 번째 난관: 어떻게 수많은 좌표들을 DB에 저장하는가? 단순하게 생각해 ..

[백준]14502 - 연구소 문제 풀이(자바,Java)

문제https://www.acmicpc.net/problem/14502 들어가며오랜만에 푸는 문제라 숨 막혔다.그리고 배열 복제하는 등의 테크닉도 배운 문제라 좋았다.풀이 코드package solved.ac.maraton;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class 백준14502 { static int[][] arr; static int[][] map; static int n, m; static boolean[][] visited = new boolean[n][m]; static int[][] dirs = ..