운영 장애에서 오픈소스 기여까지, OpenFeign/querydsl 컨트리뷰트
·
회고
1. 배경1) 오픈소스 기여 도전 배경이전 글에서 JPA 양방향 @OneToOne으로 인한 Q클래스 데드락 장애를 다뤘습니다. [Spring] QueryDSL 특정 API 타임아웃 - JPA 양방향 @OneToOne으로 인한 클래스 초기화 데드락, Class Initializa1. 문제1) 증상운영 중 특정 도메인의 API만 응답이 없어지는 문제가 발생했습니다.타임아웃이 발생했고, 컨테이너를 재시작하면 문제가 해결됐지만 불규칙한 주기로 문제가 재발했습니다.자세5g-0.tistory.com이 문제는 원인을 파악하기 특히 힘들었습니다.예외 발생X, 스레드가 조용히 멈춤에러 로그도 없음DB, CPU, 메모리도 정상불규칙하게 재발, 에러상황 재현 어려움문제를 파악하고 나서 QueryDSL 이슈를 찾아보니, 이..
[Spring] QueryDSL 특정 API 타임아웃 - JPA 양방향 @OneToOne으로 인한 클래스 초기화 데드락, Class Initialization Monitor
·
TroubleShooting
1. 문제1) 증상운영 중 특정 도메인의 API만 응답이 없어지는 문제가 발생했습니다.타임아웃이 발생했고, 컨테이너를 재시작하면 문제가 해결됐지만 불규칙한 주기로 문제가 재발했습니다.자세한 문제상황은 다음과 같습니다.DB 정상, CPU/메모리도 정상Slow query log에도 안잡힘개발서버에서도 간헐적으로 동일 증상 발생운영 상태에서 발생했기 때문에 원인 파악보다 빠른 복구가 우선이었고, 재시작 후 어떤 상황에서 재발하는지 판단이 어려워 에러 확인이 더욱 어려웠습니다.2) 원인 후보가장 먼저 DB 커넥션 풀 고갈을 의심했습니다.풀 고갈이라면 모든 API가 동시에 막혀야하는데 특정 도메인 API만 문제가 생겼습니다.DB를 직접 확인해도 문제가 없었고, 살아있는 트랜잭션도 없었습니다.두번째로는 무거운 쿼리..
[Spring] 테스트 코드 도입기 - JUnit과 Mockito를 활용한 단위 테스트
·
Backend/Spring
1. 배경 및 목표1) 배경저는 스타트업에서 혼자 백엔드를 개발하고 있습니다.스타트업 특성상 빠른 기능 구현과 잦은 명세 변경에 따른 리팩토링이 반복되는 환경입니다.안정성을 중요하게 생각하지만, 혼자 개발하는 만큼 놓치는 케이스가 생기지 않을까 불안함이 있었고,이를 개발 서버에서 배포 전 최대한 많은 테스트를 해보는 것으로 달래곤 했습니다.최근 Claude Code를 도입하면서 작업속도가 향상되었고, 확보된 시간을 안정성에 투자할 수 있겠다고 판단했습니다.테스트 코드를 도입하면 다음과 같은 이점을 얻을 수 있습니다.작성한 코드가 의도한대로 동작하는지 검증 가능리팩토링 등 코드 수정 후에도 기능이 정상적으로 동작하는지 검증할 수 있음테스트 코드를 통해 해당 기능이 어떤 목적을 지니고, 어떻게 동작하는지 문..
[Spring] PageImpl 역직렬화를 위한 Wrapper 클래스, PageImpl Redis 캐싱
·
Backend/Spring
1. 배경 및 목표1) PageImpl Wrapper 클래스의 필요성지금까지 사내 프로젝트에서 PageImpl을 상속받은 RestPageImpl 이라는 클래스를 사용해 페이징을 처리해왔습니다.@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)public RestPageImpl(@JsonProperty("content") List content, ...) 개인 프로젝트때는 PageImpl로도 페이징을 처리했었는데 굳이 이런 클래스를 만들어 사용하는 이유가 궁금해져 알아보았습니다. PageImpl은 직렬화(객체 -> JSON)은 가능하지만 역직렬화(JSON -> 객체)가 불가능합니다.이를 해결하기 위해 Jackson이 역직렬화에 사용할 수 있는 생성자를 추가한 Wrappe..
[Infra] AWS EC2 scheduled reboot, docker container 갑자기 모두 내려갔을때
·
TroubleShooting
문제갑자기 Docker 컨테이너가 모두 내려가있었습니다...AWS 인스턴스 하나를 운영 보조용으로 사용하고 있었습니다.평소처럼 로그를 확인하러 그라파나에 접속했고 모두 내려가있었습니다. 일단 제가 내린적이 없기 때문에 시스템이 종료된적이 있나 확인해보았습니다.사용된 명령어는 다음과 같습니다.# 서버의 재부팅 기록을 확인last reboot 확인결과 2026-02-02 04:56에 서버가 재시작 되었다는걸 알 수 있었습니다.AWS에 들어가서 확인해보았습니다. 설명에 Scheduled Reboot를 보고 AWS에서 13:00(KST)에 인스턴스 재부팅 예약이 있었다는걸 알 수 있었습니다.서버에서 확인한 부팅 시각은 04:56이었고, 서버 시간이 UTC 기준이라면 KST로는 13:56입니다.AWS 콘솔의 sc..
[OS] 프로세스 개념, 프로세스 스케줄링
·
CS/운영체제
1. 프로세스 개요1) 프로세스란?프로세스란 실행 중인 프로그램입니다.여기서 실행 중인 프로그램이란 디스크에 저장된 파일과 같은 수동적인 존재가 아닌,실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재를 나타냅니다.즉, 정확히 말하면 실행 파일이 메모리에 적재될 때 프로그램은 프로세스가 됩니다.프로세스(process): 실행 중인 프로그램. 운영체제로부터 CPU, 메모리, 파일 등의 자원을 할당받아 작업을 실행프로세스의 활동 상태는 프로그램 카운터 값과 프로세서 레지스터의 내용으로 나타냅니다.프로세스의 메모리 배치는 다음과 같습니다. 함수가 호출될 때마다 함수 매개변수, 지역 변수 및 복귀 주소를 포함하는 활성화 레코드(activation record)가 스택에 push됩니..
[OS] 블로킹(Blocking)/논블로킹(Non-Blocking), 동기(Syncronous)/비동기(ASyncronous)
·
CS/운영체제
1. Blocking / Non-Blocking (제어권의 행방)1) 블로킹(Blocking)블로킹은 호출된 함수가 자신의 작업을 마칠 때까지 제어권(함수를 실행할 권리)을 계속 갖고 있는 상태를 뜻합니다.즉, 호출한 함수는 작업이 끝날 때까지 다음 작업을 수행하지 못하고 대기하게 됩니다.그림으로 알아보겠습니다.A함수는 B함수를 호출하며 제어권을 B에게 넘김B함수는 작업을 수행, A 함수는 제어권이 없기 때문에 대기B 함수는 작업 완료 후 A에게 제어권 반환A 함수 다음 작업 수행즉, B 함수의 작업이 끝나기 전까지 A함수는 아무 작업도 못합니다.2) 논블로킹(Non-Blocking)논블로킹은 호출된 함수가 작업 완료 여부와 상관없이 제어권을 즉시 반환하는 상태를 뜻합니다.즉, 호출한 함수는 작업 결과를..
[OS] 운영체제의 개념, 역할 및 구조
·
CS/운영체제
1. 운영체제 개요1) 운영체제란?운영체제(OS, Operating System)는 하드웨어 바로 위에 설치되어, 사용자와 응용 프로그램이 하드웨어를 사용할 수 있도록 관리하는 시스템 소프트웨어 입니다.운영체제의 구조는 다음과 같습니다. 위 그림처럼, 운영체제는 하드웨어와 응용프로그램 사이에서 자원을 배분하고 명령을 전달하는 중개자 역할을 수행합니다.운영체제(OS, Operating System): 컴퓨터 하드웨어를 제어하고, 사용자가 응용 프로그램을 원할하게 실행할 수 있도록 관리하는 소프트웨어2) 커널(Kernel)운영체제와 항상 함께 등장하는 핵심 부분 커널에 대해 간단하게 알아보겠습니다.커널은 운영체제에서 항상 메모리에 상주하며, 하드웨어와 직접적으로 상호작용합니다.커널은 다음과 같은 기능을 담당..