목록전체 글 (55)
백엔드 엔지니어 이재혁
잘못된 결제 처리를 막자결제가 완료되었는데 결제 대기 상태로 변경된다면? 사용자는 2번 결제하게 될 수도 있다.이런 문제는 당연히 막아야 한다. 그런데, 어떻게 효과적으로 막을 것인가? 서비스 레이어의 모든 비즈니스 로직에서 상태 변화를 모두 추적할 것인가?도메인에 유한 상태 기계 로직을 표현하면 도메인 스스로 잘못된 상태 변경을 막아줄 수 있다. 결제 상태 관리 우리 시스템에서 결제 시스템은 위와 같은 상태 변화를 갖는다. `SUCCESS` 였는데 `PENDING`이 되는 것은 불가능하다. 위와 같은 상태 변화 규칙을 도메인에 로직으로 담아보자. TransactionStatus Enumpublic enum TransactionStatus { PENDING, // 결제 대기 중 (사용자가 결제 진..
MS별 버전 관리AS-IS (모놀로식 기반)기존에는 프론트 ↔ 백엔드 API 버전을 하나로 관리했다.개인 사이드 프로젝트라 크게 버전이 바뀔 일이 없었던 것이 컸다. TO-BE (MSA 기반)Micro Service 간의 독립성 보장을 위해 각 서비스가 독립적으로 버전 관리를 할 수 있도록 바꿔주었다. 기존 백엔드 시스템(플랫폼 서버)에 변화를 줄 필요는 없었고,(기존의 APP 버전을 플랫폼 서버가 이어받아서 사용)프론트엔드에서 각 서비스별로 버전을 다르게 지정할 수 있도록 수정을 했다. 관련 PR: https://github.com/Jaehyuk-Lee/carematching-front/pull/76 CORS 관리기존에 백엔드에서 관리하던 CORS도 API Gateway로 제어권을 넘겼다.클라이언트와 ..
어제는 API Gateway를 만들어서 MSA 환경의 기본 바탕을 만들었다면, 오늘은 API Gateway가 역할을 제대로 할 수 있도록 설정을 좀 해주었다. 오늘 요약추가 문제Netty를 사용할 때, http/2 통신을 함에도 http/1.1 로그가 찍히는 문제 원인 파악 목차타임아웃 및 커넥션 풀 설정upstream http/2 설정WireShark로 검증http/2 통신을 하는데도 http/1.1 로그가 찍힌 이유 (Netty 관련) 자세히 알아보기1. 타임아웃 및 커넥션 풀 설정무한 대기로 인한 리소스 낭비 방지를 위해 `connect-timeout`과 `response-timeout`을 설정하자.이어서 `connection pool` 설정을 더해 커넥션 생성에 따른 오버헤드도 최소화하고자 했..
케어매칭 프로젝트를 서비스에 적합한 MSA 아키텍처로 전환해보고자 한다. 아키텍처 설계각 서비스 분리 이유1. 채팅 서비스 (Chat Service)상황Spring MVCNode.js채팅 발송요청마다 스레드 할당싱글 스레드 유지 (이벤트 루프 기반 작업) 채팅 서비스는 작은 요청이 많이 들어온다. 요청마다 실질적인 처리 비용은 낮지만, Spring MVC에서는 많은 요청 때문에 스레드가 많이 생긴다. Node.js를 이용해 스레드의 컨텍스트 스위칭 비용을 최소화하자.채팅은 네트워크 I/O가 많으니, 실제 구현시에는 오버헤드가 적은 라이브러리도 찾아보자.2. 결제 서비스 (Transaction Service)결제 서비스의 경우, 시스템의 기술적인 성능보다는 도메인의 중요성 때문에 나눠보고자 했다.결제 서비..
Go 언어... 컴파일 언어인데, GC를 지원한다고?GC 지원 언어로는 인터프리터나 하이브리드 언어만 알고 있던 나에게는 뭔가 신세계였다. 흥미는 여기서 시작했는데, 깊이 들어가보니 Go는 신세계 덩어리였다.Go라는 언어에 대해 공부하는 것을 넘어 컴퓨터에 대해 다시 생각해볼 수 있는 좋은 기회였다. 멀티스레딩Go는 멀티스레딩을 런타임이 관리한다. 이게 무슨 말이냐,실행하고 있는 프로세스 전체가 이미 스레드풀이라고 보면 되려나?Go는 개발자가 작업을 던지면 Go가 알아서 멀티스레딩으로 관리해준다. Java에 비유하면, 스레드풀 관리랑 대기큐 관리를 JVM이 대신 해주는거다.(Java에도 Virtual Thread라는 경량 스레드가 있지만 구조적 차이로 Go만큼 좋은 경량 스레드는 아니다.) Gorouti..
if(kakao)25를 온라인으로 보고 난 후기입니다. 전체 느낌 한 줄: 카카오는 전사 비즈니스의 핵심을 AI로 옮기고 있어 보인다. PlayMCP가 인상적이다. Day 1 오전카카오의 AI: 카나나 (Kanana)카카오가 자체 AI 모델을 만들고 있을 것이라는 건 예상이 되는 내용이었다.그런데 이번 발표에서 내게 와닿았던건, "Kanana Nano"였다. 카나나 나노는 모델의 크기를 작게 만들어 온디바이스에서 실행할 수 있도록 만든 모델이다. 온디바이스로 작동하며, 카카오가 개인 정보를 안전하게 보호하면서도 AI 기능을 제공하기 위해 자체 모델을 작게 튜닝한 버전이다. 통화녹음요약, 대화맥락 파악 등 사생활 정보를 보호한다는 목적에서 개발했다고 한다. 그런데, 카나나 나노를 구동하기 위한 스펙이 되..
오래 헤맸던 경험을, 이후에 글로 정리하다보니 일부 빠진 내용이 있을 수 있습니다. 컨테이너 환경의 Nginx는 HTTPS를 쉽게 적용하기 어려운 문제가 있다... (Certbot Nginx 플러그인 사용 불가)일단 HTTPS를 적용하는 것에 목적을 두고, 조금 우회하는 방법으로 해봤다. Amazon Linux 2023 기준이라는 점 참고해주세요 인증서부터 정상 발급 받기certbot으로 인증서 발급 진행sudo dnf install -y certbotsudo certbot certonly --standalone -d carematching.kro.kr # 주소는 각자에 맞게 바꿔주기# 시키는대로 진행하다보면 이제 인증서와 개인키가 발급된다.Certificate is saved at: /etc/letse..
gemini-cli 설치 및 실행 방법은 글을 쉽게 찾을 수 있어 "샌드박스" 기능에 집중해 작성하겠습니다. gemini-cli는 터미널에서 실행할 수 있는 명령이라면 무엇이든지 실행이 가능하다.그래서 강력하기는 하지만... 보안 위험성이 떠올랐는데, 보안에 문제가 없을까? 보안 위험 가능성 확인실험1. notepad++를 실행해달라고 한다.PATH 환경 변수에 등록되어 있지 않아 이름만으로는 실행이 불가능했다.이어서 직접 해당 프로그램을 검색하는 시도를 했다.하지만 `Search path ("C:\Program Files (x86)") resolves outside the allowed workspace directories` 라며 검색 기능이 막혔다."보안 제약"으로 인해 시스템 폴더 검색이 제한되..