-
Notifications
You must be signed in to change notification settings - Fork 0
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
Refactor/#38 유저 도메인 리팩터링 #60
Conversation
@Valid @RequestBody UpdateProfileRequest request) { | ||
userService.updateProfileInfo(authInfo.userId(), request.nickname(), request.name(), | ||
request.interests()); | ||
@Valid @RequestBody UpdateProfileDto.Request request) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이름 수정은 불가하다는 정책에 따라 UpdateProfileDto의 name 필드를 제거 후 수정하였습니다!
private void updateInterests(User user, List<Keyword> keywords) { | ||
List<Interest> currentInterests = interestCommand.findAllByUserId(user.getId()); | ||
interestCommand.deleteAll(currentInterests); | ||
interestCommand.saveAll(keywords, user); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단순히 가독성을 위해 관심사를 업데이트 하는 로직을 메서드로 뺐습니다!
해당 메서드는 사용자 프로필 정보 수정 기능에서 사용됩니다.
request.authCode()); | ||
|
||
checkDuplicatedUser(response); | ||
checkDuplicatedNickname(request.nickname()); | ||
userQuery.hasDuplicatedUser(response.oAuthProvider(), response.oAuthProviderId()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Request 전체를 넘겨주지 않고 필요한 값만 빼서 전달하도록 수정하였습니다!
public void hasDuplicatedNickname(String nickname) { | ||
if (userRepository.existsUserByProfile_Nickname(nickname)) { | ||
throw new IllegalArgumentException("이미 존재하는 닉네임입니다."); | ||
} | ||
} | ||
|
||
public void hasDuplicatedUser(OAuthProvider oAuthProvider, String oAuthProviderId) { | ||
if (userRepository.existsUserByOauthInfo_oauthProviderAndOauthInfo_oauthProviderId( | ||
oAuthProvider, oAuthProviderId)) { | ||
throw new IllegalArgumentException(ALREADY_REGISTERED_MESSAGE); | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사용자와 닉네임 중복 체크를 일단 UserQuery에 두긴 했는데,, UserCommand와 UserQuery 중 어디에 두는게 더 적절한 것 같은지 의견 궁금합니다🙇🏻♀️🙇🏻♀️👍🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UserRepository는 쿼리지만, 이 메서드를 사용하는 사용자입장에서는 Command라고 생각했어요
그래서 제 생각엔 hasDuplicatedUser
, hasDuplicatedNickname
둘 다 Command로 생각됩니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 반대로 사용자 입장에서 생각하는건 서비스 레이어고,
이 커맨드 쿼리 부분은 객체 내부상태 입장에서 생각하는게 맞아 보여요
객체의 내부 상태를 변환하면서 반환 상태가 없으면, 커맨드
그렇지 않으면 쿼리
즉, 이 부분은 쿼리가 맞는거 같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고하셨습니다
Long userId = userCommand.saveUser(user); | ||
User newUser = userQuery.getUserById(userId); | ||
|
||
interestCommand.saveAll(request.keywords(), newUser); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아 id값을 DB에 의존하게 되서 이렇게 코딩하신거 같은데 userId 리턴이 아니라 걍 User리턴으로 해도 될거 같은데, 월요일에 다 같이 한 번 얘기 하시죠
public void checkDuplicatedNickname(String nickname) { | ||
userQuery.hasDuplicatedNickname(nickname); | ||
} | ||
|
||
public void deleteUser(Long userId) { | ||
userCommand.deleteUser(userId); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제 생각엔 이거 메서드로 따로 뺄 필요는 없어 보이네용?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상민님, 이 부분 만약 따로 안빼면 컨트롤러에서 직접 커맨드 또는 쿼리 레이어에 의존하나요?
User user = userQuery.getUserById(userId); | ||
userQuery.hasDuplicatedNickname(nickname); | ||
user.updateNickname(nickname); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
더티 체킹이 동작하지 않아서 업데이트가 안될 것 같아요
제 생각엔 위 세줄을 묶어서 UserCommnad로 만들어도 좋을 것 같습니다.
public void hasDuplicatedNickname(String nickname) { | ||
if (userRepository.existsUserByProfile_Nickname(nickname)) { | ||
throw new IllegalArgumentException("이미 존재하는 닉네임입니다."); | ||
} | ||
} | ||
|
||
public void hasDuplicatedUser(OAuthProvider oAuthProvider, String oAuthProviderId) { | ||
if (userRepository.existsUserByOauthInfo_oauthProviderAndOauthInfo_oauthProviderId( | ||
oAuthProvider, oAuthProviderId)) { | ||
throw new IllegalArgumentException(ALREADY_REGISTERED_MESSAGE); | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UserRepository는 쿼리지만, 이 메서드를 사용하는 사용자입장에서는 Command라고 생각했어요
그래서 제 생각엔 hasDuplicatedUser
, hasDuplicatedNickname
둘 다 Command로 생각됩니다.
There was a problem hiding this comment.
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 lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
서비스에 트랜잭션 있는게 좋을거같아 보여요!
public void hasDuplicatedNickname(String nickname) { | ||
if (userRepository.existsUserByProfile_Nickname(nickname)) { | ||
throw new IllegalArgumentException("이미 존재하는 닉네임입니다."); | ||
} | ||
} | ||
|
||
public void hasDuplicatedUser(OAuthProvider oAuthProvider, String oAuthProviderId) { | ||
if (userRepository.existsUserByOauthInfo_oauthProviderAndOauthInfo_oauthProviderId( | ||
oAuthProvider, oAuthProviderId)) { | ||
throw new IllegalArgumentException(ALREADY_REGISTERED_MESSAGE); | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 반대로 사용자 입장에서 생각하는건 서비스 레이어고,
이 커맨드 쿼리 부분은 객체 내부상태 입장에서 생각하는게 맞아 보여요
객체의 내부 상태를 변환하면서 반환 상태가 없으면, 커맨드
그렇지 않으면 쿼리
즉, 이 부분은 쿼리가 맞는거 같아요
public void checkDuplicatedNickname(String nickname) { | ||
userQuery.hasDuplicatedNickname(nickname); | ||
} | ||
|
||
public void deleteUser(Long userId) { | ||
userCommand.deleteUser(userId); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상민님, 이 부분 만약 따로 안빼면 컨트롤러에서 직접 커맨드 또는 쿼리 레이어에 의존하나요?
private void updateInterests(User user, List<Keyword> keywords) { | ||
List<Interest> currentInterests = interestCommand.findAllByUserId(user.getId()); | ||
interestCommand.deleteAll(currentInterests); | ||
interestCommand.saveAll(keywords, user); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
InterestCommand에 updateInterests라는 메서드로 쫙 묶어도 될 것 같습니다.
이슈번호
close: #38
작업 내용 설명
리뷰어에게 한마디
변경사항들 코멘트로 달아두었습니다 ! 🙆🏻♀️