본문 바로가기

분류 전체보기

(37)
Spring boot 3.2에서 Aws Sqs Temporary Queue를 이용한 요청 응답 구현하기 서론 정말 오랜만에 글을 쓴다 ! 최근 헥사고날 아키텍쳐에대한 관심이 높아져 그간 진행해오던 사이드 프로젝트를 헥사고날 아키텍쳐로 변경해보며 공부를 하고 있다. 프로젝트는 도메인별로 분리하여 최종적으로는 MSA 형태처럼 구현해보는것이 목표이다. 그러기 위해서는 각 도메인간 의존성이 존재하지 않아야 하기 때문에 각 도메인간 통신을 Spring에서 제공하는 EventPublisher를 통해 진행을 하였다. 그러던 중 회원과 인증에 대한 도메인을 분리하여 회원가입 및 로그인 기능을 구현하고 있었는데, 인증 서버로 들어온 요청에 대해 토큰을 반환하는 API 작업 중, 회원 서버를 거쳐야하는 동기 로직이 필요했다. 일반적인 http 요청 응답 형식으로도 진행을 할 수 있었지만 Aws의 Sqs의 기능 중 Tempo..
WebClient를 활용한 병렬 API 호출 및 예외 처리 서론 과제 테스트를 하며 외부 서버와의 통신으로 데이터를 받아와야했는데, 호출 시간을 단축 시켜야하는 요구사항이 있었다. 데이터를 분할하여 여러 요청들을 다른 서버로 요청하여 데이터를 받아오는 로직이였고, 실패 응답시 재호출에는 약 10초간 지연시간이 있었기 때문에 재호출 로직을 고려하여 병렬로 호출을 해야겠다고 생각을 하여 WebClient를 이용한 병렬 API 통신을 진행하였다. 본론 데이터를 분할하여 서버로 병렬 요청을 하는 로직이였기 때문에 로직은 다음과 같았다. 1. entity에 서버로 요청할 횟수만큼 requestCount를 설정하고 저장한다. 2. 반복문을 통해 데이터를 분할하여 RequestDto를 생성한다. 3. 생성한 RequestDto로 WebClient를 생성하여 Mono 객체를 ..
Spring Boot @Async 비동기 로직 테스트 - 테스트 격리 서론 과제 요구사항을 구현하며, 비동기로 로직을 처리해야하는 작업이 필요했다. 해당 로직을 검증하기위해 테스트 코드를 작성하며 다양한 시행착오가 있었는데, 이를 글로 정리해보고자 한다. 본론 요구사항은 특정 API로부터 데이터를 가져와 필요한 데이터를 DB에 저장하는 로직이였는데, 특정 API로부터 응답 시간이 오래 걸리기 때문에 그동안 Connection을 유지하는건 리소스 낭비라고 생각하여 비동기로 구현을 해야겠다고 생각을 했다. @Async를 이용하여 비동기로 구현을 했고, 이제 테스트 코드를 통해 검증을 해야했는데 예상치 못한 문제가 발생했다. 기존에는 ServiceTest라는 최상위 클래스에서 @Transactional을 선언하여 테스트 데이터가 테스트 이후 Rollback되었는데, @Async..
Swagger 3 (springdoc-openapi-ui) 에서 @AuthenticationPrincipal 파라미터 무시 전역 설정 서론 현재 진행 중인 프로젝트의 공식 문서를 Swagger로 정하고 작업을 진행하고 있는데, 앱 개발자와 협업을 하며 Swagger 확인 도중 @AuthenticationPrincipal를 이용하여 회원을 파라미터로 받는 엔드포인트에 다음과 같이 지속적으로 빈 괄호를 넘겨줘야 정상 작동하는 상황이 발생하였다. 본론 위 내용을 해결하기 위해 @AuthenticationPrincipal이 들어가는 EndPoint에 @Parameter(hidden = true)를 설정을 하여 문제는 해결이 되었으나 저 메서드가 들어가는 모든 엔드포인트에 설정하기는 작업이 번거로워 전역적인 설정이 없는지 찾아보았다. 전역적인 설정을 위해 검색을 해보니 springfox-swagger-ui , springfox-swagger2 ..
Spring WebClient를 이용한 Open API 통신 서론 회사 프로젝트의 상담 신청 Time Table에 대한 API를 구현해야했다. 요구사항은 다음과 같았다. 캘린더를 통해 해당 날짜에 맞는 타임 테이블을 노출 시켜준다. 기획서 요구사항 연도와 월을 설정하여 조회시 상담 가능한 날짜를 노출시켜준다. 날짜를 클릭하면 상담 가능한 시간대를 노출시켜준다. 작업하며 정의된 추가 고려사항 (개인 테스트 케이스) 휴일과 점심시간(수요일 2시간)을 제외하고 타임 테이블을 노출 시켜준다. 상담원이 1명이므로, 이미 상담이 신청되어있는경우 해당 시간대는 노출시키지 않는다. 해당 날짜에 상담 가능한 시간이 없는경우 해당 날짜를 노출시키지 않는다. 조회하는 달을 조회 할 경우, 조회하는 일자 기준 이전 날짜를 노출시키지 않는다. 조회시간 기준이 영업시간인 경우, 조회시간 ..
Spring Boot에서 Batch, Scheduler 사용기 서론 그동안 글을 많이 못썼다.. 회사에서는 쿼리 튜닝하느라 바빴고.. 사이드 프로젝트는 애들이 각자 바빠서 작업을 못했기 때문.. 그러다 회사에서 상담신청 개선 작업을 진행하게 되면서 사용자 로그 및 1:1문의와 관련하여 개인정보 처리방침에 의거 사용자의 민감 정보에 대한 처리가 필요하다고 생각하여 작업을 진행하였다. 본론 기능 요구사항을 정리 하였을때, 내용은 크게 어렵지 않았다. 회사의 개인정보 처리방침에 따라 사용자 로그는 최대 3개월동안 저장 가능하였고, 1:1문의에서 사용되는 개인정보 (이메일, 휴대폰 번호)는 6개월동안 저장이 가능하였다. 위의 요구사항을 토대로 매일 새벽의 특정 시간에, 로그 테이블과 1:1 문의 테이블에서 데이터의 생성 시각을 확인하여 특정 일자가 지난 데이터들을 삭제시켜..
[REST API] GET 메서드에서의 데이터 전달 서론 현재 회사에서는 Spring - java - mybatis / JSP - jQuery를 사용하고 있는데, 회사 팀 내에서 JPA와 React를 도입하자는 의견들이 있어 자체적으로 프론트 개발자분들 두 분과 나와 백엔드 개발자 한분 이렇게 넷이서 팀을 꾸려 당장 서비스엔 도입이 힘드니, 회사 공식 홈페이지를 개발해보기로 했다. 회의를 통해 공통 응답과 몇 안되는 API 리스트업을 하여 작업 후 우선 개발 서버에 배포를 하였는데, 프론트 개발자분께서 지속적으로 에러가 발생하는 부분에 대해 피드백을 주셔서 확인을 해보았다. 본론 에러를 확인해보니 400 에러가 떨어지는데 @RequestBody를 통해 받는 객체에 매핑이 안되는 내용이였다. 분명 PostMan에서는 정상적으로 API가 작동하는것을 확인 했..
Spring Security 사용자 권한에 따른 API 접근 설정하기 서론 근 3일동안 과제 테스트가 있어 실컷 요구사항에 맞춰 서비스코드 작업을 하고 단위 테스트 작업을 마쳤다. 요구사항 중 권한에 따른 제약이 있었다. 회원을 구분짓고 상품에 대한 수정,삭제,생성의 권한은 판매자만 있도록 설정하는것이였다. 이 요구사항을 보고 Spring Security의 Role을 이용해야겠다는 생각이 떠올라서 이전에 사이드 프로젝트에서 구현한 내용들을 바탕으로 Jwt와 Spring Security를 기반으로 인증 인가 작업을 진행했었고, 오늘 단위 테스트 작업을 마치고 API를 작업 후 통합 테스트를 진행 하는데 문제가 발생했다. 본론 API 작업 이후 Security Config 파일에 API의 Path와 Method를 기반으로 권한에 따른 접근을 처리했다. authorizeRequ..