동시성 제어를 위한 DB 락에 대해 알아보자
·
Java/JPA
이번에 컨텐츠를 사고팔 수 있는 커머스 서비스를 개발하다보니 동시에 일어난 결제를 처리하는 방법으로 락에 대해서 공부하게 되었다. 내용을 복습할 겸 블로그에 정리해보고자 한다. 1. 락이란?웹 서비스는 여러 사용자의 요청을 동시에 처리한다. 조회 API나 데이터 정합성이 덜 중요한 데이터라면 큰 문제가 없을 수 있지만, 잔액 차감, 재고 감소처럼 정합성에 민감한 데이터에서는 동시 요청이 치명적일 수 있다. 예를 들어 사용자 A의 크레딧 잔액이 10,000원이고, 동시에 두 개의 구매 요청이 들어왔다고 가정해보자.첫 번째 요청은 7,000원을 차감하려고 하고, 두 번째 요청도 7,000원을 차감하려고 한다. 둘 다 거의 동시에 잔액을 조회하면 두 요청 모두 “현재 잔액은 10,000원이므로 구매 가능하다”..
2주만에 한능검 1급 합격하기(두음법칙 정리 있음)
·
자격증
2026년 5월 23일에 있었던 78회 한국사능력검정시험에서 86점으로 1급에 합격했다.2주 정도 준비했고 순공 시간으로만 따지면 7일이 채 안 될 것 같다. 한능검을 보게 된 계기는 내가 지원할 수 있는 곳을 넓히기 위함이다.요즘 취업시장이 얼어붙고 AI가 IT 업무를 대체하기 시작하면서 좀더 넓은 범위로 지원해야겠다 느꼈다.한능검은 대부분의 공공기관에서 가산점을 주고 있다.그러기에 1급 합격을 노리게 되었다.이번에 한국사를 공부하면서 느낀 것이지만 대한민국 국민이라면 한국사는 필수적으로 '잘' 알아야한다고 생각한다.잘못된 역사를 되풀이하지 않도록 말이다. (최태성 선생님은 인강에서 이런 말씀을 많이 하신다.) 내가 만약 지금의 합격 노하우를 가지고 있는 상태에서 다시 한능검을 지원하게 된다면 이대로 ..
배포 환경 변수 주입은 어떻게 풀어낼까?
·
Infra
1. 개요배포 환경에서는 DB 계정, JWT 시크릿 같은 민감한 데이터와 CORS 허용 도메인 같은 환경별 값이 필요하다.값을 코드에 하드코딩하면 유출 리스크가 커지고, 환경(dev/stage/prod)별로 빌드 아티팩트를 다시 만들어야 한다.값을 서버에 수동으로 입력하면 휴먼 에러가 늘고, 멀티 서버 환경에서는 서버마다 값이 달라지는 사고가 난다.또, 컨테이너가 재기동되면 값이 사라지거나(임시 export), 운영자가 기억에 의존하는 문제가 생긴다.배포 자동화가 있는 경우에도 어디에서 어떤 파일/변수로 주입되는지가 불명확하면 장애 시 원인 파악이 어렵다.즉, 배포 환경변수 주입은 운영에서 재현 불가/복구 지연/보안 유출로 이어지는 중요한 문제다. 이제 어떤 방식들로 해결할 수 있는지 알아보자. 2. 해..
무중단 배포 & 로드밸런싱 전략 적용
·
Infra
왜 무중단 배포를 구현했나 기존에는 배포 시 서버를 재시작하는 중단 배포 방식으로 배포를 진행했다.이 방식은 구현이 간단하지만 배포 시 서비스 중단 발생, 이로 인한 사용자 경험 저하와 같은 문제가 발생한다.특히 현재 개발하고 있는 실시간 채팅 서비스의 경우 연결이 끊기는 것이 치명적이었다.내가 사용자라고 생각해봤을 때 배포할때마다 서비스가 중단된다면 다른 서비스를 찾아볼 것 같다 생각했다. 그래서 '다운타임 없이 배포하는 무중단 배포'를 우선적으로 구현해보기로 했다. 로드밸런싱을 적용한 이유메시지 브로커 기반 아키텍처에서는 다수의 서버 인스턴스가 메시지를 처리할 때, 각 인스턴스가 메시지를 경쟁적으로 소비할지(경쟁 소비 모델), 또는 메시지를 분산 처리할지(팬아웃 모델)에 대한 설계가 중요하다. 하지..
Java SpringBoot의 테스트에 대해 알아보자
·
Java
스프링 프로젝트를 진행하던 중 테스트 방법에 대해 고민하게 되었다.처음에는 단위 테스트(Mockito), 통합 테스트 등 모든 테스트를 작성하고자 생각했었다.구현했을 당시에는 문제가 없었지만 개발 초기 단계다 보니 비지니스 로직이 바뀌는 경우가 잦아지면서 테스트 또한 매번 변경해줘야하는 문제가 발생하여 테스트 구조 변경을 고려하게 되었다. 겸사겸사 블로그에 자바 스프링에서의 테스트에 대해 한번 정리하고자한다. 테스트에는 크게 슬라이스 테스트, 단위 테스트, 통합 테스트로 나뉜다.슬라이스 테스트컨트롤러 레이어, 영속성 레이어, 외부 API 호출 등 특정 레이어만 잘라서 해당 레이어에 필요한 빈들만 올려 테스트스프링에서는 컨트롤러 레이어를 테스트하는 @WebMvcTest, 영속성 레이어를 테스트하는 @Da..
Github 잔디 안심어지는 오류 해결 & 이전 커밋 내역 잔디 심기
·
Git
노트북에서 개발을 진행하고 커밋 및 푸시했던 것들이 언제부턴가 잔디가 안심어지기 시작했다.검색해본 결과 git을 처음 로컬에 등록할 당시 이메일을 등록해야하는데 github에 등록해놓은 이메일과 상이해서 발생한 오류란다.고치는 방법을 간단하게 정리해보고자 한다. 1. 로컬 git 이메일 설정git config --list 위 명령어를 통해 현재 내 git 로컬 이메일 등록이 잘못되었는지 확인한다.만약 github에 등록된 이메일과 다르다면 새로 등록해줘야한다.참고로 github에 등록된 이메일은 여기서 확인하면 된다.Github 프로필사진 -> Settings -> Emails 아래와 같이 명령어를 실행하면 git에 등록되어있는 이메일을 교체할 수 있다.git config user.email "내 이메일..
2026.04 회고
·
카테고리 없음
프로그래밍을 처음 시작하게된 계기는 내가 기획한 것을 실제 프로덕트로 발전시켜보고 싶어서였다.나는 대학생 시절 기획 공모전도 나가고 마케팅을 배울 수 있는 기회도 있었어서 경험을 쌓았었지만 어디까지나 '어떻게 할 것이다'라는 계획서를 제출하는데서 멈췄기 때문에 아쉬움이 있었다.그런데 프로그래밍을 배우고 나서 이걸 실제로 실현시킬 수 있는 툴이 생겼다.이 때부터 창업을 해보고 싶었다. 그리고 개발이란 어디서부터 시작해야하는지 몰라서 교육 프로그램을 듣고 싶었다.싸피라는 부트캠프가 유명하고 비전공자 전형도 별도로 있어서 개발에 대한 스타트를 끊기엔 참 좋은 선택지였다.자바와 객체지향에 대한 기본적인 교육, vue.js도 함께 배워서 하나의 돌아가는 프로젝트를 완성해보고 교육생들과 함께 실제 서비스되고 있는 ..
실시간 채팅 구현기(3) 코드 분석
·
프로젝트
지난 시간에 이어 코드를 분석해보는 시간을 갖겠다.우선 spring에서 웹소켓을 사용하기 위한 설정부터 알아보자.웹소켓 통신 구현을 위한 필수적인 코드만 살펴보겠다. WebSocketConfig@Configuration@EnableWebSocketMessageBroker // STOMP 메시징 활성화@RequiredArgsConstructorpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@EnableWebSocketMessageBroker : STOMP 프로토콜을 이용한 메시징 인프라를 활성화하고 웹소켓 연결을 허용한다. 이를 통해 @MessageMapping 어노테이션을 컨트롤러에서 사용할 수 있게된다. @Ove..
실시간 채팅 구현기(2) 기술 설명 및 구현 방법
·
프로젝트
이전 시간엔 실시간 채팅 서비스를 위해 어떤 기술 스택을 사용할지 선정해봤다.이번 시간엔 이 기술들에 대해 자세히 이해해보고 어떤식으로 구현할지 얘기해보겠다. 실시간 채팅 서비스의 핵심은 유실없는 실시간 전송과 불안정한 네트워크 환경에서도 안정적으로 작동하는 것이다.지난번에 선정한 주요 기술스택을 살펴보자. WebSocket클라이언트에서 서버 단방향으로 요청과 응답 그리고 연결 종료가 일어나는 HTTP와 달리 웹소켓은 양방향으로 통신할 수 있으며, HTTP에 비해 통신하는데 발생하는 오버헤드가 적다. 웹소켓의 동작 과정은 다음과 같다. 1. 클라이언트가 HTTP 프로토콜로 Handshake 요청을 한다.GET /chat/websocket HTTP/1.1Host: your-domain.comOrigin: ..
실시간 채팅 구현기(1) 기술 스택 선정 및 연동(SockJS, STOMP, Redis Streams)
·
프로젝트
이전에 부트캠프에서 웹소켓을 이용해서 실시간 서비스를 만드는 팀들이 종종 보였었는데 관심이 있었다.그래서 이번에 개인 프로젝트로 실시간 채팅 서비스를 구현하려고 한다.첫번째 게시글로는 실시간 채팅을 위해서는 어떤 기술이 있고, 어떤 과정을 통해 선택하게 되었는지를 정리하고자 한다. 실시간 채팅을 위한 기술1. Polling클라이언트가 일반적인 HTTP 요청을 주기적으로 보내서 변경된 데이터를 확인하는 방식을 Polling이라고 한다.이전에 사용자의 위치 정보를 서버에 보내야 할 일이 있었는데 시간상, 내가 알고있는 지식상 이렇게 밖에 구현하지 못한 기억이 있다. 가장 단순한 방식이지만 클라이언트가 주기적으로 요청을 보내기 때문에 사용자가 많아지면 서버의 부담이 커진다.HTTP 요청 오버헤드 또한 비용이 ..