화면 정의서
/api/email
, /api/name
이며 QueryString의 요청이 email과 name입니다. private final List<DuplicateService>duplicateServices;
public DuplicateServiceFinder(List<DuplicateService> duplicateServices) {
this.duplicateServices = duplicateServices;
}
@GetMapping("/email")
public DuplicateResponseDto checkEmailDuplication(@RequestParam(value = "email", required = true) String account, HttpServletRequest request) {
return getVerifyResponseDto(request.getParameterNames().nextElement(), account);
}
@GetMapping("/name")
public DuplicateResponseDto checkNameDuplication(@RequestParam(value = "name", required = true) String account, HttpServletRequest request) {
return getVerifyResponseDto(request.getParameterNames().nextElement(), account);
}
public static DuplicateResponseDto getVerifyResponseDto(String type, String value) {
DuplicateService duplicateService = duplicateServices.stream()
.filter(verifyService -> verifyService.getType().name().equals(type))
.findAny()
.orElseThrow(RuntimeException::new);
return duplicateService.signupDivisionDuplicateCheck(type, value);
}
request.getParameterNames().nextElement()
을 통하여 쿼리 스트링의 값을 가져올 수 있습니다. 이후 getVerifyResponseDto
를 통하여 parameter에 맞는 서비스를 호출할 수 있습니다.public interface DuplicateService {
DuplicateResponseDto signupDivisionDuplicateCheck(String type, String value);
DuplicateType getType();
}
@Service
public class EmailServiceImpl implements DuplicateService {
private final MemberRepository memberRepository;
public EmailServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Override
public DuplicateResponseDto signupDivisionDuplicateCheck(String type, String value) {
return DuplicateResponseDto.of(memberRepository.findByEmail(value)
.isPresent() ? DuplicateResult.FALSE.getDivisionResult() : DuplicateResult.TRUE.getDivisionResult());
}
@Override
public DuplicateType getType() {
return DuplicateType.email;
}
}
@Service
public class NameServiceImpl implements DuplicateService {
private final MemberRepository memberRepository;
public NameServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Override
public DuplicateResponseDto signupDivisionDuplicateCheck(String type, String value) {
return DuplicateResponseDto.of(memberRepository.findByName(value)
.isPresent() ? DuplicateResult.FALSE.getDivisionResult() : DuplicateResult.TRUE.getDivisionResult());
}
@Override
public DuplicateType getType() {
return DuplicateType.name;
}
}
public DuplicateResponseDto getVerifyResponseDto(String type, String value) {
DuplicateService duplicateService = duplicateServices.stream()
.filter(verifyService -> verifyService.getType().name().equals(type))
.findAny()
.orElseThrow(RuntimeException::new);
return duplicateService.signupDivisionDuplicateCheck(type, value);
}
위에 함수를 static으로 바꾸면 안되나요?
@Component
public class DuplicateServiceFinder {
private final List<DuplicateService>duplicateServices;
public DuplicateServiceFinder(List<DuplicateService> duplicateServices) {
this.duplicateServices = duplicateServices;
}
public DuplicateResponseDto getVerifyResponseDto(String type, String value) {
DuplicateService duplicateService = duplicateServices.stream()
.filter(verifyService -> verifyService.getType().name().equals(type))
.findAny()
.orElseThrow(RuntimeException::new);
return duplicateService.signupDivisionDuplicateCheck(type, value);
}
}
@Override
@Transactional
@TimeAnnotation
public MemberSignupResponse signUp(
MemberSignupRequest request
) {
checkEmailAndNameDuplication(request);
Member member = Member.builder()
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.name(request.getName())
.roles(new HashSet<>())
.build();
signupWithRole(member);
return MemberSignupResponse.of(memberRepository.save(member));
}
private void checkEmailAndNameDuplication(MemberSignupRequest request) {
divisionDuplicationAboutNickEmail(request);
divisionDuplicationAboutName(request);
}
private void divisionDuplicationAboutName(MemberSignupRequest request) {
DuplicateResponseDto name = duplicateServiceFinder.getVerifyResponseDto("name", request.getName());
Optional.of(name)
.filter(duplicateResponseDto -> duplicateResponseDto.getVerify().equals(DuplicateResult.FALSE.getDivisionResult()))
.ifPresent(duplicateResponseDto -> {
throw new RuntimeException("중복 이름");
});
}
private void divisionDuplicationAboutNickEmail(MemberSignupRequest request) {
DuplicateResponseDto email = duplicateServiceFinder.getVerifyResponseDto("email", request.getEmail());
Optional.of(email)
.filter(duplicateResponseDto -> duplicateResponseDto.getVerify().equals(DuplicateResult.FALSE.getDivisionResult()))
.ifPresent(duplicateResponseDto -> {
throw new RuntimeException("중복 이메일");
});
}