728x90
spring에서 네이버 로그인 API를 사용하려고 시도하면서 회원정보를 VO객체에 담으려고 할 때 오류가 났다.
ObjectMapper를 사용해 readValue() 메서드를 사용했는데 response의 값이 string이 아니고 json형식이라 그렇듯 하다.
아래는 네이버 로그인 API에서 응답으로 주는 사용자 정보로 key값 안에 배열이 하나 더 있다.
{
"resultcode":"00",
"message":"success",
"response":
{
"id":value,
"nickname": value,
"age": value,
"gender": value,
"email": value,
"mobile": value,
"mobile_e164": value,
"name": value,
"birthday": value,
"birthyear": value
}
}
해결책은 두가지가 있다.
- response 안의 키값들을 멤버 변수로 하는 클래스를 생성하기
- response의 데이터 타입을 JsonNode로 바꾸기
첫 번째 방법은 클래스 안에 클래스를 생성하면 된다.
// VO class
public class NaverProfileVO {
private String resultcode;
private String message;
private InnerNaverProfileVO response;
public class InnerNaverProfileVO{
private String email;
private String nickname;
private String profile_image;
private String age;
private String gender;
private String id;
private String name;
private String birthday;
private String birthyear;
private String mobile;
}
}
getter/setter
// vo 객체 안에 value 값을 담는 메서드
NaverProfileVO vo = new NaverProfileVO();
ObjectMapper mapper = new ObjectMapper();
vo = mapper.readValue(jason문자열, NaverProfileVO.class);
이렇게 하면 NaverProfileVO 객체 안에 값이 다 담긴다.
그러나 네이버 뿐만 아니라 카카오와 구글 로그인 api도 구현하려고 하다 보니
세 가지를 통합해서 vo를 생성하기 때문에 중복된 변수들이 있어 첫 번째 방법은 사용하기 힘들다.
그래서 두 번째 방법을 사용했다.
public class SnsProfileVO extends SnsVO {
//kakao
private String properties;
private String kakao_account;
private Long kakaoid;
//naver
private String resultcode;
private String message;
@JsonProperty
private JsonNode response;
private String age;
private String birthyear;
private String mobile;
private String id;
//google
private String aud;
private String sub;
//common
private String name;
private String nickname;
private String email;
private String gender;
private String birthday;
private String age_range;
}
response의 데이터 타입을 JsonNode로 바꾸고 @JsonProperty 어노테이션을 작성했다.
이상태로 매핑을 하면 response에 json 데이터를 담을 수 있다.
담은 데이터를 다시한번 매퍼로 읽으면 객체에 값을 담을 수 있다.
다른 방법들이 있긴 하지만 다른 방법들은 하나하나 값을 저장하는 방식이라
가장 코드를 적게 사용하는 방법을 찾다 보니 이 방법을 찾게 되었다.
SnsProfileVO snsProfile = new SnsProfileVO();
ObjectMapper mapper = new ObjectMapper();
snsProfile = mapper.readValue(json문자열, SnsProfileVO.class);
snsProfile = mapper.readValue(snsProfile.getResponse().toString(), SnsProfileVO.class);
728x90
'Error' 카테고리의 다른 글
scp permission denied 해결하기 위해 시도 해볼 만한 방법들 (0) | 2022.11.22 |
---|---|
워드클라우드 오류 cannot open resource (0) | 2022.01.14 |