Spring

Early Return 패턴

윤승 2025. 4. 17. 20:58

Early Return 패턴: 조건이 맞지 않으면 일찍 반환(early return) 해서 아래 코드의 실행을 피하는 구조이다.

 

Early Return 패턴을 사용하면 좋은 점

  • 중첩된 if 줄이기
  • 가독성이 향상된다.
  • 불필요한 연산을 제거한다.
  • 실패 상황을 먼저 처리하고 성공 흐름만 아래로 자연스럽게 이어지게 한다.

 

✅ 코드 예시

※ userRepository.existsByEmail(String email) : 이 메서드는 Spring Data JPA에서 제공하는 쿼리 메서드(Query Method) 로, User 테이블에서 특정 이메일을 가진 사용자가 존재하는지 여부(true/false)를 반환해 주는 기능이다.

    @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);
    }

현재 signup() 메서드에는 Early Return 패턴이 적용되어 있지 않다.

그로 인해 passwordEncoder.encode()가 이메일 중복 여부를 확인하기 전에 먼저 실행되고 있어, 이메일이 이미 존재하는 경우에도 불필요하게 비밀번호 인코딩 연산이 수행되는 문제가 발생한다.

 

✅ 리팩토링 포인트

 

  • passwordEncoder.encode()는 CPU 비용이 큰 연산이다.
  • 이메일이 이미 존재한다면, 이 연산은 할 필요가 없다.
  • 따라서 existsByEmail() 검사를 가장 먼저 수행해야 한다.

 

 

✅ 수정된 signup() 메서드 코드

@Transactional
public SignupResponse signup(SignupRequest signupRequest) {
    // 1. 이메일 중복 체크 먼저 수행
    if (userRepository.existsByEmail(signupRequest.getEmail())) {
        throw new InvalidRequestException("이미 존재하는 이메일입니다.");
    }

	// 2. 이메일 중복 체크 후 다음 연산 실행
    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);
}

 

✅ 결과

  • 성능 최적화 (불필요한 연산 방지)
  • 조건에 맞지 않으면 조기 종료 → Early Return 패턴
  • 가독성, 유지보수성 향상

'Spring' 카테고리의 다른 글

Servlet Filter  (1) 2025.04.22
Spring - 심화 주차 과제 세션  (2) 2025.04.21
JPA 연관관계  (1) 2025.04.16
HttpMessageConverter  (1) 2025.04.15
뉴스피드 프로젝트 트러블 슈팅  (4) 2025.04.14