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);
}
}
}