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] Blackhole 유저 대여시 재확인 로직 #1304 & 밴 유저가 만료시간 볼 수 있도록 변경 #1294 #1305

Merged
merged 23 commits into from
Aug 18, 2023

Conversation

enaenen
Copy link
Collaborator

@enaenen enaenen commented Aug 14, 2023

해당 사항 (중복 선택)

  • FEAT : 새로운 기능 추가 및 개선
  • FIX : 기존 기능 수정 및 정상 동작을 위한 간단한 추가, 수정사항
  • BUG : 버그 수정
  • REFACTOR : 결과의 변경 없이 코드의 구조를 재조정
  • TEST : 테스트 코드 추가
  • DOCS : 코드가 아닌 문서를 수정한 경우
  • REMOVE : 파일을 삭제하는 작업만 수행
  • RENAME : 파일 또는 폴더명을 수정하거나 위치(경로)를 변경
  • ETC : 이외에 다른 경우 - 어떠한 사항인지 작성해주세요.

설명

아래 링크에 이슈번호를 적어주세요. 예) .../42cabi/issues/738

closing #1294
closing #1304

#1294

  • Blackhole Refresher 클래스를 따로 생성하여 순환참조를 방지
  • 블랙홀 지난 유저가 대여 시도시, intra API 에서 재확인 후, 업데이트
  • 업데이트 이후에도 블랙홀 유저일시, 블랙홀 에러메세지 throw

#1304

  • 현재 밴유저가 대여시도시, 에러 Status ALL_밴 유저입니다. 혹은 SHARE_밴 유저입니다. 고정 메세지로 전달.
  • ServiceException->ExceptionStatus ENUM 으로 message가 고정 되어있는상태
  • 기존의 구조를 최대한 변경하지 않고 진행 하기 위하여
  • CustomExceptionStatus 를 Enum이 아닌 일반 클래스로 생성하여 메세지 커스텀 가능하도록 작성
  • ExceptionController 에서 CustomServiceException 처리를 따로 만들어, 추 후 메세지를 동적으로 생성해서 리턴해야할 경우 이 CustomServiceException 객체를 생성하도록 작성

Copy link
Collaborator

@sichoi42 sichoi42 left a comment

Choose a reason for hiding this comment

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

  1. 블랙홀에 빠졌는지 유무를 판단하는 것을 BlackholeRefresher가 수행한다.
  2. 스케줄러에서 BlackholeManager로 블랙홀에 빠진 유저를 확인할 때, BlackholeRefresher에 의존하여 대신 수행하게 한다. 블랙홀에 빠졌다고 판단되면 LentService를 통해 반납 및 삭제 처리한다.
  3. LentPolicy에서 BlackholeRefresher를 통해 블랙홀에 빠진 것으로 확인되는 경우, 대여 실패 처리한다.
    이렇게 이해하면 맞을까요?

빠른 수정 넘나 감사드립니다...! 고생하셨습니다!

@enaenen
Copy link
Collaborator Author

enaenen commented Aug 15, 2023

  1. 블랙홀에 빠졌는지 유무를 판단하는 것을 BlackholeRefresher가 수행한다.
  2. 스케줄러에서 BlackholeManager로 블랙홀에 빠진 유저를 확인할 때, BlackholeRefresher에 의존하여 대신 수행하게 한다. 블랙홀에 빠졌다고 판단되면 LentService를 통해 반납 및 삭제 처리한다.
  3. LentPolicy에서 BlackholeRefresher를 통해 블랙홀에 빠진 것으로 확인되는 경우, 대여 실패 처리한다.
    이렇게 이해하면 맞을까요?

빠른 수정 넘나 감사드립니다...! 고생하셨습니다!

  • 스케줄러에서 BlackholeManager로 블랙홀에 빠진 유저를 확인할 때, BlackholeRefresher에 의존하여 대신 수행하게 한다. 블랙홀에 빠졌다고 판단되면 LentService를 통해 반납 및 삭제 처리한다.

넵!
생략된게 있다면, 2번에서 해당 유저가 블랙홀에 빠지지 않았고, 살아남아서 블랙홀을 늘렸다면, user 의 blackholed_at 을 업데이트를 합니다

Copy link
Collaborator

@Ssuamje Ssuamje left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

Comment on lines 111 to 115
if (user.getBlackholedAt() != null && user.getBlackholedAt()
.isBefore(LocalDateTime.now())) {
if(blackholeRefresher.isBlackholedAndUpdateBlackhole(UserBlackholeInfoDto.of(user)))
return LentPolicyStatus.BLACKHOLED_USER;
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

주석에 적어주신대로 분리하는게 맞아보이는데, 이 경우에는 오히려 이벤트로 분리해서 적용하는 건 어떻게 생각하시나요?

  • 블랙홀과 관련한 listener를 추가하고, 이에 대한 정보를 담은 event 객체를 만들어서 publish한다.
  • 현재의 케이스에서는 '블랙홀 갱신 중입니다. 다시 시도해주세요'와 같은 문구로 핸들링 할 수 있으면 좋을 것 같습니다.

스케줄러만으로도 케어가 된다면 좋겠지만 별도로 케어하기 힘들다면 이런 방식도 고려해볼만하지 않을까.. 싶기도 합니다. 개인적으로 BlackholeRefresher는 Policy의 책임과는 상관 없는 친구인 것 같은 느낌이 듭니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이벤트 발생 - 리스너 좋은 의견 감사합니다.
한번 반영하여 다시 올려보겠습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이벤트 리스너 예제를 보고 한번 만드려고 생각해봤는데,
[서버관점]

  1. 블랙홀 상태인 대여자가 대여시도
  2. 이벤트발생
  3. 업데이트 or 블랙홀에 빠진것을 확인 후 처리
  4. LentPolicyStatus.BLACKHOLE_CHECKING; -> thorw 처리 => "블랙홀 갱신중입니다" 에러
  5. 유저는 재시도
  6. 성공
    위와같은 프로세스가 될것으로 예상됩니다.

그렇다면
[유저관점]
블랙홀이 아닌 유저일경우

<기존>

  • 대여버튼 누른상태로 딜레이 -> 대여완료

<이벤트ver>

  • 대여버튼 누른상태 -> 갱신중입니다 에러 확인 및 클릭 -> 다시 대여버튼 클릭

위에서 아래와같은 프로세스가 되는게, 유저가 더 불편해지는건 아닌지 모르겠네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이벤트 버전으로 가면 저렇게 나눈 코드가 다 필요없긴함

Copy link
Collaborator

Choose a reason for hiding this comment

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

이전에 3층 비밀번호 설정할 때 고민하던 케이스가 생각나는데, 지금도 비슷한 상황이라고 생각이 듭니다. 알아서 모든 걸 다 해준다기보다는 어느 정도 타협볼 수 있는 수준인 것 같아요 갠적으로

Comment on lines 29 to 34
JsonNode getBlackholeInfo(UserBlackholeInfoDto userBlackholeInfoDto)
throws ServiceException, HttpClientErrorException {
log.info("called refreshBlackhole{}", userBlackholeInfoDto);
return ftApiManager.getFtUsersInfoByName(
userBlackholeInfoDto.getName());
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

개인적인 느낌이지만 userBlackholeInfoDto를 매개변수로 받아서 BlackholeInfo를 받아오는게 직관적이지 않은 것 같습니다. 이 경우에는 BlackholedUser의 Info(JsonNode)를 가져오는 것 아닌가요? 블랙홀 정보를 찾아온다는 얘기랑은 조금 다른 것 같습니다..! + 접근지정자가 없습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ca57242854bc421dff6cd5d7dad22786
왓더헬..? 접근지정자 OMG

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

name 을 통해서 조회하는 것으로 수정하였습니다.
기존의 구조에서 intra api 만 가져오는 부분이 빠지면서 더 부자연스러웠던 것 같습니다.
저는 기존의 구조인 userBlackholeInfoDto => 블랙홀로 판명된 유저의 블랙홀정보를 담은 UserINFO 라고 인식했습니다.

따라서 userBlackholeInfoDto -> userInfo (변수명만 변경)
jsonUserInfo -> jsonRefreshedUserInfo
로 변경하였습니다. 어떤가요?
"유저이름으로 intra api 를 통해 유저 정보를 가져와서, 블랙홀date 를 찾는 함수"

Copy link
Collaborator

Choose a reason for hiding this comment

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

변경해주신 getBlackholeInfo의 경우에서 찾아봤는데 외부 API에서 사용할 여지가 별로 없어보이는데 private으로 돌리는 건 어떻게 생각하시나요?

Copy link
Collaborator Author

@enaenen enaenen Aug 18, 2023

Choose a reason for hiding this comment

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

반영완료!

@enaenen
Copy link
Collaborator Author

enaenen commented Aug 16, 2023

EventListener 쓰면 기존 블랙홀 매니저 그대로 사용 가능하네요

  1. 이벤트처리로하면, 대여시도하면 일단 throw 방식으로 해야한다는점
    이럴경우 인트라 먹통이거나, 다른 api 에러 발생시 계속 잠시후 다시시도해주세요 에러 메세지만 봄

2.이벤트 안쓰고 하면 대여 버튼 누르면 잠깐 대기했다가 대여완료, 그 외 에러 메세지 처리 가능

위 상황이 빈번할지는 잘 모르겠어서 사실 둘다 괜찮을것 같은데, 1번이 개발자 입장에선 재사용성이랑 간결함
2번이 사용자입장에서 더 편리함 이 장점일것같은데 어떻게 생각하시나요?
@sichoi42 @Ssuamje

블랙홀매니저 부분은
BlackholedUserLentEventListener
BlackholeManagerV2
LentPolicyImpl
113라인,114라인

이렇게 3파일만 보시면됩니다.

@enaenen
Copy link
Collaborator Author

enaenen commented Aug 16, 2023

@sichoi42 @Ssuamje

@Ssuamje
Copy link
Collaborator

Ssuamje commented Aug 16, 2023

@enaenen

말씀해주신 1번은 이벤트로 바꾸지 않아도 애초에 겪을 문제인 것 같다는 생각이듭니다. - 결국 외부 API 호출해야하는 건 똑같은 것 같아요.

2번은 뭔가 사상차이일 것 같은데 저는 뭐든 상관은 없을 것 같지만 이 정도(이벤트 방식)는 괜찮지 않나? 싶습니다.

Copy link
Collaborator

@Z1Park Z1Park left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

@sichoi42
Copy link
Collaborator

블랙홀 처리 관련 제 생각

블랙홀에 빠진 유저는 스케줄러가 돌지 않는 블랙박스 기간 동안 대여를 못하게 막는 것
-> 하면 좋고 안해도 그만이라고 생각합니다. 해서 얻는 이점이 그렇게까지 크다고 느껴지지 않네요. 하지만 최소한 블랙박스 기간 동안에 블랙홀을 늘려온 유저가 대여가 안되도록 막히는건 안 될 것 같습니다..!

앞선 질문에 대한 제 생각

1번이나 2번이나 외부 API 통신과정에서 문제가 발생하면 사난님이 말씀하신대로 똑같이 겪게될 문제인 것 같습니다..!
사실 그래서 V1이나 V2나 둘 다 나름의 장단점이 있겠지만 트레이드 오프 차이가 크게 날 것 같진 않아서 어떤 방식이든 좋을 것 같습니다.
결론: 우주님 맘에 드는 방식으로 골라주세요 😂

@enaenen enaenen merged commit 4ec10d7 into dev Aug 18, 2023
1 check passed
@enaenen enaenen deleted the be/dev/refactor_blackhole_scheduler/#1294 branch August 18, 2023 15:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants