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

유지보수 향상을 위해 CredentialManager 의 일급컬렉션을 생성 #1041

Open
wants to merge 15 commits into
base: dev/be
Choose a base branch
from

Conversation

zangsu
Copy link
Contributor

@zangsu zangsu commented Jan 18, 2025

⚡️ 관련 이슈

related #1010, #981

📍주요 변경 사항

  • AuthControllerAuthArgumentResolverCredentialManagers 필드 타입이 Stream<CredentialManager 에서 일급컬렉션으로 변경됩니다.
  • MockMvcTest 에서 로그인 / 비로그인 상황을 흉내내기 위한 setLogin(), setNoLogin() 메서드를 추가하였습니다.

🍗 PR 첫 리뷰 마감 기한

1/23(목) 18:00

  • 출근 이슈로 빠른 수정이 힘들 것 같아서 마감 기한 넉넉하게 설정합니다!

@zangsu zangsu added refactor 요구사항이 바뀌지 않은 변경사항 BE 백엔드 labels Jan 18, 2025
@zangsu zangsu added this to the 7차 스프린트 💭 milestone Jan 18, 2025
@zangsu zangsu self-assigned this Jan 18, 2025
@zangsu zangsu changed the base branch from main to dev/be January 18, 2025 12:02

private CredentialManager getDefaultCredentialManager() {
return credentialManagers.stream()
.filter(cm -> cm instanceof CookieCredentialManager)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

instanceof를 사용한 부분이 영 마음에 안드네요.
다만, 인증 정보를 확인하기 위한 Credential-Type 헤더가 존재하지 않는다면 기본적으로 Cookie를 사용하는 CredentialManager를 사용해야 하는데, 이를 구현하는게 조금 번거로웠어요.

고민해본 방법

CredentialManager를 상속하는 DefaultCredentialManager를 만들어볼까 생각했어요.
다만, 이 경우 DefaultCredentialManager.support() 메서드는 항상 true를 반환해야 하기 때문에 List<CredentialManage>의 순서 중 가장 마지막에 위치해야 합니다.
그런데, 지금 우리는 스프링이 직접 의존성을 주입해 주고 있기 때문에 순서를 제어하기가 어려운 상황이에요.

Copy link
Contributor

Choose a reason for hiding this comment

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

짱수가 고민한 방법이 충분히 좋다고 생각해요.

DefaultCredentialManager를 필드로 분리하면 순서 문제가 해결될 것 같은데 어떤가요?


// when & then
mvc.perform(post("/categories")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(createCategoryRequest)))
.andExpect(status().isUnauthorized())
.andExpect(jsonPath("$.detail").value("인증에 대한 쿠키가 없어서 회원 정보를 찾을 수 없습니다. 다시 로그인해주세요."))
Copy link
Contributor Author

Choose a reason for hiding this comment

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

우리가 Controller 를 테스트할때 detail 을 확인해야 할까요?
이 때문에 예외 메시지만 변경된 경우에도 테스트코드에 수정이 일어나는게 마음에 들지 않아서요.

다들 Controller 테스트에서 확인하고 싶은 것중에 예외 메시지가 포함되어 있나요??

Copy link
Contributor

Choose a reason for hiding this comment

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

저는 굳이 확인하지 않아도 된다고 생각해요.

Detail은 DTO 테스트로 분리하는 게 좋다고 생각해요~

참고: VocRequestTest

@zangsu zangsu changed the title Refactor/1010 use credential adapter 테스트 가용성을 높이기 위해 CredentialManager 의 일급컬렉션을 생성 Jan 18, 2025
@zangsu zangsu changed the title 테스트 가용성을 높이기 위해 CredentialManager 의 일급컬렉션을 생성 유지보수 향상을 위해 CredentialManager 의 일급컬렉션을 생성 Jan 18, 2025
Copy link
Contributor

@zeus6768 zeus6768 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 +40 to +49
private CredentialManager getCredentialManager(HttpServletRequest request) {
Optional<CredentialType> credentialType = getCredentialType(request);
if (credentialType.isEmpty()) {
return getDefaultCredentialManager();
}
return credentialManagers.stream()
.filter(cm -> cm.support(credentialType.get()))
.findFirst()
.orElse(getDefaultCredentialManager());
}
Copy link
Contributor

Choose a reason for hiding this comment

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

IDE 제안이 뜨는데 이렇게 하는 건 어떤가요?

Suggested change
private CredentialManager getCredentialManager(HttpServletRequest request) {
Optional<CredentialType> credentialType = getCredentialType(request);
if (credentialType.isEmpty()) {
return getDefaultCredentialManager();
}
return credentialManagers.stream()
.filter(cm -> cm.support(credentialType.get()))
.findFirst()
.orElse(getDefaultCredentialManager());
}
private CredentialManager getCredentialManager(HttpServletRequest request) {
Optional<CredentialType> credentialType = getCredentialType(request);
return credentialType.map(type -> credentialManagers.stream()
.filter(cm -> cm.support(type))
.findFirst()
.orElse(getDefaultCredentialManager())).orElseGet(this::getDefaultCredentialManager);
}

Comment on lines +25 to +28
@Override
public boolean support(CredentialType credentialType) {
return credentialType == CredentialType.COOKIE;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

CredentialType은 package-private 인 반면, 이 메서드는 public 이어서 경고가 발생해요.

짱수가 의도한 게 아니라면 CredentialType을 public으로 바꿔야겠어요~


private CredentialManager getDefaultCredentialManager() {
return credentialManagers.stream()
.filter(cm -> cm instanceof CookieCredentialManager)
Copy link
Contributor

Choose a reason for hiding this comment

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

짱수가 고민한 방법이 충분히 좋다고 생각해요.

DefaultCredentialManager를 필드로 분리하면 순서 문제가 해결될 것 같은데 어떤가요?


// when & then
mvc.perform(post("/categories")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(createCategoryRequest)))
.andExpect(status().isUnauthorized())
.andExpect(jsonPath("$.detail").value("인증에 대한 쿠키가 없어서 회원 정보를 찾을 수 없습니다. 다시 로그인해주세요."))
Copy link
Contributor

Choose a reason for hiding this comment

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

저는 굳이 확인하지 않아도 된다고 생각해요.

Detail은 DTO 테스트로 분리하는 게 좋다고 생각해요~

참고: VocRequestTest

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드 refactor 요구사항이 바뀌지 않은 변경사항
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

2 participants