Category Software Engineering

헥사고날 아키텍처의 포트는 엔티티가 아니라 의도로 나눈다

Member 엔티티가 있으니 MemberService 하나, MemberController 하나. 스프링을 배우면 대부분 이 구조로 시작한다. 처음에는 편하다. 문제는 N개월 뒤에 온다. MemberService는 메서드 열다섯 개짜리 클래스가 되고, 그것을 주입받은 코드만 봐서는 무슨 목적으로 쓰는지 알 수 없다. 헥사고날 아키텍처는 이 지점에서 다른…

MSA 서버 비용 절감은 추정이 아니라 실측에서 시작한다

공모전 준비 중에 서버 비용이 문제가 됐다. 개발 기간에는 start.sh랑 stop.sh로 작업할 때만 켜고 껐더니 청구서가 상시 가동의 절반 이하로 나왔는데, 이제 공모전 출품도 해야 하고 서비스 운영이나 포트폴리오 용도로 쓰려면 결국 24시간 켜둬야 한다. 이대로라면 원래 비용인 월 15만 원이 그대로…

Kafka 컨슈머 설계 판단 기준, 5가지 질문으로 끝낸다

Kafka를 처음 붙일 때 대부분 프로듀서부터 본다. KafkaTemplate을 주입받고 send()를 호출하면 메시지가 나간다. 여기까지는 반나절이면 끝난다. 문제는 컨슈머다. 그룹 ID를 어떻게 나눌지, 키를 줄지, 커밋을 자동으로 할지 수동으로 할지, 실패한 메시지를 어떻게 할지를 전부 정해야 한다. 이 결정을 미루고 기본값으로…

도메인 값 객체와 요청 DTO를 분리한 트레이드오프

MemberRegisterRequest 같은 요청 오브젝트를 어느 계층에 둘지 물으면, 개발자가 반사적으로 “애플리케이션 레이어”라고 답한다. DTO는 데이터를 담아 계층 경계를 넘기는 역할이니 서비스 레이어에 두는 것이 자연스럽다는 이유다. 그런데 헥사고날 아키텍처로 회원 등록 기능을 만들 때, 이 오브젝트를 도메인 레이어에 두었다. 결론부터…

Caddy가 스테이징 인증서를 물어오기 전에 컨테이너를 재시작해야 했다

공모전 시연용 AWS 환경을 거의 다 세우고 마지막으로 도메인과 HTTPS만 붙이면 되는 단계였다. api.example.com에 A레코드를 넣고 HTTPS 접속을 검증하는 스크립트를 돌렸는데 exit 35로 죽었다. 급한 마음에 컨테이너 로그부터 보려다 컨테이너 이름을 잘못 짐작해서 로그 확인 자체가 또 실패했다. 원인은 Caddy가…

카프카 클러스터는 브로커·토픽·파티션 세 겹으로 이해한다

카프카를 처음 배울 때 가장 많이 헷갈리는 지점은 “토픽에 메시지를 넣었는데 왜 순서가 뒤죽박죽으로 나오지?”다. 답은 카프카의 저장 구조에 있다. 카프카 클러스터는 브로커라는 서버 위에, 토픽이라는 논리 단위를 두고, 그 안에 파티션이라는 물리 단위로 메시지를 나눠 저장한다. 이 세 겹을…

카프카는 데이터를 주고받는 중간다리, 메시지 브로커다

두 서버가 직접 데이터를 주고받게 만들면 언젠가 문제가 생긴다. 받는 쪽 서버가 잠깐 죽으면 보낸 요청은 그대로 사라지고, 응답을 기다리는 동안 보낸 쪽 서버의 성능도 같이 떨어진다. 아파치 카프카(Apache Kafka)는 이 문제를 “중간에 메시지를 대신 보관해 주는 저장소”를 두는 방식으로…

웹 보안의 핵심은 원격지 사용자 입력을 신뢰하지 않는 것이다

아이디 입력란이 있으면 사람들은 아이디를 넣는다. 개발자는 그렇게 가정하고 코드를 짠다. 그런데 누군가는 그 칸에 1만 자를 때려 넣고, 누군가는 자바스크립트를, 누군가는 SQL문을 넣는다. 입력란은 사람의 선의를 전제로 만들어지지만, 공격자는 그 전제를 노린다 웹 보안을 코드 레벨에서 시작하는 출발점은 하나로…