Framework

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..
서버 최초 실행 시 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..
문제 배경 내가 작성한 리뷰를 조회하는 API를 스프링 데이터 JPA의 페이징 처리를 통해 구현했다. 현재 API를 호출했을 때 실행되는 SQL 쿼리문을 보면 N+1 문제가 발생한다. 실행되는 SQL 쿼리문 2024-02-11 18:31:29.479 INFO 29300 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2024-02-11 18:31:29.479 INFO 29300 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServl..
순수 JPA에서의 DTO 조회 JPA에서 프로젝션으로 여러 타입의 필드를 조회하기 위한 방법 중 하나이다. new 명령어 사용해야 한다. DTO의 package 이름을 다 적어야 한다. 생성자 방식만 지원한다. List result = em.createQuery( "select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class ).getResultList(); 위와 같이 패키지명을 작성해야 하는 불편함은 QueryDSL을 사용하여 극복할 수 있다. QueryDSL에서의 DTO 조회 기본적으로 QueryDSL에서는 프로젝션 대상으로 여러 필드를 선택하게 되면 Tuple이라는 타입을 리턴해준다. List fetch = query.se..
https://youtu.be/brE0tYOV9jQ위의 백기선님 영상에서 제시된 문제의 원인을 연관관계 매핑 시 @JoinColumn을 선언하지 않아서라고 생각했다. 하지만 답은 연관관계 편의 메서드를 통해 객체의 연관관계를 양방향으로 설정하지 않은 것이었다.다대일 매핑 시 항상 @JoinColumn을 선언했었는데, 위의 영상으로 인해 @JoinColumn의 역할에 대해 자세히 공부해 볼 필요성을 느꼈다. 예제로 진행할 전체 코드는 아래와 같다. Book 클래스@Entitypublic class Book { @Id @GeneratedValue private Integer id; private String isbn; private String title; @ManyToOne ..
jyjyjy25
'Framework' 카테고리의 글 목록