[9주차/미키] 워크북 제출합니다#66
Conversation
YoungJJun
left a comment
There was a problem hiding this comment.
9주차 피드백
-
필수 미션에 대해 우선 큰 틀은 잘 구현해주셨습니다! (필터 생성/삽입/API에서 JWT 활용)
-
Member Entity
social_uid,social_type모두nullable = false설정되어 있습니다. 이 경우 로컬 회원가입 로직에서 해당 값을 무조건 채워줘야 하는데 제가 보기로는 따로 해당 값을 채워주는 로직이 없습니다. 이 경우 DB 제약조건 위반으로 500에러 발생해서 로컬 회원가입 안될 것 같아요.다른 로직 고려해서 로컬 회원도
social_uid를 고유값으로 채우거나nullabe = true설정,social_type또한LOCAL이라고 enum을 만들어서 채워주거나nullabe = true설정 필요할 것 같아요. -
MemberCommandService, JwtUtil
2번 피드백과 관련된 내용입니다.
일반 로그인 후 JWT 발급 시 NPE 발생해요.
jwtUtil.createToken() 내부에서 socialType.name() 호출하는데 null로 설정되어 있어서 NPE 발생합니다. 로컬 회원의 경우 체크해서 우회하거나
LOCAL타입을 추가해야할 것 같아요. -
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,memberIdoremail등 unique값을 넣어서 동일한 로직으로 돌아가게 구현하는 방법이 있을 것 같아요. -
MemberCommandService - login()
DB Write 없는 것 같습니다.
@Transactional(readOnly = true)추가하면 좋을 것 같아요. -
MemberErrorCode -
MEMBER_INVALID_PASSWORD비밀번호 불일치 상황이
NOT_FOUND(404)에는 적절하지 않은 것 같습니다.UNAUTHORIZED(401)등으로 수정하면 좋을 것 같아요. -
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()); }
이렇게 수정하는 편이 동작도하고 성능면에서도 좋을 것 같네요.
-
(주안점 관련 피드백)
우선 작성해주신 내용을 제가 정확히 이해한지 모르겠어요.. 제가 이해한건 카카오 화면에서는 로그인이 정상적으로 이루어지는걸로 보이는데 토큰이 안나온다는 걸로 이해하고 우선 피드백 드릴게요!
//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를 설계하면 잘 구현하실 수 있을거에요!
워크북은 아무래도 순서대로 배우다 보니 이렇게 꼬이는 상황이 발생하는 것 같습니다.
수고하셨고 시험 잘보세용 🍎
✅ 실습 체크리스트
✅ 컨벤션 체크리스트
📌 주안점
카카오톡 프로필 화면은 뜨는데 JWT 토큰이 안나옵니다...코드 상에 오류는 없는 거 같은데
혹시 찾으신다면 꼭 알려주세요!