Skip to content

[9주차/미키] 워크북 제출합니다#66

Merged
migi0401 merged 1 commit into
UMC-Inha:micky/mainfrom
migi0401:main
Jun 16, 2026
Merged

[9주차/미키] 워크북 제출합니다#66
migi0401 merged 1 commit into
UMC-Inha:micky/mainfrom
migi0401:main

Conversation

@migi0401

Copy link
Copy Markdown

✅ 실습 체크리스트

  • 이론 학습을 완료하셨나요?
  • 미션 요구사항을 모두 이해하셨나요?
  • 실습을 수행하기 위한 공부를 완료하셨나요?
  • 실습 요구사항을 모두 완료하셨나요?

✅ 컨벤션 체크리스트

  • 디렉토리 구조 컨벤션을 잘 지켰나요?
  • pr 제목을 컨벤션에 맞게 작성하였나요?
  • pr에 해당되는 이슈를 연결하였나요?(중요)
  • 적절한 라벨을 설정하였나요?
  • 파트장에게 code review를 요청하기 위해 reviewer를 등록하였나요?
  • 닉네임/main 브랜치의 최신 상태를 반영하고 있는지 확인했나요?(매우 중요!)

📌 주안점

카카오톡 프로필 화면은 뜨는데 JWT 토큰이 안나옵니다...코드 상에 오류는 없는 거 같은데
혹시 찾으신다면 꼭 알려주세요!

@migi0401 migi0401 requested a review from YoungJJun May 31, 2026 12:46
@migi0401 migi0401 self-assigned this May 31, 2026
@YoungJJun YoungJJun linked an issue May 31, 2026 that may be closed by this pull request

@YoungJJun YoungJJun left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

9주차 피드백

  1. 필수 미션에 대해 우선 큰 틀은 잘 구현해주셨습니다! (필터 생성/삽입/API에서 JWT 활용)

  2. Member Entity

    social_uid, social_type 모두 nullable = false 설정되어 있습니다. 이 경우 로컬 회원가입 로직에서 해당 값을 무조건 채워줘야 하는데 제가 보기로는 따로 해당 값을 채워주는 로직이 없습니다. 이 경우 DB 제약조건 위반으로 500에러 발생해서 로컬 회원가입 안될 것 같아요.

    다른 로직 고려해서 로컬 회원도 social_uid 를 고유값으로 채우거나 nullabe = true 설정, social_type 또한LOCAL 이라고 enum을 만들어서 채워주거나 nullabe = true 설정 필요할 것 같아요.

  3. MemberCommandService, JwtUtil

    2번 피드백과 관련된 내용입니다.

    일반 로그인 후 JWT 발급 시 NPE 발생해요.

    jwtUtil.createToken() 내부에서 socialType.name() 호출하는데 null로 설정되어 있어서 NPE 발생합니다. 로컬 회원의 경우 체크해서 우회하거나 LOCAL 타입을 추가해야할 것 같아요.

  4. JwtAuthFilter

    jwtUtil.getSocialType(token)이 null을 반환할 경우 loadUserByUidAndSocialType(null, uid) 호출 → findBySocialTypeAndSocialUid(null, uid)가 조회 실패해 인증이 항상 거부됩니다.

    위에서 얘기했던 SOCIAL_TYPE에 LOCAL을 추가하고 uid에 값을 넣어주거나 null인 경우 분기처리가 필요할 것 같아요.

    → 여기까지(2,3,4) 비슷한 문제인데 한 번 정리하자면 로컬 회원 구현 후 소셜 회원을 추가하는 과정에서 충돌하는 부분이 발생하면서 로컬 회원가입, 로그인(토큰발급)에 전체적으로 문제가 생긴 것 같습니다.

    해결방법 정리하자면 로컬 회원의 경우 위에서 얘기한 부분에 대해서 null을 확인 후 따로 처리하는 방향과 social_type, social_uid 에 각각 LOCAL,memberId or email등 unique값을 넣어서 동일한 로직으로 돌아가게 구현하는 방법이 있을 것 같아요.

  5. MemberCommandService - login()

    DB Write 없는 것 같습니다. @Transactional(readOnly = true) 추가하면 좋을 것 같아요.

  6. MemberErrorCode - MEMBER_INVALID_PASSWORD

    비밀번호 불일치 상황이 NOT_FOUND(404) 에는 적절하지 않은 것 같습니다.

    UNAUTHORIZED(401) 등으로 수정하면 좋을 것 같아요.

  7. MemberQueryService - getMyProfile

    AuthMember 를 아래처럼 수정하셨는데

    @Override
        public @Nullable String getUsername() {
            return member.getSocialUid();
        }

    프로필 조회 코드에서는 email 필드에 socialUid가 들어가게 되고 이를 이용해서 조회를 하면 항상 실패하게 됩니다.

     String email = authMember.getUsername(); // 실제론 socialUid 반환
     Member member = memberRepository.findByMail(email); // socialUid로 mail 조회 → 항상 실패

    → AuthMember는 Member를 필드로 가지고 있으니까

     // 수정 후
      public MemberResDTO.MyProfileDTO getMyProfile(AuthMember authMember) {
          return MemberConverter.toMyProfileDTO(authMember.getMember());
      }

    이렇게 수정하는 편이 동작도하고 성능면에서도 좋을 것 같네요.

  8. (주안점 관련 피드백)

    우선 작성해주신 내용을 제가 정확히 이해한지 모르겠어요.. 제가 이해한건 카카오 화면에서는 로그인이 정상적으로 이루어지는걸로 보이는데 토큰이 안나온다는 걸로 이해하고 우선 피드백 드릴게요!

    //CustomOAuthService
    
    // (필수) 인증 서버의 일회성 토큰을 이용해 정보 조회 & 유저 객체 생성
            OAuth2User oAuthMember = super.loadUser(userRequest);
    
            // 유저 객체에서 정보 추출
            SocialType providerId;
            String socialUid;
            Map<String, Object> attributes = oAuthMember.getAttribute("kakao_account");
            Map<String, Object> profile = (Map<String, Object>) attributes.get("profile");

    여기서 첫 줄 까지가 카카오와 소통하는 구간이라고 보시면 되고 이후에는 저희 서버 내부에서의 로직입니다. 사용자의 정보를 attributes, profile에 받아온거에요!

    case KAKAO -> {
                    String email = attributes.get("email").toString();
                    String name = profile.get("nickname").toString();
    
                    dto = new KakaoDTO(socialUid, email, name);

    여기서 attributes에서 email 값을 꺼내고 toString 호출 하는데 email은 항상 제공되는 값이 아닙니다.. 카카오 기준으로는 비즈니스 앱 등록, 심사, 사용자의 동의 등의 사항을 만족해야 email값이 채워져 있습니다. (조건은 제 프로젝트 진행때 기억이라 약간 다를 수 있습니다.)

    이렇게 되면 null.toString() 호출되어서 NPE가 발생하고 여기서 죽어서 토큰 발급이 안되는 것 같아요.

    → 해결방안은 진짜 프로젝트에서는 email을 nullable 설정하고 null로 가입하는 경우 적절한 처리가 이루어지도록 null 상황에서 예외처리, 분기 로직을 구현해야할 것 같습니다.


미키 수고하셨습니다. 소셜 로그인까지 구현하시게 되면서 예상치 못한 부분이 많아서 뭔가 많이 꼬이게 된 것 같습니다. 실제 프로젝트에서는 각 소셜 로그인이 제공하는 정보 범위가 어디인지 찾아보시고 DB를 설계하면 잘 구현하실 수 있을거에요!
워크북은 아무래도 순서대로 배우다 보니 이렇게 꼬이는 상황이 발생하는 것 같습니다.
수고하셨고 시험 잘보세용 🍎

@LeeJaeJun1 LeeJaeJun1 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OAuth까지 구현해주시고 고생많으셨습니당!

@migi0401 migi0401 merged commit a4b6afe into UMC-Inha:micky/main Jun 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chapter09_Spring Security - JWT, OAuth

3 participants