Replies: 2 comments
-
저의 의견은 기본적으로 save하기 이전에 DB Layer에 해당 email이 저장되었는지 먼저 검사 후, 있으면 email 중복 exception을 던져주고, 해당 validation을 통과하면 그때 save 하는 방식이 좋다고 생각합니다! public Long signUp(SignUpVendorCommand cmd) throws InvalidCreationException, DuplicateEmailException {
PayAccount newPayAccount = new PayAccount();
payAccountRepository.save(newPayAccount);
Vendor newVendor =
new Vendor(cmd.name(), cmd.email(), cmd.password(), cmd.phone(), newPayAccount, passwordEncoder);
vendorRepository.findByEmail(cmd.email())
.ifPresent((exists)->throw new IllegalArgumentException("이미 존재하는 이메일입니다"));
vendorRepository.save(newVendor);
return newVendor.getId();
} |
Beta Was this translation helpful? Give feedback.
0 replies
-
catch 문 내에서 메시지를 확인해서 분기하는 방법도 있습니다. public Long signUp(SignUpVendorCommand cmd) {
PayAccount newPayAccount = new PayAccount();
payAccountRepository.save(newPayAccount);
Vendor newVendor =
new Vendor(cmd.name(), cmd.email(), cmd.password(), cmd.phone(), newPayAccount, passwordEncoder);
try {
vendorRepository.save(newVendor);
} catch (DataIntegrityViolationException e) {
Throwable cause = e.getCause();
// ConstraintViolationException이 원인인 경우
if (cause instanceof ConstraintViolationException constraintException) {
// 예외 메시지나 제약 조건 이름 등을 분석하여 중복된 이메일이 원인인지 확인
if (constraintException.getMessage().contains("EMAIL_UNIQUE_CONSTRAINT")) {
throw new DuplicateEmailException();
}
}
throw new DuplicateEmailException();
}
return newVendor.getId();
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
#12 에서 파생된 Discussion입니다.
비즈니스 로직에서 Email의 Unique 제약조건을 검증하는 로직이 아닌, JPA를 이용해 영속화를 먼저 시키는 방식을 사용한 방법에 대한 논의입니다.
먼저 Vendor의 Domain Entity 입니다.
아래는 회원가입 비즈니스 로직입니다.
이메일이 중복되면 JPA에서 Unique 제약조건 위배에 대한 SQLException을 DataIntegrityViolationException로 감싸서 아래와 같은 exception을 보내게 됩니다.
고민
현재는 unique 제약조건이 email만 존재하지만, unique한 컬럼이 추가된다면 해당 분기를 어떻게 해야할지에 대해 고민해봐야 할 것 같습니다!
또한 unique이외의 다른 제약조건인 NotNull 또한 아래와 같이 DataIntegrityViolationException 묶여서 던져지기 때문에 분기를 하기위해서는 string을 이용해 분기해야 한다는 단점이 있기 때문에 고민해봐야 할 것 같습니다.
Beta Was this translation helpful? Give feedback.
All reactions