분류 전체보기 (193) 썸네일형 리스트형 Gatling을 이용한 부하 테스트 CEP의 서버 성능은 그리 좋은 편이 아니다. 그래서 요청에 대한 부하 분산을 하고자 로드밸런싱을 하였다.하지만 로드밸런싱을 하고 난 후 요청에 대한 응답이 어느정도로 개선이 되었는지 확인을 하지 않았는데, 이를 확인해보고자 부하 테스트를 할 수 있는 gatling을 이용해보았다.사용한 gatling코드는 다음과 같다.더보기package computerdatabase;import io.gatling.javaapi.core.*;import io.gatling.javaapi.http.*;import java.util.Arrays;import java.util.List;import java.util.Objects;import java.util.Random;import java.util.stream.Collec.. QueryDsl을 이용한 데이터 처리 CEP에는 keyword검색, 편의점 종류에 따른 검색, 행사 종류에 따른 검색과 즐겨찾기에서의 검색 기능이 있다.아무것도 선택하지 않은경우, keyword만 쓴 경우, 편의점 종류를 2개만 선택하고 이벤트 종류는 1+1만 선택한 경우 등등 수많은 경우의 수가 나올 수 있다.이 경우에는 SpringData jpa나 jpql 보다 동적 쿼리 구성과 유지보수성 측면에서 이점을 가진 QueryDsl을 사용하는 것이 좋을 것 같아 QueryDsl을 적용하고, 테스트 해 보았다. 총 3단계의 과정을 거쳤다.1.queryDsl적용2.단위 테스트3.통합 테스트 1. QueryDsl적용더보기 @Override public Page findProducts(PageDto pageDto, ProductReques.. 도커로 프로젝트 배포하기 - 로드밸런싱 도커를 통한 cd 와 서비스 분리까지 끝냈으니 이제 도커와 nginx를 이용해 로드밸런싱을 해주는 것만 남았다.도커 컴포즈를 사용하는게 여러대의 도커를 관리하기 편해보였으므로 도커컴포즈를 사용해서 로드밸런싱을 해 주었다.1.docker-compose.yml 작성우선 배포가 되는 ec2인스턴스에 docker-compose.yml을 작성해주고, nginx설정을 수정해 주어야 한다. docker-compose.ymlversion: '3'services: nginx: image: nginx:latest container_name: nginx volumes: - /etc/nginx/nginx.conf:/etc/nginx/nginx.conf # Nginx 설정 파일을 컨테이너에 연결 .. 도커로 프로젝트 배포하기 - 서비스 분리 1.DokerFile작성우선, 도커로 서비스를 분리하기로 한 이유가 크롤링 스케줄러 서비스이기 때문에 도커 컨테이너 환경에서 chrome과 chromedriver가 실행이 되어야 한다.그런데 도커 컨테이너는 배포된 이미지를 기반으로 독립적인 환경에서 실행되기 때문에, ec2에 설치되어있는 chrome과 chromedriver를 가져다 쓸수 없다.따라서 도커를 빌드하기 위해 작성하는 Dockerfile에 chrome과 chromedriver 설치관련 스크립트를 작성해 주어야 한다.FROM ubuntu:22.04# 빌드 아규먼트 설정ARG AWS_ACCESS_KEY_IDARG AWS_SECRET_ACCESS_KEY# 환경 변수 설정ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}E.. 도커로 프로젝트 배포하기 - 워크플로우 프로젝트를 배포하고 관리하던중, 스케줄러 서비스는 분리를 하는게 좋겠다는 생각이 들었다.이유는 1. 추후 도커 컨테이너를 통해 로드밸런싱을 할 건데, 시간에 맞춰 크롤링을 하는 스케줄링 서비스가 기타 다른 api를 관리하는 서비스와 같은 컨테이너로 실행되면 중복 실행 등의 문제가 생길 수도 있다.2. api서버는 실시간 요청에 대응해야 하므로, 트래픽이 많아질 때 스케일링이 필요할 수 있지만, 스케줄링은 고정된 시간에만 작동하므로 그만큼의 리소스를 요구하지 않기 때문이다.3. 스케줄링 서비스와 api서비스의 업데이트 주기가 다르기 때문이다. api서비스는 상대적으로 업데이트를 많이하지만 스케줄링 서비스는 한번 구축해놓으니 업데이트를 잘 하지 않게 되었다.4. 크롤링 스케줄링 서비스는 외부 데이터를 크롤.. 무한 스크롤 구현 react로 작성중인 프로젝트중 스크롤이 화면 끝에 도달했을때, 추가적으로 데이터를 더 로딩하는 무한 스크롤 방식을 구현해야 해서 구현해 보았다. 대상 데이터는 페이징 처리 돼서 반환이 되는 데이터이고, 이를 처리하기위해 useState를 이용해 변수를 선언했다.현재 페이지가 몇 번째 페이지인지 알기 위해 page를 선언하고, 페이지가 끝에 도달했는지 알기 위한 용도로 totalPage를 선언해 주었다. aysnc와 await를 사용해 비동기 처리를 해주고, useEffect를 통해 page의 상태가 변경될때마다 fetchProducts를 통해 페이지 데이터를 요청하도록 했다. 그리고 이벤트 리스너를 통해 스크롤 위치를 체크할수 있게 하고, 이를 useEffect의 의존성을 [page,totalPag.. SpringBoot를 이용한 crawling 프로젝트 - 2 jsoup과 selenium을 이용한 크롤링 준비를 했다면 크롤링 해 온 데이터를 프로젝트에 사용하기 위해 저장 해 주어야 한다. 크롤링 한 데이터를 저정하기 위한 product엔티티를 생성하고 진행했다. 3중 for문을 stream으로 정리해주고, 가져온 정보를 product로 변환해 list에 저장하게 해 주었다. 이렇게 생성된 list를 JpaRepository를 사용한다면, saveAll 메서드를 통해 한번에 저장할 수 있고, Repository를 사용한다면,메서드를 커스텀 해 주기적으로 일정한 갯수의 객체를 flush시킬수 있다. flush 되는 객체의 최대치를 250개로 잡아놨으므로, batchSize를 250으로 설정 해 주었다. 이렇게 작성하고 요청을 해 보면, 데이터가 잘 저장.. SpringBoot를 이용한 crawling 프로젝트 - 1 Spring boot에서 웹크롤링을 하기 위해서는 일반적으로 jsoup라이브러리를 사용한다.하지만 jsoup만 사용할 경우에는 동적인 페이지의 데이터 크롤링을 하지 못하기 때문에, selenium 라이브러리와 크롬 드라이버도 jsoup와 함께 사용해 이번 프로젝트를 진행했다. jsoup을 이용해 데이터를 크롤링 하기 위해서는 대상이 되는 웹 페이지의 css정보를 알아야 한다.css에 대한 정보는 개발자 도구를 이용해 간단히 알 수 있다. 캡쳐한 화면의 img경로는 #wrap #contents .relCon .prodListWrap 하위의 ul > li > .prod_img다.(id는 # , class는 . 으로 구분한다.) 이를 크롤링 하기 위한 코드로 정리해보자면, 다음과 같다. 하지만 페이지 내부의 .. 04월 23일 변경사항 1. 예약 일별조회 api작성 일별조회 쿼리 추가 2. Builder사용하는 생성자 변경 1. 예약 일별조회 api작성 @GetMapping("{year}/{month}/{day}/{storeId}") public ResponseEntity showReservations(@PathVariable Long storeId,@PathVariable Integer year,@PathVariable Integer month,@PathVariable Integer day) { List dtoList = reservationService.showReservations(storeId, year, month, day); HttpHeaders headers = new HttpHeaders(); headers.setCont.. 04월 11일 변경사항 1. store항목 페이징 조회, 단건 조회하는 api 추가 1.1 pageDto 추가 1.2 페이징 쿼리 추가 1.3 단건조회 api 2. url, mapping 어노테이션 수정 2.1 url 수정 2.2 어노테이션 수정 1. store항목 페이징 조회, 단건 조회하는 api 추가 1. pageDto추가 @Getter @AllArgsConstructor @NoArgsConstructor @Setter public class StorePageDto { int page; int size; boolean isAsc; String sortBy; boolean cutByStarRate; int starCut; public Pageable toPageable() { if(Objects.nonNull(sortBy).. 이전 1 2 3 4 ··· 20 다음