Develop/API

์นด์นด์˜ค ๋กœ๊ทธ์ธ API ๊ตฌํ˜„ ํ•˜๊ธฐ (REST API ๋ฐฉ์‹)

hello_u 2023. 3. 26. 22:53

 

 ์นด์นด์˜ค ๋กœ๊ทธ์ธ API (OAuth 2.0)

 

 ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ์ˆ˜๋งŽ์€ ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์Œ

 

๋˜ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ ๋˜ํ•œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋‹ด

 

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ

 

 

์นด์นด์˜ค API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1. ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์— ๊ฐ€์ž…ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋กํ•˜๊ธฐ

 

์นด์นด์˜ค API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์— ๊ฐ€์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ€์ž… ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋กํ•˜๊ณ , ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ๊ธฐ๋Šฅ๊ณผ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

 

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

 

2. SDK ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์ •ํ•˜๊ธฐ

 

์นด์นด์˜ค API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ SDK๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ , ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์นด์นด์˜ค REST API๋Š” SDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

3. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

 

SDK๋ฅผ ์„ค์ •ํ•œ ํ›„, ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ API๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ

 

๋กœ๊ทธ์ธ ์š”์ฒญ ์ฃผ์†Œ(GET)

GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code HTTP/1.1
Host: kauth.kakao.com
<a class="p-2" href="https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=http://localhost:8080/auth/kakao/callback&response_type=code">
    <img th:src="@{/img/kakao_login_medium.jpg}" style="height:60px"/> </a>

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋™์˜ ํ™”๋ฉด์„ ํ˜ธ์ถœํ•˜๊ณ , ์‚ฌ์šฉ์ž ๋™์˜๋ฅผ ๊ฑฐ์ณ ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋™์˜ ํ™”๋ฉด

 

Redirect URI : ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ•œ ๋’ค์— ์‘๋‹ต๋ฐ›์„ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 

์นด์นด์˜ค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋“ค์„ Redirect URI์— ์ „๋‹ฌํ•œ๋‹ค. 

 

 

Response ์ธ๊ฐ€ ์ฝ”๋“œ ํš๋“

 

์„œ๋น„์Šค ์„œ๋ฒ„๋Š” redirect_uri๋กœ HTTP 302 ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ ์š”์ฒญ์˜ Location์—์„œ ์ธ๊ฐ€ ์ฝ”๋“œ ๋˜๋Š” ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ธ๊ฐ€ ์ฝ”๋“œ๋Š” ๋™์˜ ํ™”๋ฉด์„ ํ†ตํ•ด ์ธ๊ฐ€๋ฐ›์€ ๋™์˜ ํ•ญ๋ชฉ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ† ํฐ ๋ฐ›๊ธฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

4. ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ›์•„์˜ค๊ธฐ

 

์ธ๊ฐ€ ์ฝ”๋“œ๋กœ ํ† ํฐ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

 

์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐ›๊ธฐ๋งŒ์œผ๋กœ๋Š” ์นด์นด์˜ค ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ† ํฐ ๋ฐ›๊ธฐ๊นŒ์ง€ ๋งˆ์ณ์•ผ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ, ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ํ›„, ํ•ด๋‹น ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ ์ฃผ์†Œ(POST)

curl -v -X POST "https://kauth.kakao.com/oauth/token" \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -d "grant_type=authorization_code" \
 -d "client_id=${REST_API_KEY}" \
 --data-urlencode "redirect_uri=${REDIRECT_URI}" \
 -d "code=${AUTHORIZE_CODE}"

 

ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํฌํ•จํ•ด POST๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. 

 

POST ๋ฐฉ์‹ - ์ฟผ๋ฆฌ์ŠคํŠธ๋ง(GET๋ฐฉ์‹)์ด ์•„๋‹Œ  http body ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ 

 

 

//HttpHeader ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");

Content-Type: application/x-www-form-urlencoded 

 

-->   http body ๋ฐ์ดํ„ฐ๊ฐ€ key=value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ—ค๋”์— ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

Parameter

 

//HttpBody ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type","authorization_code");
params.add("client_id","{REST_API_KEY}");
params.add("redirect_uri","http://localhost:8080/auth/kakao/callback");
params.add("code",code);

 

HTTP body ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. (POST ๋ฐฉ์‹) 

 

 

// HttpHeader์™€ HttpBody๋ฅผ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ์— ๋‹ด๊ธฐ
HttpEntity<MultiValueMap<String,String>> kakaoTokenRequest =
        new HttpEntity<>(params,headers);

 

RestTemplate.exchange() ๋ฉ”์„œ๋“œ๊ฐ€ HttpEntity ๋ฅผ ๊ฐ–๊ธฐ๋•Œ๋ฌธ์— 

 

HttpHeader์™€ HttpBody๋ฅผ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ์— ๋‹ด๋Š”๋‹ค.

 

 

RestTemplate rt = new RestTemplate();

//Http POST ๋ฐฉ์‹ ์š”์ฒญ - response ๋ณ€์ˆ˜ ์‘๋‹ต
ResponseEntity<String> response = rt.exchange(
        "https://kauth.kakao.com/oauth/token",   // ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ ์ฃผ์†Œ
        HttpMethod.POST,
        kakaoTokenRequest,
        String.class
);

 

 

RestTemplate.exchange() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉ

 

์š”์ฒญ ์„ฑ๊ณต ์‹œ ์‘๋‹ต์€ ํ† ํฐ๊ณผ ํ† ํฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.

 

 

# ์ฐธ๊ณ  : RestTemplate

๋”๋ณด๊ธฐ

RestTemplate์€ Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

RESTful ์›น ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

RestTemplate์„ ์‚ฌ์šฉํ•˜๋ฉด GET, POST, PUT, DELETE ๋“ฑ์˜ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ ํ—ค๋”์™€ ์‘๋‹ต ํ—ค๋”, ์ฟ ํ‚ค, JSON ๋ฐ XML ๋ฉ”์‹œ์ง€์˜ ๋ณ€ํ™˜ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

exchange()

 

RestTemplate์˜ exchange() ๋ฉ”์„œ๋“œ๋Š” HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ทธ์— ๋Œ€ํ•œ HTTP ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๋ฉ”์„œ๋“œ๋Š” HTTP ๋ฉ”์„œ๋“œ, ์š”์ฒญ URL, ์š”์ฒญ ํ—ค๋”, ์š”์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ ๋ฐ ์‘๋‹ต ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋“ฑ์˜

 

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์„œ HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ ,

 

HTTP ์‘๋‹ต์„ ๋ฐ›์•„์„œ ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

exchange() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์–‘ํ•œ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ,

 

์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด exchange() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RestTemplate restTemplate = new RestTemplate();
String url = "https://api.example.com/user/{userId}";
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + accessToken);
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<User> response = restTemplate.exchange(url, HttpMethod.GET, entity, User.class, userId);
User user = response.getBody();

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” url ๋ณ€์ˆ˜์— ์š”์ฒญํ•  URL์„ ์ง€์ •ํ•˜๊ณ , headers ๋ณ€์ˆ˜์— ์š”์ฒญ ํ—ค๋”๋ฅผ ์„ค์ •ํ•œ ํ›„ HttpEntity ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ด HttpEntity ๊ฐ์ฒด๋Š” ์š”์ฒญ ํ—ค๋”์™€ ์š”์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  exchange() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์š”์ฒญ ๋ฉ”์„œ๋“œ(HttpMethod.GET), HttpEntity ๊ฐ์ฒด, ์‘๋‹ต ๋ฐ์ดํ„ฐ ํƒ€์ž…(User.class),

 

๊ทธ๋ฆฌ๊ณ  URL ๋ณ€์ˆ˜(userId)๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ResponseEntity ๊ฐ์ฒด์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ user ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Response 

Response : ํ† ํฐ๊ณผ ํ† ํฐ ์ •๋ณด

 

{
    "token_type":"bearer",
    "access_token":"${ACCESS_TOKEN}",
    "expires_in":43199,
    "refresh_token":"${REFRESH_TOKEN}",
    "refresh_token_expires_in":25184000,
    "scope":"account_email profile"
}

 

Response : JSON ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต๋ฐ›์Œ 

 

JSON ๋ฐ์ดํ„ฐ๋ฅผ Java์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ์— ๋‹ด๋Š”๋‹ค. (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์šฉ - Gson, Json Simple, ObjectMapper)

 

 

//Gson, Json Simple, ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
OAuthToken oAuthToken = null;

try {
    oAuthToken = objectMapper.readValue(response.getBody(), OAuthToken.class);
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

 

ObjectMapper ๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ๋ฐ์ดํ„ฐ๋ฅผ Java ๊ฐ์ฒด์— ๋งคํ•‘

 

 

# ์ฐธ๊ณ  : ObjectMapper (JSON ํŒŒ์‹ฑ)

๋”๋ณด๊ธฐ

๋ฌธ์ž๋กœ ๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ objectMapper ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

JSON ํŒŒ์ผ์„ Java ๊ฐ์ฒด๋กœ deserialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ readValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

ObjectMapper

 

ObjectMapper๋ฅผ ์ด์šฉํ•˜๋ฉด JSON์„ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

 

๋ฐ˜๋Œ€๋กœ Java ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋กœ serialization ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Java Object → JSON

 

Java ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ serialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ writeValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

// Java Object ->  JSON
        Person person = new Person("zooneon", 25, "seoul");
        try {
            objectMapper.writeValue(new File("src/person.json"), person);
        } catch (IOException e) {
            e.printStackTrace();
        }

์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ JSON์„ ์ €์žฅํ•  ํŒŒ์ผ๊ณผ ์ง๋ ฌํ™”์‹œํ‚ฌ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

JSON → Java Object

 

JSON ํŒŒ์ผ์„ Java ๊ฐ์ฒด๋กœ deserialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ readValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

// JSON -> Java Object
        String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";
        try {
            Person deserializedPerson = objectMapper.readValue(json, Person.class);
            System.out.println(deserializedPerson);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ JSON ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด or ๊ฐ์ฒด์™€ ์—ญ์ง๋ ฌํ™” ์‹œํ‚ฌ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

 

ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

 

GET/POST /v2/user/me HTTP/1.1
Host: kapi.kakao.com
Authorization: Bearer ${ACCESS_TOKEN}/KakaoAK ${APP_ADMIN_KEY}
Content-type: application/x-www-form-urlencoded;charset=utf-8

 

์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ํ† ํฐ์„ ํ—ค๋”(Header)์— ๋‹ด์•„ GET ๋˜๋Š” POST๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

 

//HttpHeader ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
HttpHeaders headers2 = new HttpHeaders();
headers2.add("Authorization"," Bearer "+oAuthToken.getAccess_token());
headers2.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");

 

HttpHeader ๋ฅผ ์ƒ์„ฑํ›„ ์•ก์„ธ์Šค ํ† ํฐ๊ณผ content-type์„ ๋‹ด๋Š”๋‹ค.

 

HttpEntity<MultiValueMap<String,String>> kakaoProfileRequest2 =
        new HttpEntity<>(headers2);

 

RestTemplate.exchange() ๋ฉ”์„œ๋“œ๊ฐ€ HttpEntity ๋ฅผ ๊ฐ–๊ธฐ๋•Œ๋ฌธ์—

 

HttpHeader๋ฅผ HttpEntity์— ๋‹ด๋Š”๋‹ค. 

 

//Http POST ๋ฐฉ์‹ ์š”์ฒญ - response ๋ณ€์ˆ˜ ์‘๋‹ต
ResponseEntity<String> response2 = rt2.exchange(
        "https://kapi.kakao.com/v2/user/me",   // ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ ์ฃผ์†Œ
        HttpMethod.POST,
        kakaoProfileRequest2,
        String.class
);

RestTemplate.exchange() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉ

 

์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ ์„ฑ๊ณต ์‹œ, ์‘๋‹ต ๋ฐ”๋””(Body)๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•œ JSON ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

์š”์ฒญ ์„ฑ๊ณต : ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•œ JSON ๊ฐ์ฒด

 

JSON ํŒŒ์ผ์„ Java ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž  

 

 

https://www.jsonschema2pojo.org/

 

jsonschema2pojo

Reference properties For each property present in the 'properties' definition, we add a property to a given Java class according to the JavaBeans spec. A private field is added to the parent class, along with accompanying accessor methods (getter and sette

www.jsonschema2pojo.org

 

 

jsonschema2pojo

 

jsonschema2pojo๋Š” JSON ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

Property word delimiters ๊ฐ€ ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ์—†์• ๋„๋ก ํ•˜์ž 

 

 

ObjectMapper objectMapper2 = new ObjectMapper();
KakaoProfile kakaoProfile = null;
try {
    kakaoProfile = objectMapper2.readValue(response2.getBody(), KakaoProfile.class);
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

 

JSON ํŒŒ์ผ์„ jsonschema2pojo ํ†ตํ•ด์„œ ์ƒ์„ฑํ•œ Java ํด๋ž˜์Šค ๊ฐ์ฒด๋กœ deserialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

 

ObjectMapper์˜ readValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

 

System.out.println(" ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ = " + kakaoProfile.getKakao_account().getEmail());
System.out.println(" ์‚ฌ์šฉ์ž ์ด๋ฆ„ = " + kakaoProfile.getProperties().getNickname());

 

์ด์ œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

์ถœ๋ ฅ

 

 

 

 

 

5. ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ, ์นด์นด์˜ค ๋กœ๊ทธ์•„์›ƒ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๊ทธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ† ํฐ์„ ๋งŒ๋ฃŒ์‹œ์ผœ ํ•ด๋‹น ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ ๋” ์ด์ƒ ์นด์นด์˜ค API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ

 

์นด์นด์˜ค๊ณ„์ •๊ณผ ํ•จ๊ป˜ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์€ ์นด์นด์˜ค๊ณ„์ • ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ ํ›„

 

Logout Redirect URI๋กœ 302 ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(Redirect)ํ•˜์—ฌ ์„œ๋น„์Šค ๋กœ๊ทธ์•„์›ƒ๊นŒ์ง€ ์—ฐ์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Logout Redirect URI ์„ค์ •

 

 

href="https://kauth.kakao.com/oauth/logout?client_id=${REST_API_KEY}&logout_redirect_uri=http://localhost:8080/auth/kakao/logout">๋กœ๊ทธ์•„์›ƒ</a>

 

 

 

๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์นด์นด์˜ค ๋กœ๊ทธ์•„์›ƒ API๋ฅผ ํ˜ธ์ถœ

 

 

 

๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต -> ๋ฉ”์ธ ํŽ˜์ด์ง€

 

 

REST API๋ฅผ ์‚ฌ์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ

 

์นด์นด์˜ค REST API๋Š” SDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

REST API๋Š” ์›น ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์นด์นด์˜ค REST API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” HTTP ์š”์ฒญ์„ ๊ตฌ์„ฑํ•˜๊ณ , ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์นด์นด์˜ค REST API๋Š” HTTP ์š”์ฒญ์— ํ•„์š”ํ•œ URL, HTTP ๋ฉ”์†Œ๋“œ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์„ ์ œ๊ณตํ•˜๊ณ , ์‘๋‹ต์€ JSON ํ˜•ํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ, ๋ฉ”์‹œ์ง€ ์ „์†ก ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

REST API ๋ฅผ ์‚ฌ์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ณผ์ •