///
Search
Duplicate
🗣️

최종 발표 피드백

질문 & 답변 & 피드백

김준영 튜터님(카카오헬스케어)

질문:
아키텍처 상으로 생각보다 돈이 많이 들지 않았는지
답변:
생각보다 돈이 많이 들었다 (한 달에 10만원)
피드백:
OK
질문:
Redis Cluster를 어떻게 구성하신건지
답변:
Redis Cluster를 구성하지는 않았고, ElastiCache를 구성하고, 이에 대한 Read-Replication을 적용한 상태이다.
피드백:
이 부분은 그림을 수정해서 오해를 줄였으면 좋겠다.
질문:
Grafana 와 Prometheus 를 어떻게 사용하신 건지
답변:
부하테스트를 통해 서버의 상태를 모니터링 하기 위해 적용하였다.
피드백:
OK
질문:
AWS 설정을 직접 스크립트나 yaml을 사용하여 구성하였는지
답변:
Github Actions, Secret Key와 Code Deploy를 사용하여 자동으로 Blue/Green 배포를 할 수 있게 하였다.
yaml을 작성하여 구성하였다.
피드백:
테라폼을 사용하여 코드레벨로서 AWS 구성을 관리할 수 있다.
이런 구성은 서비스 환경이전에 대하여 유연하게 적용할 수 있다는 이점을 띈다.
Local 스테이지
Dev 스테이지
Integration 스테이지
QA 스테이지
Production 스테이지
이런 부분은 FinOps와도 연관되는데 — 요즘은 Devops라 안 부르고 FinOps라 부른다 — 궁금하면 찾아보자
질문:
Jmeter를 사용하여 어떤 단계별 부하테스트를 거쳤는지?
아래 테스트를 알고 사용했는지?
스모크 테스트
새니티 테스트
,,,
답변:
잘 알지 못 한다,,, 처음 들어봤다,,,
피드백:
부하테스트 단계 별로 테스트 목표와 테스트 방법이 다르니 꼭 공부해보길 바란다
위 내용을 모르고 부하테스트를 했다고 어필한다면 마이너스 점수를 줄 것 같다
질문:
부하테스트 시, TPS를 500초로 잡았는데 그러한 근거가 있는지?
답변:
500 TPS에 대한 정확한 근거는 없다.
다만, 케이스의 갯수를 제한두지 않고 Infinite Load를 하였기에 500 TPS로 잡았다
피드백:
보통 부하테스트에 대한 목표값 측정을 하고 테스트한다
TPS 500초면 굉장히 널널한 거다.
목표값 측정 과정은 공부해보길 바란다
목표치 설정에 대한 근거가 없는 부하테스트라면 마이너스 점수를 줄 것 같다.
질문:
부하테스트의 시나리오는 어떻게 구성하였는지?
왜 Read 하나에 대해서 테스트를 하는지?
답변:
Auto - Scale 에 대한 개선효과를 추정하기 위해 대표적인 케이스인 전체 상품 조회만을 테스트하였다.
각 개선효과에 대한 부하테스트 별, 시나리오를 구성하여 테스트하였다.
피드백:
실제 환경에서는 Read만 할 수가 없다. 꼭 여러 케이스들을 조합해서 테스트하길 바란다.
질문:
Read 와 Write 중 어느 것이 DB의 부하가 많다고 생각하는지?
답변:
트래픽 관점으로는 Read가, DB의 CPU 사용률 관점으로는 Write 가 많다고 생각한다.
피드백:
MySQL 내부적으로도 캐싱을 하기 때문에 Read가 더 빠르다. 따라서 Write가 상대적으로 부하가 높다.
MySQL 내부 아키텍처 또한 공부를 해볼 것
질문:
부하테스트 시, HicariCP의 커넥션 수와 톰캣의 Thread Pool 에서는 문제가 없었는지?
기본 HicariCP의 커넥션 수와 이에 대한 커스텀을 어떻게 할 수 있는지 알고 있는지?
기본 Tomcat Thread Pool 의 Size가 몇인지,
왜 그렇게 구성되는지
어떻게 커스텀할 수 있는지 알고 있는지?
답변:
HicariCP의 커넥션은 10개로 알고 있다.
Thread Pool의 커넥션은 220개로 알고 있다.
둘 다 어떻게 개선하면 좋을지는 고려하지 않았다.
피드백:
부하테스트 시, 첫 발목을 잡는 것이 바로 이 둘이다.
꼭 왜 그렇게 구성되어있는지, 내부적으로 어떻게 처리되는지, 어떻게 하면 수정하여 개선할 수 있을지를 공부해보길 바란다.

이준호 튜터님

질문:
동시성 이슈를 제어하시려고 하셨다 했는데 어떤 시나리오에서 어떤 동시성 이슈가 발생하고, 어떻게 대처하셨는지
답변:
상황
하나의 입찰에 대한 다량의 동시 주문 요청 케이스에서 데드락 이슈가 발생하였다.
해결
해당 유스케이스 내에서, 조회 이후 수정,삭제가 이루어지고 있다
이러한 이유로 조회할 때 배타적 잠금을 걸어서 해결하였다.
개선사항
만약 다량의 트래픽이 유입된다면, 다른 스레드가 무한정 대기하여 timeout 이 나는 것을 보았다.
이러한 이유로 Redis의 분산락을 통해 개선 예정이다.
피드백:
OK
질문:
Redisson을 사용한 동시성 제어를 추후 개선방법으로 채택하셨는데, 다른 방법은 없었는지?
답변:
배타적 잠금과 @Retryable 사용하여 대처하는 방법
이 떄 동일한 스레드를 사용하게 되어 스레드 풀에 반납하지 못 한다
따라서 Retry handler에 스레드 풀 사이즈를 배정하여 대처
다만 트래픽에 따라 스레드 풀 사이즈가 변경되어야 하므로 스레드 풀 사이즈를 얼마나 정할지가 어렵다.
이러한 이유로 Redis 분산락을 채택할 예정이다.
피드백:
처음 들어보는 방안이라 낯설다. 다만 나쁘지 않은 방법인 것 같다.
질문:
서비스 특성 상, 조회가 굉장히 많을 것 같은데 이에 대해서 어떻게 대처하고 있는지?
답변:
프로젝트 시간 상, 상품 데이터 관련하여 캐싱처리만을 하였다.
기존에 회의를 통해 캐싱처리 전략을 고려해보았다.
이를 기반으로 추후에 다른 데이터 관련해서도 적용할 예정이다.
(말을 못 하고 지나감) CQRS를 적용하여 조회와 쓰기 트래픽을 분리하였다.
피드백:
꼭 적용해서 캐싱 전략에 대해서도 이야기하면서 덧붙이면 좋을 것 같다.

이성국 튜터님

질문:
mysql primary와 secondary간 동기화가 되어있어서 몇초정도는 데이터 정합성이 차이가 날텐데 이럴 때 a 사용자가 게시글을 작성하고 b사용자가 직후에 조회한다면 해당 게시글이 보이지 않을텐데 이럴땐 어떻게 개선할 건지?
답변:
두 가지 방법을 고려하여 개선할 예정이다.
메세지 큐를 사용하여, 어플리케이션 레벨에서 더욱 빠른 비동기적 동기화를 진행
캐싱 테이블에 선행적으로 저장하여 더욱 빠른 조회를 하게 할 예정
피드백:
두 방법 모두 그렇게 좋은 접근방법은 아닌 것 같다.
메세지 큐
관리 허들이 높다
큐로 처리되기 때문에 오히려 성능이 저하될 것 같다
캐싱 테이블
관리사항이 높아지고
오히려 데이터 정합성이 깨질 가능성이 높다
아래와 같이 답변하여 비즈니스 적인 측면을 고려하는 개발자임을 어필하는 것도 좋을 것 같다.
만약, 데이터의 정합성의 차이를 최대한 줄여야한다면 스케일업을 하여 조금 더 빠르고 정확한 데이터를 제공할 수 있습니다.
다만, 저희는 비용적인 측면에서 ~초 정도는 비즈니스적으로 허용하게 하였습니다.
,,,
질문:
왜 offset 기반 페이지네이션을 채택하셨는지?
답변:
큰 단점이 없다고 판단하였다.
offset 기반으로 선 적용한 뒤, 추이에 따라 cursor 기반 페이지네이션을 적용할 예정이다.
피드백:
cursor 기반에 비해 offset 방식은 이점이 크게 없다.
현업에서도 이러한 이유로 거의 cursor 기반을 채택하고 있다.
페이지네이션에 대해서 많이 물어보니 이 부분은 꼭 공부했으면 좋겠다.

이력서

김준영 튜터님(카카오헬스케어)

진짜 Contribution이 아니라면 잔디를 보여줄 때 Contribution이라고 적지 않는 게 좋을듯
몇 달씩 비어있는 잔디를 보여주는 것은 그렇게 메리트가 있다고 생각되지 않음
기술스택에 대해서는 버전을 꼭 명시할 것
해당 버전에 대해서 아래 사항에 대해 답변 준비할 것
해당 버전을 왜 채택했는지
이전버전과의 차이점
버전만의 특정 기술을 사용한 부분
블로그 내의 내용들을 자신있게 말할 수 있어야 함
까먹지 말고, 어디서 복붙한 것들은 최대한 올리지 말 것
프로젝트의 주요 개발 내역에 대해서, “~API” 사용했다라고 쓰기보다 더욱 구체적인 개발사항을 서술할 것
강조하고 싶은 내용은 Color를 사용해서 강조할 것
그렇다고 너무 많은 것을 Color를 사용해서 강조하지 말 것
꼭 구체적인 수치를 최대한 많이 보여주자
읽는 사람으로 하여금 더욱 친절하게 — 아마 수치와 디테일한 사항들을 저술하라는 것 같다 — 적어줬으면 좋겠다.
하루에 50건씩 들어온다.

공부가 더 필요한 부분이 뭐라고 생각하는가

임지훈
솔직히 아키텍처 관련해서 CI/CD 정도만 공부하려 했는데 정말 중요하구나 생각들어서 깊게 공부할 생각
인강을 듣거나 손수 만들어봐야겠다
AWS를 사용하지 않고 직접 구현해도 무관한 것들은 반드시 공부해야겠다
서버비를 아끼는 개발자를 어필할 수 있지 않을까 실제로도 이런 개발자가 지혜롭기도 하고
스프링 내부의 기본기를 탄탄히 해야겠다는 생각이 들었다.
스레드 풀
히카리
어떤 흐름으로 트랜잭션 메서드가 호출되어 하나의 스레드가 부여되고, 실행되는지
캐싱에 대해서도 공부를 해보고 싶다
캐싱 메모리 전략
데이터 정합성
이력서와 면접, 특히 알고리즘과 CS 공부를 좀 더 탄탄히 해야겠다
동시성 제어 관련하여 비관적 락보다 분산락을 채택했을 때의 이점을 공부하고 싶다
MySQL 내부구조와 MHA 방식도 공부해야겠다
Offset 기반 페이지네이션과 Cursor 기반 페이지네이션 또한 공부해야겠다

추가적으로 궁금한 사항들은?

임지훈
CQRS 패턴에서 꼭 모델을 나눠야 할까
추가 질의응답 관련해서 적절한 답변을 한걸까
특히, CQRS 모델 분리여부에 대한 질의응답에 대해 궁금하다
모델 분리를 고려해야하는 이유와 우리가 이를 채택하지 않은 이유
무중단 배포 다른 효율적인 방법 ?
배포전략 종류와 Blue/Green 의 장점에 대해서 잘 설명해주셨습니다. - 다만 Blue/Green 의 경우 서버 배포시 해당 노드에서 운영중인 서버의 2배 리소스를 일시적으로 사용한다는 단점이 있는데요. - 이때 노드당 리소스 사용량 제한에 의해 Green Pod 가 리소스 할당을 받지 못할 수 있습니다. - 그부분도 인지하고 넘어가면 좋을 것 같습니다.
쿠폰 코드레벨 더 효율적인 관리 ???
쿠폰의 종류가 엄청나게 많아질 것이기 때문에 ENUM으로만 확장성을 대응하기엔 어려워 보입니다. - 다만, 결재 상세내역에 어떤 쿠폰인지 연관관계를 남겨놓지 않고 쿠폰이름과 할인가격만 남기는것도 괜찮은 방법이긴 합니다. - 우리 서비스에서 쿠폰 도메인이 얼마나 중요하냐에 따라 다를 것 같네요.