이상형 월드컵, 굿즈 판매 개인 프로젝트를 진행하는 도중, 굿즈 결제 부분은 포트원 카카오페이 API를 활용하기로 했다.

 

https://portone.io/korea/ko

 

포트원 | 온라인 비즈니스 성장을 돕는 기업

포트원이 제공하는 단 한 줄의 코드로 세상의 모든 결제를 손쉽게 연동해보세요. PG사 통합결제 연동, 해외결제, 파트너 정산 관리, 결제 애널리틱스, 수수료 혜택까지, 포트원의 맞춤 컨설팅을

portone.io

우선 포트원 사이트에 가서 회원가입을 하고 로그인을 한다.

 

 

연동 정보에서 식별코드 탭에 가면 본인의 식별코드, 시크릿 키 등을 확인할 수 있다. 이 코드들은 유출되지 않도록 주의한다.

 

 

 

그리고 채널 관리 탭에 가서 사용할 결제 대행사를 선택 후, 등록을 한다. 단순 테스트를 하고 싶으면 테스트, 실제로 연동을 하고 싶으면 실연동으로. 내 프로젝트는 그저 포트폴리오용이니까 당연히 테스트로

 

 

 

 

<!-- jQuery CDN 추가 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- 아임포트 스크립트 추가 -->
<script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.2.0.js"></script>

 

해당 API를 사용할 HTML의 헤드 부분에 추가한다.

 

 

 

 

 

<input class="purchase-button" onclick="handlePayment('kakaopay', 'card')" value="구매하기" type="button">
// 아임포트 코드
var impCode = '본인 아임포트 코드';

function handlePayment(pg, payMethod) {
    const checkAgree = document.querySelector('.check-agree');
    if (!checkAgree.checked) {
        checkAgree.nextElementSibling.style.color = 'red';
        return;
    }
    const url = new URL(window.location.href);  // url 객체

    const urlParams = url.searchParams;         // 해당 주소에서 파라미터들 가져오기
    const merchantUid = urlParams.get("index"); // 주문 고유 index

    console.log("handlePayment");
    console.log(pg);
    console.log(payMethod);


    // 결제하기 버튼 클릭 시 결제 요청
    IMP.init(impCode);
    IMP.request_pay({
        pg: pg,
        pay_method: payMethod,
        merchant_uid: merchantUid, // 주문번호 생성
        name: document.querySelector('.product-name').value,        // 제품 이름
        amount: document.querySelector('.price').value,             // 결제 가격
        buyer_name: document.querySelector('.buyerName').value      // 주문한 사람
    }, function(rsp) {
        if (rsp.success) {
            // 결제 성공 시
            console.log(rsp.imp_uid);
            $.ajax({
                type: 'POST',
                url: '/api/v1/payment/validation/' + rsp.imp_uid
            }).done(function(data) {
                console.log(data);
                // 결제 금액 일치. 결제 성공 처리
                $.ajax({
                    url: "/api/v1/payment/check/" + merchantUid,
                    method: "post",
                    contentType: "application/json"
                }).then(function(res) {
                    // saveOrder(merchantUid);
                    alert("[결제 완료] 제품을 기다려주십시오.");
                    location.href = '/store/';
                }).catch(function(error) {
                    // 금액이 맞지 않아 결제 실패시 환불처리 및 주문취소
                    $.ajax({
                        url: "/api/v1/payment/cancel/" + rsp.imp_uid,
                        method: "post",
                        contentType: "application/json"
                    }).done(function(data) {
                        cancelOrder('no');
                    }).catch(function(error) {
                        alert('환불에 실패하였습니다.');
                    });
                });
            }).catch(function(error) {
                alert('결제에 실패하였습니다. ' + rsp.error_msg);
            });
        } else {
            alert(rsp.error_msg);
        }
    });
}

 

자바스크립트 로직. 일단 결제를 성공한 후, 만약 유저가 악의적으로 HTML로 금액을 조작한 후, 결제한 것이라면 바로 결제가 취소되고 주문이 취소되도록 하였다.

 

 

 

 

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
<dependency>
    <groupId>com.github.iamport</groupId>
    <artifactId>iamport-rest-client-java</artifactId>
    <version>0.2.22</version>
</dependency>

 

자바에서 아임포트 클라이언트를 활용하기 위해 pom.xml에 레포시토리와 의존성을 추가하였다.

 

 

 

 

#iamport
imp.code=본인 아임포트 코드
imp.api.key=본인 api 키
imp.api.secretkey=본인 시크릿키

 

애플리케이션 프로퍼티로 가서 위에서 발급받은 본인의 아임포트 코드, api 키, 시크릿키를 작성한다. 자바에서 그대로 사용하면 유출의 위험이 있기 때문이다.

 

 

 

@Service
@Slf4j
@RequiredArgsConstructor
public class PaymentService {
    private final AdminMapper adminMapper;
    private final StoreMapper storeMapper;
    private IamportClient iamportClient;

    @Value("${imp.api.key}")
    private String apiKey;

    @Value("${imp.api.secretkey}")
    private String secretKey;

    @PostConstruct
    public void init() {
        this.iamportClient = new IamportClient(apiKey, secretKey);
    }

    /**
     * 아임포트 서버로부터 결제 정보를 검증
     * @param imp_uid
     */
    public IamportResponse<Payment> validateIamport(String imp_uid, HttpSession session) {
        try {
            IamportResponse<Payment> payment = iamportClient.paymentByImpUid(imp_uid);
            log.info("결제 요청 응답. 결제 내역 - 주문 번호: {}", payment.getResponse());

            // 내가 결제한 정보들을 객체에 집어넣기
            GoodsOrderDto userOrder = new GoodsOrderDto();
            userOrder.setIndex(Integer.parseInt(payment.getResponse().getMerchantUid()));
            userOrder.setTitle(payment.getResponse().getName());
            userOrder.setUserEmail(payment.getResponse().getBuyerName());
            userOrder.setPrice(payment.getResponse().getAmount().intValue());
            session.setAttribute("userOrder", userOrder);   // 세션에 등록
            return payment;
        } catch (Exception e) {
            log.info(e.getMessage());
            return null;
        }
    }

    /**
     * 아임포트 서버로부터 결제 취소 요청
     *
     * @param imp_uid
     * @return
     */
    public IamportResponse<Payment> cancelPayment(String imp_uid) {
        try {
            CancelData cancelData = new CancelData(imp_uid, true);
            IamportResponse<Payment> payment = iamportClient.cancelPaymentByImpUid(cancelData);
            return payment;
        } catch (Exception e) {
            log.info(e.getMessage());
            return null;
        }
    }

    /**
     * 금액 맞는지 아닌지 체크
     */
    public Result check(int goodsOrderId, HttpSession session){
        GoodsOrderDto dbGoodsOrder = this.adminMapper.selectGoodsOrderByIndex(goodsOrderId);    // DB에 있는 값
        GoodsOrderDto userGoodsOrder = (GoodsOrderDto) session.getAttribute("userOrder");       // 유저 결제 내용
        UserEntity user = (UserEntity) session.getAttribute("user");                            // 유저
        if (dbGoodsOrder.getPrice() - dbGoodsOrder.getPrice() * dbGoodsOrder.getDiscount()/100 != userGoodsOrder.getPrice()) {
            System.out.println("가격 문제");
            return CommonResult.FAILURE;
        }
        if (goodsOrderId != userGoodsOrder.getIndex()) {
            System.out.println("인덱스 문제");
            return CommonResult.FAILURE;
        }
        if (!dbGoodsOrder.getTitle().equals(userGoodsOrder.getTitle())) {
            System.out.println("굿즈 이름 문제");
            return CommonResult.FAILURE;
        }
        if (!dbGoodsOrder.getUserEmail().equals(user.getEmail())) {
            System.out.println("유저 이름 문제");
            return CommonResult.FAILURE;
        }
        if (dbGoodsOrder.isPaid()) {
            System.out.println("이미 결제");
            return CommonResult.FAILURE;
        }
        dbGoodsOrder.setPaid(true);
        this.storeMapper.updateGoodsOrder(dbGoodsOrder);
        return CommonResult.SUCCESS;
    }

}
@RestController
@RequestMapping("/api/v1/payment")
@RequiredArgsConstructor
@Slf4j
public class PaymentController {
    private final PaymentService paymentService;

    // 결제하기
    @PostMapping("/validation/{imp_uid}")
    public IamportResponse<Payment> validateIamport(
            @PathVariable String imp_uid,
            HttpSession session
    ) throws IamportResponseException, IOException {
        log.info("imp_uid: {}", imp_uid);
        log.info("validateIamport");
        return paymentService.validateIamport(imp_uid, session);
    }

    // 금액 맞는지 체크
    @PostMapping("/check/{goodsOrderId}")
    public ResponseEntity<String> processOrder(
            @PathVariable int goodsOrderId,
            Exception ex,
            HttpSession session
    ) {
        Result result = this.paymentService.check(goodsOrderId, session);
        if (result == CommonResult.FAILURE) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        return ResponseEntity.ok("성공");
    }

    // 결제 취소(환불)
    @PostMapping("/cancel/{imp_uid}")
    public IamportResponse<Payment> cancelPayment(@PathVariable String imp_uid) throws IamportResponseException, IOException {
        return paymentService.cancelPayment(imp_uid);
    }
}

 

전체 서비스와 컨트롤러. 우선 해당 결제을 식별하는 주문 번호를 카테고리로 가져와서 결제를 진행한다. 그러면 결제 완료.

 

하지만 결제 부분만 완성한다면, 어떤 유저가 악의적으로 금액을 수정해서 결제하는 것을 막을 수 없다. 특히 내 프로젝트는 장바구니 시스템이 곧 주문이다. 그러므로 상대적으로 금액이 낮은 제품을 우선 주문하고, 그 후 금액 높은 제품을 다시 주문하여 그 제품의 정보들을 이미 등록한 금액 낮은 제품의 정보로 등록하여 결제하는 편법을 쓸 수 있다.

 

그래서 우선 결제 부분에서 내가 주문한 정보들을 세션에 집어넣고, 검토 부분에서 내 주문의 정보들과 DB에 등록된 주문 정보가 맞는지 확인하는 컨트롤러 작성 후, ResponseEntity 방식으로 금액이 맞다면 ok, 틀리다면 일부러 오류를 내서 환불처리 POST를 진행하도록 한다. 위와 같은 편법을 쓸 경우 금액 높은 제품이 아닌 편법으로 등록해놓았던 금액 낮은 제품이 대신 결제완료 된다.

 

 

 

 

 

 

시연 결과 제대로 작동하는 것을 확인하였다.

 

약간 아쉬운 부분은, 포트원 api의 구현방식을 염두해 두지 않고 주문 테이블을 만들었기에, 고유 주문번호를 랜덤 숫자문자 16자리가 아닌 그냥 인덱스 식별값으로 집어넣은 점이 아쉽고, 이미 주문하기 부분을 구현해 놓은 상태였기에 포트원 api에서 권장하는 주문하기 기능을 활용하지 못한 점이 아쉽다.

 

포트원의 KG 이니시스 방식도 이 처럼 구현하는 방식이 같기 때문에 나중에 똑같은 방식으로 구현하면 좋을 것 같다.

'API' 카테고리의 다른 글

[API] 카카오 로그인 API 구현  (0) 2024.05.13
[API] 카카오 지도 API 추가하기  (0) 2024.03.25
[API] 다음 주소 찾기 API  (0) 2024.01.24

새로운 개인 프로젝트를 진행하게 되었다. 그 프로젝트에서 카카오 로그인을 구현하려 한다.

 

카카오 로그인 API는 다음과 같이 구현된다. 

 

 

 

 

 

 

우선 유저 DB는 다음과 같다. 맨 마지막 컬럼 BOOLEAN 형식의 `is_kakao`는 해당 유저가 카카오 유저인지 밝혀주는 역할을 한다.

 

 

 

https://developers.kakao.com/console/app 우선 카카오 developers 사이트에 가서 내 애플리케이션을 누르면 다음과 같은 화면이 뜬다. 애플리케이션 추가하기를 눌러 본인이 원하는 대로 설정한 후 등록한다.

 

 

 

 

 

 

등록 후 클릭해서 들어가면 앱키가 나오는데, 여기서 REST API 키가 중요하다. 복사하자.

 

 

 

로그인 완료 시, 리다이렉트 할 경로이다. 나는 다음과 같이 등록하였다.

 

 

 

 

 

 

로그인 시, 동의 받을 개인정보, 닉네임, 프로필사진, 카카오계정에 다음과 같이 필수동의로 설정해놓자.

 

 

 

 

 

// 로그인 페이지
@RequestMapping(value = "/login", method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView getLogin() {
    String client_id = "8908f5fd6288606dcad177472698dfbf";
    String redirect_uri = "http://localhost:8080/auth_kakao";
    String location = "https://kauth.kakao.com/oauth/authorize?response_type=code&client_id="+ client_id +"&redirect_uri="+ redirect_uri;

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("location", location);
    modelAndView.setViewName("/user/login");
    return modelAndView;
}

 

이미 만들어놓은 일반적인 로그인 페이지 부분 GET 맵핑을 다음과 같이 수정한다. 우선 client_id 부분은 위에서 복사해놓은 REST API 키를 붙여놓고, redirect_uri 역시 위에서 설정해놓은 리다이렉트 경로를 붙여넣기 한다.

location 경로는 내 REST API키와 리다이렉트 경로를 파라미터로 가지고 있는 카카오 로그인 페이지 화면이다. 모델 뷰로 이 경로를 가지고 HTML로 가서

 

 

 

 

여기 카카오 로그인 버튼 a태그에 다음 주소를 설정하게 하면 저 버튼을 누를 시 카카오 로그인 화면으로 이동하게 된다.

 

 

@Controller
@RequestMapping("")
public class KakaoLoginController {
    private final KakaoService kakaoService;
    private final UserService userService;

    private String client_id = "8908f5fd6288606dcad177472698dfbf";
    private String redirect_uri = "http://localhost:8080/auth_kakao";

    @Autowired
    public KakaoLoginController(KakaoService kakaoService, UserService userService) {
        this.kakaoService = kakaoService;
        this.userService = userService;
    }

    @RequestMapping(value = "/auth_kakao", method = RequestMethod.GET)
    public String authKakao(
            @RequestParam("code") String code,
            UserEntity user,
            HttpSession session
    ) throws IOException {
        String accessToken = this.kakaoService.getAccessTokenFromKakao(client_id, code);
        HashMap<String, Object> userInfo = this.kakaoService.getUserInfo(accessToken);

 

일단 카카오 로그인을 하면 위에 redirect_uri 주소로 code 파라미터와 함께 리다이렉트하게 되는데, 그 주소("/auth_kakao")를 GET 방식으로 다음과 같이 구현한다. 그리고 받아온 code 파라미터역시 작성한다. 일단 서비스에 코드를 통해 토큰을 발급 요청하는 getAccessTokenFromKakao() 서비스와 받은 토큰으로 사용자 정보를 가져오는 getUserInfo() 서비스를 만든다.

 

 

 

public String getAccessTokenFromKakao(String client_id, String code) throws IOException {
    //------kakao POST 요청------
    String reqURL = "https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id="+client_id+"&code=" + code;
    URL url = new URL(reqURL);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");

    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    String line = "";
    String result = "";

    while ((line = br.readLine()) != null) {
        result += line;
    }

    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> jsonMap = objectMapper.readValue(result, new TypeReference<Map<String, Object>>() {
    });

    System.out.println("Response Body : " + result);

    String accessToken = (String) jsonMap.get("access_token");
    String refreshToken = (String) jsonMap.get("refresh_token");
    String scope = (String) jsonMap.get("scope");

    System.out.println("Access Token : " + accessToken);
    System.out.println("Refresh Token : " + refreshToken);
    System.out.println("Scope : " + scope);

    return accessToken;
}

 

서비스에 토큰 발급받는 서비스를 만들었다. reqURL 경로는 카카오에 코드를 담아서 accessToken을 받는 과정이다.

 

 

 

 

 

public HashMap<String, Object> getUserInfo(String access_Token) throws IOException {
    // 클라이언트 요청 정보
    HashMap<String, Object> userInfo = new HashMap<String, Object>();


    //------kakao GET 요청------
    String reqURL = "https://kapi.kakao.com/v2/user/me";
    URL url = new URL(reqURL);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Authorization", "Bearer " + access_Token);

    int responseCode = conn.getResponseCode();
    System.out.println("responseCode : " + responseCode);

    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    String line = "";
    String result = "";

    while ((line = br.readLine()) != null) {
        result += line;
    }

    System.out.println("Response Body : " + result);

    // jackson objectmapper 객체 생성
    ObjectMapper objectMapper = new ObjectMapper();
    // JSON String -> Map
    Map<String, Object> jsonMap = objectMapper.readValue(result, new TypeReference<Map<String, Object>>() {
    });


    //사용자 정보 추출
    Map<String, Object> properties = (Map<String, Object>) jsonMap.get("properties");
    Map<String, Object> kakao_account = (Map<String, Object>) jsonMap.get("kakao_account");

    Long id = (Long) jsonMap.get("id");
    String nickname = properties.get("nickname").toString();
    String profileImage = properties.get("profile_image").toString();
    String email = kakao_account.get("email").toString();
    System.out.println("아이디" + id);
    System.out.println("닉네임" + nickname);
    System.out.println("프로필이미지" + profileImage);
    System.out.println("이메일" + email);

    //userInfo에 넣기
    userInfo.put("id", id);
    userInfo.put("nickname", nickname);
    userInfo.put("profileImage", profileImage);
    userInfo.put("email", email);
    return userInfo;
}

 

받은 토큰으로 사용자 정보를 가져오는 역할을 하는 서비스, reqURL 경로에 Bearer 토큰을 추가하여 GET 요청을 보내면 ResponseBody에 사용자 정보를 body값을 받게 된다.

 

 

 

 

 

@RequestMapping(value = "/auth_kakao", method = RequestMethod.GET)
public String authKakao(
        @RequestParam("code") String code,
        UserEntity user,
        HttpSession session
) throws IOException {
    String accessToken = this.kakaoService.getAccessTokenFromKakao(client_id, code);
    HashMap<String, Object> userInfo = this.kakaoService.getUserInfo(accessToken);
    System.out.println("id : " + userInfo.get("id"));

    // 로그인, 회원가입 로직 추가
    // 만약 처음 로그인 시, 회원 DB에 해당 이메일이 없다면
    if (this.userService.getUserByEmail( "kakao_" + userInfo.get("email").toString() ) == null) {
        // 회원가입하기
        this.kakaoService.kakaoRegister(userInfo, user);
    }
    // 로그인
    UserEntity loginUser = this.kakaoService.kakaoLogin(userInfo, user);
    if (loginUser == null) {
        return "redirect:/user/login";
    }
    session.setAttribute("user", loginUser);

    return "redirect:/";
}

 

최종 컨트롤러, 사용자 정보까지 받아왔다면 그것을 이용해서 로그인과 회원가입을 구현하면 된다.

 

 

 

 

 

 

로그아웃을 구현하기 위해 카카오 로그인의 고급 부분에 들어가서 로그아웃 URI 경로를 등록한다.

 

 

 

 

// 로그아웃
@RequestMapping(value = "/logout", method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView getLogout(HttpSession session) {
    UserEntity user = (UserEntity) session.getAttribute("user");    // 로그인한 유저 정보 불러오기

    String client_id = "8908f5fd6288606dcad177472698dfbf";
    String redirect_uri = "http://localhost:8080/logout_kakao";

    ModelAndView modelAndView = new ModelAndView();
    if (user.isKakao()) {   // 만약 카카오 로그인이라면
        String kakaoLogoutUrl = "https://kauth.kakao.com/oauth/logout?client_id=" + client_id + "&logout_redirect_uri=" + redirect_uri;
        return new ModelAndView("redirect:" + kakaoLogoutUrl);
    } else {                // 일반 로그인이라면
        session.setAttribute("user", null);
        modelAndView.setViewName("redirect:/");
        return modelAndView;
    }
}

 

일단 기존 로그아웃 맵핑을 다음과 같이 설정했다. 일단 로그인한 유저 세션의 정보를 불러온다(세션 정보 안에 유저 엔티티로 구성된 데이터가 들어가있다). client_id는 본인의 REST_API 키를 붙여넣기 하고, 리다이렉트경로는 위에서 설정한 로그아웃 리다이렉트 경로를 붙여넣기 한다.

 

만약 카카오 로그인 유저일 경우 로그아웃 경로를 다음과 같이 설정 후, 그 주소로 리다이렉트하게 한다. 일반 로그인 유저일 경우 원래 로직대로 동작하게끔 한다.

 

 

 

 

// 카카오 로그아웃
@RequestMapping(value = "/logout_kakao", method = RequestMethod.GET)
public String logoutKakao(HttpSession session) {
    session.setAttribute("user", null);
    return "redirect:/";
}

 

최종적으로 로그아웃을 하면 여기에 리다이렉트하게 되는데, HttpSession의 "user"를 null로 설정해 로그아웃되게 하였고, 홈 페이지로 리다이렉트하면 된다.

 

 

 

이로서 카카오 로그인 로그아웃 완성...

 

굳이 이 방법이 아니더라도 다른 방법으로 구현해보는 것도 나쁘지 않을지도.

'API' 카테고리의 다른 글

[API] 포트원 API 사용하기 (Spring Boot)  (0) 2024.07.11
[API] 카카오 지도 API 추가하기  (0) 2024.03.25
[API] 다음 주소 찾기 API  (0) 2024.01.24

https://developers.kakao.com/console/app

 

카카오계정

 

accounts.kakao.com

위 주소로 가서 카카오 아이디로 로그인을 한다.

 

 

 

 

 

로그인을 하면 해당 화면을 뜨는데, 애플리케이션을 다음과 같이 원하는 이름과 카테고리 사업자명으로 저장한다.

 

 

 

 

 

 

 

등록한 애플리케이션에 들어가서 플랫폼 카테고리로 간다. WEB 플렛폼 등록을 다음과 같이 해준다. (단순 연습이니 사이트 도메인을 localhost:8080, 127.0.0.1:8080 으로)

 

 

 

 

 

https://apis.map.kakao.com/

 

 

카카오맵 api 사이트이다. web을 선택하면

 

 

 

 

 

 

자바스크립트 api의 스크립트 부분을 복사해서 내 html 에 붙여넣기 한다. (무조건 내가 설정한 자바스크립트 태그의 위에 넣어야 한다.)

 

 

 

 

 

 

developer 사이트로 돌아가서 앱키 카테고리로 간 후, 자바스크립트키를 복붙한다. 그리고 이미 붙여넣은 태그 안에 앱키를 붙여넣기하면 된다.

 

 

 

 

 

크롬에 앱키를 포함한 주소를 주소창에 붙여넣기하고, 그것을 컨트롤 + s 로 추출하여 라이브러리 디렉터리 안에 넣는다. (라이브러리 디렉터리가 없다면 만든다)

 

 

 

 

 

 

자바스크립트 코드를 다음과 같이 설정해놓는다.

 

 

 

 

 

 

카카오 지도 API를 불러온 걸 확인할 수 있다.

 

 

 

 

 

lat과 lng는 지도의 위치. lv는 지도 확대 수준이다. 

 

 

 

 

 

navigator.geolocation.getCurrentPosition() 으로 사용자의 현재 위치를 허용할 것인지 묻고, data를 이용해 사용자의 현재 위치를 불러오게끔 한다.

 

 

 

 

지도의 위치를 옮기면 실시간으로 로컬 저장소에 값들이 저장된다.

 

 

 

 

 

다음 주소 API를 같이 사용하고 있을 경우, geocoder로 주소를 찍었으면 해당 좌표로 이동하게끔 하였고, 표시를 위한 마커도 추가하였다.

'API' 카테고리의 다른 글

[API] 포트원 API 사용하기 (Spring Boot)  (0) 2024.07.11
[API] 카카오 로그인 API 구현  (0) 2024.05.13
[API] 다음 주소 찾기 API  (0) 2024.01.24

주로 회원가입 부분을 만들 때, 우편번호나 도로명 주소를 검색하고 입력하는 기능을 추가하기도 한다. 요청, 허가 없이 누구나 쓸 수 있는 다음 주소 찾기 API를 사용하여, 회원가입의 우편번호 입력 기능을 구현해보자

 

 

 

 

 

일단 HTML과 CSS, JS로 회원가입 부분을 만들었다. 주목해야 할 곳은 우편번호 찾기 부분이다. 우편번호 찾기를 눌렀을 시, 검고 투명한 배경 그리고 x 표시와 함께 하얀색 네모박스를 생성하도록 만들었고, x 표시를 누르면 다시 사라지도록 했다. 우리는 하얀색 네모 박스 안에 다음 주소 API를 넣을 예정이다.

 

 

 

 

 

구글에 '다음 주소 찾기 api'를 검색하면 맨위에 뜨는 페이지가 있는데 클릭한다.

 

 

 

 

그리고 아래로 내려가면 이런 코드가 보이는데, 맨 위의 코드를 복사하고

 

 

 

HTML 파일의 head 부분에 붙여넣기 한다. 반드시 해당 HTML의 js보다 윗줄에 적어야 한다는 것을 명심

 

 

 

위에서 보여준 자바스크립트 코드의 API 부분이다. new daum.Postcode 안에 다음과 같이 적는데, oncomplete은 팝업에서 내가 주소를 클릭했을 때, 무엇을 실행할지를 적으면 된다.

 

일단 파라미터로 적은 data를 콘솔로 찍어 보면

 

주소를 클릭했을 시, 콘솔로 이렇게 나타난다. 우리가 선택한 data는 오브젝트 형식이다.

 

 

 

그럼 oncomplete 에서 저 오브젝트 부분의 값들을 회원가입 우편번호 텍스트 input 의 값으로 넣으면 된다. data의 'zonecode'는 우편번호, 'address'는 주소

 

 

 

 

 

확인해본 결과 값들이 input 텍스트 안에 불려져 왔다.

 

 

 

 

 

카카오 지도를 함께 사용하고 있을 경우 geocoder를 이용, 주소를 불러오면 해당 좌표로 이동해서 지도를 보여준다.

'API' 카테고리의 다른 글

[API] 포트원 API 사용하기 (Spring Boot)  (0) 2024.07.11
[API] 카카오 로그인 API 구현  (0) 2024.05.13
[API] 카카오 지도 API 추가하기  (0) 2024.03.25

+ Recent posts