Code Monkey home page Code Monkey logo

modoospace's Introduction

ModooSpace

스터디룸, 회의실, 연습실, 파티룸, 스튜디오 등 모든 공간을 시간단위로 대여할 수 있는 공간 대여 플랫폼입니다.

❗️ 단 호스트의 승인이 있어야 사용이 가능합니다.

프로젝트 목표

  • 국내 SpaceCloud를 모티브로 공간대여 플랫폼을 구현하였습니다.
  • 비즈니스 로직을 객체에게 최대한 위임하여 Service Layer에서 객체가 서로 협력하여 요청을 수행할 수 있도록 아키텍처를 구성하였습니다.
  • 해당 프로젝트에서는 Mock없는 테스트를 지향하며 Domain 단위테스트, Service 통합테스트를 수행하여 TestCoverage 80%를 달성하였습니다.
  • 단순 기능만 구현한 것이 아닌, 성능 테스트를 통해 높은 트래픽을 가정한 상황에서도 안정적인 서비스를 유지할 수 있도록 지속적으로 서버 구조를 개선 중입니다.

사용 기술

스크린샷 2024-03-27 오전 12 19 02

ERD 구조

스크린샷 2024-03-26 오후 11 10 16

1차 서버 아키텍처

image

주요 기술 Issue

modoospace's People

Contributors

hoa0217 avatar haileykimdev avatar f-lab-bot avatar

Stargazers

DaIn Park avatar Jaeyeon avatar Minseok Kim (김민석) avatar 이건창 avatar  avatar  avatar  avatar

Watchers

 avatar

modoospace's Issues

Pinpoint Repository로 변경

성능테스트 진행 시 Pinpoint Hbase가 부하를 받으면 계속 죽는 Issue 발생했다.. 직접 구축하여 성능테스트를 진행하기보다 Cloud에서 제공하는 서비스를 사용하자.

  • Pinpoint Repository 생성
  • Agent 변경 작업
  • 도커파일 및 CD 워크플로우 수정

로그인 Argument Resolver/Jacoco Report to PR

  • 로그인 User를 받아오는 Argument Resolver 생성
  • 어플리케이션 및 테스트 코드 리팩토링

중복되는 LoginMember를 찾는 로직을 제거하여 타Serivce와 MemberService와의 의존성을 제거한다.

  • Jacoco Report to PR 설정

이슈발생 #68

Jacoco Report to PR 시 Instruction 기준으로 체크되므로 limit counter를 변경하였더니 커버리지 80%를 넘지 못함.
image

https://github.com/Madrapps/jacoco-report/blob/main/src/process.ts

Redis 적용

서버의 로컬 캐시로 Emitter 및 Session 저장 문제

여러 개의 서버 인스턴스끼리 공유가 안됨. 전체 인스턴스끼리 공유 또는 알림(메세징)이 필요하다.

DB 접근 줄이기

자주 사용되나, 자주 변하지 않는 Member 및 Alarm을 Redis에 저장한다.


  • Redis 환경 구축
  • Login Session 적용
  • SSE 적용
  • Member 적용
  • Alarm 적용

Domain(Facility, Reservation) 및 코드 개선

  • ERD 그리기
  • Facility 수정
    • minUser, maxUser 추가
    • facilityType 제거
  • TimeRange, DateTimeRange 도출
    • 시간관련 비지니스로직 위임
  • Reservation 수정
    • numOfUser 추가
    • 수용인원 validation 추가
  • 사용가능시간 반환로직 수정 : 1일치에 대한 24시간 데이터 모두 제공
  • DTO -> Request, Response로 명칭변경
    • 요청과 응답에대한 구분 명확히 분리
  • 생성자 인수 3개 이하 Builder 패턴 제거 (불필요)
  • 외부에 쓰이지 않는 메서드 private 처리

예약 알림 서비스

  • RabbitMQ 인스턴스 생성 - 네이버 클라우드
  • 예약이 생성되면 Host에게 알림을 준다.
  • 예약이 승인되면 Visitor에게 알림을 준다.
  • 예약이 취소되면 Host에게 알림을 준다.

SseEmitter 로컬 캐시 저장 방식 변경

현재 구독된 클라이언트의 SseEmitter를 서버의 로컬메모리(해시맵)에 저장하고 있다.
만약 서버를 이중화하게된다면, 서버끼리 공유가 되지 않기때문에 이벤트 발행 서버와 유저가 구독한 서버가 다르면 알림을 전송하지 못한다.


예약 조회 및 예약 요청 api

  • 호스트는 자신의 공간 예약 현황을 조회할 수 있다. (예약리스트)
  • 호스트는 예약 상세 내역을 조회할 수 있다.
  • 방문자는 자신 예약 현황을 조회할 수 있다. (예약리스트)
  • 방문자는 예약 상세 내역을 조회할 수 있다.
  • 방문자는 예약 요청을 할 수 있다.
    • SEAT을 예약할 경우 바로 완료' 상태로 적용된다.
    • ROOM을 예약할 경우 '승인대기' 로 적용된다
  • 관리자는 모든 공간 예약 현황을 조회할 수 있다.

예약조회 api 성능개선

  • 예약 가능시간 조회 api 개선
    • 예약테이블의 인덱싱 설정
    • 예약 가능 시간 리스트를 캐싱
    • 예약 진행시 기존 캐싱을 삭제

카테고리 엔티티 및 시설유형 Enum생성 / 연관관계 매핑

  • 카테고리 엔터티 및 시설유형 Enum을 생성한다.
  • 공간(Space)는 카테고리 1개를 가질 수 있다.
    • 추가로 상세설명을 갖는다.
  • 시설(Facility)는 시설유형(SEAT, ROOM)을 1개를 가질 수 있다.
    • 추가로 상세설명, 예약가능여부를 갖는다.
  • 카테고리 기본 데이터를 미리 생성해둔다.
    • 스터디 공간
    • 오피스 공간
    • 파티 공간
    • 연습 공간
    • 스튜디오 공간
  • 모든 사용자는 카테고리ID로 Space를 조회할 수 있다.

Controller단에서 받는 dto의 식별자 값을 계속 getter해와 엔티티를 찾는 행위들이 신경 쓰여 이를 @pathVariable로 최대한 뺌.

시설 등록/수정/삭제/조회 구현

  • 호스트는 본인이 소유한 공간에 시설을 등록할 수 있다. (관리자도 가능)
    • 고정세팅값 등록시 3개월 치 일자 별 세팅값이 생성된다.
  • 호스트는 본인이 소유한 공간에 시설을 수정할 수 있다. (관리자도 가능)
    • 이름, 예약가능여부, 상세설명
    • 고정세팅값 변경 시 3개월 치 일자 별 세팅값이 다시 생성된다. (이전 데이터 삭제)
    • 특정일자 세팅값 변경 시 그 데이터만 업데이트한다. ➡️ Facility 스케줄 CRUD 따로 구현 필요
  • 호스트는 본인이 소유한 공간에 시설을 삭제할 수 있다. (관리자도 가능)
  • 모든 사용자는 시설을 조회할 수 있다.
    < 조회 조건 >
    • 시설 id

로그인/로그아웃

  • OAuth를 이용한 인증 환경을 구축한다.
  • 소셜로그인/로그아웃을 구현한다.
    • 구글
    • 네이버
    • 카카오

테스트용 데이터 생성

  • SpaceCloud API, Kakao 주소 API 연동
  • 공간 및 주소를 모두스페이스 엔티티(Category, Space, Facility, WeekDaySetting, TimeSetting)로 변환하여 저장한다.
  • 1~50000까지 실행한다.

Github Action 배포 설정

  • application.yml 파일 시크릿에 등록
  • CI 설정
    • application.yml 파일 생성
    • gradle build
  • CD 설정
    • Docker 이미지 생성 및 Docker Hub 업로드
    • 네이버클라우드 서버에서 이미지 다운로드 및 실행

공간 검색 기능

공간 동적 검색 개발

  • 검색어 (공간제목, 공간설명, 카테고리) ➡️ Query & ES 둘다 구현
  • 지역분류
  • 예약가능인원
  • 예약가능일자
  • 예약가능시작~종료시간

  • 엘라스틱서치 클라우드 서버 구축
  • TestContainer 환경 구축
  • 검색 테스트 케이스 작성

Elastic Search를 테스트하기 위해서는 TestContainer 필요

시설스케줄 추가/수정/삭제/배치

  • 스케줄 데이터를 추가한다.
  • 스케줄 데이터를 삭제한다.
  • 스케줄 데이터를 수정한다.
  • 스케줄 데이터를 매달 25일 일괄로 Setting값에 맞게 (당월+3)월의 스케줄 데이터를 생성한다. ➡️ 호출용 API 개발 완료
  • 스케줄 데이터를 매달 1일 일괄로 (당월-1)월의 스케줄 데이터를 삭제한다 ➡️ 호출용 API 개발 완료

RabbitMQ Exception 발생 시 재시도 횟수 제한

1차 이슈발생

  • RabbitMQ Handler 중 Exception이 발생하면 계속해서 같은 Message를 처리하려 시도한다.
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method 'public void com.modoospace.alarm.consumer.AlarmConsumer.handler(java.lang.String)' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:272) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:209) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:148) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1674) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1593) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1581) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1572) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1516) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1001) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:948) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:86) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1326) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1232) ~[spring-rabbit-2.4.12.jar:2.4.12]
	at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
  • DLX 큐를 만들어 Exception 발생 시 재처리되지 않도록 DLX 큐로 보내준다.

2차 이슈발생

근본적으로 잘못된 메세지는 재처리 과정이 불필요하다. 하지만 DB Connection Pool에 Connection이 부족한 경우 또는 DB서버가 잠깐 다운되어있는 경우 등 외부환경에 의해 영향받은 경우엔 재처리과정이 유의미하다. (다시 시도했을 땐, 정상화 되어있을 수도 있기 때문) 따라서 Exception에 따라 재처리 할지 말지를 결정하는 로직이 필요하다.

Pinpoint 설정

  • 로컬 Pinpoint 설치
  • 프로젝트 Agent 설치
  • DockerFile 재작성
  • CD워크플로우 수정

cors 설정

  • 외부에서 웹서버 연결을 위한 cors 설정

시설 업데이트, 삭제 쿼리 개선

상황

현재 시설의 시간/요일 세팅값 변경 시 3개월 치 스케줄 데이터가 삭제 후 새로생성된다.
총 180여개의 쿼리가 한번에 나가게 되는데, 만약 여러 User가 시설을 업데이트하게 된다면 부하가 예상된다.
삭제 정도는 한방쿼리로 해결할 수 있지 않을까?

public void update(Schedules schedules, Facility facility) {
    this.schedules.clear(); // delete 쿼리가 90개 날라감..
    this.schedules.addAll(schedules.getSchedules());
    schedules.setFacility(facility);
}

해결

  1. update 전 스케줄데이터를 업데이트 해야하는지 체크
  2. 삭제가 필요하다면 한방쿼리로 해당 시설의 스케줄 삭제 후 update 진행

Space, Facility, Alarm 목록 조회 쿼리 개선

  • 목록 조회 쿼리 개선 (페이징 처리, fetch join)
    • Space 페이지 조회 ➡️ Fetch Join 및 페이징 처리
    • Facility 페이지 조회 ➡️ 동적쿼리 생성(DTO 조회) 및 페이징 처리
    • Alarm 조회 ➡️ 연관관계 제거 및 페이징 처리

테스트 커버리지 80% 달성

CI확인을 위해 테스트 커버리지를 50%로 설정하였지만, 이는 너무 낮다.
커버리지 80%를 달성할 수 있도록 테스트코드 추가 필요.

Execution failed for task ':jacocoTestCoverageVerification'.
> Rule violated for class com.modoospace.reservation.repository.ReservationQueryRepository: branches covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.repository.AlarmQueryRepository: branches covered ratio is 0.5, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.repository.EmitterCacheRepository: branches covered ratio is 0.5, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.repository.SpaceQueryRepository: branches covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.repository.FacilityQueryRepository: branches covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.repository.ScheduleQueryRepository: branches covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.reservation.serivce.ReservationService: branches covered ratio is 0.7, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.domain.Alarm: branches covered ratio is 0.5, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.domain.Schedules: branches covered ratio is 0.7, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.domain.Space.SpaceBuilder: branches covered ratio is 0.5, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.domain.Facility: branches covered ratio is 0.7, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.domain.Space: branches covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.service.AlarmService: branches covered ratio is 0.5, but expected minimum is 0.8

  • ReservationQueryRepository
  • AlarmQueryRepository
  • EmitterCacheRepository
  • SpaceQueryRepository
  • FacilityQueryRepository
  • ScheduleQueryRepository
  • ReservationService
  • Alarm
  • Schedules
  • SpaceBuilder
  • Facility
  • Space
  • AlarmService

EmbeddedRedis ➡️ TestContainers 변경

mac os 업데이트 후 아래 에러가 발생하여 확인해보니, sonoma os에 대한 이슈가 있어보임. (kstyrc/embedded-redis#135)

java.lang.RuntimeException: Can't start redis server. Check logs for details. Redis process log: 

OS에 의존적인 EmbeddedRedis를 걷어내고 TestContainers로 Redis를 띄우도록 변경 필요.


  • TestContainers 설정
  • 테스트 통과 확인

성능테스트 진행

테스트 조건
가상User 1000명 = 10process * 100 thread
시간 10분

테스트 진행

  • 공간검색api
  • 공간조회api
  • 시설조회api
  • 1개월 스케줄조회 api
  • 예약가능여부조회api
  • 시나리오 테스트: 공간검색 ➡️ 공간조회 ➡️ 시설조회 ➡️ 예약가능여부조회

개선사항

  • 공간검색: 검색어를 key값으로 spaceId 캐싱 필요
  • 시설조회: Ngrinder TimeOutError 발생
    • 원인추론: 반환되는 데이터가 다른 api에 비해 2배.
    • 해결방법: 필요없은 데이터(3개월치 스케줄 데이터) 제거. 또한 해당 테스트는 1개월치 스케줄데이터 조회 api로 대체한다.
2024-03-24 18:48:38,168 ERROR java.util.concurrent.ExecutionException: java.net.ConnectException: Operation timed out
java.net.ConnectException: Operation timed out
	at org.apache.hc.core5.reactor.InternalConnectChannel.onIOEvent(InternalConnectChannel.java:64)
	at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
	at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:179)
	at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:128)
	at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
	at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
  • Schedule 테이블에 date index 생성 및 between 제거
    private BooleanExpression dateBetween(LocalDate startDate, LocalDate endDate) {
        return schedule.date.between(startDate, endDate);
    }

참고:https://devhood.tistory.com/249

크론탭 설정 (배치)

  • 스케줄 데이터를 매달 25일 일괄로 Setting값에 맞게 (당월+3)월의 스케줄 데이터를 생성한다.
    • 만약 3월 25일에 api를 호출한다면, 6월 스케줄 데이터를 생성한다.
  • 스케줄 데이터를 매달 1일 일괄로 (당월-1)월의 스케줄 데이터를 삭제한다
    • 만약 4월 1일에 api를 호출한다면, 3월 스케줄 데이터는 삭제한다.

Instruction 기준 테스트 커버리지 80% 달성

이슈발생

Jacoco Report to PR 시 Instruction 기준으로 체크되므로 limit counter를 변경하였더니 커버리지 80%를 넘지 못함.
image

https://github.com/Madrapps/jacoco-report/blob/main/src/process.ts

Execution failed for task ':jacocoTestCoverageVerification'.
> Rule violated for class com.modoospace.reservation.domain.ReservationStatus: instructions covered ratio is 0.7, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.producer.AlarmProducer: instructions covered ratio is 0.3, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.sevice.SpaceService: instructions covered ratio is 0.7, but expected minimum is 0.8
  Rule violated for class com.modoospace.space.sevice.FacilityService: instructions covered ratio is 0.6, but expected minimum is 0.8
  Rule violated for class com.modoospace.alarm.consumer.AlarmConsumer: instructions covered ratio is 0.3, but expected minimum is 0.8
  Rule violated for class com.modoospace.reservation.serivce.ReservationService: instructions covered ratio is 0.6, but expected minimum is 0.8

테스트 코드 보완 필요

  • ReservationStatus
  • AlarmProducer
  • SpaceService
  • FacilityService
  • AlarmConsumer
  • ReservationService
  • ReservationService 권한별 예약 검색 리팩토링

ElasticSearch TimeoutException 개선

스크린샷 2024-03-20 오후 11 29 22

ES를 사용할 때가 쿼리를 사용할 때 보다 TPS가 약 3배 높은 상황(처리량 3배, 지연시간1/3). 하지만 에러응답이 187개가 왔기때문에 이를 개선해보고자함. 서버에선 아래와 같이 ElasticSearch와 통신하려다 TimeOutException이 발생하였으므로 2가지 방법을 시도해볼 것.

2024-03-20 21:57:01.581 ERROR 1 --- [o-8080-exec-834] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: error while performing request] with root cause

java.util.concurrent.TimeoutException: Connection lease request time out
	at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:411) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:391) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:355) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:393) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:247) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:387) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:173) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:448) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:338) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:87) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:40) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
	at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]

  • TimeOut 시간 늘리기 1-> 10

외부 네트워크 환경에서 Elasticsearch와 통신할 경우, 네트워크 지연이나 변동성이 내부 네트워크보다 크게 증가할 수 있습니다. 이런 환경에서는 연결 타임아웃(Connection Timeout)과 소켓 타임아웃(Socket Timeout)을 조금 더 넉넉하게 설정하는 것이 좋습니다.
연결 타임아웃: 연결 타임아웃은 서버에 연결을 시도할 때까지의 시간입니다. 외부 네트워크 환경에서는 5초보다 더 긴 시간이 필요할 수 있습니다. 일반적으로 10초에서 20초 사이로 설정하는 것이 안전 마진을 제공하고, 네트워크 지연으로 인한 연결 실패를 줄일 수 있습니다.
출처: gpt

  • 커넥션풀 늘리기 MaxConnTotal 20 -> 100, MaxConnPerRoute 2 -> 50

성능테스트에서 가상User수를 200명으로 가정했으므로 ElasticSearch 동시 접속자 수는 1/4인 50명으로 잡음.
참고: https://hc.apache.org/httpcomponents-asyncclient-4.1.x/current/httpasyncclient/apidocs/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.html

공간 등록/수정/삭제/조회 구현 (추가: 회원 권한 수정)

  • 관리자는 가입된 회원의 권한을 변경할 수 있다.
  • 호스트는 공간을 등록할 수 있다.
  • 호스트는 본인이 소유한 공간을 수정할 수 있다. (관리자도 가능)
  • 호스트는 본인이 소유한 공간을 삭제할 수 있다. (관리자도 가능)
  • 모든 사용자는 공간을 조회할 수 있다.
    < 조회조건 >
    • 공간 id
    • 호스트 id

공간 등록 전, Member의 권한 수정기능도 함께 개발.
지역 검색은 QueryDSL 학습 후 개발 예정

해당일자에 예약가능한 시간 조회 api

  • visitor가 선택한 시간에 해당 시설이 이용가능한 상태인지 조회한다.
    • 해당 시설의 기본 time setting에 해당되는 지 확인한다.
    • 시설의 예약가능상태(reservationEnable) 필드값을 확인한다
    • 해당 시설의 예약목록에서 동일한 시간대의 예약이 있는지 확인한다. (QueryDSL)
  • 룸 : space 선택 -> 룸 선택 ->날짜 선택 -> 시간선택 (기존예약상황 고려)
  • 이용가능한 상태인지 확인하는 테스트코드

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.