원지의 개발
article thumbnail
728x90

1. 자바측 API

  • 모든 언어는 API 통신을 위한 라이브러리들이 있음 (예를들어 js에서 비동기 통신을 이용한 카카오, 구글api)
  • 자바에서는 java.net 패키기의 URL클래스, HttpURLConnection클래스 이용하거나 외부라이브러리 HttpClient 이용
  • js에서 ajax로 하는 것을 java에서는 아래의 방식으로 사용

1.1. 통신 방법

1. HttpURLConnection 객체 생성

<java />
URL url = new URL(요청주소); HttpURLConnection conn = (HttpURLConnection) url.openConnection();

2. 요청 메서드 설정

<java />
conn.setRequestMethod("POST"); conn.setDoOutput(true); //상대방 서버로부터 결과를 받아오겠다

3. 효청 헤더 설정 (특정 이름, 값) - 필요한 값들을 담아줌

<java />
conn.setRequestProperty("Authorization", "Bearer " + 토큰값);

여기까지는 필요한 데이터에 대한 setting

4. 데이터 보내기

<java />
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); String req = "보낼데이터"; bw.write(req); bw.flush();

5. 응답 받기

<java />
int result = conn.getResponseCode(); //결과

6. 데이터 받기

<java />
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String result = ""; String str; while( (str = br.readLine()) != null ) { result += str; }

2. GSON


3. 카카오 로그인

https://developers.kakao.com/docs/latest/ko/kakaologin/common#login

1. 플랫폼 사용 도메인 설정
2. 동의항목 선택
3. 카카오로그인 개념 이해
4. REST API 이해
5. Redirect URL 입력
6. 내 프로젝트의 화면에서 시작
7. JAVA(서버) 측에서 통신

3.1. 이해

https://developers.kakao.com/docs/latest/ko/kakaologin/common

3.2. 실습 - javascript

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

출처: kakao developers

  • OpenID Connection: 카카오 로그인 시 액세스 토큰과 ID 토큰을 함께 발급

출처: kakao developers

  • 카카오톡 채널은 원래 비즈니스용으로 해야하지만, 테스트용으로도 만들 수 있음

2023.01.06 - [클라이언트/JavaScript] - [JavaScript] AJAX, API, fetch, Promise, then, json, xml

 

[JavaScript] AJAX, API, fetch, Promise, then, json, xml

ES5 ▶ XMLHttpRequest, fetch(), ajax(), Axois 등 XMLHttpRequest: ajax 프로그램에 사용할 수 있는 객체 AJAX (비동기 통신) Asynchronous Javascript ans XML 웹페이지의 이동 없이 필요한 데이터만 전송하는 기술 ex) 구글

j-won950101.tistory.com

https://developer-sudal.tistory.com/77

 

[JS] 카카오 로그인 API 구현 방법

java script 의 openAPI 를 이용해서 직접 만든 사이트의 로그인 부분에 카카오 로그인을 구현해보려고 합니다. 카카오는 카카오 디벨로퍼에 openAPI가 잘 설명되어 있어서 어떤 기능이 있고 어떻게 구

developer-sudal.tistory.com

3.3. BootMyWeb - java

회원 정보 페이지는 로그인 후 진입 가능

  • 로그인이 되어 있지 않으면 /main으로 진입 불가 (인터셉터 사용)
  • 회원가입도 /main 진입 전 사용

  • 카카오 로그인 누른 후 연결할 Redirect URI 설정

3.3.1. 1. 요청 - 인가

<java />
<script th:inline="javascript"> //폼 제출과는 관계X $(".kakaoBtn").click(function () { location.href = "https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code" }) </script>
  • ${ } 들어내고 내 api key와 컨트롤러로 보낼 uri 넣기
<java />
@Controller @RequestMapping("/user") public class UserController { @Autowired //서비스 영역과 같음 private KakaoAPI kakaoAPI; //카카오 redirect_uri @GetMapping("/kakao") public String kakao(@RequestParam("code") String code) { System.out.println("인가코드:" + code); return "redirect:/main"; }

  • 컨트롤러에 연결한 카카오 redirect_uri 넣기
  • 인가 코드를 받아오는 것을 옛날에는 클라이언트에서 처리했지만 지금은 서버에서 처리

3.3.2. 2-1. 토큰 받기

  • KakaoAPI 만들어서 아까 받은 인가 코드로 토큰 받고, 토큰 기반으로 유저 정보 얻어오는 기능 생성

  • 필수 파라미터를 포함한 POST로 요청
  • 요청시 content-type이 폼데이터 형식이므로 본문에 키=값&키=값... 식으로 담기
<java />
@Component("kakao") //정확히 정해진 역할 없이 빈으로 정하고 싶으면 component 어노테이션 public class KakaoAPI { //application.properties @Value("${kakao.client.id}") private String clientId; //토큰발급기능 public String getAccessToken(String code) { String requestURL = "https://kauth.kakao.com/oauth/token"; String redirect_uri= "http://127.0.0.1:8484/user/kakao"; String refresh_token = ""; String access_token = ""; //post의 폼데이터 형식 키=값&키=값... String data = "grant_type=authorization_code" + "&client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&code=" + code; try { URL url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); //post형식 conn.setDoOutput(true); //카카오서버로부터 데이터 응답을 허용 //데이터 전송을 위한 클래스 //OutputStream out = conn.getOutputStream(); //OutputStreamWriter osw = new OutputStreamWriter(out); //BufferedWriter br = new BufferedWriter(osw); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(conn.getOutputStream())); bw.write(data); bw.flush(); //응답 결과를 conn객체에서 받음 System.out.println( "요청결과:" + conn.getResponseCode() ); if(conn.getResponseCode() == 200 ) { //요청성공 BufferedReader br = new BufferedReader(new InputStreamReader( conn.getInputStream() )); String result = ""; String str = null; while( (str = br.readLine() ) != null ) { //한줄씩읽음 - 읽을값이 없다면 null result += str; } System.out.println(result); //제이슨 데이터 분해 JsonParser json = new JsonParser(); //com.google.~~ JsonElement element = json.parse(result); //json데이터 전달 JsonObject obj = element.getAsJsonObject(); //json오브젝트 형변환 access_token = obj.get("access_token").getAsString(); refresh_token = obj.get("refresh_token").getAsString(); } } catch (Exception e) { e.printStackTrace(); } return access_token; }​

  • 컨트롤러에서 받아온 인가코드를 넣어서 요청한 다음

  • 요청 결과를 conn 객체에서 받음
  • BufferedReader 이용해서 한 줄씩 읽기
    위의 응답 결과가 나옴

<java />
//제이슨 파서 implementation 'com.google.code.gson:gson:2.8.5'
  • build.gradle에 GSON 추가

  • 제이슨 데이터 분해 후 access_token 리턴

3.3.3. 2-2. 토큰 기반으로 유저 정보 얻기

 

<java />
//토큰 기반으로 유저정보 얻기 public Map<String, Object> getUserInfo(String access_token) { //데이터 저장할 map Map<String, Object> map = new HashMap<>(); String requestURL = "https://kapi.kakao.com/v2/user/me"; try { URL url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); //post형식 conn.setDoOutput(true); //카카오서버로부터 데이터 응답을 허용 //헤더에 토큰정보를 추가 conn.setRequestProperty("Authorization", "Bearer " + access_token); System.out.println("토큰요청결과:" + conn.getResponseCode() ); if(conn.getResponseCode() == 200 ) { BufferedReader br = new BufferedReader(new InputStreamReader( conn.getInputStream() )); String result = ""; String str = null; while( (str = br.readLine() ) != null ) { //한줄씩읽음 - 읽을값이 없다면 null result += str; } System.out.println(result); //추가로 뽑은 것 JsonParser json = new JsonParser(); JsonElement element = json.parse(result); //json에서 key를 꺼내고, 다시 key를 꺼낸다. JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject(); JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject(); String nickname = properties.getAsJsonObject().get("nickname").getAsString(); String email = kakao_account.getAsJsonObject().get("email").getAsString(); //맵에 저장 map.put("nickname", nickname); map.put("email", email); } } catch (Exception e) { e.printStackTrace(); } return map; }

3.3.4. 3. UserController - 서비스 데이터베이스 가입, 탈퇴 등 회원 정보 처리

<java />
//카카오 redirect_uri @GetMapping("/kakao") public String kakao(@RequestParam("code") String code) { System.out.println("인가코드:" + code); String token = kakaoAPI.getAccessToken(code); System.out.println("어세스토큰:" + token); Map<String, Object> map = kakaoAPI.getUserInfo(token); System.out.println("사용자데이터(닉네임, 이메일):" + map.toString()); //서비스 데이터베이스(Database)의 가입, 탈퇴 등 회원 정보 처리는 서비스에서 자체 구현 //카카오는 서비스 데이터에 접근하지 않으므로 회원 정보를 대신 저장하거나 삭제할 수 없음 //서비스 서버는 카카오로부터 받은 사용자 정보로 회원가입 되어 있는지 확인 //1. 이미 회원 - 해당 사용자의 로그인에 대한 세션 발급 후, 로그인 완료 처리 //2. 회원 X - 카카오에서 받은 정보로 서비스 데이터베이스에 회원가입 처리 return "redirect:/main"; }

오늘 하루

더보기

기억에 남는 부분

 

어려운 부분

 

문제 해결 부분

 

728x90
profile

원지의 개발

@원지다

250x250