내일 배움 캠프 (54) 썸네일형 리스트형 2024-02-02 오늘은 최종프로젝트 30일차이다. 슬슬 막바지를 향해가고 있다. 오늘은 조회 성능을 향상하기 위해 캐싱 관련 기술을 적용시키려고 한다. 먼저 캐싱은 로컬캐시와 원격 캐시가 있다. 로컬캐시 자바 애플리케이션에서 cache 시스템을 사용 각각의 애플리케이션은 개별로 된 캐시 시스템을 가지고 있고, 1:1 방식으로 사용한다. 따라서 여러 서버로 구성된 환경에서는 각각의 애플리케이션에서 캐시 데이터를 서로 공유 불가능하다. Spring에서 사용가능한 cache 기능은 ConcurrentMap, CaffeineCache, SimpleCache 등 있다. 원격캐시 애플리케이션 외부에 독립적인 메모리 저장소를 별도로 구축하여 한 곳에서 관리한다. 서버 확장 시 동기화가 필요하진 않지만 네트워크 트래픽이 더 많이 발생.. 2024-02-01 오늘은 프로젝트 29일차이다. 오늘은 최종발표회를 준비하기 위한 브로셔를 작성했다. 대부분의 시간을 브로셔를 작성했고 브로셔 내용에는 여태까지 했었던 주요 기술과 기술적 의사 결정 트러블 슈팅관련된 문제를 적었다. 2024-01-31 오늘은 프로젝트 28일 차이다. 오늘 진행한 내용은 어제 Ngrinder를 그대로 Ec2에서 테스트해 보기 위해서 Ec2에 private subnet에 인스턴스 생성을 진행했다. 테스트할 때 네트워크도 고려해야 하지만 단순 부하테스트 이기 때문에 Ec2 서버 안에 있는 private subnet에 Agent를 생성하여 먼저 Controller를 Ec2에서 public subnet으로 생성하고 보안그룹 설정했다 Agent 인스턴스 생성 시점에 탄력적 Ip를 잠시 연결하고 업데이트등 여러가지 환경구성등을 진행하고, 탄력적 IP가 연결된 상태에서는 Agent가 생성되어 있었다. 하지만 보안그룹을 포트에 맞게 생성 후 탄력적 IP를 해제한 상태에서 테스트를 진행하니 Ngrinder Controller에 Agen.. 2024-01-30 오늘은 프로젝트 27일차이다. 오늘은 어제 진행했던 ngrinder의 문제를 해결하기 위해 아침부터 분주하게 했으나 하다가 답이 안 나와서 전부 리셋을 하고 진행했다. 리셋하고 처음부터 도커에 설치를 하고 시작을 하니 전에 입력했던 명령어를 드디어 윈도우 볼륨이 아닌 리눅스 볼륨으로 입력해도 잘 생성 됐다. 생성을 하고 나서 기분 좋게 테스트를 진행해 봤다. 초기 테스트를 진행하기 위해서 스크립트를 작성해야 된다. 아래는 테스트 코드이고 여기서 본인테스트에 맞게 수정을 진행하면 된다. import static net.grinder.script.Grinder.grinder import static org.junit.Assert.* import static org.hamcrest.Matchers.* impo.. 2024-01-29 오늘은 프로젝트 26일 차이다. 오늘은 서비스 배포를 진행하면서 기다릴 시간이 없기 때문에 부하테스트를 진행하기 위해 ngrinder 환경구축을 진행했다. 테스트 환경을 구축하기 위해 처음에는 ngrinder공식 홈페이지에 가서 war파일을 받았다. https://github.com/naver/ngrinder/releases Releases · naver/ngrinder enterprise level performance testing solution. Contribute to naver/ngrinder development by creating an account on GitHub. github.com 받은 파일을 통해 window cmd에서 받은 파일의 디렉토리로 이동하고 아래의 명령어를 통해 실행을.. 2024-01-26 오늘은 프로젝트 23일 차이다. 오늘은 어제 진행하던 내용에서 N+1문제를 해결하기 위해 기존에 커서기반의 공연 전체조회 기능의 쿼리를 수정했다. 여기서 N+1문제가 발생할만한 이유는 goodsInfo에 goodsImage가 양방향 매핑으로 설정 돼 있는 동시에 Laze의 설정 때문에 발생하는 것으로 원인 추축이 된다. 수정을 위해 기존의 쿼리에서는 이미지를 쿼리 처리가 끝난후에 가져온 이미지 중에서 서비스 로직을 통해 대표 이미지를 분리해서 넣었었다. 이번에 개선한 점은 이미지를 개선과 동시에 DTO를 생성하여 필요한 데이터만 쿼리로 바로 처리하게 뜸했다. GoodsImage의 서브쿼리를 생성하고 서브쿼리에서 Dto에 필요한 객체를 매핑하여 goodsid, title, 이미지는 내부 서브 쿼리를 다시 .. 2024-01-25 오늘은 프로젝트 22일 차이다. 프로젝트를 진행하면서 기존에 메인페이지에서 조회하는 공연 전체 조회를 성능 최적화 하기 위해 준비했다. 오프셋 페이지네이션에서 성능 최적화를 하면서 Page방식에서 커서 방식으로 변경했기 때문에 기존에 있던 코드와 비교를 진행했다. 그러기 위해서는 AOP를 추가해야 하는데 다음과 같이 추가했다. 이 AOP는 쿼리가 실행되는 시간을 보여준다. package com.sparta.ticketauction.global.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.. 2024-01-24 오늘은 프로젝트 21일 차이다. 오늘은 서비스 론칭을 하기에 앞서서 조회기능 향상을 위해서 기존에 사용하던 오프셋 기반의 페이징 조회가 아니라 커서 기반의 조회를 구현을 진행했다. 커서기반의 조회를 구현할라면 커서 Id와 사이즈가 필요하다 커서 Id는 현재 보고 있는 공연의 위치와 같으며 사이즈는 조회 시 현재 위치하고 있는 커서에서 어디까지 조회를 진행할 건지 나타내는 기능을 한다. 또한 기존의 카테고리 이름을 받아서 필요한 카테고리에 따라서도 조회가 가능하게끔 했다. 실제로 구현한 코드는 다음과 같다. @GetMapping("/goods") public ResponseEntity getAllGoods( @RequestParam(value = "cursorId", required = false) Lon.. 이전 1 2 3 4 ··· 7 다음 목록 더보기