1. application.yml 파일 구성spring: primary-datasource: jdbc-url: jdbc:mysql://localhost:3306/{DB1}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 username: {username} password: {password} driver-class-name: com.mysql.cj.jdbc.Driver secondary-datasource: jdbc-url: jdbc:mysql://localhost:3306/{DB2}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 username: {username} passwo..
Framework/Spring
서버 최초 실행 시 Open API를 통해 데이터를 조회하여 DB에 저장하는 로직을 구현했다. 하지만 두 가지의 데이터를 각각 조회해야 하는데 기존 코드의 경우 동기적으로 수행하고 있었다. 데이터 수가 적을 경우엔 성능 차이가 크지 않지만, 조회할 데이터의 양이 많기 때문에 동기적으로 수행될 경우 조회 및 저장에 소요되는 시간이 많아진다. 이를 해결하기 위해 Spring에서 제공하는 Async 기능을 이용하여 비동기 처리를 적용하여 시스템의 전체적인 수행 시간을 개선하고 리소스를 효율적으로 사용하려고 한다. 비동기란?요청과 결과가 동시에 일어나지 않는다는 뜻이다.즉 작업을 요청하고 해당 요청에 대한 결과를 기다리지 않아도 된다. 이를 통해 여러 작업들을 병렬적으로 처리할 수 있다. @Asy..
이전 포스팅에서는 WebClient를 사용하여 1번째 페이지에 해당하는 데이터를 조회하고 DB에 저장하는 과정을 수행했다. 이번에는 모든 데이터를 저장하기 위해 전체 페이지 수를 계산하고 반복문을 통해 모든 데이터를 조회하려고 한다. 1. 응답 데이터에서 필요한 값 파싱하기 String pharmacyInfo = webClient.get() .uri(uriBuilder -> uriBuilder .path(PHARMACY_ENDPOINT) .queryParam("serviceKey", PHARMACY_API_KEY) .queryParam("_type", "json") .build()) .retrieve() .bodyToMono(String.class) .block(); JSONParser parser = ..
WebClient 선정 이유최근 Spring 3.2부터 추가된 RestClient를 사용하면 기존의 RestTemplate의 직관적이지 못한 사용성과 WebClient의 의존성 문제를 해결할 수 있다. 하지만 외부 여러 API를 통해 대량의 데이터를 조회해야 하므로 비동기적 수행이 필수적이다. RestClient에서는 비동기 기능을 찾아볼 수 없었으므로 비동기 방식을 지원하는 WebClient를 사용하려고 한다. WebClientConfig@Configurationpublic class WebClientConfig { @Value("${open-api.base-url}") private String BASE_URL; @Bean public WebClient pha..
MockMvc를 이용하여 Controller 테스트 코드를 작성한다. 테스트할 코드는 form-data 형식으로 이미지 파일과 텍스트를 입력 받아 유저 리소스를 수정하는 PATCH 메서드이다. 1. MockMultipartFile 객체 생성 MockMultipartFile file = new MockMultipartFile( "홍길동전 썸네일 이미지", "thumbnail.png", MediaType.IMAGE_PNG_VALUE, "thumbnail".getBytes() ); MockMulipartFile은 MultipartFile 인터페이스를 상속 받는 가짜 객체다. multipart 파일을 업로드하는 컨트롤러 테스트에 사용된다. 2. 요청 mockMvc.perform( multipart(HttpMet..