이번엔 결제 기능을 포스팅 해보겠습니다
제일 생소하기도 했고 처음으로 외부 라이브러리를 사용했던 기능입니다
개요
결제는 아임포트(iamport) 대행사를 이용했습니다
결제를 위해 PG사에 직접 연동하는 것보다는 아임포트를 사용하는 것이
시간적으로 더 낫다고 판단했습니다
아임포트 측에서도 사용 이유에 대해 잘 설명되어 있으니 참고하시면 좋을 것 같습니다
결제 연동 가이드를 열어보시면
이처럼 메뉴들이 나와있는걸 보실 수 있습니다
연동 가이드에서 제공해준 코드들은 Javascript와 Node.js로 되어있습니다
저희는 Springboot와 JSP를 사용하고 있기 때문에
그대로 적용한다면 서버쪽에서 처리해야할 작업들을 클라이언트쪽에서 해야할 수 밖에 없다고 생각했습니다
그러나 Java 사용자를 위한 모듈을 아임포트 측에서 제공해주고 있었기 때문에 걱정을 덜 수 있었습니다
들어가보시면 readme로 설명을 적어놓은 것을 볼 수 있습니다
maven 사용 시 pom.xml에 코드를 추가해주시면 서버에서 직접적으로 사용할 수 있게 됩니다
저희 프로젝트도 아임포트 REST API 모듈을 사용했으며
연동가이드와 위의 github의 코드를 살펴보면서 진행했습니다
결제 연동 시 실제로 데이터가 들어갔는지 확인하기 위해 API를 사용해보실 수도 있습니다
이제 코드로 넘어가보겠습니다
제가 사용한 기술 버전은 Java 17, SpringBoot 3.0 이상, mariaDB 10.4 이상, Mybatis 3.0 이상이며
JSP와 javascript, jquery, ajax를 사용해서 view를 구성했습니다
이미 아임포트 모듈을 적용했다는 가정하에 진행되는 점,
그리고 아임포트 코드에 대해 먼저 설명된다는 것을 참고하시면서 보시면 좋을 것 같습니다
아임포트 AccessToken 발급
우선 아임포트의 모든 API를 사용하기 위해선 먼저 액세스 토큰을 발급받아야 합니다
아임포트 api 문서에도 보시면 가장 먼저 언급되어 있는 것이 토큰 발급입니다
아임포트에 가입해서 결제 연동 메뉴의 내 식별 코드를 눌러보시면
REST API key와 secret이 있습니다
이것을 개인 properties 파일에 적어둔다음
@Value 어노테이션을 활용해 결제 컨트롤러에서 사용할 수 있게 해줍니다
컨트롤러에서 초기화 시킨 api key와 secret은
아임포트 모듈에 들어있는 IamportClient에서 사용하게 됩니다
이 클래스의 생성자의 매개변수로 key와 secret을 넣어주면 apikey, apiSecret 필드에 각각 초기화 되며
IamportClient 클래스의 메서드를 사용할 때 이것들을 이용할 수 있게 됩니다
이제 apikey, apiSecret 값만 넣어준 다음 API를 사용하기만 하면 됩니다
아임포트 모듈에 모두 구현되어 있기 때문입니다
하지만 코드를 조금만 더 살펴보겠습니다
토급 발급 과정 이해를 위해 api 문서를 참고해보면
/users/getToken으로 key와 secret을 보내면 액세스 토큰을 반환받을 수 있다고 나와있습니다
이것은 IamportClient의 getAuth()메서드에 구현되어 있습니다
생성시 초기화 시킨 apiKey와 apiSecret의 값으로 토큰 발급을 요청하는 코드가 들어있는 모습입니다
생성자 위쪽에 인스턴스 필드 중에서 iamport 필드의 타입은 Iamport 라고 되어있었습니다
Iamport 소스코드를 들어가보면 가장 맨 위에 나오는게
/users/getToken으로 요청을 보내 Call<IamportResponse<AccessToken>>을 반환하고있습니다
때문에 getAuth()에서는 Call<IamportResponse<AccessToken>>를 반환받은 call과
그리고 call.execute()를 실행해서 Response<IamportResponse<AccessToken>> 타입인 response 변수를 사용해서 액세스 토큰을 사용할 수 있도록 하고 있습니다
Call과 Response는 Retrofit 라이브러리에서 HTTP 요청을 표현하기 위한 인터페이스입니다
아임포트는 retrofit2 모듈을 기반으로 만들었다고 이미 언급했었죠
Call 인터페이스에서도 설명이 나와있습니다
직역하면 웹서버에 요청을 보내고 응답을 반환하는 Retrofit 메서드의 request라고 나와있습니다
성공적으로 요청이 전달되면 반환되는 타입은 T로 타입 매개변수로서 응답의 body에 들어오게 됩니다
그러므로 getAuth()에서 Call 인터페이스의 execute()를 실행해 /users/getToken으로 요청을 보내는게 성공한다면
Call<IamportResponse<AccessToken>>의 응답 body에는
Response<IamportResponse<AccessToken>>이 들어오게 되는 것입니다
Response 클래스부터 먼저 보겠습니다
Response 클래스 내부에는 HTTP 응답 결과에 따라 처리되는 다양한 메서드가 있습니다
그 중에서 getAuth에서 사용하는 부분은
isSuccessFul()과 body()밖에 없습니다
isSuccessFul()을 보면 결과에 따라 boolean 값을 반환하도록 되어있습니다
200~299 사이의 코드일시 true를 반환한다고 나와있습니다
요청이 성공적으로 수신되었다는 뜻이라고 나와있네요
그리고 body()는
말그대로 T타입인 body 필드를 반환합니다
Call 인터페이스에서 execute() 메서드의 반환값은 Response<T> 입니다
getAuth()에서는 call 변수의 타입을 Call<IamportResponse<AccessToken>>로 설정했기 때문에
요청이 성공적이라면 T는 당연히 IamportResponse<AccessToken>가 됩니다
이러면 IamportResponse와 AccessToken의 코드도 살펴봐야겠죠
두 클래스의 코드입니다
반환값이 IamportResponse<AccessToken>이므로 IamportResponse의 response 필드 타입은 AccessToken이 되고
getResponse로 AccessToken을 가져올 수 있게됩니다
그렇게 가져온 AccessToken에서는 getToken으로 token 필드를 가져오면 access_token이라는 키를 가진
실제 액세스 토큰 값을 반환하게 됩니다
이러한 내부 동작을 간략하게 설명드린 이유는
나중에 아임포트 API를 사용할 때 해당 메서드들을 사용해서 액세스 토큰 발급 여부를 검증하기 때문입니다
API 문서에서도 바로 확인할 수 있습니다
이렇게 key와 secret을 넣으면 access_token의 키를 가진 토큰 값이 나오는걸 확인할 수 있습니다
이 방식은 스크립트 코드에서 key, secret값을 보내 요청한 결과와 동일합니다
END
서버 내에서 엑세스 토큰 인증 방법을 아임포트 java 모듈에 들어있는 코드로 보여드리면서 설명드렸습니다
이제 토큰 인증을 할 수 있게 되었으니 API로 제공하는 사전/사후 검증, 환불 등의 기능을 모두 사용할 수 있습니다
포스트가 길어졌네요
다음엔 액세스 토큰을 활용해서 아임포트 API를 적용한 코드를 리뷰해보겠습니다
'프로젝트 > 나이스투미트유' 카테고리의 다른 글
#6. 결제 - 02 (0) | 2023.08.12 |
---|---|
#4. 장바구니 - 01 (0) | 2023.08.11 |
#3. 주문 - 01 (0) | 2023.08.11 |
#2. Git & Github (1) | 2023.08.09 |
#1. 프로젝트에서 나의 역할 (0) | 2023.08.07 |