어떤 사용자가 OAuth 로그인을 n개 하는데, email이 전부 같다고 하자.
만약 email만 체크한다면, 중복으로 처리된다. 이를 막기 위해 다음과 같이 작성했다.
//OAuth 회원 가입 시에는 provider 와 email 둘 다를 알 필요가 있다.
// 반면, 일반 회원 가입 시에는 email 만 알 필요가 있다. provider 는 null 이다.
@Override
public Boolean existsEmail(String email, String provider) {
Integer fetchFirst;
if (provider == null) {
fetchFirst = jpaQueryFactory
.selectOne()
.from(QWriter.writer)
.where(QWriter.writer.email.eq(email))
.fetchFirst();
} else {
//이메일이 같더라도 provider 가 다르면 다른 걸로 인식하게 하기
fetchFirst = jpaQueryFactory
.selectOne()
.from(QWriter.writer)
.where(QWriter.writer.email.eq(email).and(QWriter.writer.provider.eq(provider)))
.fetchFirst();
}
return fetchFirst != null;
}
일반 회원 가입 시에는 provider가 존재하지 않기 때문에 null이다. 따라서 같은 email이 있는지만 체크하면 된다.
반면 oauth 회원 가입 시에는 provider 랑 email 모두 같은 지 확인한다.
이렇게 하면 email이 같아도 oauth provider 가 다르면 전부 다르게 회원 가입 된다.
하지만 일반 회원 가입은 다르다. 만약 oauth 회원 가입으로 된 특정 email이 있다면, email만 보고 판단하기 때문에 중복 이메일로 판정된다. 해당 결과는 프론트 단에서 alert()로 중복이메일임을 알려주었다.