Redis 캐싱을 사용하여, 일일 조회수와 좋아요 증감 수를 반영한 일일 HOT 상품 목록 조회 기능 개발
·
SpringBoot
해당 기능을 개발한 이유 위와 같이 몇몇 증권사들은 각 금융상품에 대해서 청약 경쟁률을 보여주나, 대부분은 제공하고 있지 않고 있었습니다. 청약 경쟁률 조회 API를 증권사에서 제공해서 사용하면 좋겠지만, 사업자 등록증이나 별도의 승인이 필요하거나 API를 제공하지 않았습니다...ㅠㅠ 투자에 참고하기 이러한 좋은 기능을 저희 서비스에 녹여내고 싶었고, 실제 투자자분들의 의견을 수집하고, 타 서비스를 조사하면서 결과적으로 저희 서비스만의 기능으로 일일 HOT 상품 목록 조회 기능을 개발하고자 하였습니다.   일일 HOT 상품 판별 요소 선정과 비율 반영 그렇다면, 일일 HOT 상품들을 사용자에게 보여주기 위해서 어떤 요소들로 어떤 기준을 가지고 보여줘야 할지 고민이 되었습니다. 저희 서비스 테두리 안에서 ..
비효율적인 상품 상세 검색 코드 수정과 nGrinder를 활용한 성능 테스트
·
SpringBoot
문제소마 프로젝트를 진행하던 도중, 팀원으로부터 오류 제보를 받았습니다.저희 서비스에서 제공하고 있는 상품 상세 검색 기능에서 종목 유형에 대한 세부 검색 요청시,이에 해당하는 상품들을 받아오지 못하는 오류가 발생하는 문제였습니다.  잠시 저희 서비스에 대해서 간략하게 설명 드리자면,주요 여러 증권사에서 발행하고 있는 금융 파생 상품 중에 하나인 ELS(Equity Linked Securities, 주가연계증권) 상품을통합하고 데이터 분석 기법 및 AI를 활용한 중립적인 분석 정보를 제공하는 서비스입니다.  아래와 같이 각 상품마다 기초자산들이 존재하는데왼쪽 사진의 S&P500, KOSPI, HSCEI와 같은 주가 지수형인 경우와,오른쪽 사진과 같이 삼성전자, 현대차와 같은 단일 주식들로 이루어진 종목형..
Spring Boot와 Kafka 테스트: Embedded Kafka로 상품 좋아요 메시지 검증하기
·
SpringBoot
들어가며레디스에 캐싱되어 있는 각각의 상품에 대해서 사용자가 좋아요를 누른 정보들을상품 서비스에서 주기적으로 DB에 dump하는 과정에서 추가적으로 유저 서비스의 DB에 저장할 수 있도록 하기 위해 중간에 카프카를 두고 비동기적으로 통신했는데, 이번에는 상품 서비스쪽에 작성한 카프카 프로듀서 관련 코드에 대해서 테스트 코드를 작성해본 내용을 기록하고자 글을 작성해보았습니다.    어떻게 카프카 테스트 코드를 작성해야 할까?처음으로 카프카 관련 테스트 코드를 작성하다보니 아래 기존의 레디스 관련 테스트 코드를 작성할 때와 같이,레디스 컨테이너를 생성하고, 매 테스트 전에 레디스 데이터를 초기화하여 테스트가 레디스에 의존하는 기능을 검증할 수 있도록하는 Testcontainer 방식으로 수행해야 하는지에 대..
MSA) 서비스 별 각 인스턴스에서 애플리케이션을 Docker 컨테이너화 후, 발생한 Eureka Client 간의 통신 문제
·
SpringBoot
개발 서버를 구축하기 위해, 현재 위와 같이MSA의 Eureka 서버를 제외하고, 각 서비스들을 각각의 인스턴스에 Blue/Green 무중단 배포를 적용하여 도커로 컨테이너화 한 상태였습니다. API Gateway 서버와 Batch Service 서버 모두CD가 동작하면 각 서버에 작성한 쉘 스크립트가 실행되어 Blue/Green 무중단 배포를 적용하는 방식입니다.  위와 같이 Blue/Green을 적용을 확인하기 위해 각 마이크로 서비스에 헬스 체크 컨트롤러를 만들어 둔 상태였습니다.   문제각 서비스에서 도커 컨테이너가 정상적으로 올라간 것을 확인한 후,API Gateway 서버에서 Batch Service의 API를 잘 라우팅 해주는지 확인하기 위해아래와 같이 리눅스 상에서 curl 명령을 통해 헬..
MSA) Spring Cloud 기반의 MSA 구조에서 Swagger 통합하기 + FastAPI의 Swagger까지
·
SpringBoot
들어가며 저번 시간에 FastAPI 서버를 Spring Cloud Eureka에 Client로 등록하는 방법에 이어서,이번에는 각 서비스마다 Swagger를 설정하여 이를 한 곳에서 통합하여 볼 수 있게끔 적용하려고 합니다. MSA 구조에서 프로젝트를 진행하면, 각 마이크로서비스들이 각각의 애플리케이션에서 돌아가기 때문에모놀리식 구조와 다르게 API 문서들을 관리하는데 어려움이 존재합니다.  쉽게 설명해보자면 모놀리식 구조의 경우 하나의 애플리케이션으로 운영 되므로애플리케이션에 Swagger를 하나만 띄우면 되지만 MSA 구조는 서비스들이 독립적으로 분리되어있기 때문에 서비스마다 Swagger를 띄워줘야합니다.이러한 상황에서 Swagger를 통합해주지 않는다면,API를 받아쓰는 프론트 입장에서는 호출하고..
MSA) Spring Cloud Eureka에 FastAPI 서버를 Client로 등록하기
·
SpringBoot
들어가며저희 팀이 계획한 기획에서 python을 활용하여 데이터 분석과 여러 데이터들을 가져와야할 것 같아MSA 구조의 팀 프로젝트를 수행하기 전에, 연습하고 해당 내용을 기록하고자 글을 작성했습니다.  Python 기반의 백엔드 프레임워크를 Flask를 쓸지 FastAPI를 쓸지는 정확히 확정이 되진 않았지만,Flask는 작은 프로젝트에서 다뤄본 경험이 있기도 하고 FastAPI가 좋다고들 하는데 사용해보지는 않아서배워볼겸 FastAPI로 진행하고자 합니다.  적용한 내용을 보기 쉽게 그림으로 그려보았습니다.   FastAPI를 설치하기 전에, 가상환경 세팅하기# 가상환경을 만들 디렉토리로 이동$ cd {directory}# 가상환경 만들기$ python3 -m venv {venv name}# 가상환경..
Locust를 통해 부하 테스트를 진행하고 Prometheus/Grafana로 모니터링하기
·
SpringBoot
멀티 모듈 프로젝트를 구성하여 쿠폰 발급 시스템 개발을 진행했었습니다. 이제 종합적으로 Locust를 사용하여 부하 테스트를 진행하고 각 모듈에 가해지는 부하를 Prometheus에서 지표들을 수집하고, Grafana의 대시보드에서 확인하는 과정을 기록하려고 합니다. 우선 Prometheus와 Grafana 컨테이너를 띄워주고 Prometheus에 접속해줍니다. 현재 지표를 수집할 애플리케이션들이 켜져있지 않으므로 동작시켜 줍니다. Grafana에 접속했는데 현재 저의 경우 아래 사진과 같이 주황색 경고등이 떠있는 것을 확인할 수 있었습니다. 경고등에 마우스를 가져가면 This panel requires Angular (deprecated)라는 문구가 뜨는데 이는 대시보드가 ​​AngularJS가 필요한..
프로메테우스와 그라파나를 사용하여 모니터링 수행하기
·
SpringBoot
들어가며 우선 서비스 개발과 장기적인 운영 관점에서 애플리케이션을 모니터링하는 것은 매우 중요한 작업입니다. 애플리케이션에서 발생하는 동작들에 대한 메트릭을 수집하여 애플리케이션 성능을 분석하면서 추후에 성능을 최적화할 수 있고, 시스템 내부에서 발생할 수 있는 잠재적인 문제를 빠르게 식별하고 해결하는 데 도움이 될 수 있습니다. 또한 외부로 부터 발생하는 악의적인 활동이나 보안 위협을 식별하고 대응할 수 있기 때문에 모니터링 환경 구축은 필수적이라고 할 수 있습니다. 그러므로 이번에 스프링부트 환경에서 프로메테우스와 그라파나를 사용하여 모니터링 구축을 하면서 공부한 내용들을 기록해보았습니다. 용어 및 개념 Metric 위에서부터 메트릭이라는 용어를 사용했기 때문에, 해당 용어에 대해서 궁금하셨을 수도 ..
기존에 동시성 이슈 문제 해결을 위해 사용한 Redisson 대신 Redis의 script를 사용해서 성능 올리기
·
SpringBoot
들어가며public void issue(long couponId, long userId) { // 캐시를 통해 쿠폰에 대한 유효성 검증 수행 CouponRedisEntity coupon = couponCacheService.getCouponCache(couponId); coupon.checkIssuableCoupon(); // 레디스 동시성 이슈 해결하기 위함 distributeLockExecutor.execute("lock_%s".formatted(couponId), 3000, 3000, () -> { couponIssueRedisService.checkCouponIssueQuantity(coupon, userId); issueRequest(coupo..
Mockito 에러 - UnnecessaryStubbingException 해결
·
SpringBoot
문제 사용자가 게시판에 올린 미션 인증 글을 관리자가 승인을 해주는 기능을 만들었는데, 이와 관련해서 테스트 코드를 작성하고 있었습니다. 그 중에 사용자가 올린 미션 인증 글의 상태가 승인 대기중인 글이 아닐 때, 이에 맞는 오류 메시지를 반환해야 했습니다. @Test @DisplayName("미션 인증글 승인 - 승인 대기중인 글이 아닐 때, 오류 메시지를 잘 반환하는지?") void acceptMission_4() { // given Team team = TeamMock.create("팀1"); User user = UserMock.create(team, UserRole.MENTOR, passwordEncoder); Mission mission = MissionMock.create(); Mission..