이전 이야기
https://record47584.tistory.com/87
Spring 프로젝트 되살리기 2 - ArgumentResolver 이슈
이전 이야기https://record47584.tistory.com/86 Spring 프로젝트 되살리기 1 - 빌드 에러 해결시나리오 1누군가가 git에 올린 프로젝트를 가져왔다. 근데 빌드부터가 안되네?이 프로젝트.... 내가 집도한다.
record47584.tistory.com
시나리오 3
일단 명세서에 적힌대로 기능들이 동작하긴 한다. 하지만 내부를 보니 좀 더 좋은 코드로 바꿀 수 있을 것 같다.
리팩토링 1 - 코드 순서 변경
@Transactional
public SignupResponse signup(SignupRequest signupRequest) {
String encodedPassword = passwordEncoder.encode(signupRequest.getPassword());
UserRole userRole = UserRole.of(signupRequest.getUserRole());
if (userRepository.existsByEmail(signupRequest.getEmail())) {
throw new InvalidRequestException("이미 존재하는 이메일입니다.");
}
User newUser = new User(
signupRequest.getEmail(),
encodedPassword,
userRole
);
User savedUser = userRepository.save(newUser);
String bearerToken = jwtUtil.createToken(savedUser.getId(), savedUser.getEmail(), userRole);
return new SignupResponse(bearerToken);
}
회원가입을 처리하는 service 코드이다. 만약 중복 이메일 검사에서 에러를 throw 한다면, 그 위에 존재하는 패스워드를 인코딩하는 코드와 String userRole를 enum로 파싱하는 코드는 굳이 처리할 필요가 없다.
결과
@Transactional
public SignupResponse signup(SignupRequest signupRequest) {
// 에러 발생시, 바로 리턴
if (userRepository.existsByEmail(signupRequest.getEmail())) {
throw new InvalidRequestException("이미 존재하는 이메일입니다.");
}
String encodedPassword = passwordEncoder.encode(signupRequest.getPassword());
UserRole userRole = UserRole.of(signupRequest.getUserRole());
User newUser = new User(
signupRequest.getEmail(),
encodedPassword,
userRole
);
User savedUser = userRepository.save(newUser);
String bearerToken = jwtUtil.createToken(savedUser.getId(), savedUser.getEmail(), userRole);
return new SignupResponse(bearerToken);
}
위처럼 코드 위치만 바꿔줘도 필요없는 작업을 생략할 수 있다.
리팩토링 2 - 중첩 if문 제거
public String getTodayWeather() {
ResponseEntity<WeatherDto[]> responseEntity =
restTemplate.getForEntity(buildWeatherApiUri(), WeatherDto[].class);
WeatherDto[] weatherArray = responseEntity.getBody();
if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) {
throw new ServerException("날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode());
} else {
if (weatherArray == null || weatherArray.length == 0) {
throw new ServerException("날씨 데이터가 없습니다.");
}
}
String today = getCurrentDate();
for (WeatherDto weatherDto : weatherArray) {
if (today.equals(weatherDto.getDate())) {
return weatherDto.getWeather();
}
}
throw new ServerException("오늘에 해당하는 날씨 데이터를 찾을 수 없습니다.");
}
이 코드는 외부 날씨 API를 호출해서 오늘 날씨를 찾아 반환하는 메서드이다. 전체적으로 문제 없지만,
if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) {
throw new ServerException("날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode());
} else {
if (weatherArray == null || weatherArray.length == 0) {
throw new ServerException("날씨 데이터가 없습니다.");
}
}
if문이 중첩되는 위 코드는 살짝 고치는게 좋아보인다.
- throw로 에러를 리턴하면 함수가 종료되므로 else로 뺄 필요가 없음
- if 문의 내용이 1줄이면 굳이 중괄호로 묶을 필요가 없음
결과
public String getTodayWeather() {
ResponseEntity<WeatherDto[]> responseEntity =
restTemplate.getForEntity(buildWeatherApiUri(), WeatherDto[].class);
WeatherDto[] weatherArray = responseEntity.getBody();
if (!HttpStatus.OK.equals(responseEntity.getStatusCode()))
throw new ServerException("날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode());
// 이중 if문 제거됨
if (weatherArray == null || weatherArray.length == 0)
throw new ServerException("날씨 데이터가 없습니다.");
String today = getCurrentDate();
for (WeatherDto weatherDto : weatherArray) {
if (today.equals(weatherDto.getDate())) {
return weatherDto.getWeather();
}
}
throw new ServerException("오늘에 해당하는 날씨 데이터를 찾을 수 없습니다.");
}
위 코드가 코드의 흐름을 읽기 더 편하다. ( = 코드 가독성이 좋다. )
'Spring > - [시리즈] Spring 프로젝트 되살리기' 카테고리의 다른 글
| Spring 프로젝트 되살리기 6 - 유닛 테스트 코드 고치기 (0) | 2026.07.25 |
|---|---|
| Spring 프로젝트 되살리기 5 - 코드 리팩토링 3 (@EntityGraph 적용) (0) | 2026.07.25 |
| Spring 프로젝트 되살리기 4 - 코드 리팩토링 2 (@Valid 적용) (0) | 2026.07.25 |
| Spring 프로젝트 되살리기 2 - ArgumentResolver 이슈 해결 (0) | 2026.07.24 |
| Spring 프로젝트 되살리기 1 - 빌드 에러 해결 (0) | 2026.07.24 |