Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 자동 예약 및 자동 업데이트 동시성 제어(#586) #604

Merged
merged 9 commits into from
Oct 16, 2024

Conversation

github-actions[bot]
Copy link
Contributor

@github-actions github-actions bot commented Oct 14, 2024

📌 관련 이슈

✨ PR 세부 내용

지금 PR에서는 두 가지 작업을 했습니다.
하나씩 차례로 설명드릴게요!

  1. WAS가 여러 대일 경우 스케줄 작업이 중복으로 실행되는 것을 방지하는 작업하는 기능 구현

기존 코드에서는 만약 무중단 배포나 서버 성능을 위해 여러 대의 WAS가 동작할 때 등록된 스케줄 작업이 중복으로 실행되게 합니다.
저희 서비스를 예로 들면, 매칭이 여러번 된다거나 사용자 프로필을 여러번 업데이트 한다거나 하는 치명적인 오류를 범할 수 있습니다.

이 문제를 해결하기 위해 먼저 PENDING 상태의 스케줄 작업을 찾습니다.
이때 MySql의 Lock을 사용하여 동시에 등록된 스케줄 작업을 찾고 수행하는 것을 막아주었습니다.

(여긴 -> 동시성 처리 방법에 대해 설명해준 블로그인데 도움이 정말 많이 되었습니다.
한번 시간 되실 때 꼭 읽어보세요~)

스크린샷 2024-10-14 오후 11 58 07

하지만 Lock을 사용할 때 발생할 수 있는 문제는
Lock 범위 안에 스케줄 작업(예: 매칭, 업데이트)이 포함되면, Lock을 점유하는 시간이 길어진다는 점입니다.

이로 인해 다른 트랜잭션들이 Lock을 기다리게 되고, 교착 상태에 빠질 위험이 있습니다.

  1. 비동기로 Lock 범위 최소화

이를 해결하기 위해 실제 스케줄 작업은 비동기로 별도의 쓰레드에서 처리하도록 하였습니다.

@Component
@RequiredArgsConstructor
public class AutomaticUpdateExecutor {

    private final UpdateExecutor updateExecutor;
    private final AutomaticUpdateRepository automaticUpdateRepository;

    @Transactional
    public void execute(long roomId) {
        automaticUpdateRepository.findByRoomIdAndStatusForUpdate(roomId, ScheduleStatus.PENDING)
                .ifPresent(automaticUpdate -> {
                    updateExecutor.update(roomId);  // 비동기로 실제 스케줄 작업 실행
                    automaticUpdate.updateStatusToDone(); // automaticUpdate의 상태를 바로 변경하여 중복으로 실행되는 것을 방지
                });
    }
}

코드에 나와있는 UpdateExecutor의 update(roomId) 메서드는 비동기로 되어있습니다.

스크린샷 2024-10-15 오전 12 01 08

이를 통해 Lock 범위 내에서는 비동기 작업이 처리되도록 요청만 보내고, 스케줄 상태를 PENDING에서 DONE으로 업데이트합니다.
이렇게 하여 Lock을 잡는 시간은 짧아지고, 실제 작업은 별도의 비동기 쓰레드에서 처리될 수 있었습니다.


P5: 클래스명

현재 클래스명인 UpdateExecutor, MatchingExecutor 등 스케줄 관련 작업을 하는 클래스들의 이름이 가독성이 좋다 생각하지 않아요.
다만, 조이썬이 리팩토링 하고 있는 작업과 겹치는 부분이 있어 충돌 걱정 때문에 수정하지 않고 그대로 두었습니다.

클래스명에 대한 피드백은 넘어가주셔도 좋을듯해요~

@github-actions github-actions bot added BE 백엔드 개발 관련 작업 기능 기능 구현 작업 labels Oct 14, 2024
Copy link
Contributor Author

github-actions bot commented Oct 14, 2024

Test Results

 52 files   52 suites   9s ⏱️
157 tests 151 ✅ 6 💤 0 ❌
166 runs  160 ✅ 6 💤 0 ❌

Results for commit 228c331.

♻️ This comment has been updated with latest results.

Copy link
Contributor

@youngsu5582 youngsu5582 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

뽀로로
말한거나 의도대로면 바로 상태를 바꿔서 명확하게 동작이 될 거 같아요.
다만, 이를 테스트 하기 어려운게 문제겠네요 🥲🥲

도커에 데이터를 세팅하고
로컬에서 포트 다르게 두개의 서버를 열고 태스크를 어떻게 차지하는지 확인하면 될 거 같긴한데 어렵겠죠..?🥲

@ServiceTest
@Import(TestAsyncConfig.class)
class AutomaticMatchingExecutorTest {
class AutomaticMatchingExecutorTest extends MatchingTest {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extend 한 이유가 있나요?
단순 데이터를 미리 세팅할 이유라면
이전 ContextInitializer 처럼 관리 포인트가 늘어나거나 잘못 사용될 의도는 없을까 걱정되서 물어봅니당

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extend 로 둔 이유가 너무 많은 세팅이 필요한 거였다면,
차라리 이 세팅 데이터를 한 시나리오 픽스쳐로 빼는건 어떠신가요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

시나리오 fixture로 분리하더라도
조이썬이 지적한 것처럼 ContextInitializer와 같은 관리 포인트가 늘어난다는 점에서는 동일하지 않을까요? 🤔

확실히 지금까지 테스트 작성하면서 ContextInitializerDatainitializer처럼
테스트들을 위해 세팅된... 어떤 값들을 관리하는 게 진짜 빡세더라고용...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상속받은 추상 클래스는 데이터 세팅보다는 Mock 객체를 통해 테스트 환경에서 사용할 결과만 설정하는 역할을 합니다.

실제 테스트 로직에서는 Mocking된 값을 반환해준다라는 흐름만 제공하여 딱히 데이터를 관리할 부분은 없다고 생각들어
기존 DataInitialzier나 ContextInitializer와는 다른 느낌이긴 합니다만 아무튼 의견 받았으니 수정할게요~! 👍

@@ -7,7 +7,6 @@
import org.junit.jupiter.params.provider.CsvSource;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

submodule 쪽에 의견을 남길수 없어서 여기 남깁니다.
config push 한 내용을 제거할 수 있으면 제거해주세요
( 최신 버전에서 10월 4일 cfed68 로 변경된거 같아요 )

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그러게요 예전 커밋으로 돌아갔네요
확인 부탁드려요!!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인이요~! 수정합니당~


import java.util.List;
import java.util.Optional;

public interface AutomaticMatchingRepository extends JpaRepository<AutomaticMatching, Long> {

Optional<AutomaticMatching> findByRoomId(long roomId);
@Lock(LockModeType.PESSIMISTIC_WRITE)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 의미하는 낙관적 락이
실제 DB 에 락을 걸어서 다른 서버의 트랜잭션에서 접근하지 못하게 막는다는 뜻 맞나요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비관적 락이고 PERSSIMISTIC_WRITE 이기 때문에 베타적 잠금으로 동작할 것 같습니다.
그렇다고 하면 락을 획득한 쓰레드 외엔 락올 놓기 전까지 update, delete, insert 가 막히겠군요!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

실제 DB 에 락을 걸어서 다른 서버의 트랜잭션에서 접근하지 못하게 막는다는 뜻 맞나요?

넵 맞습니다. @Lock을 사용하면 실제 DB단에 락을 걸어 다른 서버 간 동시성도 막을 수 있습니다.

private final AutomaticMatchingRepository automaticMatchingRepository;

@Async
@Transactional
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의도에 맞게 잘 변경된거 같아요 👍

Copy link
Contributor

@hjk0761 hjk0761 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

�automatic 을 분리한 부분도 좋고, 메서드 레벨로 비동기를 내려 범위를 최소한으로 한 부분도 좋은 것 같습니다!
다만, 조이썬 리뷰와 마찬가지로 테스트할 수 있는 수단이 있으면 좋겠다는 생각이 들어요.
비동기다보니 코드만으론 행동을 유추하기 어렵다는 점이 있어서 그런 거 같아요..

서브모듈 커밋이 돌아간 것 때문에 RC 드립니다.
다른 부분은 의견 제시이니 편하게 생각하시면 될 것 같습니다!


import java.util.List;
import java.util.Optional;

public interface AutomaticMatchingRepository extends JpaRepository<AutomaticMatching, Long> {

Optional<AutomaticMatching> findByRoomId(long roomId);
@Lock(LockModeType.PESSIMISTIC_WRITE)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비관적 락이고 PERSSIMISTIC_WRITE 이기 때문에 베타적 잠금으로 동작할 것 같습니다.
그렇다고 하면 락을 획득한 쓰레드 외엔 락올 놓기 전까지 update, delete, insert 가 막히겠군요!

@@ -7,7 +7,6 @@
import org.junit.jupiter.params.provider.CsvSource;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그러게요 예전 커밋으로 돌아갔네요
확인 부탁드려요!!

@ServiceTest
@Import(TestAsyncConfig.class)
class AutomaticMatchingExecutorTest {
class AutomaticMatchingExecutorTest extends MatchingTest {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extend 로 둔 이유가 너무 많은 세팅이 필요한 거였다면,
차라리 이 세팅 데이터를 한 시나리오 픽스쳐로 빼는건 어떠신가요?

Copy link
Contributor

@ashsty ashsty left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 잘 적혀 있어서 이해하기 쉬웠네용! ☺️
도움되는 링크까지 있어 정말 좋았습니다~~ 👍

간단한 질문만 한 가지 남겨뒀어용. ㅇ.ㅇ 고생하셨습니다~~!


matchingService.match(roomId, pullRequestInfo);
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

@Async
@Transactional
public void match(long roomId) {
//TODO: 트랜잭션 분리
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

트랜잭션 분리라는 게 정확히 어떤 태스크를 뜻하는 건가요? ㅇ.ㅇ
이번 PR에서 수행된 TODO인가요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 적어둔 "트랜잭션 분리" TODO는 매칭 실패 시 예외가 발생했을 때 데이터를 저장하기 위해 명시적으로 트랜잭션을 선언한 부분입니다.

현재는 코드에서 직접 TransactionTemplate을 사용해 트랜잭션을 관리하고 있지만, 이를 더 효율적으로 관리하기 위해 트랜잭션 전파 속성을 활용해 별도의 클래스로 분리할 계획입니다.

@ServiceTest
@Import(TestAsyncConfig.class)
class AutomaticMatchingExecutorTest {
class AutomaticMatchingExecutorTest extends MatchingTest {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

시나리오 fixture로 분리하더라도
조이썬이 지적한 것처럼 ContextInitializer와 같은 관리 포인트가 늘어난다는 점에서는 동일하지 않을까요? 🤔

확실히 지금까지 테스트 작성하면서 ContextInitializerDatainitializer처럼
테스트들을 위해 세팅된... 어떤 값들을 관리하는 게 진짜 빡세더라고용...

@jcoding-play
Copy link
Contributor

도커에 데이터를 세팅하고 로컬에서 포트 다르게 두개의 서버를 열고 태스크를 어떻게 차지하는지 확인하면 될 거 같긴한데 어렵겠죠..?🥲

일단 하나의 서버로 여러 쓰레드에서 동시에 작업을 동작하도록 테스트했을 때는 문제가 없었고,
아마 Lock은 실제 DB 단에 사용하는 방식이므로 문제는 없을 거라 생각이 들긴해요!
그래도 확실하게 시도해보겠습니당~ 👍

@jcoding-play jcoding-play merged commit 6cd7484 into develop Oct 16, 2024
4 checks passed
@jcoding-play jcoding-play deleted the feat/#586 branch October 16, 2024 07:43
pp449 added a commit that referenced this pull request Oct 19, 2024
* [BE] 방 매칭 실패 시 매칭 실패 원인을 전달하는 기능 구현(#562) (#575)

* feat: 반환된 예외를 통해 실패 원인을 찾는 기능 구현

* feat: 실패한 매칭 정보를 저장하는 엔티티 구현

* feat: 매칭을 실패했을 경우 실패한 매칭 정보를 저장하는 기능 구현

* refactor: 클래스명 변경

* feat: 반환된 예외를 통해 매칭 실패 원인에 대한 메세지를 얻는 기능 구현

* refactor: FailedMatching 생성자 변경

* feat: 매칭 실패한 방을 조회시, 실패 원인을 같이 전달하는 기능 구현

* refactor: 맵 구현체 변경

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 종료 시, 코드 리뷰 완료 버튼 동작 안하도록 하는 기능 구현(#579) (#580)

* feat: 방 종료 후 코드 리뷰 완료 버튼 검증 로직 구현

* fix: 잘못된 요청값 수정 (#566)

Co-authored-by: youngsu5582 <[email protected]>

* refactor: 리뷰 완료 요청 검증 로직 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>

* [BE] 참여했던 방이 종료되면 참여 중 탭에서 제거(#581) (#584)

* feat: 참여했던 방이 종료되면 참여 중 탭에서 제거하는 기능 구현

* [BE] 중복으로 매칭되던 상황 해결(#587) (#588)

* refactor: 도메인 수정

* feat: 리뷰어, 리뷰이 조회 API 기능 구현

* refactor: 중복된 기능 코드 제거

* docs: 메서드 시그니쳐 통일

* feat: 시연용 데이터 추가

* refactor: 패키지 이동으로 인한 오류 수정

* feat: 시연용 데이터 추가

* fix: REMOTE_ORIGIN 그냥 변수로 변경

* feat: 데이터 추가

* feat: 서브모듈 반영

* feat: response 생성 때 reviewer, reviewee 분리

* feat: application 설정 변경

* feat: 데모 데이터 함수로 분리

* fix: 누락된 saveAll 추가

* fix: 데이터 정합성 수정

* fix: roomId 상수 변경

* feat: 피드백 키워드 뒤 .제거

* refactor: 3차 데모데이 데이터 변경

* feat: room 4에 대한 케이스도 추가

* feat: room 4 매칭 추가

* fix: 응답 내 프로필 링크로 변경

* 최신 브랜치 병합

* feat: submodule 업데이트

* refactor: 서브모듈 변경

* fix: 매칭 중복 예외 처리 안되던 오류 해결

* fix: 리뷰어 매칭 안되던 오류 수정

* test: participationFilter 로직 수정에 따른 테스트 수정

---------

Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>

* feat: pr 제출 안 했을 때 문구 추가 (#590)

Co-authored-by: jinsil <[email protected]>

* [BE] 방 생성 검증 로직 주석 처리(#593) (#594)

* refactor: 방 생성 검증 로직 주석 처리

* refactor: 운영 환경 설정 변경

* refactor: 방 생성 검증 로직 테스트 disabled 처리

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 매칭 실패 시 매칭 실패 원인을 전달하는 기능 구현(#562) (#575)

* feat: 반환된 예외를 통해 실패 원인을 찾는 기능 구현

* feat: 실패한 매칭 정보를 저장하는 엔티티 구현

* feat: 매칭을 실패했을 경우 실패한 매칭 정보를 저장하는 기능 구현

* refactor: 클래스명 변경

* feat: 반환된 예외를 통해 매칭 실패 원인에 대한 메세지를 얻는 기능 구현

* refactor: FailedMatching 생성자 변경

* feat: 매칭 실패한 방을 조회시, 실패 원인을 같이 전달하는 기능 구현

* refactor: 맵 구현체 변경

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 종료 시, 코드 리뷰 완료 버튼 동작 안하도록 하는 기능 구현(#579) (#580)

* feat: 방 종료 후 코드 리뷰 완료 버튼 검증 로직 구현

* fix: 잘못된 요청값 수정 (#566)

Co-authored-by: youngsu5582 <[email protected]>

* refactor: 리뷰 완료 요청 검증 로직 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: ashsty <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: jinsil <[email protected]>

* refactor: 로컬 서버용 깃허브 토큰 변경 (#600)

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] Room Controller 역할 분리(#595) (#596)

* refactor: Room Controller 역할 분리

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* [BE] 자동 예약 및 자동 업데이트 동시성 제어(#586) (#604)

* feat: Lock을 통한 자동 매칭 동시성 제어 기능 구현

* feat: Lock을 통한 자동 업데이트 동시성 제어 기능 구현

* feat: 자동 매칭 Lock 범위 최소화를 위한 클래스 구현

* feat: 자동 예약 Lock 범위 최소화를 위한 클래스 구현

* test: 자동 매칭 테스트 중복 코드 추상 클래스로 이동

* test: 자동 예약 테스트 중복 코드 추상 클래스로 이동

* refactor: Transactional 어노테이션 제거

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 수정 기능 & 스케줄러 부분 분리 및 리팩토링(#605) (#606)

* feat: repository 의존성 제거, 테스트 명확하게 변경

* feat: Reader/Writer 통해 조회 로직 분리

* feat: 룸 수정 기능 구현

* refactor: 피드백 반영

* fix: 충돌 해결

---------

Co-authored-by: youngsu5582 <[email protected]>

* [FE] 콜리네 서비스 제공후 QA(#597) (#602)

* fix: 모집 마감 -> 종료된 방으로 변경

* fix: 매칭 후 pr 제출 안 해서 실패했을 때 바로 문구 띄우기

* design: 모달 이름에 width 변경

* design: 프로필 드롭다운에서 이름 다 보여지게 하기

* design: 배너 medium일 때 높이 수정

* feat: timeDropdown에서 선택된 시간이 제일 위에 떠있게 하기

* feat: 피드백 모아보기에서 세부 피드백에 scroll 추가

* design: 세부 피드백 높이 지정

* fix: content 길이 길어졌을 때 ... 로 보이게 하기

* design: 피드백 모달 엔터처리, line-height 추가

* feat: 분류 드롭다운으로 선택하게 변경

* feat: 키워드 없을 때 ui 처리

* feat: 방 매칭 실패 시 서버가 준 message 띄우기

* [BE] Room Controller 역할 분리(#595) (#596)

* refactor: Room Controller 역할 분리

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* refactor: ALL 타입 추가

* feat: 수정된 api에 맞게 message 타입 추가

* fix: 방 생성 시 키워드 입력을 안했을 때 렌더링 조건 수정

* feat: 바뀐 RoomInfo 데이터 형식에 맞게 storybook 수정

---------

Co-authored-by: jinsil <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: 00kang <[email protected]>

* [BE] 참여했던 방이 종료 된 후, 종료 탭 및 마이페이지에서 안보이는 문제 해결(#607) (#611)

* refactor: 참여한 방을 조회하는 기능 수정

* refactor: 방을 조회하는 기능 메서드 분리

* refactor: 방을 조회 메서드 클래스 분리

* test: Nested 어노테이션을 통한 RoomServiceTest 관심사 분리

* feat: 참여했던 방이 종료되면 종료 탭에서 보이도록 하는 기능 구현

* feat: 종료 탭에서 자신이 참여했던 방도 나타내는 기능 구현

* test: 테스트 수정

* refactor: 조회 쿼리 수정

* refactor: 피드백 반영

* refactor: 변수명 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 로그 중복 작성 제거, 비즈니스 로직 내 로그 추가(#608) (#610)

* feat: additivity false 로 변경

* refactor: 참가,취소 로직 분리

* chore: 로그 레벨 변경

* feat: 로그 추가

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* [FE] 24시간 이하로 남으면 디데이 말고 시간 보여주기(#598) (#609)

* fix: 디데이가 1일 남은경우에도 24시간 미만 남은경우 남은 dday로 반환하도록 변경

* refactor: areDatesEqual 함수를 dateFormatter 유틸 함수로 이동

* fix: 중복된 함수 제거

* test: 데이터 포메팅 유틸 함수 테스트코드 추가

* test: 테스트 시 이미지 모듈은 mock string 값이 반환되도록 모킹

* test: 룸 카드의 남은 기간 정보 UI 렌더링 테스트 추가

* fix: 진행중인 방의 D-Day 가 잘못 표기되는 문제 해결

* test: 테스트 명세 오타 수정

* test: 방 상세정보의 모집/리뷰 마감까지 남은 시간 렌더링 테스트 추가

* test: jest 환경에서 시간대를 한국 시간대를 사용하도록 변경

* feat: SEO 최적화를 위해 html에 메타태그 추가

---------

Co-authored-by: Lee sang Yeop <[email protected]>

* [FE] 생성페이지 달력, 시간 입력 리팩토링(#603) (#614)

* design: 방 생성 페이지 모바일, 태블릿 대응

* refactor: error props 제거

* feat: DateTimePicker 생성하여 날짜, 시간 한번에 관리

* refactor: formatCombinedDateTime 인자 하나로 받기

* refactor: handleInputChange 함수로 통합하기

* refactor: 분류 type 맞추기

* feat: 방 생성 유효성 처리

---------

Co-authored-by: jinsil <[email protected]>

* refactor: 초기 데이터 주석 처리

* refactor: 초기 참여자 사이즈 변경

* feat: 매칭 실패 원인을 전달하는 기능 구현

* [BE] 방 응답 시, CLASSIFICATION 반환 추가(#621) (#623)

* feat: 방 정보 응답 시, classification 정보 추가

* feat: 개발 서버 액세스 토큰 변경

* test: 테스트 통과하도록 주석 처리

---------

Co-authored-by: gyungchan Jo <[email protected]>

* refactor: 요청 dto 제약 조건 변경

* [FE] 방 수정 기능 추가(#616) (#620)

* feat: hostType node_env로 판별

* feat: 검색 title 변경

* fix: test에 message 추가하여 오류 해결

* feat: 방 수정 api 추가

* refactor: classification 속성 추가하기

* refactor: 방 상세 정보 가져오는 함수 훅으로 분리

* feat: 방 생성, 수정 페이지 분리

* fix: put 요청으로 변경

* refactor: getInitialFormState 함수로 분리

* design: 드롭다운 선택된 것 다르게 보여주기

* refactor: 불필요한 코드 제거

* fix: roomId로 변경

* feat: roomId로 변경

---------

Co-authored-by: jinsil <[email protected]>

* [FE] 참여 중인 방에 대해 바뀐 명세서 반영하기(#612) (#622)

* refactor: 수정된 API명세서에 맞게 includeClosed 쿼리 추가

* feat: 참여중 라벨 추가

* feat: 참여중, 모집중 라벨 같이 보여주기

* feat: 종료, 매칭실패 라벨 같이 보여주기

* feat: 참여중 라벨을 범용적으로 사용하기 위해 참여로 수정

* refactor: 참여 라벨, 매칭실패 라벨 고려하여 추가하기

* test: roomStatus, participationStatus, message 상태에 따라 다르게 보여지는 라벨의 테스트 구현

* feat: 서비스 어느 곳에서든지 참여 라벨이 있을 경우 상세페이지로 리다이렉팅

---------

Co-authored-by: 00kang <[email protected]>
Co-authored-by: Lee sang Yeop <[email protected]>

* [BE] 쓴 피드백은 피드백 모아보기에서 바로 볼 수 있도록 변경 + 리팩터링(#613) (#617)

* refactor: 작성한 피드백은 바로 피드백 모아보기에서 보도록 수정

* refactor: 피드백 가져오는 역할 클래스 분리

* refactor: 개발 피드백 작성 기능 수정

* refactor: 개발 피드백 수정 기능 변경

* refactor: 개발 피드백 조회 기능 수정

* refactor: 생성, 수정 dto 분리

* refactor: 피드백을 조회하는 기능 수정

* refactor: 피드백 반영

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 매칭 로직 원복 및 수정(#624) (#627)

* refactor: 도메인 수정

* feat: 리뷰어, 리뷰이 조회 API 기능 구현

* refactor: 중복된 기능 코드 제거

* docs: 메서드 시그니쳐 통일

* feat: 시연용 데이터 추가

* refactor: 패키지 이동으로 인한 오류 수정

* feat: 시연용 데이터 추가

* fix: REMOTE_ORIGIN 그냥 변수로 변경

* feat: 데이터 추가

* feat: 서브모듈 반영

* feat: response 생성 때 reviewer, reviewee 분리

* feat: application 설정 변경

* feat: 데모 데이터 함수로 분리

* fix: 누락된 saveAll 추가

* fix: 데이터 정합성 수정

* fix: roomId 상수 변경

* feat: 피드백 키워드 뒤 .제거

* refactor: 3차 데모데이 데이터 변경

* feat: room 4에 대한 케이스도 추가

* feat: room 4 매칭 추가

* fix: 응답 내 프로필 링크로 변경

* 최신 브랜치 병합

* feat: submodule 업데이트

* refactor: 서브모듈 변경

* feat: submodule 업데이트

* refactor: 매칭 로직 원복

* fix: 매칭 로직 오류 수정

* refactor: 변수명 직관적으로 수정

* refactor: 리뷰어를 제외하고 matchingSize 만큼 추가 매칭하도록 수정

* refactor: 리뷰어가 matchingSize 만큼 리뷰이와 매칭되도록 수정

* feat: submodule 업데이트

* refactor: 피드백 반영

* refactor: 변수명 수정

---------

Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: HyunJoong Kim <[email protected]>

* [BE] 참여한 전체 방들 조회할 때, 실패 원인 같이 보내는 기능 구현(#625) (#629)

* refactor: ParticipationWriter 패키지 변경 및 코드 포맷팅 적용

* refactor: 작은 단위로 클래스 분리

* refactor: 예외 타입명 변경

* refactor: 참여했지만 매칭에 실패했던 모든 방들을 조회할 때 실패 메시지를 같이 보내는 기능 구현

* refactor: 방 조회 기능 수정

* test: 방 관련 테스트 추가

---------

Co-authored-by: gyungchan Jo <[email protected]>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: ashsty <[email protected]>
Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: jinsil <[email protected]>
Co-authored-by: 00kang <[email protected]>
Co-authored-by: HyunJoong Kim <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드 개발 관련 작업 기능 기능 구현 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] 자동 예약 및 자동 업데이트 동시성 제어
4 participants