카카오 로그인 API - REST API(3)
이전의 과정
https://welcometomybrain.tistory.com/43
저번 게시글에서는 인가 코드를 이용하여 토큰을 발급받았다.
오늘은 토큰을 이용해 사용자 정보를 가지고 와서 VO에 담는 것까지 해 보도록 하겠다.
현재 STS3에서 JSP로 구현하고 있습니다.
먼저 VO에 데이터들을 담아줄 것이므로 KakaoVO를 만들어준다.
나는 다음과 같이 만들어 주었는데 필요에 따라 설정해서 만들면 될 듯하다.
다만 Id의 경우는 문서에서 Long 타입이라고 하니 Long으로 지정해서 사용하자!
여기서 id는 카카오가 회원번호로 부여하는 것이다(고정 값)
package three.people.vo;
public class KakaoVO {
private Long kakaoId;
private String nickname;
private String account_email;
private String gender;
private String age_range;
private String birthday;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAccount_email() {
return account_email;
}
public void setAccount_email(String account_email) {
this.account_email = account_email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAge_range() {
return age_range;
}
public void setAge_range(String age_range) {
this.age_range = age_range;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public Long getKakaoId() {
return kakaoId;
}
public void setKakaoId(Long kakaoId) {
this.kakaoId = kakaoId;
}
}
VO를 만들어 주었으니 kakapService에 두 번째 메서드를 만들자!
kakaoService.java
//회원정보 요청, 사용자 정보 보기
public KakaoVO userInfo(String access_Token) throws IOException {
System.out.println("-------------------------사용자 정보 보기---------------------------");
KakaoVO userInfo = new KakaoVO();
//토큰을 이용하여 카카오에 회원의 정보를 요청한다.
// v1을 통한 '사용자 정보 요청'은 만료되었다.
String reqURl = "https://kapi.kakao.com/v2/user/me";
try {
//URL 객체 생성
URL url = new URL(reqURl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
//연결 완료
//헤더 필드 읽기
//요청에 필요한 Header에 포함 될 내용 // 문서에서 지정해둔 양식
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
//응답코드 확인하기
int responseCode = conn.getResponseCode();
System.out.println("responseCode: "+ responseCode);
//입력스트림을 가지고 오고 데이터 읽기
//inputStream은 데이터를 바이트의 배열로 읽어 오는 low-level의 메서드
//따라서 데이터를 문자 '데이터'로 읽기 위해서 InputStreamReader로 매핑
//데이터를 문자'열'로 읽기 위해서 inputStream을 BufferedReader로 매핑하기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
String line="";
String result ="";
while((line= br.readLine()) != null) {
result += line;
}
System.out.println("response body: " + result);
// Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
//JsonElement.getAsJsonObject().get("key value").getAs타입(); 의 형태로 파싱한다.
//응답데이터(JSON)
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
Long id = element.getAsJsonObject().get("id").getAsLong();
//파싱된 json데이터를 string에 담기
//properties
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
//kakao_account
String email = kakao_account.getAsJsonObject().get("email").getAsString();
String gender = kakao_account.getAsJsonObject().get("gender").getAsString();
String birthday = kakao_account.getAsJsonObject().get("birthday").getAsString();
String age_range = kakao_account.getAsJsonObject().get("age_range").getAsString();
System.out.println("id: "+ id);
System.out.println("nickname: "+nickname);
//setter이용하여 KakaoVO에 담기
userInfo.setKakaoId(id);
userInfo.setNickname(nickname);
userInfo.setAccount_email(email);
userInfo.setAge_range(age_range);
userInfo.setGender(gender);
userInfo.setBirthday(birthday);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userInfo;
}
완성된 메서드는 다음과 같다.
REST API를 사용하는데 가장 중요한 문서를 보면
사용자 정보를 볼 때는 동의 항목이 제대로 설정이 되어있어야 한다고 한다.

이제 저 메서드가 어떻게 나왔는지 하나씩 보자!
먼저 문서를 보면 토큰을 이용하여 Request 하는 방법을 볼 수 있다.

잘 모를 때는 sample 보기!
get 방식으로 저 경로에 요청하고 Header에는 저 정보를 담아달라는 말!

- 요청 경로 reqURL에 담기
(나는 사용자 정보를 보려면 토큰 정보를 봐야 하는 줄 알았었다,, 멍청이,,
토큰 정보가 아니라 문서에서 사용자 정보 보기 부분을 참고하시면 됩니다...)
토큰을 이용하여 카카오에 회원의 정보를 요청한다.
(토큰 정보 보기 부분에서 경로가 v1이었는데 v1을 통한 '사용자 정보 요청'은 만료되었다고 한다...
어차피 우리는 토큰 정보는 필요 없다,,)
2.URL 객체 생성
토큰을 발급받을 때와 마찬가지로 객체를 만들어서 통신을 할 수 있다.
URL은 자바 애플리케이션과 URL 연결과 관련한 모든 클래스의 슈퍼 클래스로
URlconnection과 HttpURLConnection 모두 추상 클래스로서 인스턴스를 직접 만들 수 없다.
따라서 URL 객체를 생성하는 방식으로 그 하위의 HttpURLConnection 인스턴스를 사용할 수 있다.
문서에서 GET 과 POST 모두 가능하다고 했으므로 POST로 해보자
try {
//URL 객체 생성
URL url = new URL(reqURl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
3. Header로 정보 넘기기

//헤더 필드 읽기
//요청에 필요한 Header에 포함 될 내용
// 문서에서 지정해둔 양식
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
//응답코드 확인하기
int responseCode = conn.getResponseCode();
System.out.println("responseCode: "+ responseCode);
문서에 Header에 property로 Authorization을 설정하라고 했으므로 conn에 set 해준다.
(conn은 URL 객체로부터 가져온 HTTP 인스턴스가 들어있다.)
access_token은 controller에 메서드를 작성할 때 매개변수로 가지고 오면 된다.
마지막으로 응답 코드를 확인해 주면
사용자 정보를 카카오에게 요청 완료한 것이다.
요청한 정보 VO에 담기
(JSONObject를 바꿔서 VO에 담기)
- 입력 스트림을 가지고 오고 데이터 읽기
inputStream은 데이터를 바이트의 배열로 읽어 오는 low-level의 메서드이다.
따라서 데이터를 문자 '데이터'로 읽기 위해서 InputStreamReader로 매핑,
데이터를 문자'열'로 읽기 위해서 inputStream을 BufferedReader로 매핑하기!
반복문으로 사용자 정보를 result에 담고, 값을 찍어서 확인해 보기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
String line="";
String result ="";
while((line= br.readLine()) != null) {
result += line;
}
System.out.println("response body: " + result);
2. Gson 라이브러리에 포함된 클래스로 JSON 파싱 하기
//JsonElement.getAsJsonObject().get("key value").getAs 타입();의 형태로 파싱 한다.
일단 문서를 보면 우리가 가지고 와야 하는 응답 데이터를 알 수 있다.
일단 회원번호(id)는 로그아웃할 때 사용해야 해서 가지고 와야 한다.
(로그아웃 방식이 두 가지인데 하나는 필요 없는데, 하나는 필요하다.)
properties에는 우리가 사용자 프로퍼티로 등록한 정보들이 있으므로 꺼낸다.
kakao_account에도 우리가 원하는 정보가 들어있음으로 꺼내야 한다.

element에 result를 담아서 파싱 해준다.
그럼 이 element가 파싱 된 응답 데이터이므로 element에서 JsonObject를 타입에 맞게 꺼내준다.
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
//응답데이터(JSON)
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
Long id = element.getAsJsonObject().get("id").getAsLong();
3. 파싱 된 json 데이터를 string에 담기
id는 그 자체가 필요한 값이므로 건드리지 않아도 되고,
properties랑 kakao_account에서는 우리가 필요한 값을 꺼내면 된다.
여기서 문서를 보면 kakao_account에서 다음과 같이 어떤 값을 꺼낼 수 있는지 적혀있다.
properties는 앱에서 사용자 프로퍼티로 설정한 값들을 꺼낼 수 있다.

코드로 쓰면 다음과 같다.
//properties
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
//kakao_account
String email = kakao_account.getAsJsonObject().get("email").getAsString();
String gender = kakao_account.getAsJsonObject().get("gender").getAsString();
String birthday = kakao_account.getAsJsonObject().get("birthday").getAsString();
String age_range = kakao_account.getAsJsonObject().get("age_range").getAsString();
System.out.println("id: "+ id);
System.out.println("nickname: "+nickname);
4. vo에 담기
vo에 담고 return 해주면 사용자 정보 보기 완료!
//setter이용하여 KakaoVO에 담기
userInfo.setKakaoId(id);
userInfo.setNickname(nickname);
userInfo.setAccount_email(email);
userInfo.setAge_range(age_range);
userInfo.setGender(gender);
userInfo.setBirthday(birthday);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userInfo;
}
위의 메서드를 다시 정리해서 적으면 다음과 같다
(제일 위에 있는 메서드랑 같음)
KakaoService
//회원정보 요청, 사용자 정보 보기
public KakaoVO userInfo(String access_Token) throws IOException {
System.out.println("-------------------------사용자 정보 보기---------------------------");
KakaoVO userInfo = new KakaoVO();
//토큰을 이용하여 카카오에 회원의 정보를 요청한다.
// v1을 통한 '사용자 정보 요청'은 만료되었다.
String reqURl = "https://kapi.kakao.com/v2/user/me";
try {
//URL 객체 생성
URL url = new URL(reqURl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
//연결 완료
//헤더 필드 읽기
//요청에 필요한 Header에 포함 될 내용 // 문서에서 지정해둔 양식
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
//응답코드 확인하기
int responseCode = conn.getResponseCode();
System.out.println("responseCode: "+ responseCode);
//입력스트림을 가지고 오고 데이터 읽기
//inputStream은 데이터를 바이트의 배열로 읽어 오는 low-level의 메서드
//따라서 데이터를 문자 '데이터'로 읽기 위해서 InputStreamReader로 매핑
//데이터를 문자'열'로 읽기 위해서 inputStream을 BufferedReader로 매핑하기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
String line="";
String result ="";
while((line= br.readLine()) != null) {
result += line;
}
System.out.println("response body: " + result);
// Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
//JsonElement.getAsJsonObject().get("key value").getAs타입(); 의 형태로 파싱한다.
//응답데이터(JSON)
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
Long id = element.getAsJsonObject().get("id").getAsLong();
//파싱된 json데이터를 string에 담기
//properties
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
//kakao_account
String email = kakao_account.getAsJsonObject().get("email").getAsString();
String gender = kakao_account.getAsJsonObject().get("gender").getAsString();
String birthday = kakao_account.getAsJsonObject().get("birthday").getAsString();
String age_range = kakao_account.getAsJsonObject().get("age_range").getAsString();
System.out.println("id: "+ id);
System.out.println("nickname: "+nickname);
//setter이용하여 KakaoVO에 담기
userInfo.setKakaoId(id);
userInfo.setNickname(nickname);
userInfo.setAccount_email(email);
userInfo.setAge_range(age_range);
userInfo.setGender(gender);
userInfo.setBirthday(birthday);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userInfo;
}
사용자 정보 보기까지 완료되었다.
이제 이 메서드를 컨트롤러에서 사용하면 된다.
CommonController.java
@RequestMapping("/common")
@Controller
public class CommonController{
@RequestMapping(value = "/kakaologin")
public String login(@RequestParam("code") String code, HttpSession session) throws IOException {
//토큰 발급 받기
String access_Token = kakaoService.getAccessToken(code);
//사용자 정보 가지고 오기
KakaoVO userInfo = kakaoService.userInfo(access_Token);
//세션 형성
session = request.getSession();
System.out.println("accessToken: "+access_Token);
System.out.println("code:"+ code);
System.out.println("Common Controller:"+ userInfo);
System.out.println("nickname: "+ userInfo.getNickname());
System.out.println("email: "+ userInfo.getAccount_email());
System.out.println("gender: "+ userInfo.getGender());
//세션에 담기
if (userInfo.getNickname() != null) {
session.setAttribute("nickname", userInfo.getNickname());
session.setAttribute("access_Token", access_Token);
session.setAttribute("kakaoId", userInfo.getKakaoId());
}
return "common/kakao";
}
}
세션 형성하고 세션에 값들을 담아주었다.
다음 게시물에는 로그아웃을 만들어보겠습니다