Situation현재 피파온라인 전적검색 프로젝트에서 사용자의 전적을 갱신해야하는 기능이 있다. 이 기능은 사용자의 정보를 갱신하고, 사용자의 Match 리스트를 불러온 뒤, 리스트에 포함된 각각의 Match 상세 정보를 Nexon API에 요청해야하는 작업이 필요했다. 이 과정에서 평균적으로 약 200번의 API 요청이 필요했고, 이를 처리하기 위해 @Async 와 ThreadPoolTaskExectuor를 사용하여 RestTempalte을 통해 비동기적으로 요청을 하는 로직을 구현했다. 기존에 동기적인 방식에 싱글스레드는 약 100s가 걸렸지만, 해당 비동기 로직으로 변경한 후 15s 로 줄일 수 있었다. 하지만, 이것도 매우 느렸다. 왜 이렇게 처리 속도가 늦을까 생각을하다가, 2가지 고민을 하게되..
개발 이야기
Code 실제 코드가 아닌 예시 코드입니다. @Table(name = "community_post") @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String subject; private String content; } postRepository.findAll(PageRequest.of(0, 10)); 상황 Post(게시물) 을 Pagenation 사용하여 데이터를 조회하는 중에 데이터가 9개 이하일 때는 하나의 쿼리가 나가지만 10개 이상일 경우..
▶️상황 현재 @ControllerAdvice를 통해 custom 한 ErrorResponse 를 응답하고 있다. 그런데 Spring MVC Exception 은 내가 정의한 custom 한 ErrorResponse 를 응답하지 않는다. API 일관성을 지키기 위해서는 Spring MVC Exception 또한 내 custom한 ErrorResponse 를 응답해야한다. ▶️ResponseEntityExceptionHandler가 없는 경우 매개변수가 필요한 HTTP 요청 시에 요청 매개 변수가 누락된 경우 예시를 들어보자. 아래는 ResponseEntityExceptionHandler가 처리하는 예외들이다. 기본적인 응답이 나오게 된다. 이러면 다른 Exception 들은 내가 커스터마이징한 응답 메세..
▶️상황 현재 피파 전적검색 앱 프로젝트를 진행 중이다. 사용자가 전적갱신을 하게 되면 다음과 같은 로직으로 진행하게 된다. 사용자의 닉네임을 입력받아서 고유한 사용자 식별자(UID)를 가져온다. 1번의 UID를 통해 해당 사용자의 매치 리스트를 조회한다. 매치 리스트를 가져와서 각 매치에 대한 상세 정보를 요청한다. 이때, 만약 매치가 100개라고 가정했을 때, 3번의 요청이 동기적으로 수행된다면 다음과 같은 일이 발생한다. 각각의 요청이 하나씩 순차적으로 처리하게 된다. 즉, 첫 번째 요청이 완료되어야만 두 번째 요청이 시작되고, 두 번째 요청이 완료되어야 세 번째 요청이 시작된다. 따라서, 3번째 요청은 1번째 요청이 완료되고 2번째 요청이 진행 중일 때까지 대기하게 된다. 이 경우, 전체적으로 매..
▶️상황 현재 Art:Care 라는 프로젝트를 진행중인데, 앱에 무한스크롤 기능을 구현해야 했다. 스크롤을 내릴 때 이전 데이터가 중복되서 갱신되지 않고, 마지막 데이터 기준으로 데이터를 계속 불러오게 해야한다. 페이지네이션이란? 대용량의 데이터에서 필요한 데이터만 전달하는 방법이다. 크게 오프셋 기반 페이지네이션(Offset Based Pagination) 과 커서 기반 페이지네이션(Cursor Based Pagination) 이 있다. 페이지네이션을 사용하면 한 번에 로드해야 하는 데이터 양이 줄어들어 로딩 시간을 줄일 수 있다. ▶Offset Based Pagination 오프셋 기반 페이지네이션에 대해 간단하게 알아보겠다. 일정 Offset부터 일정 개수의 아이템을 가져오는 방식이다. 예를 들어 ..
▶️상황 현재 프로젝트에서 금융결제원 오픈 API를 사용하고있는데, 테스트 API와 실제 운용 API가 나누어져있다. 개발 서버에서 실제 운용 API를 사용하여 테스트하면 안되기 때문에 이를 각각 개발 서버와 운영 서버에 맞게 분리 해야하고, 환경 설정 값들을 그에 맞게 적용해야한다. ▶️Spring 에서 설정 값을 어떻게 적용시키는가? 참고문헌 https://docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-external-config.html Spring Boot 에서는 Environment 추상화를 통해 환경 설정 값들에 접근할 수 있다고 한다. 우리는 PropertySource Interface 가 Environment에 ..