포트원 API 사용해보기
포트원(구 IamPort)
팀 프로젝트로 커머스 사이트를 구현하기로 하였다.
기본 기능은 CRUD와 다를게 없으니 그러려니 하는데 결제는 어떻게 해야하는지 궁금해졌다.
실제로 PG사와 계약해서 가맹점을 등록해야하나? 아니면 mocking 하는 식으로 껍데기만 만들어야하나?
싶던 도중 포트원 API를 발견했다.
가맹점 등록을 하지 않아도 결제창까지 띄울 수 있고 테스트 계정으로 결제도 구현 가능했다.
사용 기술
프론트엔드는 Next.js / 백엔드는 스프링을 이용하여 포트원 API로 결제 기능을 구현해볼 것이다.
간단히 결제 기능에만 집중해서 만들것이며 기본적인 CORS같은건 굳이 설명하지 않는다.
이 글에는 백엔드 사이드 내용만 적고 프론트엔드 쪽은 이 글로 분리하려고 한다.
사실 포트원에서 만들어둔 API들이 너무 잘 돼있어서 백엔드가 굳이 필요할까? 싶기는 하다.
포트원 공식문서를 보면 Swagger로도 잘 정리 되어 있다.
V2 버전이 더 많은 API를 지원하는것 같으니 프론트에서는 V2를 쓰는걸 추천한다.
- Spring Boot 3.2.4 / gradle-kotlin
- Java 17
사전 작업
아무래도 외부 라이브러리를 사용하는거다 보니 사전작업이 필요하다.
포트원 개발자센터를 찬찬히 읽어보면 이런저런 기능을 이용할 수 있을것이다.
1. 포트원에 회원가입
회원가입 -> 사이드 바의 결제 연동 탭 -> 식별코드/API Keys 탭
2. Spring에 Iamport 의존성 주입
build.gradle
repositories {
mavenCentral()
maven(url="https://jitpack.io")
}
dependencies {
...
// 아임포트
implementation("com.github.iamport:iamport-rest-client-java:0.2.23")
...
}
구현하기
환경 변수는 @ConfigurationProperties로 yml에서 가져온다.
이에 관한 글은 여기를 참고.
IamportConfig
앞으로 Iamport API를 이용하기 위해 사용할 IamportClient에 apiKey, secretKey를 넣고 초기화해준다.
사전작업 하면서 봤던 API Key를 여기서 사용한다.
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "iamport")
@Slf4j
public class IamportConfig {
private final String apiKey;
private final String secretKey;
@Bean
public IamportClient iamportClient() {
return new IamportClient(apiKey, secretKey);
}
}
OrderController
IamportClient는 서비스 레이어에서 써야하나 싶지만 우선 컨트롤러에 작성해뒀다.
프론트에서 전달받은 주문 번호로 이 IamportClient를 이용하여 필요한 메서드를 실행할 수 있다.
하지만 위에서도 언급했듯 백엔드에서는 이 정도 밖에 정리할게 없다.
프론트엔드와의 기획에 따라서는 IamportClient를 쓸 일도 없을 수 있을것 같다.
포트원에서 주문 내역을 관리해주기 때문에 백엔드에서 할게 있나 싶다.
만약 엔티티 연관관계가 필요하다면 적당히 백엔드 DB에 주문 ID만 저장해두고 프론트로 넘겨주면 되지 않을까 싶다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/orders")
public class OrderController {
private final IamportClient iamportClient;
@PostMapping("/{impUid}")
public IamportResponse<Payment> test(@PathVariable String impUid) throws IamportResponseException, IOException {
IamportResponse<Payment> response = iamportClient.paymentByImpUid(impUid);
String token = iamportClient.getAuth().getResponse().getToken();
return response;
}
}