Inflearn brand logo image

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

KMC님의 프로필 이미지
KMC

작성한 질문수

카카오,구글 SNS 로그인(springboot3, vue3)

소셜 로그인 설계

작성

·

28

0

안녕하세요 강사님 혹시 oauth2 를 이용한 로그인을 한 다음에 사용자 프로필을 받는 것이 서비스 플로우인데 이럴경우

웹이 아닌 앱을 사용할경우 (로직은 다른 거 알고 있습니다.) (PCKE 방식 사용 예정입니다.)

oauth2 를 해서 사용자 db에 저장이 되고

{4CDE2647-B434-4FDD-92AC-65E488E63552}.png

이렇게 처음에 저장이 되고 그 다음에 프로필을 받으면 저 값이 수정이 되게 만들어 주는 게 맞을지 질문드립니다.

사용자엔티티에 Provider 나 socialId 로 값을 받습니다. (구글과 애플을 사용할 예정입니다.)


@Entity
@Table(name = "users")
@Getter
@NoArgsConstructor
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name = "SEX", nullable = false)
    private Sex sex;

    @Column(name = "age", nullable = false)
    private Integer age;

    @Column(name = "nationality", nullable = false)
    private String nationality;

    @Column(name = "introduction", length = 40, nullable = false)
    private String introduction;

    @Column(name = "visit_purpose", length = 40, nullable = false)
    private String visitPurpose;

    @Column(name = "languages", nullable = false)
    private String languages;

    @Column(name = "hobby", nullable = false)
    private String hobby;

    @Column(name = "created_at", nullable = false)
    private Instant createdAt;

    @Column(name = "updated_at", nullable = false)
    private Instant updatedAt;

    @Column(name = "Provider", nullable = false)
    private String provider;

    @Column(name = "social_id", nullable = false)
    private String socialId;

    @Column(name = "email", nullable = false)
    private String email;

    @Builder
    public User(String name, Sex sex, Integer age, String nationality,
                String introduction, String visitPurpose, String languages,
                String hobby, String provider, String socialId, String email) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.nationality = nationality;
        this.introduction = introduction;
        this.visitPurpose = visitPurpose;
        this.languages = languages;
        this.hobby = hobby;
        this.provider = provider;
        this.socialId = socialId;
        this.email = email;
        this.createdAt = Instant.now();
        this.updatedAt = Instant.now();
    }

    public void updateProfile(UserUpdateDTO dto) {
        if (dto.getName() != null && !dto.getName().trim().isEmpty()) {
            this.name = dto.getName().trim();
        }
        if (dto.getSex() != null) {
            this.sex = dto.getSex();
        }
        if (dto.getAge() != null) {
            this.age = dto.getAge();
        }
        if (dto.getNationality() != null && !dto.getNationality().trim().isEmpty()) {
            this.nationality = dto.getNationality().trim();
        }
        if (dto.getIntroduction() != null && !dto.getIntroduction().trim().isEmpty()) {
            this.introduction = dto.getIntroduction().trim();
        }
        if (dto.getVisitPurpose() != null && !dto.getVisitPurpose().trim().isEmpty()) {
            this.visitPurpose = dto.getVisitPurpose().trim();
        }
        if (dto.getLanguages() != null && !dto.getLanguages().trim().isEmpty()) {
            this.languages = dto.getLanguages().trim();
        }
        if (dto.getHobby() != null && !dto.getHobby().trim().isEmpty()) {
            this.hobby = dto.getHobby().trim();
        }

        this.updatedAt = Instant.now(); // 수정 시각 갱신
    }
}

답변 2

0

bradkim님의 프로필 이미지
bradkim
지식공유자

안녕하세요~!

제가 질문을 정확히 이해했는지 모르겠습니다만, 먼저 비어있는 회원요소를 만든후에,

 

oauth2-client를 통해 구글로부터 받아온 정보를 가지고 추후 업데이트 하겠다는 말씀으로 이해하면 될까요?

 

그런데, 비어있는 회원요소를 db에 만들필요 없이 구글로부터 받아온정보를 가지고 바로 등록(create)작업을 하면 더 간편하지 않을까요?

 

제가 맥락을 정확히 이해했는지 확실히 몰라서, 맞는 답변일지 모르겠습니다.

KMC님의 프로필 이미지
KMC
질문자

이게 서비스 플로우가 처음 방문한 경우 구글 oauth2로 로그인을 하면 db 에 유저 정보가 들어갑니다. 처음 방문 인경우 그 다음 국적 나이 성별 사용 가능언어 등등 를 사용자가 설정해야 하는 데 이럴 경우 처음 유저정보가 들어간 데이터베이스에서 (이 때는 유저정보에 구글에서 받아온 이메일 하고 소셜아이디만 들어갑니다.) 그다음 프로필 정보(소개글이나 기타 세팅을 사용자가 해줍니다

틴더? 비슷한느낌인 거 같습니다.) 를 유저에 정보(사진 과 같이 설정된 상태)에서 업데이트를 해 주는 게 맞나요?

bradkim님의 프로필 이미지
bradkim
지식공유자

아 추가 정보를 입력해야 한다는 말씀이실까요?

그 경우엔 말씀하신대로 기본 socialId값만 세팅해두고, 추후에 사용자에게 추가 정보를 입력받은후에 업데이트를 하면 될것 같습니다.

 

다만, 올려주신 로직을 보면 null인지 아닌지 체크가 모두 들어가고 있는데, 사용자로부터 넘겨오는 값을 그대로 update하면되지 굳이 null체크를 모두 해줄필욘 없어보이긴합니다.

KMC님의 프로필 이미지
KMC
질문자

넵 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. KMC님.

질문해주신 내용에 대해서는 사용자 OAuth2 로그인 후 프로필을 업데이트하는 일반적인 플로우에 대한 설명으로 보입니다. 아래는 특정한 로직을 진행하는 과정에서 고려할 수 있는 몇 가지 사항과 접근법입니다:

  1. 초기 사용자 데이터 저장:

    • OAuth2 로그인을 통해 사용자가 인증되면, socialId, provider, 그리고 특수한 경우 email 등 최소한의 정보를 기반으로 사용자 데이터를 users 테이블에 저장할 수 있습니다. 이 단계에서는 사용자의 프로필이 불완전할 수 있습니다.
    • 이 초기 데이터는 사용자가 OAuth2 플랫폼(예: 구글, 애플)에서 제공하는 기본 정보만을 이용해 저장되며, 이후 개인정보 수집을 위해 추가 작업을 할 수 있습니다.
  2. 프로필 정보 업데이트:

    • 사용자가 OAuth2 로그인 후 서비스 자체의 프로필 수정 UI를 통해 보다 상세한 정보를 입력하거나 업데이트할 수 있습니다. 이는 사용자 경험 향상 및 서비스에서 제공하는 기능을 최대로 활용하기 위한 일반적인 플로우입니다.
    • 프로필 업데이트 시에는 User 엔티티의 updateProfile() 메서드를 호출하여 필요한 정보를 업데이트하고, 이와 함께 updatedAt 필드를 갱신하여 최신 상태를 반영할 수 있습니다.
    • UserUpdateDTO 객체를 통해 변경될 수 있는 프로필 필드를 관리하며, 업데이트 가능성을 평가하고 필요에 따라 값을 조정하게 됩니다.
  3. PCKE 및 앱 연동:

    • 웹이 아닌 모바일 앱 환경에서 PKCE(Proof Key for Code Exchange)를 사용하면, 클라이언트 비공개키와 공개키를 통해 보안을 강화할 수 있습니다. PKCE는 특히 보안이 중요한 모바일 환경에서의 OAuth2 인증을 안전하게 수행하는 데 매우 유용합니다.

유사한 로직을 구현하는 방식이나 OAuth2와 관련된 더 많은 정보가 필요하시다면 아래의 유사 질문 URL을 확인할 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

KMC님의 프로필 이미지
KMC

작성한 질문수

질문하기