간단 결제 시스템 구현 : (2) Mono 제대로 써보기
김영한 자바 고급 편 완강 기념(?)으로 이번 시간에는 예전에 결제 시스템 분석하면서 만들어봤던 샘플 코드를 리펙토링 해보려고 한다. 비동기 + 멀티스레드 중심으로 리팩터링 할 요소를 찾아
dev-jhl.tistory.com
김영한 자바 고급 편 완강 기념으로 이전에 했던 결제 시스템을 리팩토링 해보려고 했는데, 생각보다 할게 없어서? 확신의 멀티스레딩인 알림 서비스로 다시 돌아왔다. V1은 간단하게 만든답시고 원본 아키텍처를 심하게 손질했었는데 (...) 제대로 다시 만들면 그래도 꽤 비동기 멀티스레딩 다운 프로젝트가 될 것 같다.
GitHub - hyerijang/demo-notification-system: 개인 프로젝트 - 알림 시스템 Consumer 클론코딩
개인 프로젝트 - 알림 시스템 Consumer 클론코딩. Contribute to hyerijang/demo-notification-system development by creating an account on GitHub.
github.com
V1 : 기능은! 한다!

V1의 경우 멀티 스레딩 + 동시성 공부하면서 간단히 구현해보는게 목적이었기 때문에 실제 아키텍처와 다르게 최대한 간단히 설계해 봤었다. Kafka 깔기 귀찮음(...) 이슈로 그냥 Blocking Queue를 활용해서 Producer Consumer 를 코드로 구현해서 동작만 모방했다, 이게 생각보다 어려웠고, 왜 카프카를 쓰는지 이해해버렸다. 메세지 플랫폼과 HTTP 통신하는 부분도 Thread.sleep으로 20ms 재워놓고 대충 통신했다고 치고 넘어갔다. 좀 너무했나..?
V2 : 좀 더 발전시켜보기 + Kafka
위 구조의 문제점은 : 내 서버 <-> 메세지 플랫폼간 통신하는 20ms 동안 스레드가 놀면서 기다리고 있다는 점이다. 즉, 메세지 전송 + 전송 결과 수신을 하나의 스레드에서 처리하고 있어서 스레드 낭비가 있다. ( 단일 책임 원칙 위반)
따라서 메세지 전송, 전송 결과 수신을 다른 스레드 풀에서 담당하게 하면, 좀 더 효율적으로 일할 수 있을 것 같다.

위 구조에서 메세지 플랫폼 발송 결과 처리 컨슈머(kafka consumer), 발송 결과 처리 스레드 풀이 추가되었다,
사실 이번에도 Consumer Producer 구현해서 스레드 풀을 각각 만들어서 써볼까? 했는데, 음.... Kafka를 쓰는게 더 쉽고, 코드 복잡도가 낮아질 듯 싶어서 Kafka를 추가 해보려고한다. AWS 쓰기엔 돈이 없어서 ㅠㅠ 로컬 환경에서 Docker Compose로 구성해보았다.
멀티 브로커 kafka 구성하기
[Kafka] Docker Compose로 멀티브로커 Kafka 구성하기
devocean.sk.com
Kafka 구성은 위 블로그 글을 그대로 따라했다. 설명이 친절해서 그냥 읽어보면서 시키는 대로 복붙복붙 하면 됨
topic 생성하기
다른 블로그 글 보면서 따라하다가 이 부분에서 자꾸 막혀서 슬펐는데, docker-compose 내부의 서비스 이름으로 접근하므로 kafka-1, zookeeper-1 의 형태로 접근한다! (이 부분은 본인이 ymal을 어떻게 썼느냐에 다라 달라질 것이다.)

# docker-compose exec {서비스이름} kafka-topics --create --topic {토픽명} --bootstrap-server {서비스이름}:9092 --replication-factor 3 --partitions 2
docker-compose exec kafka-1 kafka-topics --create --topic my-topic --bootstrap-server kafka-1:9092 --replication-factor 3 --partitions 2
위의 커맨드에서 my-topic 을 자신이 쓸 토픽명으로 바꾸고, replica 수랑 patrition 수를 원하는대로 조정하면 된다.
나 같은 경우 topic이 2개 필요해서 2번 만들었고, replica와 partition 수는 broker 수와 동일하게 3으로 설정했다.
- dev.ipo-message-request.v1 (메세지 전송 요청)
- dev.ipo-message-platform-result.v1 (메세지 플랫폼 전송 결과 수신)
Kafka-UI Tool 추가하기
Kafka-UI Tool 을 이용하여 Kafka 관리하기
devocean.sk.com
CLI 로 쓰다보니 좀 불편해서 ㅎㅎ UI를 하나 추가했다. 위 블로그 글을 참조했다.
docker-compose -f docker-compose-kafka-ui.yaml up -d
docker-compose-kafka-ui.yaml 를 작성 후 해당 파일이 있는 위치에서 위 명령어를 실행하고 http://localhost:8989/ 로 접근하면 아래와 같은 대시보드를 확인할 수 있다.
이제 내 kafka 클러스터에 관한 정보를 좀 더 편하게 확인할 수 있다!

GUI 가 있으면 이렇게 간단히 메세지를 생성해서 테스트에 쓸 수 있다.

'프로젝트 > 공모주 알리미 클론 (개인)' 카테고리의 다른 글
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 후기 (feat 알림 서비스 클론 코딩) (1) | 2025.03.11 |
---|
간단 결제 시스템 구현 : (2) Mono 제대로 써보기
김영한 자바 고급 편 완강 기념(?)으로 이번 시간에는 예전에 결제 시스템 분석하면서 만들어봤던 샘플 코드를 리펙토링 해보려고 한다. 비동기 + 멀티스레드 중심으로 리팩터링 할 요소를 찾아
dev-jhl.tistory.com
김영한 자바 고급 편 완강 기념으로 이전에 했던 결제 시스템을 리팩토링 해보려고 했는데, 생각보다 할게 없어서? 확신의 멀티스레딩인 알림 서비스로 다시 돌아왔다. V1은 간단하게 만든답시고 원본 아키텍처를 심하게 손질했었는데 (...) 제대로 다시 만들면 그래도 꽤 비동기 멀티스레딩 다운 프로젝트가 될 것 같다.
GitHub - hyerijang/demo-notification-system: 개인 프로젝트 - 알림 시스템 Consumer 클론코딩
개인 프로젝트 - 알림 시스템 Consumer 클론코딩. Contribute to hyerijang/demo-notification-system development by creating an account on GitHub.
github.com
V1 : 기능은! 한다!

V1의 경우 멀티 스레딩 + 동시성 공부하면서 간단히 구현해보는게 목적이었기 때문에 실제 아키텍처와 다르게 최대한 간단히 설계해 봤었다. Kafka 깔기 귀찮음(...) 이슈로 그냥 Blocking Queue를 활용해서 Producer Consumer 를 코드로 구현해서 동작만 모방했다, 이게 생각보다 어려웠고, 왜 카프카를 쓰는지 이해해버렸다. 메세지 플랫폼과 HTTP 통신하는 부분도 Thread.sleep으로 20ms 재워놓고 대충 통신했다고 치고 넘어갔다. 좀 너무했나..?
V2 : 좀 더 발전시켜보기 + Kafka
위 구조의 문제점은 : 내 서버 <-> 메세지 플랫폼간 통신하는 20ms 동안 스레드가 놀면서 기다리고 있다는 점이다. 즉, 메세지 전송 + 전송 결과 수신을 하나의 스레드에서 처리하고 있어서 스레드 낭비가 있다. ( 단일 책임 원칙 위반)
따라서 메세지 전송, 전송 결과 수신을 다른 스레드 풀에서 담당하게 하면, 좀 더 효율적으로 일할 수 있을 것 같다.

위 구조에서 메세지 플랫폼 발송 결과 처리 컨슈머(kafka consumer), 발송 결과 처리 스레드 풀이 추가되었다,
사실 이번에도 Consumer Producer 구현해서 스레드 풀을 각각 만들어서 써볼까? 했는데, 음.... Kafka를 쓰는게 더 쉽고, 코드 복잡도가 낮아질 듯 싶어서 Kafka를 추가 해보려고한다. AWS 쓰기엔 돈이 없어서 ㅠㅠ 로컬 환경에서 Docker Compose로 구성해보았다.
멀티 브로커 kafka 구성하기
[Kafka] Docker Compose로 멀티브로커 Kafka 구성하기
devocean.sk.com
Kafka 구성은 위 블로그 글을 그대로 따라했다. 설명이 친절해서 그냥 읽어보면서 시키는 대로 복붙복붙 하면 됨
topic 생성하기
다른 블로그 글 보면서 따라하다가 이 부분에서 자꾸 막혀서 슬펐는데, docker-compose 내부의 서비스 이름으로 접근하므로 kafka-1, zookeeper-1 의 형태로 접근한다! (이 부분은 본인이 ymal을 어떻게 썼느냐에 다라 달라질 것이다.)

# docker-compose exec {서비스이름} kafka-topics --create --topic {토픽명} --bootstrap-server {서비스이름}:9092 --replication-factor 3 --partitions 2
docker-compose exec kafka-1 kafka-topics --create --topic my-topic --bootstrap-server kafka-1:9092 --replication-factor 3 --partitions 2
위의 커맨드에서 my-topic 을 자신이 쓸 토픽명으로 바꾸고, replica 수랑 patrition 수를 원하는대로 조정하면 된다.
나 같은 경우 topic이 2개 필요해서 2번 만들었고, replica와 partition 수는 broker 수와 동일하게 3으로 설정했다.
- dev.ipo-message-request.v1 (메세지 전송 요청)
- dev.ipo-message-platform-result.v1 (메세지 플랫폼 전송 결과 수신)
Kafka-UI Tool 추가하기
Kafka-UI Tool 을 이용하여 Kafka 관리하기
devocean.sk.com
CLI 로 쓰다보니 좀 불편해서 ㅎㅎ UI를 하나 추가했다. 위 블로그 글을 참조했다.
docker-compose -f docker-compose-kafka-ui.yaml up -d
docker-compose-kafka-ui.yaml 를 작성 후 해당 파일이 있는 위치에서 위 명령어를 실행하고 http://localhost:8989/ 로 접근하면 아래와 같은 대시보드를 확인할 수 있다.
이제 내 kafka 클러스터에 관한 정보를 좀 더 편하게 확인할 수 있다!

GUI 가 있으면 이렇게 간단히 메세지를 생성해서 테스트에 쓸 수 있다.

'프로젝트 > 공모주 알리미 클론 (개인)' 카테고리의 다른 글
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 후기 (feat 알림 서비스 클론 코딩) (1) | 2025.03.11 |
---|