본문 바로가기

개발 일지/TIL

[ #40 ] TIL

✏️ 0612      


Spring 심화 강의

수준별 학습: 스탠다드 이론반


기존 프로젝트에 카카오 서버의 사용자 정보 넣기

 

 

기존 User 테이블 형식

 

 

 

카카오로부터 받는 사용자 정보

 

카카오 사용자 정보 JSON 예

{
  "id": 1632335751,
  "properties": {
    "nickname": "르탄이",
    "profile_image": "http://k.kakaocdn.net/...jpg",
    "thumbnail_image": "http://k.kakaocdn.net/...jpg"
  },
  "kakao_account": {
    "profile_needs_agreement": false,
    "profile": {
      "nickname": "르탄이",
      "thumbnail_image_url": "http://k.kakaocdn.net/...jpg",
      "profile_image_url": "http://k.kakaocdn.net/...jpg"
    },
    "has_email": true,
    "email_needs_agreement": false,
    "is_email_valid": true,
    "is_email_verified": true,
    "email": "letan@sparta.com"
  }
}

 

 

테이블 설계 옵션

  • 카카오 User를 위한 테이블을 하나 더 추가

장점 : 결합도가 낮아진다

- 성격이 다른 유저별로 분리 > 차후 각 테이블의 변화에 서로 영향을 주지 않는다

- ex) 카카오 사용자들만 profile_image 컬럼 추가를 사용

 

단점 : 구현 난이도가 올라간다

- 관심상품 등록 시, 회원별로 다른 테이블을 참조해야 한다

  = 일반 회원 : User - Product

  = 카카오 회원 : KakaoUser - Product

 

  • 기존 회원 테이블에 카카오 User 추가 ( 강의 진행 )

장점 : 구현이 단순해진다

 

단점 : 결합도가 높아진다

- 폼 로그인을 통해 카카오 로그인 사용자의 username, password 를 입력해서 로그인한다면 문제가 발생할 수 있다

 

 

 

강의 프로젝트 진행 중 발생한 오류

private KakaoUserInfoDto getKakaoUserInfo(String accessToken) throws JsonProcessingException {
    log.info("엑세스 토큰 : " + accessToken);
    // 요청 URL 만들기
		...

    // HTTP Header 생성
		...

    // HTTP 요청 보내기
    ResponseEntity<String> response = restTemplate.exchange(
            requestEntity,
            String.class
    );

    JsonNode jsonNode = new ObjectMapper().readTree(response.getBody());
    Long id = jsonNode.get("id").asLong();
    String nickname = jsonNode.get("properties")
            .get("nickname").asText();
    String email = jsonNode.get("kakao_account")
            .get("email").asText();

    log.info("카카오 사용자 정보: " + id + ", " + nickname + ", " + email);
    return new KakaoUserInfoDto(id, nickname, email);
}

 

 

액세스 토큰을 통해 카카오 계정으로 로그인한 사용자의 정보를 가져오는 메서드인데

 

 

 

JsonNode.get(String) 메서드가 null을 반환하여, 그 결과를 사용하려고 할 때 발생하는 NullPointerException 오류가 발생

해결하기 위해서는 JsonNode.get(String) 메서드가 null을 반환할 가능성을 처리해야 한다는데

 

 

JsonNode.class 에 들어가보니 이 메서드 null 을 return 하고 있었다...

그런데 애초에 토큰이 정상적으로 들어오는 상황이었고 가져오는 것 또한 잘되는 상황

null 이 나올 수가 없는 상황이었다

디버깅 했을 때 값 잘 가져오다가 갑자기 exception 쪽으로 빠지더라..

대체 뭐냐 진짜

 

 

그래서 나는 또 다른 방법으로 추정되는 path 메서드를 찾아냈다

 

JsonNode jsonNode = new ObjectMapper().readTree(response.getBody());
Long id = jsonNode.path("id").asLong();
String nickname = jsonNode.path("properties")
        .path("nickname").asText();
String email = jsonNode.path("kakao_account")
        .path("email").asText();

log.info("카카오 사용자 정보: " + id + ", " + nickname + ", " + email);
return new KakaoUserInfoDto(id, nickname, email);

 

오류가 나고 있던 jsonNode.get 을 path 으로 변경

 

혹시 몰라서 대충 가렸는데... 안 가려도 상관없으려나 싶기도 하고?

하지만 내 개인정보는 소즁하니까 ㅎ

 

get 메서드를 사용하면서 null 반환되어 사용자 정보를 찾지 못한다고 오류가 나오는 것 같다
String 매개변수를 가질 수 있는 path 메서드를 사용하니 잘 출력이 된다 !

 

어케든 해냈다! 💦💦

'개발 일지 > TIL' 카테고리의 다른 글

[ #42 ] TIL  (0) 2024.06.14
[ #41 ] TIL  (0) 2024.06.13
[ #39 ] TIL  (3) 2024.06.11
[ #37 ] TIL  (0) 2024.06.07
[ #36 ] TIL  (0) 2024.06.05