2024/01 4

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 5장(안전 해시 설계)

수평적 규모 확장성을 달성하기 위해서는 요청 or 데이터를 서버에 균등하게 나눠야한다. 안정해시는 이 목표를 달성하기 위해 보편적으로 사용하는 기술인데, 이 해시기술이 어떤 문제를 해결할 수 있는지 부터 알아본다. 해시 키 재배치(rehash) 문제 N개의 캐시서버가 있다고 할 때, 이 서버들에 부하를 균등하게 나누는 보편적 방법은 아래의 해시 함수를 사용하는 것이다. serverIndex = hash(key) % N (N은 서버의 개수이다) 4대의 서버를 사용한다면 해시 값이 18358617은 1(서버인덱스)이다. 이런식으로 나머지연산(%)을 이용해서 각 서버에 저장한다. 그러나, 해당 방법은 서버가 추가되거나 삭제될 때 문제가 발생한다. 만약 0번 서버가 장애가 발생하여, 위 해시함수를 이용해서 해시..

레거시 프로젝트 리팩토링 하기 feat SpringBoot + JPA

개요 2년전에 우리 팀이 인수인계 받은 프로젝트가 있었다. 해당 프로젝트 역할은 원래 웹에서 게임DB을 사용하기 위해 만든 API 시스템이였는데, 게임서버, 회원 등 여러 도메인에서 게임DB을 이용하면서 규모가 커졌다. 이 프로젝트는 2018년 ~ 2019년 즈음에 구축되어, 새로 들어가는 이벤트 or 기능들 제외하고는 오래된 레거시 코드로 이루어져 있었다. 이슈가 있을 때, 코드를 수정하면서, 리팩토링도 같이 하곤 했는데, 이번에 request로 받는 파라미터 중 유저 ID을 유저 No로 받도록 수정해야하는 이슈가 있었다. 70% 정도의 API가 ID을 Request Param으로 받고 있었기 때문에, 대부분 코드를 수정했어야했다. 이때다 싶어, 리팩토링 작업도 같이 진행하면 어떻겠냐고 팀장님께 제안드..

람다에서 지역변수 값을 변경하지 못하는 이유 Variable used in lambda expression should be final or effectively final

개요 JAVA에서 람다식을 사용하다보면, 가끔 인텔리제이에서 Variable used in lambda expression should be final or effectively final 해당 내용의 컴파일 에러가 나온다. 대강 구글링하여 지역변수를 사용하면 안된다는 건 알고있었는데 정확한 이유는 알지 못하고, 나중에 리서치하고 정리해야지 하고 넘어갔다. 람다와 지역변수, 전역변수 더 나아가 멀티쓰레드, 메모리할당 구조까지 폭넓은 범위를 다루고 있었고, 이에 대해 정리하였다. 쓰레드 메모리 할당 구조 위 그림은 멀티 쓰레드의 메모리 할당 구조이다. CODE, DATA(Method Area), HEAP 부분은 공유하고, Stack 영역만 각각 사용하는 걸 볼 수 있다. JAVA에서 지역변수는 Stack ..

주니어 서버 개발자의 2023년 회고

올해에도 어김 없이 연말이 찾아왔다. 이맘때쯤 사람들이 가장 많이 하는 말이 있는데, "벌써 시간이 이렇게 됐네,," 이다. 예전에 어른들이 나이를 먹을수록 시간이 더 빨리간다. 라는 말을 자주 했었는데, 제일 공감가는 말이다. 시간이 이렇게 빨리갔는데... 올해 어떤걸 했고, 작년에 세운 목표를 달성했는지에 대해 회고를 하려고한다. 작년 목표 달성률 2022년 목표에 대해 작년에 블로그에 쓴 줄 알았는데, 없었다... 노션에 적어놓고, 포스팅 한다는 걸 깜빡한 듯 싶은데.. 작년 목표는 아래와 같다. 온라인 & 오프라인 교육 적극적으로 참여하기 감사하게도, 사내에서 인프런, 패스트캠프에서 제공하는 강의를 무료로 듣는 복지가 있어, 이를 적극 활용하기로 했었다. 또한, 사내 초청 강의나, 사우분들이 진행..

생각생각생각 2024.01.03
728x90