๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“• Spring Framework/Spring Project

2022.05.29 ใ€Œ๊ฒฐ์ œ APIใ€

by GroovyArea 2022. 5. 29.
์žฅ๋ฐ”๊ตฌ๋‹ˆ crud ์ž‘์—…ํ•œ ๊ฒƒ์„ ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋ฒˆ ์ฃผ์— ๋๋‚ด๊ณ  ๋‚˜์„œ, ๋’ค๋Šฆ๊ฒŒ ๊ฒฐ์ œ API๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์นด์นด์˜ค ํŽ˜์ด API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ƒ๊ฐ๋งŒํผ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ์–ด๋””์„œ ๋ณธ ๊ฑด๋ฐ ๋งŒ๋“ค์–ด์ง„ API๋ฅผ ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š” ๊ฒƒ๋„ ๋Šฅ๋ ฅ์ด๋ผ๊ณ ..ใ…‹ใ…‹
๊ทธ๋ž˜๋„ ํ•ด์•ผ์ง€ ์–ด์ฉŒ๊ฒ ๋‚˜.

์นด์นด์˜ค ํŽ˜์ด API ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ˆ ๋˜๊ฒŒ ๋‹ค์–‘ํ•œ API๋ฅผ ์†Œ๊ฐœํ•ด ๋†“์•˜๋‹ค. ๊ฒฐ์ œ ์š”์ฒญ๋„ ๋ณด์•ˆ์ƒ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ํ•ด์•ผ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„˜๊ฒจ ์ฃผ๊ณ  ๋ฐ›๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๊ต‰์žฅํžˆ ๋งŽ๋‹ค. ์‹ค๊ฑฐ๋ž˜๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ API๋ผ ํ™•์‹คํžˆ ๋‹ค๋ฅด๊ธด ํ•˜๋‹ค.
๊ฐœ์ธ์ ์ธ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ ํ…Œ์ŠคํŠธ ๊ฒฐ์ œ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๋ฆฌ๋Š” ์ž‘์—…์€ ์ฐธ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์ผ๋‹จ ๊ฒฐ์ œ ์š”์ฒญ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ค๊ณ„ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํฌ๊ฒŒ ๋ณด๋ฉด ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๊ฒฐ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ฒซ ์งธ๋Š” ๋‹จ๊ฑด ๊ฒฐ์ œ์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๊ฒฐ์ œ์ด๋‹ค. 
๊ทธ๋ ‡๊ฒŒ kakao api๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฐ์ œ ์š”์ฒญ์„ ๊ตฌํ˜„ํ•œ ๊ณผ์ •์„ ๋‚˜์—ดํ•ด๋ณด๊ฒ ๋‹ค.

 

์นด์นด์˜ค ํŽ˜์ด API ๊ณต์‹ ๋ฌธ์„œ

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

 

Kakao Developers

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

developers.kakao.com

๋ณด๋‹ค ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋‹ค. ํ•„์š”ํ•œ ๊ฑธ ๊ณจ๋ผ ์“ฐ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. 

๋ถ„์„ํ•˜๋ฉด์„œ ์ด API๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ •๋ง ๋Œ€๋‹จํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. 

 

DB ์„ค๊ณ„ ์—ฌ๋ถ€

๊ธฐ์กด์—๋Š” DB ์„ค๊ณ„๋ฅผ ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.

์ฃผ๋ฌธ, ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜์—ฌ ์ด์šฉํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์นด์นด์˜ค ํŽ˜์ด์—์„œ ๊ฒฐ์ œ ๊ฑด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

๊ทธ๋ž˜์„œ DB ์„ค๊ณ„๋ฅผ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์•˜๋‹ค.

(๊ทผ๋ฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ๊ฒฐ์ œ ๊ฑด์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ์ผํšŒ์„ฑ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด๋‹ค.. ์•Œ๋ฐ” ๋‹ค๋…€์™€์„œ ์ฃผ๋ฌธ ์กฐํšŒ๊นŒ์ง€ ๋งŒ๋“ค์–ด์•ผ๊ฒ ๋‹ค..!)

 

๋‹จ๊ฑด ๊ฒฐ์ œ 

์ œ๋ชฉ๊ณผ ๊ทธ๋Œ€๋กœ ๋‹จ์ผ ์ƒํ’ˆ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ œ ์š”์ฒญ API๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค. 

์นด์นด์˜ค ํŽ˜์ด rest Api๋ฅผ ํ†ตํ•ด ๊ฒฐ์ œ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฒด์ ์œผ๋กœ ๋„˜๊ฒจ์ค„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” api๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. 

๋‹จ๊ฑด ๊ฒฐ์ œ ๊ฑด์ธ๋ฐ๋„ ๋„˜๊ฒจ์ค„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐธ ๋งŽ๋‹ค. 

ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„ ์‚ฌ๋žŒ๋“ค์€ ํ”„๋ŸฐํŠธ๋ฅผ ๊ฐ™์ด ํ•˜๋ฉฐ ajax๋‚˜ ํ”„๋ก ํŠธ ์—”์ง„์„ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ ๋„˜๊ฒจ์ฃผ๋Š”๋ฐ ๋‚˜๋Š” rest api๋งŒ ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋‹ˆ postman์œผ๋กœ ์ง์ ‘ json์„ ๋งŒ๋“ค์–ด์„œ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒŒ ์ฐธ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ด์—ˆ๋‹ค.

 

๊ฒฐ์ œ ๋กœ์ง (๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ rest api ์„ค๊ณ„ ์‹œ ํ๋ฆ„๋„)

ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ์™ธํ•œ ํ๋ฆ„๋„๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค.

1. ๊ฒฐ์ œ ์ค€๋น„

ํด๋ผ์ด์–ธํŠธ (postman์œผ๋กœ json ์š”์ฒญ) => local host server(header, body)  => kakao pay server

 

2. ์นด์นด์˜ค ํŽ˜์ด ์„œ๋ฒ„์˜ ์‘๋‹ต

kakao pay server (์‘๋‹ต ๊ฐ์ฒด) => localhost server (๊ฒฐ์ œ ์š”์ฒญ url) => ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ url ๋ฐ์ดํ„ฐ๋กœ ์‘๋‹ต (postman)

 

3. ํด๋ผ์ด์–ธํŠธ(postman or chrome ๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ๊ฒฐ์ œ ์š”์ฒญ

ํด๋ผ์ด์–ธํŠธ url ์š”์ฒญ => kakao pay server ์‘๋‹ต(qr ์ฝ”๋“œ or ์ „ํ™”๋ฒˆํ˜ธ) 

 

4. ๊ฒฐ์ œ ์ฒ˜๋ฆฌ

qr ์ฝ”๋“œ๋กœ ํ•ธ๋“œ๋ก ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ

 

5. ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต

kakao pay server (๊ฒฐ์ œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ url๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‘๋‹ต) : ์ž๋™ ์š”์ฒญ ์ด๋ฏ€๋กœ ์ด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ postman์—์„œ ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.

 

6. url์„ postman์œผ๋กœ ์š”์ฒญ

ํด๋ผ์ด์–ธํŠธ (postman) => localhost => kakao pay server

 

7. ๊ฒฐ์ œ ์ •๋ณด๋ฅผ ์‘๋‹ต

kakao pay server (์‘๋‹ต ๊ฐ์ฒด) => localhost => ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ์‘๋‹ต

 

์นด์นด์˜ค ํŽ˜์ด ์„œ๋ฒ„์— Request ์š”์ฒญ

๋„˜๊ฒจ์ค„ ๋ฐ์ดํ„ฐ๋Š” ์นœ์ ˆํžˆ ๋ช…์‹œํ•ด ๋†“์•˜๋‹ค. ๊ทธ๊ฑฐ์— ๋งž์ถฐ์„œ ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ์ ์ ˆํžˆ ๋„ฃ์–ด post ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

public String kakaoPayReady(OrderReadyDTO orderReadyDTO, UserDTO user) {

    /* ์„œ๋ฒ„๋กœ ์š”์ฒญํ•  ํ—ค๋”*/
    HttpHeaders headers = new HttpHeaders();
    setHeaders(headers);

    order_id = user.getUserId() + orderReadyDTO.getItem_name();
    userId = user.getUserId();
    itemName = orderReadyDTO.getItem_name();
    totalAmount = orderReadyDTO.getTotal_Amount();

    /* ์„œ๋ฒ„๋กœ ์š”์ฒญํ•  body */
    MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
    setParams(params);
    params.add("partner_order_id", order_id);
    params.add("partner_user_id", userId);
    params.add("item_name", itemName);
    params.add("quantity", String.valueOf(orderReadyDTO.getQuantity()));
    params.add("total_amount", String.valueOf(totalAmount));
    params.add("tax_free_amount", String.valueOf(TAX_FREE_AMOUNT));

    return getUrl(headers, params);
}
private String getUrl(HttpHeaders headers, MultiValueMap<String, String> params) {
    HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<>(params, headers);

    try {
        /* ์„œ๋ฒ„ ์š”์ฒญ ํ›„ ์‘๋‹ต ๊ฐ์ฒด ๋ฐ›๊ธฐ */
        kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + KAKAO_PAY_READY),
                body, KakaoPayReadyVO.class);

        return kakaoPayReadyVO != null ? kakaoPayReadyVO.getNext_redirect_pc_url() : null;
    } catch (RestClientException e) {
        log.error(e.getMessage());
    } catch (URISyntaxException e) {
        log.error(e.getMessage());
    }

    return null;
}

๋ฉ”์„œ๋“œ๊ฐ€ ์ค‘๋ณต์ด ๋งŽ์ด ๋˜์–ด์„œ ์ถ•์•ฝ์„ ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ—ค๋”์™€ ๋ฐ”๋”” ๊ฐ์ฒด๋ฅผ ๋‹ด์•„ uri๋ฅผ ์ƒ์„ฑ ํ›„ restTemplate์˜ postForObject ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์นด์นด์˜ค ํŽ˜์ด ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ํ•˜๋ฉด 

 

=> (๋ฐ‘์—๊นŒ์ง€ ์—„์ฒญ ๋งŽ๋‹ค..)  ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ’์„ ๊ฐ์ฒด๋กœ ๋„˜๊ฒจ์ค€๋‹ค. 

 

public class KakaoPayReadyVO {

    private String tid, next_redirect_pc_url;
    private Date created_at;

    @ConstructorProperties({"tid","next_redirect_pc_url","created_at"})
    public KakaoPayReadyVO(String tid, String next_redirect_pc_url, Date created_at) {
        this.tid = tid;
        this.next_redirect_pc_url = next_redirect_pc_url;
        this.created_at = created_at;
    }

=> ๊ฒฐ์ œ ์ค€๋น„ ๋„˜๊ฒจ๋ฐ›์„ ๊ฐ์ฒด

 

์ดํ•˜ ์•Œ๋ฐ” ๋‹ค๋…€์™€์„œ ์“ฐ์ž

 

๋ฆฌํŒฉํ† ๋ง!

https://sweeeetgoguma.tistory.com/entry/%EA%B2%B0%EC%A0%9C-API-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-1-feat-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B4

 

๊ฒฐ์ œ API ๋ฆฌํŒฉํ† ๋ง - [1] (feat. ์ „๋žต ํŒจํ„ด)

๊ฒฐ์ œ API๋ฅผ ๋ฆฌํŒฉํ† ๋ง ์‹œ์ž‘ํ•˜๋ฉฐ ์™ธ๋ถ€ API๋ฅผ ์—ฐ๋™ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ดค๋‹ค. ๊ธฐ์กด์—๋„ ์นด์นด์˜คํŽ˜์ด๋ฅผ ์ด์šฉํ–ˆ์—ˆ๊ณ , ์ง€๊ธˆ๋„ ์นด์นด์˜คํŽ˜์ด๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ, ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒฐ์ œ API๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ

sweeeetgoguma.tistory.com

 

๋ฐ˜์‘ํ˜•