인프런 커뮤니티 질문&답변

전병준님의 프로필 이미지

작성한 질문수

스프링부트 시큐리티 & JWT 강의

스프링부트 시큐리티 10강 - 페이스북 로그인 완료

회원가입? 로그인 ?

해결된 질문

작성

·

421

0

안녕하세요 데어님! 강의를 듣다 문득 궁금한 것이 있어서 질문을 올리게됐습니다.

지금 여러가지 OAuth2.0 서비스를 스프링 시큐리티와 연동하는 작업을 진행하고 있는데, 나름대로 예외처리를 하다가 지금 구현하는건 회원가입일까 아니면 로그인일까 라는 생각이 들어서요. 아래 코드는 현재 로직이 회원가입이라고 가정한, PrincipalOauth2UserService 내 리팩토링한 코드입니다.

아래 코드를 따르자면 로그인 링크를 클릭했을 때 DB 내에 저장된 username 을 가져와 비교한 뒤 만약 동일한 username 이 있다면 간단하게 예외를 발생하도록 짜보았습니다.

그렇다면 지금 과정은 로그인이 아닌 회원가입이고, 로그인을 위한 로직은 따로 작성해줘야 하는 걸까요 ?

구글 [로그인], 페이스북 [로그인] 이라고 돼있어서 조금 헷갈리네요.. 😅

1. public OAuth2User loadUser() {

... 중략

OAuth2UserInfo oauth2UserInfo = null;
if (oauth2UserInfo != null) {
            String provider = oauth2UserInfo.getProvider();
            String providerId = oauth2UserInfo.getProviderId();
            String username = provider + "_" + providerId;

            User findUser = userRepository.findByUsername(username);
            if (findUser == null) {
                user = saveUserInfo(oauth2UserInfo, provider, providerId, username);
                userRepository.save(user);
            } else {
                try {
                    throw new Exception("이미 존재하는 유저입니다.");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
   
    return new PrincipalDetails(user, oAuth2User.getAttributes());
}

2. saveUserInfo()
private User saveUserInfo(OAuth2UserInfo oauth2UserInfo, String provider, String providerId, String username) {
        String email = oauth2UserInfo.getEmail();
        String password = bCryptPasswordEncoder.encode("password"); // 별 의미없는 패스워드
        String role = "ROLE_USER";

        return User.builder()
            .username(username)
            .password(password)
            .email(email)
            .role(role)
            .provider(provider)
            .providerId(providerId)
            .build();
    }
}

답변 2

1

최주호님의 프로필 이미지
최주호
지식공유자

리팩토링 필요합니다.

최대한 메서드를 하나의 책임을 가지게 나누어서 조합해서 사용하는 것이 좋습니다.

그리고 로그인 요청을 했을때, 만약에 회원가입이 안되어있다면, 자동 회원가입 메서드를 호출해주고

회원가입이 되어있다면 바로 로그인할 수 있게 분기만 해주면 됩니다.

즉, 런타임시 동적으로 회원가입 혹은 로그인이 결정됩니다.

0

전병준님의 프로필 이미지
전병준
질문자

넵 이해했습니다 따로 구현해봐야겠네요 감사합니다^_^