본문 바로가기
Spring/- [시리즈] Spring 프로젝트 되살리기

Spring 프로젝트 되살리기 3 - 코드 리팩토링 1 (중첩 if문 제거 등)

by 정구정구 2026. 7. 24.

이전 이야기

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("오늘에 해당하는 날씨 데이터를 찾을 수 없습니다.");
    }

 

위 코드가 코드의 흐름을 읽기 더 편하다. ( = 코드 가독성이 좋다. )