개발자취 141

주니어 서버 개발자의 2024 회고

어김없이 돌아온 2024 회고...이번 회고는 키워드로 정리해보려고 한다. 특별한 이유는 없고, 가독성이 좋을 것 같다는 느낌이 있다.도전이번 연도는 유난히 힘들었다. 부족함을 채워야겠다며 공부에 힘썼던 작년과 달리, 올해는 도전을 많이 했고, 성공의 문턱에서 넘어지는 일이 꽤 많았다. 그런데 아이러니하게도, 이 또한 공부가 되었다. 특히 여러 과제를 하면서 대용량 시스템 설계에 대해 깊이 고민하게 되었고, 정말 많은 것을 배웠다. 아! 성공한 도전도 있다. 상반기에 쿠버네티스 관련 자격증 CKA를 취득했다.쿠버네티스 자격증평소 인프라에 관심이 많았고, 사내에서 사용하는 인프라 아키텍처가 비효율적이라고 생각했다. 물론 게임 도메인의 특성상 서비스 중단 시 타격이 크기 때문에 인프라를 여유 있게 운영하는 ..

생각생각생각 2025.05.08

서버개발자로서 살아남기 - JPA 사용시 조회방법에 따른 영속성 여부

개요스터디에서 Spring-JPA 환경에서, 쿼리메소드와 @Query 어노테이션을 이용한 JPQL, 네이티브 쿼리을 활용한 조회에 대해 이야기를 하다가, 3개의 조회방법 중 어떤 방법이 영속될까 라는 궁금증이 생겼다.위에서 언급했던 3가지 조회 방법에 대해 영속성 여부을 알아보기로 한다쿼리메서드Query 어노테이션을 활용한 JPQLQuery 어노테이션을 활용한 네이티브 쿼리 테스트관련 내용을 리서치해보는 것도 좋지만, 일단 아묻따 테스트코드를 작성해서 영속성 여부를 확인하였다.사용할 테이블은 회원 정보가 있는 테이블이고, Pk는 memberId이다. 세팅@Autowired private MemberRepository memberRepository; @Autowired private EntityMan..

개발자가 반드시 알아야하는 데이터베이스 - MYSQL(InnoDB)에서 잠금된 데이터을 조회할 수 있는 이유

개요최근 mysql의 잠금에 대한 이슈를 많이 다루고 있는데, s-lock, x-lock된 데이터에 대해 단순 조회가 어떻게 가능할까 라는 생각이 들었다. 일차원적으로 당연히 lock이 되었으니, 읽기가 안되는 것이 아닌가? 라고 생각할 수 있지만, mysq은 비잠금읽기(Consistent NonLocking Reads)로 동작하여, 잠금된 데이터도 조회가 가능하다. 비잠금읽기에 대해 자세히 알아보자.여담으로 mysql 8.0 책을 제대로 읽었다면, 해당 질문에 대한 답을 쉽게 할 수 있을 것이다.(위 생각에 대해 구글링 중 undo를 보자마자 아맞다! 싶었다..)비잠금읽기비잠금읽기mysql(InnoDB)는 기본적으로 비잠금 읽기(Consistent Nonlocking Reads)을 사용한다. 이는 se..

JAVA - Synchronized와 ThreadLocal 을 이용한 동시성 문제 해결

개요static와 synchronized의 연관관계에 대해 한번 정리를 해보려고 한다. 일단 JAVA에서 static은 클래스가 로딩될 때 메모리의 정적 영역(Static Area)에 할당된다.이 영역은 특징은 다음과 같다.JVM이 시작될 때 생성되며, 프로그램의 실행이 끝날 때까지 유지된다.클래스의 모든 인스턴스가 공유하는 공통된 값은 가진다.즉 멀티스레딩 환경에서 주의하여 사용해야한다.테스트아래 예시는 주의하지 않고 사용한 코드이다.public class A { public static int a; public static void plus() { a++; } }public class ATest { @Test public void testP..

ELK - 샤드개수 조정 (Failed to submit a listener notification task. Event loop shut down? java.util.concurrent.RejectedExecutionException: event executor terminated elastic)

개요 replaylog 관련 timeout 에러가 계속 발생하여, 확인해 본 결과, elasticSearch에 문제가 있었고, 정확히는 wb911 머신에 문제가 발생하였다. 머신에 들어가서 확인해보니, elasticsearch는 작동하고 있었지만, 알 수 없는 ERROR 로그들이 남고있었다. 그 중 하나는 아래 로그이다. Failed to submit a listener notification task. Event loop shut down? java.util.concurrent.RejectedExecutionException: event executor terminated elastic 일단 NSight를 확인해보니, 머신이 터지기 직전이여서, 재부팅을 부탁드렸다(다행히도 머신이 문제가 발생하자마자 메..

쿠버네티스 교과서 5장 - 볼륨 마운트 클레임을 이용한 데이터 퍼시스턴시

5.1 쿠버네티스에서 컨테이너 파일 시스템이 구축되는 과정 kubectl exec deploy/sleep -- sh -c 'echo ch05 > /data/file.txt; ls /data' 해당 명령어 시 권한 때문인지 작성이 안됨 ymal 파일에 defaultMode 추가하든가, 다른 수정방법 찾아봐야함 apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: containers: - name: sleep image: kiamol/ch03-sleep securityContext: runAsUser: 10..

쿠버네티스 교과서 2장 & 3장

2장 2.1 쿠버네티스는 어떻게 컨테이너를 실행하고 관리하는가 파드 쿠버네티스가 컨테이너를 실행하는 수단 쿠버네티스로 관리되는 자신만의 가상 IP 주소를 가진다. 파드는 쿠버네티스가 관리하는 가상 네트워크로 연결된다. -컨테이너를 또 다른 가상환경인 파드 로 감싼다. 컨테이너는 애플리케이션 구성 요소 하나를 실행하는 가상화 된 환경이다. 2.2 컨트롤러 객체와 함께 파드 실행하기 디플로이먼트 파드를 관리하는 컨트롤러 객체 한 노드에 문제가 발생하여 파드를 유실하면, 대체 파드를 다른 노드에 생성 디플로이먼트 스케일링 설정 디플로이먼트만 생성해도 파드가 자동으로 생성됨 쿠버네티스 API을 사용하여 현재 동작중인 리소스 확인 및 자신에게 필요한 파드 생성 디플로이먼트가 자신이 관리해야할 리소스를 어떻게 추적..

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 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 ..

728x90