인기 글

여행 동행 참여에 대해 동시성 문제 해결하고 성능 비교(낙관적/비관적 락) 해보기
·
Spring
개요현재 여행 동행 모집 프로젝트를 진행하는 중에, 동행 참여에 대한 동시성 이슈가 발생했다. 1. 동시성 문제 발생 원인여행 동행 모임 참여 로직은 다음과 같다.멤버가 우동(동행 모임)에 대해 참여 요청을 보낸다.참여할 수 있는지 유효성 검증을 한다. (인원 체크, 기존 참여 여부 확인 등)우동에 대기자로 등록한다.관리자가 승인하면 동행에 최종 참여된다.한 우동에 대해 대기자는 최대 5명만 가능하기 때문에, 처음에는 대기자 객체를 생성할 때 대기자 수를 체크했다.public class WaitingMember { public static WaitingMember of(Udong udong, Long memberId, int currentWaitingMembersCount) { ..
스프링MVC는 왜 스레드를 최대 200개까지 사용할까?
·
Spring
스프링 MVC는 웹 애플리케이션 개발에서 널리 사용되는 프레임워크이다.많은 사람들이 스프링을 왜 쓰냐 하면 거의 다 "스레드가 많아서", "대규모 트래픽 처리할 수 있어서"라고 한다.사실 스레드 개수 문제가 아니다 🙅‍♀️node.js는 적은 스레드로 논블로킹을 사용해서 충분히 트래픽을 처리한다. 스프링 MVC 기준 스레드 풀의 max값은 200이다.server: tomcat: threads: max: 200 # 생성할 수 있는 thread의 총 개수 min-spare: 10 # 항상 활성화 되어있는(idle) thread의 개수 max-connections: 8192 # 수립가능한 connection의 총 개수 a..
그래서 커넥션 풀 사이즈는 어떻게 설정하라구요?
·
DB
커넥션 풀이란?커넥션 풀은 데이터베이스 연결을 미리 생성하여 저장하고, 클라이언트 요청 시 이를 재사용하는 방식이다. 웹 애플리케이션 서버(WAS)가 실행되면 데이터베이스와의 연결 객체를 생성해 풀(pool)에 저장하고, 클라이언트 요청이 오면 이를 빌려주며 작업이 끝나면 반납받아 다시 저장한다. 커넥션 풀이 왜 필요할까?커넥션 생성에는 높은 비용이 발생한다고 한다. 아래는 한 행을 insert 하는 데 드는 시간을 나타낸다.(괄호 안의 숫자는 비율을 나타낸다)// MySQL 8.0 Documentation // https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.htmlConnecting: (3)Sending query to server: (2) ..
JVM Warm-up, feat. 스프링 첫 요청이 오래 걸리는 이유
·
Java & OOP
원인웹 애플리케이션을 실행한 후 초기 요청이 지연되는 현상을 이해하려면, 자바 프로그램이 실행되는 방식을 깊이 살펴볼 필요가 있다.C, C++과 같은 컴파일 언어는 소스 코드를 기계어로 직접 변환하여 최적화된 성능을 제공하나 빌드 환경에 종속적이라는 단점이 있다.즉, 플랫폼이 바뀌면 재컴파일이 필요하다. 자바는 이러한 플랫폼 종속적인 문제를 해결하고자 JVM을 도입하였다.자바는 자바 코드는 컴파일 시 바이트 코드로 변환되고, 실행 시 JVM이 이를 기계어로 변환하여 실행한다.이러한 구조 덕분에 Java는 플랫폼에 종속되지 않게 되었지만, 이 과정에서 변환 작업이 추가되므로 성능에 영향을 미칠 수 있다. 1. 클래스 로더JVM에서 클래스 로더(Class Loader)는 바이트 코드를 메모리에 로드하는 역할..
JVM 구조와 동작 과정
·
Java & OOP
자바를 공부하다 보면 Write once, run anywhere (한 번 작성하면, 어디서나 실행된다.) 라는 말을 볼 수 있다. 컴퓨터가 어떤 프로그램을 실행하려면, 컴퓨터가 읽을 수 있는 언어(기계어)로 작성되어야 한다.자바 프로그램에서는 JVM(Java Virtual Machine)이라는 가상머신이 우리가 작성한 java코드를 기계어로 변환해 주고, 어떤 운영체제에서도 이 코드가 실행될 수 있도록 도와주는 역할을 한다.즉, JVM 덕분에 OS에 독립적인 특징을 가지고 있는 것이다. JVM 작동 원리우리가 작성한 코드가 JVM에 전달되어 실행되기까지 과정은 아래와 같다. 개발자가 자바 소스코드(.java)를 작성한다.자바 컴파일러(javac)가 자바 소스코드를 자바 바이트코드(.class)로 컴파일..
로또 코드 예제로 이해해 보는 객체 지향 설계 5원칙(SOLID)
·
Java & OOP
스프링 입문을 위한 자바 객체 지향의 원리와 이해를 보고 5장은 꼭 정리해야겠다 싶어서 예시와 함께 이해해 보려고 노력했다! 이 원칙들은 주기적으로 봐야 할 것 같아서 포스팅한다...! 개요SOLID는 객체 지향 프로그래밍의 설계 원칙으로, 로버트 C. 마틴(Robert C. Martin)이 제시한 다섯 가지 원칙이다. 마이클 페더스(Michael Feathers)가 이를 두문자어로 정리하여 널리 알려졌다. SOLID의 5대 원칙SRP(Single Responsibility Principle): 단일 책임 원칙OCP(Open Closed Principle): 개방 폐쇄 원칙LSP(Liskov Substitution Principle): 리스코프 치환 원칙ISP(lnterface Segregation Pr..
싱글톤 패턴은 thread safe하지 않다?(개선 방식 4가지)
·
Java & OOP
싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 어디서든 이를 접근할 수 있도록 하는 디자인 패턴이다.나도 기본적인 싱글톤 구현 방식으로만 알고 있었는데, 이 방식이 멀티 스레드 환경에서 안전하지 않다는 얘기를 듣고 알아보게 되었다!  기본 싱글톤 구현 (Lazy Initialization)class Singleton { // 싱글톤 클래스 객체를 담을 인스턴스 변수 private static Singleton instance = null; // 생성자를 private로 선언 (외부에서 new 사용 X) private Singleton() {} // 외부에서 정적 메서드를 호출하면 그제서야 초기화 진행 (lazy) public static Singleton getIns..
스레드 로컬(Thread Local)이란?
·
Java & OOP
스레드 로컬이란?ThreadLocal은 멀티스레드 환경에서 각 스레드가 독립적인 데이터를 저장하고 관리할 수 있도록 지원하는 메커니즘이다. 여러 스레드가 동시에 실행되는 애플리케이션에서는 공유 데이터로 인해 경쟁 상태(race condition)가 발생할 수 있다.이러한 문제를 방지하기 위해 데이터를 스레드 간에 독립적으로 관리해야 할 때 ThreadLocal을 사용할 수 있다.  스레드 로컬이 필요한 이유1. 스레드 간 데이터 충돌 방지멀티스레드 환경에서 동일한 데이터를 여러 스레드가 동시에 접근하면, 의도치 않은 결과가 발생할 수 있다.(ex. race condition) ThreadLocal은 각 스레드가 독립적인 데이터를 유지할 수 있도록 하여 이런 충돌을 방지한다. 2. 세션 및 사용자 정보 관..
대용량 트래픽을 견디는 콘서트 예약 시스템을 설계해보자
·
System Design
F-Lab에서 참가하고 있는 블로그 챌린지 2기, 이번 회차에 어떤 내용을 포스팅해볼거냐면~ 디프만 스터디에서 시스템 디자인 설계 해봤던 내용을 적을 것이다. 왜 해보게 됐냐면최근 토스 NEXT 챌린지나, 스타트업 면접을 보면서 시스템 디자인 설계 능력을 요구하는 곳이 많다는 걸 느꼈다.이런 설계 능력은 원래 주니어에서 시니어로 넘어갈 때 요구되는 능력이라고 생각했는데,AI가 등장하면서 시기가 많이 앞당겨진 것 같아 위기감을 느꼈다.. 또륵 😭 그래서 디프만에서 열리는 시스템 디자인 설계 스터디에 참여했다!(회사+ 디프만 프로젝트를 병행하면서 스터디까지 할 수 있을까 싶었지만 일단 갈겨) 설계 과제 분석이번 과제는 콘서트 좌석 예매 시스템을 설계하는 것이고, 상세한 task는 아래와 같다.더보기한 공연..

최신 글

F-Lab 블로그 챌린지 2기를 마치며
·
후기 및 회고
왜 참여했냐면F-Lab은 1:1 멘토링 기반 서비스로, 수료 이후에도 수료생 채널을 통해 다양한 세션들과 네트워킹을 제공하고 있다.(에프랩 제일 잘 써먹는 사람 중에 1명일 듯 움하하) 한창 포스팅을 열심히 하다가, 프로젝트&이직 준비 하다 보니 포스팅에 뜸해져서강제성이 필요하겠다..!라고 생각하던 참마침 에프랩에서 수료생들을 대상으로 블로그 챌린지 2기를 주최한다길래 바로 신청했다. 진행 방식8월 초부터 시작해서 격주에 한 번씩 블로그를 작성하고, 일요일마다 회고하는 방식이었다.진행 기간8월 초부터 2달간포스팅 주기2주에 1회회고 일정매주 일요일목표 포스팅 수4개신청할 때만해도 열심히 면접 보러 다닐 때라,, 아무 걱정 없었는데 그땐 몰랐지이직+디프만+현차 전형과 겹칠 줄 허허 각자 포스팅 한 뒤 슬랙..
대용량 트래픽을 견디는 콘서트 예약 시스템을 설계해보자
·
System Design
F-Lab에서 참가하고 있는 블로그 챌린지 2기, 이번 회차에 어떤 내용을 포스팅해볼거냐면~ 디프만 스터디에서 시스템 디자인 설계 해봤던 내용을 적을 것이다. 왜 해보게 됐냐면최근 토스 NEXT 챌린지나, 스타트업 면접을 보면서 시스템 디자인 설계 능력을 요구하는 곳이 많다는 걸 느꼈다.이런 설계 능력은 원래 주니어에서 시니어로 넘어갈 때 요구되는 능력이라고 생각했는데,AI가 등장하면서 시기가 많이 앞당겨진 것 같아 위기감을 느꼈다.. 또륵 😭 그래서 디프만에서 열리는 시스템 디자인 설계 스터디에 참여했다!(회사+ 디프만 프로젝트를 병행하면서 스터디까지 할 수 있을까 싶었지만 일단 갈겨) 설계 과제 분석이번 과제는 콘서트 좌석 예매 시스템을 설계하는 것이고, 상세한 task는 아래와 같다.더보기한 공연..
8주간의 개발자 스터디를 운영하며
·
후기 및 회고
최근 "가상 면접 사례로 배우는 대규모 시스템 설계 기초" 스터디를 마무리했다. 사내 JPA 스터디 이후로 오랜만에 운영했던 스터디인데, 성공적으로 마무리된 것 같아서 뿌듯하다!무엇보다 적극적으로 참석해 주고, 유종의 미를 거두게 해 준 스터디원분들께 정말 감사하다. 안그래도 요즘 F-Lab에서 열린 블로그 챌린지 2기에 참여하고 있기 때문에, 무슨 글을 써볼까 고민하고 있던 참...🤔스터디를 2번째 운영하면서 느낀 점들과 앞으로 개발자 스터디(도서)를 효과적으로 운영하는 방법에 대해 정리해보고자 한다. 스터디는 어떻게 시작하면 좋을까? 계속 읽고 싶었던 책이라, 혹시 계실까 해서 활동하는 개발자 단톡에 이렇게 꺼냈는데... 생각보다 반응이 너무 뜨거워서 살짝 놀랐다...! 허거덩스 몇 명이 모여야 ..
9장. 웹 크롤러 설계
·
System Design
가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽고 정리한 글입니다. 이번 챕터를 읽으면서 가볍게 크롤링만 적용해 봤는데, 생각보다 고려할 부분이 정말 많구나 라는 걸 깨달았다. 크롤러는 ‘로봇’이나 ‘스파이더’라는 이름으로도 불리며, 검색 엔진을 비롯해 다양한 목적으로 사용된다.주 목적은 웹에 새롭게 올라오거나 갱신된 콘텐츠를 빠르고 정확하게 수집하는 것이다.크롤러는 특정 웹 페이지들에서 시작해, 그 안의 하이퍼링크를 따라가며 콘텐츠를 순차적으로 수집해 나간다.크롤러 활용 예시활용 예시설명검색 엔진 인덱싱검색 엔진의 로컬 인덱스를 구축하기 위해 크롤러를 사용한다. 대표적인 예시가 구글의 google bot이다.웹 아카이빙웹페이지들을 주기적으로 수집, 저장하여 아카이빙하는 용도다. 각국 국립 도서..
8장. URL 단축기 설계
·
System Design
가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽고 정리한 글입니다. 이 책 내용을 들어가기에 앞서 왜 대규모 시스템에서 URL을 단축해야 할까? 의문이 들어 찾아봤다.아래 표는 단축 URL의 주요 장점과 설명을 정리한 것이다.구분설명공간 절약 및 가독성 향상SNS(예: 트위터 280자 제한)나 문자메시지(SMS)처럼 짧은 메시지 환경에서는 긴 URL이 불편을 초래한다. 단축 URL은 글자 수를 절약하고, 깔끔하게 링크를 전달할 수 있다.클릭 추적 및 분석언제, 어디서, 누가 클릭했는지 등 실시간 데이터 추적이 가능하다. 국가/도시별, 시간대별, 디바이스·브라우저별, 유입경로까지 세분화된 분석이 가능하다.마케팅 효과 측정다양한 채널에 뿌려진 링크별로 성과를 비교할 수 있고, 메시지별 A/B 테스트..
'면접을 위한 CS 전공지식 노트'를 읽고
·
후기 및 회고
[책 링크]📌 목차1장. 디자인 패턴과 프로그래밍 패러다임2장. 네트워크3장. 운영체제4장. 데이터베이스5장. 자료 구조6장. 포트폴리오와 면접 면접 일주일 전 복기하기 좋다.딱 책 소개에 적혀있듯이, 면접 일주일 전에 가볍게 읽으면서 CS 복기하기 좋은 책이다.또는 CS를 공부하고 싶은 입문자들에게 좋을 것 같다. 디자인 패턴, 네트워크, 운영체제, 데이터베이스, 자료구조, 그리고 마지막에 포트폴리오와 면접 팁까지 핵심이 딱 담겨있다.그리고 마지막에 "이건 이렇게 물어볼 수 있다 → 이렇게 답하면 된다"이런 흐름으로 알려주는데, CS보다 이 부분이 도움이 됐다. 깊이 있는 공부에는 부족할 수 있다나는 이미 알고 있던 내용을 다시 정리하고 싶어서 이 책을 읽었는데,오히려 어디가 약한지, 뭐는 설명할..
7장. 분산 시스템을 위한 유일 ID 생성기 설계
·
System Design
분산 시스템에서 유일한 ID를 생성하는 일은 생각보다 복잡하다.단순히 RDBMS의 auto_increment를 사용하면 될 것 같지만, 서버가 분산되기 시작하면 곧 병목과 충돌의 문제가 나타난다.이 글에서는 그러한 문제를 해결하기 위한 다양한 접근법을 소개하고, 그중에서도 트위터의 Snowflake 알고리즘을 중심으로 설계를 정리한다. 데이터베이스 서버 한 대로는 그 요구를 감당할 수 없을뿐더러, 여러 데이터베이스 서버를 쓰는 경우에는 지연시간(delay)을 낮추기가 무척 힘들 것이다. 🤔 여러 데이터베이스 서버를 쓰는 경우에 지연시간을 낮추기가 힘들다는 게 무슨말일까?ID 충돌을 피하려면 각 DB 서버가 생성하는 ID 범위를 미리 조정하거나, 중앙에서 ID를 발급받는 티켓 서버 같은 구조를 사용해야 ..
6장. 키-값 저장소 설계
·
System Design
키-값 저장소는 키-값 데이터베이스라고도 불리는 비관계형 데이터베이스이며, 각 값은 고유 식별자인 키를 통해 접근한다.키는 일반 텍스트 혹은 해시 값일 수 있으며, 짧을수록 성능에 유리하다.값은 문자열, 리스트, 객체 등 어떤 것이든 가능하며, 저장소는 값의 형태를 따로 제한하지 않는다.대표적인 예시로는 Amazon Dynamo, Memcached, Redis 등이 있다. 요구사항 정리이번 장에서는 다음 특성을 갖는 키-값 저장소를 설계해 볼 것이다.키-값 쌍의 크기는 10KB 이하이다.큰 데이터를 저장할 수 있어야 한다.높은 가용성을 제공해야 한다. 따라서 시스템은 설사 장애가 있더라도 빨리 응답해야 한다.높은 규모 확장성을 제공해야 한다. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져..
5장. 안정 해시 설계
·
System Design
수평적 규모 확장성(scale out)을 달성하기 위해서는 클라이언트로부터의 요청이나 데이터를 서버에 균등하게 나누는 것이 중요하다.안정 해시는 이 목표를 달성하기 위해 보편적으로 사용하는 기술이다.안정 해시에 대해서 알기 전에 우선 이러한 해시 기술이 어떠한 문제를 해결하려고 하는지 좀 더 자세히 살펴보자먼저, 해시란?안정 해시에 대해서 알아보기 전에 간략하게 해시에 대해서 짚어보자. 해시의 사전적 의미는 '임의 길이의 데이터 문자열을 입력으로 받아서 고정 크기의 출력, 일반적으로는 숫자와 문자열로 이루어진 해시 값 또는 해시 코드를 생성하는 수학적 함수'이다. 쉽게 풀어 이야기하면 같은 문자열 입력은 항상 같은 해시 코드를 반환한다는 것이다. 해시의 이런 특성을 이용하여 암호화나 파일의 위변조 판정 ..
4장. 처리율 제한 장치의 설계
·
System Design
가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽고 정리한 글입니다. 처리율 제한 장치란처리율 제한 장치란 네트워크 시스템에서 클라이언트 또는 서비스가 보내는 트래픽의 처리율(rate)을 제어하기 위한 장치다.HTTP를 예로 들면 이 장치는 특정 기간 내에 전송되는 클라이언트의 요청 횟수를 제한한다. API 요청 횟수가 제한 장치에 정의된 임계치를 넘어서면 추가로 도달한 모든 호출은 처리가 중단된다. 예시사용자는 초당 2회 이상 새 글을 올릴 수 없다.같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다.같은 디바이스로는 주당 5회 이상 리워드를 요청할 수 없다.API에 rate limiter를 두면 좋은 점DoS(Denial of Service) 공격에 의한 자원 고갈(resource ..
`2025 스프링 캠프(Spring Camp)`참여 후기
·
후기 및 회고
입장컨퍼런스는 처음이라 뭔가 OO콘 같은 느낌일 줄 알았는데 생각보다 아기자기(?)해서 놀랐다. 입장하니 팔찌랑 굿즈를 주셨당그리고 FLEX 부스에서 커피도 주셔서 09:30~17:00까지 버텼다눙(귀찮아서 점심 안 먹음) 세션스프링 캠프는 리젠시 홀/갤럭시 홀 중 듣고 싶은 세션이 진행되는 홀로 이동하는 구조였다.처음에는 2개 왔다 갔다 해야지~했는데 중간중간 계속 고민하다가 리젠시 홀에 계속 있게 됐다(?)이럴 거면 처음부터 앞자리 갈 걸 세션 들으며 기록한 걸 간단하게 써보자면...! 1. JVM에서 ML 서빙을 해봤어요머신러닝 분야는 생소한 영역이지만, 이 세션을 통해 ML 모델을 실제 서비스에 반영하는 '서빙'이라는 개념을 처음으로 이해하게 되었다. 대부분의 라이브러리가 파이썬 기반인 만큼,..
3장. 시스템 설계 면접 공략법
·
System Design
가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽고 정리한 글입니다. 시스템 설계 면접은 많은 사람이 단순히 지원자의 설계 능력만 평가하는 자리라고 생각하지만, 사실 그 이상이다.이 자리에서 면접관은 다음과 같은 부분까지 살펴본다.지원자가 협업에 적합한지압박감 있는 상황에서 문제 해결 자질을 보이는지모호한 문제를 건설적으로 풀어낼 수 있는지좋은 질문을 던질 능력이 있는지또한 훌륭한 면접관은 부정적 신호도 놓치지 않는다.예를 들어, 시스템 비용을 고려하지 않고 순수한 설계 원칙에만 집착하거나, 과도한 엔지니어링을 하여 tradeoff(절충)를 무시하는 모습은 감점 요인이 될 수 있다. 효과적 면접을 위한 4단계 접근법1. 문제 이해 및 설계 범위 확정바로 답부터 내지 말고, 속도를 늦추고 질문하라..