✏️ 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 |