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 |