함수 추출하기(Extract Function)
- "의도"와 "구현" 분리하기
- 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면 해당 코드를 함수로 분리하고 함수 이름으로 "무슨 일을 하는지" 표현할 수 있다.
- 한줄 짜리 메소드(이름)도 괜찮다.
- 거대한 함수 안에 들어있는 주석은 추출한 함수를 찾는데 있어 좋은 단서가 될 수 있다.
https://github.com/beginner0107/spring-react-blog
내 프로젝트 개선하기
이러한 로직을 수행합니다.
로그인을 수행하는 로직
- 유저가 존재하는지 확인하고
- 비밀번호가 일치하는지 확인 후
- Cookie로 AccessToken과 RefreshToken을 발급해주는 로직
@Transactional
public void signIn(SignInRequestDto request
, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
User user = userRepository.findByEmail(request.getEmail()).orElseThrow(() ->
new BusinessException(request.getEmail(), "email", USER_NOT_FOUND));
if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
throw new BusinessException(null, "password", USER_WRONG_PASSWORD);
}
authCookieService.setNewCookieInResponse(String.valueOf(user.getId()), user.getRoles(),
httpRequest.getHeader(HttpHeaders.USER_AGENT), httpResponse);
}
- 의도 : 비밀번호를 일치 유무
- 구현 : 유무를 판단하고 예외를 던져주는 부분
이렇게 생각하고, 고쳐보았습니다.
@Transactional
public void signIn(SignInRequestDto request
, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
User user = userRepository.findByEmail(request.getEmail()).orElseThrow(() ->
new BusinessException(request.getEmail(), "email", USER_NOT_FOUND));
checkPasswordMatch(request.getPassword(), user.getPassword());
authCookieService.setNewCookieInResponse(String.valueOf(user.getId()), user.getRoles(),
httpRequest.getHeader(HttpHeaders.USER_AGENT), httpResponse);
}
- 처음 이 코드를 본 사용자는 이런 흐름으로 코드를 읽게 됩니다.
- 회원 정보가 있는지 확인을 하는구나.
- 비밀번호가 일치하는지 확인하네
- 쿠키를 설정하는구나.
구현부를 제가 보여주지 않았지만, 코드는 읽히는 것을 확인할 수 있습니다.
private void checkPasswordMatch(String enteredPassword, String storedPassword) {
if (!passwordEncoder.matches(enteredPassword, storedPassword)) {
throw new BusinessException(null, "password", USER_WRONG_PASSWORD);
}
}
'프로젝트' 카테고리의 다른 글
동시성 문제를 해결하는 방법 - Pessimistic Lock으로 해결 (0) | 2024.03.04 |
---|---|
사이드 프로젝트 블로그 글 내용 글자 수 크기 지정에 대한 고민 (1) | 2023.12.31 |