본문 바로가기

카테고리 없음

[Spring Boot] Security6 OAuth2 유저 정보 DB 저장 (10)

 

 

UserEntity 생성

@Entity
@Getter
@Setter
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
	
    private String name;

    private String email;

    private String role;
}

 

 

 

UserRepository 생성

public interface UserRepository extends JpaRepository<UserEntity, Long> {

    UserEntity findByUsername(String username);
}

 

 

service>CustomOAuth2UserService

@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    private final UserRepository userRepository;

    // UserRepository를 초기화하는 생성자
    public CustomOAuth2UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // loadUser 메소드를 오버라이드하여 커스텀 OAuth2 사용자 로딩 로직을 처리
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {

        // OAuth2 공급자에서 사용자 정보를 로드
        OAuth2User oAuth2User = super.loadUser(userRequest);
        System.out.println(oAuth2User);

        // 공급자를 식별하기 위해 registrationId를 가져옴 (예: "naver", "google")
        String registrationId = userRequest.getClientRegistration().getRegistrationId();
        OAuth2Response oAuth2Response = null;

        // registrationId에 따라 어떤 공급자의 응답을 사용할지 결정
        if (registrationId.equals("naver")) {
            oAuth2Response = new NaverResponse(oAuth2User.getAttributes());
        } else if (registrationId.equals("google")) {
            oAuth2Response = new GoogleResponse(oAuth2User.getAttributes());
        } else {
            return null;
        }

        // 공급자와 공급자 ID를 사용하여 고유한 username을 생성
        String username = oAuth2Response.getProvider() + " " + oAuth2Response.getProviderId();
        
        // 데이터베이스에서 사용자가 존재하는지 확인
        UserEntity existData = userRepository.findByUsername(username);

        if (existData == null) {
            // 사용자가 존재하지 않으면 새로운 사용자 엔티티를 생성
            UserEntity userEntity = new UserEntity();
            userEntity.setUsername(username);
            userEntity.setEmail(oAuth2Response.getEmail());
            userEntity.setName(oAuth2Response.getName());
            userEntity.setRole("ROLE_USER");

            // 새로운 사용자 엔티티를 데이터베이스에 저장
            userRepository.save(userEntity);

            // 새로운 사용자를 나타내는 UserDTO 객체 생성
            UserDTO userDTO = new UserDTO();
            userDTO.setUsername(username);
            userDTO.setName(oAuth2Response.getName());
            userDTO.setRole("ROLE_USER");

            // UserDTO를 포함하는 새로운 CustomOAuth2User 객체를 반환
            return new CustomOAuth2User(userDTO);
        } else {
            // 사용자가 존재하면 이메일과 이름을 업데이트
            existData.setEmail(oAuth2Response.getEmail());
            existData.setName(oAuth2Response.getName());

            // 업데이트된 사용자 엔티티를 데이터베이스에 저장
            userRepository.save(existData);

            // 기존 사용자를 나타내는 UserDTO 객체 생성
            UserDTO userDTO = new UserDTO();
            userDTO.setUsername(existData.getUsername());
            userDTO.setName(oAuth2Response.getName());
            userDTO.setRole(existData.getRole());

            // UserDTO를 포함하는 새로운 CustomOAuth2User 객체를 반환
            return new CustomOAuth2User(userDTO);
        }
    }
}