전체 글 48

[BE] 메시지 큐를 요청에도 응답에도 쓴다! 레거시 시스템에서 발견한 MQ 활용 패턴 (ActiveMQ)

1. 발견의 시작은 큐가 2개!항공 레거시 시스템의 PNR 조회 로직을 분석하다 이 코드를 만났다.private static final Destination GDS연동모듈_DESTINATION = new ActiveMQQueue("PNRRetrievalQueue");GDS연동모듈_JmsTemplate.send(CONDBDESTINATION, new PNRRetrieveMessageCreator(pnrLocator, pcc, country, market, crePcc)); 처음엔 "큐에 던지는 코드"로 읽혔다. 그런데 코드베이스를 더 파고들자 예상치 못한 것이 눈에 들어왔다. 큐가 하나가 아니었다. 그리고 두 번째 큐의 역할이 첫 번째와 완전히 달랐다. 하나는 요청을 넣는 큐, 다른 하나는 응답..

BE 2026.04.17

[BE] 실무에서 ActiveMQ를 쓰다가 메시지큐 세계를 다시 공부했습니다 (실무 코드로 배우는 JMS, AMQP, 이벤트 스트리밍 개념 총정리)

1. 계기 - 레거시 시스템에서 ActiveMQ를 만나다항공 시스템을 담당하면서 PNR(Passenger Name Record) 조회 로직을 분석할 일이 생겼다. 코드를 열어보니 낯선 클래스들이 눈에 들어왔다.private static final Destination GDS연동모듈_DESTINATION = new ActiveMQQueue("PNRRetrievalQueue"); GDS(Global Distribution System)에 직접 요청하는 대신 ActiveMQQueue를 통해 메시지를 던지고 있었다.PNR 조회 요청을 비동기로 위임하는 구조였다. "왜 직접 호출하지 않고 큐를 쓰는 걸까?" 이 질문 하나가 메시지큐 전반을 다시 공부하게 만든 출발점이었다. 2. 메시지큐(MQ)란 무엇인가메..

BE 2026.04.16 1

[AI] Next.js에서 Flutter로 - 백엔드 개발자가 Hume EVI 연동 구조를 파헤친 이유

사이드 프로젝트의 클라이언트가 Next.js에서 Flutter로 전환되면서"지금 웹에서 동작하는 음성 감정 AI를 Flutter에 어떻게 붙이지?"라는 과제가 생겼다.공식 Flutter SDK는 없었다. 직접 분석하는 수밖에 없었다. 1. 배경: 클라이언트 전환과 새로운 과제프로젝트는 AI 정신건강 상담 사이드 프로젝트로 음성 상담 기능은 Hume EVI를 붙여서 이미 Next.js 웹 앱에서 동작 중이다. 팀에서 클라이언트를 Flutter로 전환하기로 결정했다.모바일 앱으로 가야 한다는 판단이었다. 백엔드 개발자로서 이 결정이 나에게 의미하는 건 하나였다."지금 Next.js가 하고 있는 Hume EVI 연동 로직을 Flutter에서 어떻게 대체할 것인가그리고 Spring Boot 백엔드에 무엇을 추가..

AI 2026.04.15

[프로젝트] Docker 컨테이너에서 Spring Boot가 안 뜬다? 포트 설정의 함정 (container port mismatch)

로컬에서는 멀쩡하게 돌던 Spring Boot 앱이 컨테이너로 올리는 순간 아무 반응이 없었다. curl도, 브라우저도, 헬스체크도 전부 묵묵부답. 원인은 단 두 글자 차이였다. `8081` vs `8080`. 이 글은 그 원인을 정확히 이해하고, 재발하지 않도록 근본적으로 해결하는 과정을 기록한다. 1. 증상docker-compose 로그상 컨테이너는 정상 기동된 것처럼 보였다.하지만 외부에서 8080으로 접근하면 연결이 거부됐다.curl http://localhost:8080/actuator/healthcurl: (7) Failed to connect to localhost port 8080: Connection refused 2. 원인 분석2.1. 잘못된 판단처음엔 당연히 이렇게 생각했다."dock..

프로젝트 2026.04.14

[프로젝트] WebSocket 대신 SSE를 선택한 이유 (feat. spring boot, SseEmitter)

단방향 서버 Push가 필요한 순간, 복잡한 WebSocket 없이도 충분하다.SseEmitter 하나로 영속화, 실시간, 장애복구를 동시에 달성한 과정을 정리했다. 먼저 과정 소개 전에 Spring SeeEmitter 동작 원리를 먼저 짚고 넘어가자HTTP 연결을 "열어두는" 것이 핵심일반 HTTP 요청은 요청 → 응답이 끝나면 연결이 닫힌다. SSE는 다르다. 서버가 응답을 의도적으로 끝내지 않고 연결을 유지한 채 데이터를 조금씩 흘려보낸다. 좀 더 쉽게 말하자면일반 HTTP 는 배달 앱이다. 주문하면 음식이 오고, 거래가 끝난다.SSE는 오마카세 레스토랑이다. 자리에 앉으면(연결) 셰프가 요리가 완성될 때마다 하나씩 가져다준다. 자리를 떠나기 전까지(연결 종료) 계속. 브라우저가 받는 응답 헤더는..

프로젝트 2026.03.24 1