경험 정리 겸 강의 후기 겸 프로젝트 일기? 의식의 흐름..
비동기 멀티스레딩... 어렵다...
작년에 모 회사에서 인턴으로 근무할 당시, 사내 알림 서비스를 카프카로 재설계하는 업무를 맡았었습니다.
기존 서비스는 특정 시간이 되어 배치 작업이 실행되면 for문을 돌면서 메세지를 생성해서 발송(with 스레드 50개)하는~ 아주 단순한 형태였습니다.
개선해야할 문제점은 아래와 같았습니다.
1.(배포 등으로) 발송 중단 시 자동으로 재시작되지 않음
2.중단된 부분부터 이어서 보내지 않음
3.현재 발송 완료까지 2시간 넘게 걸리는데, 너무 오래걸림. 좀 더 속도 개선이 필요
주어진 기간은 4주였는데, 처음 2주는 어떤 식으로 진행할지 계획/공부/컨펌받는 단계였고, 집중적으로 개발한 기간은 한 2주정도 되었던 것 같네요. 업무는 무사히 마쳤고, 유의미한 성능 개선도 있었습니다. 120만건 발송 기준으로 2시간 40분 -> 1시간 16분으로 시간을 단축하며 기존 알림 발송 대비 52.5%개선 하였는데요.
왜 이렇게 빨라졌는지 추측해보자면.... 여러 이유가 있겠지만. 사실 가장 영향이 컸던건 1번인 것 같습니다.
1. 동기 스레드에 있던 발송 체크 로직을 비동기 스레드로 이동
2. 메세지 생성 부분이 별도의 배치 서버로 빠지면서, DB I/O가 줄었음
3. Cosumer가 스레드 3개로 병렬 처리해서 읽기 속도 증가


작업이 끝나고 돌이켜봤을때 한가지 아쉬운 점은, 멀티스레드를 잘 모르는 상태로 작업을 하다보니 내부 로직을 제대로 이해 못한채로 개발을 진행했다는 점입니다. (원본 코드가 있어서 작업을 하면서 그 쪽 코드를 딱히 수정할 일은 없었지만? 그래도 아쉬운건 아쉬운거니까요. config 만 작성해서 썼던 카프카 컨슈머도 사실 까보면 내부 동작은 파티션 개수만큼의 스레드 풀을 만들어 쓰는 멀티스레딩이기도 하구요...) 사실 스레드 풀.. 소문만 들었지 직접 만들어서 쓰는 코드를 본게 처음이었어서 ㅋㅋ 굉장히 신기했던 기억이 나네요.
GitHub - hyerijang/demo-notification-system: 개인 프로젝트 - 간단한 알림 시스템
개인 프로젝트 - 간단한 알림 시스템. Contribute to hyerijang/demo-notification-system development by creating an account on GitHub.
github.com
그래서 퇴사 직후에, 잊어버리기전에 미리 한번 클론 코딩을 해보자 싶어 기억을 더듬어가며 알림 서비스를 클론 코딩해봤는데요, ExecutorService와 CallerRunsPolicy 등등... 구글링으로 독학해봤는데 애초에 멀티 스레드 기초 지식이 부족하니 동작 원리가 완전히 이해가 되진 않았습니다.
스레드 잘 모르겠으면 이거 들으세요 : 김영한의 실전 자바 고급 1편
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런
김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌
www.inflearn.com
사실 중급을 수강 안해서 중급부터 들을까 살짝 고민하긴 했는데요. 중급 내용은 이미 어느정도 아는 거고, 나한테 필요한 내용은 멀티스레딩 + 동시성이니까... 냅다 고급부터 질렀습니다.
사실 12월😂 쯤에 결제해두고 다른거 하느라 미적거렸는데, 설 연휴 지나고 이러다 평생 안듣겠다 싶어서 후다닥 완강! 했습니다. 👏나도 이제 Future, ExecutorService, CallerRunsPolicy 뭔지 안다ㅠㅠ. 역시 킹갓김영한... 실습할 때는 좀 귀찮다는 생각이 들긴 하는데 다- 이유가 있는 겁니다. (+확실히 고급쯤 되니 난이도가 좀 있어서 실습 안해보면 좀 이해하기 힘들 듯. )
혼자 공부할 때는 스레드랑, 비동기도 제대로 모르면서 냅다 키워드로 검색해서 예시 코드만 읽고 복붙해서 실험하는 정도였습니다. 걷지도 못하면서 냅다 뛰려고 함 반면, 이 강의에서는 자바만 써서 스레드 만드는 것부터 시작하는데요, 바닥부터 쌓아올리니 이해의 정도가 확실히 다릅니다ㅋㅋ...
여담이지만 원본 아키텍처에서 메세지 발송할 때 부모 스레드 1개 + 자식 스레드 50개를 쓰고 있어서 "왜 중간에 부모 스레드를 굳이 만든걸까??" 하고 궁금해 했었는데, 지금 생각해보면 아마도 CallerRunsPolicy 때문이었을 것 같네요.
- CallerRunsPolicy는 처리되지 못한 요청은 무시하지 않고, ThreadPool을 호출한 스레드에서 처리 -> 메인 스레드에서 바로 스레드를 호출해서 쓰면 요청 지연 시 해당 작업을 요청한 스레드까지 동원 (다른 작업에 영향 ㅜㅜ 라기엔.. 요청 스레드 1개를 2시간 동안 못쓰는 정도..? 톰캣 요청 스레드 기본 개수가 200개니까 약~간 영향을 주겠네요.)
지금은 완강한지 오래 되어서 많이 잊어버리긴 했는데요. 그래도 예전과 달라진 점은
1. 어떤 키워드로 검색해야할지 안다.
2. 코드를 제대로 이해할 수 있다
3. 문제의 원인을 추측할 수 있다 (아 이거... 큐 사이즈가 무한이어도 되나? RejectedExecutionHandler 에서 Policy를 이걸로 해도 되나..?)
정도로 요약할 수 있을거 같습니다. only 자바로 쌩으로 스레드 만들어 쓰다가 스프링 쓰니까 편-안해지는건 덤이네요. 👍
이건 여담222이지만 저는 김영한님 강의를 완강할 때마다, 늘 수강평을 작성하는데요, 뭔가 작별인사.. 정말 마무리 짓는 느낌이라 뿌듯하기도 하고? 늘 수강평에 답글을 달아주셔서 ㅋㅋ 연예인에게 팬서비스 받는 기분이 듭니다.

다음 목표 : 배운걸 써먹어보자
다음 목표는 배운걸 써 먹어보기... 저번에 알림 시스템 클론코딩 했던건 이미 멀티스레딩 + 비동기가 다 적용되어 있어서, 새로 프로젝트를 시작해야하나? 고민해봤는데요. 이 글을 쓰러 블로그에 들어왔다가 예전에 만들어뒀던 결제 시스템을 발굴했습니다!.🥳 결제 시스템 연구해보면서 전체적인 플로우 확인을 위해 간단하게 단일 스레드 + 동기식으로 구현해봤던건데, 또 이렇게 쓸모를 발견하네요.👍
다음 글에서는 결제 처리하는 부분을 비동기 + 멀티스레드로 리팩토링하는 과정을 업로드 하겠습니다.
간단 결제 시스템 구현 : (2) Mono 제대로 써보기
김영한 자바 고급 편 완강 기념(?)으로 이번 시간에는 예전에 결제 시스템 분석하면서 만들어봤던 샘플 코드를 리펙토링 해보려고 한다. 비동기 + 멀티스레드 중심으로 리팩터링 할 요소를 찾아
dev-jhl.tistory.com
간단 결제 시스템 구현 : (1) 결제 시스템 분석해보기
인턴 퇴사후 백수 2주차, 슬슬 뭐라도 해야겠다 마음을 굳히며 원티드를 기웃거리던 도중 "기술과제 합격률을 높이는 예외처리와 테스트 전략" 이라는 백엔드 챌린지를 진행 중인걸 발견했습
dev-jhl.tistory.com
'프로젝트 > 공모주 알리미 클론 (개인)' 카테고리의 다른 글
알림 서비스 클론 코딩 : (2) 프로젝트 설계 V2 + Kafka 추가하기 (0) | 2025.03.14 |
---|
경험 정리 겸 강의 후기 겸 프로젝트 일기? 의식의 흐름..
비동기 멀티스레딩... 어렵다...
작년에 모 회사에서 인턴으로 근무할 당시, 사내 알림 서비스를 카프카로 재설계하는 업무를 맡았었습니다.
기존 서비스는 특정 시간이 되어 배치 작업이 실행되면 for문을 돌면서 메세지를 생성해서 발송(with 스레드 50개)하는~ 아주 단순한 형태였습니다.
개선해야할 문제점은 아래와 같았습니다.
1.(배포 등으로) 발송 중단 시 자동으로 재시작되지 않음
2.중단된 부분부터 이어서 보내지 않음
3.현재 발송 완료까지 2시간 넘게 걸리는데, 너무 오래걸림. 좀 더 속도 개선이 필요
주어진 기간은 4주였는데, 처음 2주는 어떤 식으로 진행할지 계획/공부/컨펌받는 단계였고, 집중적으로 개발한 기간은 한 2주정도 되었던 것 같네요. 업무는 무사히 마쳤고, 유의미한 성능 개선도 있었습니다. 120만건 발송 기준으로 2시간 40분 -> 1시간 16분으로 시간을 단축하며 기존 알림 발송 대비 52.5%개선 하였는데요.
왜 이렇게 빨라졌는지 추측해보자면.... 여러 이유가 있겠지만. 사실 가장 영향이 컸던건 1번인 것 같습니다.
1. 동기 스레드에 있던 발송 체크 로직을 비동기 스레드로 이동
2. 메세지 생성 부분이 별도의 배치 서버로 빠지면서, DB I/O가 줄었음
3. Cosumer가 스레드 3개로 병렬 처리해서 읽기 속도 증가


작업이 끝나고 돌이켜봤을때 한가지 아쉬운 점은, 멀티스레드를 잘 모르는 상태로 작업을 하다보니 내부 로직을 제대로 이해 못한채로 개발을 진행했다는 점입니다. (원본 코드가 있어서 작업을 하면서 그 쪽 코드를 딱히 수정할 일은 없었지만? 그래도 아쉬운건 아쉬운거니까요. config 만 작성해서 썼던 카프카 컨슈머도 사실 까보면 내부 동작은 파티션 개수만큼의 스레드 풀을 만들어 쓰는 멀티스레딩이기도 하구요...) 사실 스레드 풀.. 소문만 들었지 직접 만들어서 쓰는 코드를 본게 처음이었어서 ㅋㅋ 굉장히 신기했던 기억이 나네요.
GitHub - hyerijang/demo-notification-system: 개인 프로젝트 - 간단한 알림 시스템
개인 프로젝트 - 간단한 알림 시스템. Contribute to hyerijang/demo-notification-system development by creating an account on GitHub.
github.com
그래서 퇴사 직후에, 잊어버리기전에 미리 한번 클론 코딩을 해보자 싶어 기억을 더듬어가며 알림 서비스를 클론 코딩해봤는데요, ExecutorService와 CallerRunsPolicy 등등... 구글링으로 독학해봤는데 애초에 멀티 스레드 기초 지식이 부족하니 동작 원리가 완전히 이해가 되진 않았습니다.
스레드 잘 모르겠으면 이거 들으세요 : 김영한의 실전 자바 고급 1편
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런
김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌
www.inflearn.com
사실 중급을 수강 안해서 중급부터 들을까 살짝 고민하긴 했는데요. 중급 내용은 이미 어느정도 아는 거고, 나한테 필요한 내용은 멀티스레딩 + 동시성이니까... 냅다 고급부터 질렀습니다.
사실 12월😂 쯤에 결제해두고 다른거 하느라 미적거렸는데, 설 연휴 지나고 이러다 평생 안듣겠다 싶어서 후다닥 완강! 했습니다. 👏나도 이제 Future, ExecutorService, CallerRunsPolicy 뭔지 안다ㅠㅠ. 역시 킹갓김영한... 실습할 때는 좀 귀찮다는 생각이 들긴 하는데 다- 이유가 있는 겁니다. (+확실히 고급쯤 되니 난이도가 좀 있어서 실습 안해보면 좀 이해하기 힘들 듯. )
혼자 공부할 때는 스레드랑, 비동기도 제대로 모르면서 냅다 키워드로 검색해서 예시 코드만 읽고 복붙해서 실험하는 정도였습니다. 걷지도 못하면서 냅다 뛰려고 함 반면, 이 강의에서는 자바만 써서 스레드 만드는 것부터 시작하는데요, 바닥부터 쌓아올리니 이해의 정도가 확실히 다릅니다ㅋㅋ...
여담이지만 원본 아키텍처에서 메세지 발송할 때 부모 스레드 1개 + 자식 스레드 50개를 쓰고 있어서 "왜 중간에 부모 스레드를 굳이 만든걸까??" 하고 궁금해 했었는데, 지금 생각해보면 아마도 CallerRunsPolicy 때문이었을 것 같네요.
- CallerRunsPolicy는 처리되지 못한 요청은 무시하지 않고, ThreadPool을 호출한 스레드에서 처리 -> 메인 스레드에서 바로 스레드를 호출해서 쓰면 요청 지연 시 해당 작업을 요청한 스레드까지 동원 (다른 작업에 영향 ㅜㅜ 라기엔.. 요청 스레드 1개를 2시간 동안 못쓰는 정도..? 톰캣 요청 스레드 기본 개수가 200개니까 약~간 영향을 주겠네요.)
지금은 완강한지 오래 되어서 많이 잊어버리긴 했는데요. 그래도 예전과 달라진 점은
1. 어떤 키워드로 검색해야할지 안다.
2. 코드를 제대로 이해할 수 있다
3. 문제의 원인을 추측할 수 있다 (아 이거... 큐 사이즈가 무한이어도 되나? RejectedExecutionHandler 에서 Policy를 이걸로 해도 되나..?)
정도로 요약할 수 있을거 같습니다. only 자바로 쌩으로 스레드 만들어 쓰다가 스프링 쓰니까 편-안해지는건 덤이네요. 👍
이건 여담222이지만 저는 김영한님 강의를 완강할 때마다, 늘 수강평을 작성하는데요, 뭔가 작별인사.. 정말 마무리 짓는 느낌이라 뿌듯하기도 하고? 늘 수강평에 답글을 달아주셔서 ㅋㅋ 연예인에게 팬서비스 받는 기분이 듭니다.

다음 목표 : 배운걸 써먹어보자
다음 목표는 배운걸 써 먹어보기... 저번에 알림 시스템 클론코딩 했던건 이미 멀티스레딩 + 비동기가 다 적용되어 있어서, 새로 프로젝트를 시작해야하나? 고민해봤는데요. 이 글을 쓰러 블로그에 들어왔다가 예전에 만들어뒀던 결제 시스템을 발굴했습니다!.🥳 결제 시스템 연구해보면서 전체적인 플로우 확인을 위해 간단하게 단일 스레드 + 동기식으로 구현해봤던건데, 또 이렇게 쓸모를 발견하네요.👍
다음 글에서는 결제 처리하는 부분을 비동기 + 멀티스레드로 리팩토링하는 과정을 업로드 하겠습니다.
간단 결제 시스템 구현 : (2) Mono 제대로 써보기
김영한 자바 고급 편 완강 기념(?)으로 이번 시간에는 예전에 결제 시스템 분석하면서 만들어봤던 샘플 코드를 리펙토링 해보려고 한다. 비동기 + 멀티스레드 중심으로 리팩터링 할 요소를 찾아
dev-jhl.tistory.com
간단 결제 시스템 구현 : (1) 결제 시스템 분석해보기
인턴 퇴사후 백수 2주차, 슬슬 뭐라도 해야겠다 마음을 굳히며 원티드를 기웃거리던 도중 "기술과제 합격률을 높이는 예외처리와 테스트 전략" 이라는 백엔드 챌린지를 진행 중인걸 발견했습
dev-jhl.tistory.com
'프로젝트 > 공모주 알리미 클론 (개인)' 카테고리의 다른 글
알림 서비스 클론 코딩 : (2) 프로젝트 설계 V2 + Kafka 추가하기 (0) | 2025.03.14 |
---|