@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class KakaoPayService {
static final String cid = "TC0ONETIME";
@Value("${kakao.ADMIN_KEY}")
private String adminKey;
private KakaoReadyResponse kakaoReady;
...
}
기술 설명
@Slf4j: Lombok 어노테이션으로 로깅용log필드 자동 생성.@Service: 스프링에서 이 클래스를 서비스 컴포넌트로 인식하게 함(비즈니스 로직).@RequiredArgsConstructor:final필드 또는@NonNull필드에 대한 생성자를 자동 생성.@Transactional: 메서드 실행 시 트랜잭션을 시작하고, 예외 발생 시 롤백 처리.static final String cid = "TC0ONETIME": 카카오페이 테스트용 가맹점 코드.@Value("${kakao.ADMIN_KEY}") private String adminKey;:application.properties(또는application.yml)에 설정된 관리자 키를 주입.private KakaoReadyResponse kakaoReady;: 결제 준비 요청을 보낸 후 반환받는 응답 객체를 저장하는 필드.
getHeaders)private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "KakaoAK " + adminKey);
headers.set("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
return headers;
}
기능 설명
HttpHeaders headers = new HttpHeaders();: HTTP 요청에 사용할 헤더 객체 생성.headers.set("Authorization", "KakaoAK " + adminKey);:
- “KakaoAK {관리자키}” 형식으로 요청 헤더에
Authorization설정.- 카카오 API 호출 시 반드시 포함해야 하는 인증 헤더.
headers.set("Content-type", "application/x-www-form-urlencoded;charset=utf-8");:
- 요청 본문이
application/x-www-form-urlencoded형식임을 명시.- 한글 인코딩을 위해
charset=utf-8지정.return headers;: 구성된 헤더를 반환하여, 실제 API 요청 시 사용.
kakaoPayReady)public ResponseEntity<KakaoReadyResponse> kakaoPayReady(Amount amount) {
// 1) 요청 파라미터 세팅
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.add("cid", amount.getCid());
parameters.add("partner_order_id", amount.getPartner_order_id());
parameters.add("partner_user_id", amount.getPartner_user_id());
parameters.add("item_name", amount.getItem_name());
parameters.add("quantity", String.valueOf(amount.getQuantity()));
parameters.add("total_amount", String.valueOf(amount.getTotal()));
parameters.add("vat_amount", String.valueOf(amount.getTax()));
parameters.add("tax_free_amount", String.valueOf(amount.getTax_free()));
// 2) Callback URL 설정 (로컬 개발용)
parameters.add("approval_url", "http://localhost:8080/payment/success");
parameters.add("cancel_url", "http://localhost:8080/payment/cancel");
parameters.add("fail_url", "http://localhost:8080/payment/fail");
// 3) HttpEntity에 파라미터 + 헤더 담기
HttpEntity<MultiValueMap<String, String>> requestEntity =
new HttpEntity<>(parameters, this.getHeaders());
// 4) REST 호출
RestTemplate restTemplate = new RestTemplate();
kakaoReady = restTemplate.postForObject(
"https://kapi.kakao.com/v1/payment/ready",
requestEntity,
KakaoReadyResponse.class
);
// 5) 반환값에 식별용 ID 세팅
kakaoReady.setPartner_order_id(amount.getPartner_order_id());
kakaoReady.setPartner_user_id(amount.getPartner_user_id());
return ResponseEntity.ok(kakaoReady);
}
기능 설명
- 요청 파라미터 세팅
cid: 가맹점 코드partner_order_id: 주문 번호(시스템에서 설정)partner_user_id: 사용자 IDitem_name: 상품명quantity: 수량total_amount: 결제 금액(총액)vat_amount: 부가세 금액tax_free_amount: 비과세 금액- Callback URL 설정 (로컬 개발 환경)
approval_url: 결제 승인 성공 시 카카오페이가 호출할 URLcancel_url: 결제 취소 시 카카오페이가 호출할 URLfail_url: 결제 실패 시 카카오페이가 호출할 URLHttpEntity생성
parameters(폼 데이터)와getHeaders()에서 생성한 헤더를 합쳐HttpEntity에 담음.- REST API 호출
RestTemplate restTemplate = new RestTemplate();
postForObject("https://kapi.kakao.com/v1/payment/ready", requestEntity, KakaoReadyResponse.class)→ 카카오페이
/v1/payment/ready엔드포인트에 POST 요청반환된
KakaoReadyResponse객체(tid,next_redirect_pc_url등 포함)를kakaoReady필드에 저장.- 식별용 ID 세팅
- 클라이언트 요청 시 전달했던
partner_order_id와partner_user_id를kakaoReady에 다시 설정하여, 이후 승인 요청 시 사용.ResponseEntity.ok(kakaoReady)반환
- 컨트롤러 레이어로 JSON 형태(
200 OK)로KakaoReadyResponse를 전달.