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
        }
}

해결책은 두가지가 있다.

  1. response 안의 키값들을 멤버 변수로 하는 클래스를 생성하기
  2. 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

+ Recent posts