·내일까지는 카카오페이!

-우리가 팀 프로젝트로 구성하는 웹 서비스들이 거의 다 결제 서비스를 동반해야하는 경우가 많다. 그래서 카카오페이 단건결제에 대한 수업을 진행해서 추후에 팀프로젝트로 만든 웹에서 해당 결제를 시현할 수 있도록 카카오결제에 대한 수업을 진행하셨다. 사실 진행하셨다고 보기엔, 만들어야 하는 model, 즉 .java파일이 너무 많아서 영어 타이핑을 하는데 시간이 한참 지났다. 게다가 학원 행정상의 이유로 오후에는 수업이 일정시간 중단되기까지 해서 아직 뭘 했다고 할 수가 없어서 딱히 뭐라고 적어놔야할지도 모르겠다. 아직 어떻게 결제가 이루어지는지 전혀 파악이 안되었다.

우선 env.xml에 카카오페이에 관한 키를 설정했다.

	<!-- ########## 카카오페이 시작 ########## -->
	<!-- 앞에 키는 내가 사용하기 위한 변수 명임. -->
	<entry key="kakao.pay.host">https://kapi.kakao.com</entry>
	<entry key="kakao.pay.admin.key">15f702004a797af64fbebf83e4f1bb51</entry>
	<!-- 가맹점 코드 10자(테스트시  사용) -->	
	<entry key="kakao.pay.cid">TC0ONETIME</entry>
	<entry key="kakao.pay.ready.url">/v1/payment/ready</entry>
	<entry key="kakao.pay.approve.url">/v1/payment/approve</entry>
	<!-- 성공 취소 실패 시 호출할 url을 요구함 255자 제한 우리는 서비스쪽으로 해당 url을 넘기기 때문에 서비스에 정의되어야 함.-->
	<entry key="kakao.pay.success.url">https://hiboard.icia.co.kr:8088/kakao/paySuccess</entry>
	<entry key="kakao.pay.cancel.url">https://hiboard.icia.co.kr:8088/kakao/payCancel</entry>
	<entry key="kakao.pay.fail.url">https://hiboard.icia.co.kr:8088/kakao/payFail</entry>
	<!-- ########## 카카오페이 종료 ########## -->

그리고 navigation부분에 카카오 페이를 진행하는 페이지로 이동이 가능하도록 버튼을 만들었고

	    <li class="nav-item"> 
	      <a class="nav-link" href="/kakao/pay">카카오페이</a> 
	    </li>  

컨트롤러에서 해당 요청에 대한 .jsp를 리턴하도록 정의해주었다.

package com.icia.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.icia.common.util.StringUtil;
import com.icia.web.model.KakaoPayOrder;
import com.icia.web.model.Response;
import com.icia.web.util.CookieUtil;
import com.icia.web.util.HttpUtil;

@Controller("kakaoPayController")
public class KakaoPayController 
{
	private Logger logger = LoggerFactory.getLogger(KakaoPayController.class);
	
	//쿠키명
	@Value("#{env['auth.cookie.name']}")
	private String AUTH_COOKIE_NAME;
	
	@RequestMapping(value="/kakao/pay")
	public String pay(HttpServletRequest request, HttpServletResponse response) 
	{
		return "/kakao/pay";
	}
}

-원래는 상품에 대한 정보를 직접 기입하는 것이 아니겠지만, 일단 연습하는 부분이기 때문에 실제 값들을 우리가 입력하도록 해놨다. 아래가 pay.jsp의 전문이다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/WEB-INF/views/include/head.jsp" %>
<link rel="stylesheet" href="/resources/css/progress-bar.css" type="text/css">

<script>
	$(document).ready(function(){

		$("#btnPay").on("click", function(){
			//버튼 비활성화
			$("#btnPay").prop("disabled", true);
			
			if($.trim($("#itemCode").val()).length <= 0)
			{
				alert("상품 코드를 입력하세요.");
				$("#itemCode").val("");
				$("#btnPay").prop("disabled", false);
				return;
			}	
			
			if($.trim($("#itemName").val()).length <= 0)
			{
				alert("상품 이름을 입력하세요.");
				$("#itemName").val("");
				$("#itemName").focus();
				$("#btnPay").prop("disabled", false);
				return;
			}
			
			if($.trim($("#quantity").val()).length <= 0)
			{
				alert("상품 수량을 입력하세요.");
				$("#quantity").val("");
				$("#quantity").focus();
				$("#btnPay").prop("disabled", false);
				return;
			}
			
			if(!icia.common.isNumber($("#quantity").val()))
			{
				alert("수량은 숫자만 입력가능합니다.");
				$("#quantity").val("");
				$("#quantity").focus();
				$("#btnPay").prop("disabled", false);
				return;
			}
				
			if($.trim($("#totalAmount").val()).length <= 0)
			{
				alert("금액을 입력하세요.");
				$("#totalAmount").val("");
				$("#totalAmount").focus();
				$("#btnPay").prop("disabled", false);
				return;
			}
			
			if(!icia.common.isNumber($("#totalAmount").val()))
			{
				alert("금액은 숫자만 입력가능합니다.");
				$("#totalAmount").val("");
				$("#totalAmount").focus();
				$("#btnPay").prop("disabled", false);
				return;
			}
			
			icia.ajax.post({
				url:"/kakao/payReady",
				data:{
					itemCode:$("#itemCode").val(),
					itemName:$("#itemName").val(),
					quantity:$("#quantity").val(),
					totalAmount:$("#totalAmount").val()
				},
				success:function(response)
				{
					icia.common.log(response);
					
					if(response.code == 0)
					{
						//값을 가지고 성공을 띄워줄 것임
						var orderId = response.data.orderId;
						var tId = response.data.tId;
						var pcUrl = response.data.pcUrl;
						
						$("#orderId").val(orderId);
						$("#tId").val(tId);
						$("#pcUrl").val(pcUrl);
						
						//폼태그의 target으로 이름을 해주는 것.
						var win = window.open('', 'kakaoPopUp', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=540,height=700,left=100,top=100');
						$("#kakaoForm").submit();
						$("#btnPay").prop("disabled", false);
					}
					else
					{
						alert("결제 중 오류가 발생했습니다.");
						$("#btnPay").prop("disabled", false);
					}
				},
				error:function(error)
				{
					icia.common.error(error);
					$("#btnPay").prop("disabled", false);
				}
			});
		});	
		
	});
</script>

</head>
<body>
<%@ include file="/WEB-INF/views/include/navigation.jsp" %>
<div class="container">
   <h2>카카오페이</h2>
   <form name="payForm" id="payForm" method="post">
      상품코드<input type="text" name="itemCode" id="itemCode" maxlength="32" class="form-control mb-2" placeholder="상품코드" value="0123456789" />
      상품명<input type="text" name="itemName" id="itemName" maxlength="50" class="form-control mb-2" placeholder="상품명" value="비타민씨" />
      수량<input type="text" name="quantity" id="quantity" maxlength="3" class="form-control mb-2" placeholder="수량" value="1" />
      금액<input type="text" name="totalAmount" id="totalAmount" maxlength="10" class="form-control mb-2" placeholder="금액" value="30000" />
      <div class="form-group row">
         <div class="col-sm-12">
            <button type="button" id="btnPay" class="btn btn-primary" title="카카오페이">카카오페이</button>
         </div>
      </div>
   </form>
   <form name="kakaoForm" id="kakaoForm" method="post" target="kakaoPopUp" action="/kakao/payPopUp">
      <input type="hidden" name="orderId" id="orderId" value="" />
      <input type="hidden" name="tId" id="tId" value="" />
      <input type="hidden" name="pcUrl" id="pcUrl" value="" />
   </form>
</div>
</body>
</html>

그리고 해당 카카오페이 버튼을 눌렀을 때 ajax통신을 하게 되는데, 해당 url(/kakao/payReady)을 컨트롤러에 정의해줬다.

	@RequestMapping(value="/kakao/payReady", method=RequestMethod.POST)
	@ResponseBody
	public Response<Object> payReady(HttpServletRequest request, HttpServletResponse response)
	{
		Response<Object> ajaxResponse = new Response<Object>();
		
		//UUID생성하는 거
		String orderId = StringUtil.uniqueValue();
		String userId = CookieUtil.getHexValue(request, AUTH_COOKIE_NAME);
		//각각의 값을 일단 받아서 변수에 넣어줌
		String itemCode = HttpUtil.get(request, "itemCode", "");
		String itemName = HttpUtil.get(request, "itemName", "");
		int quantity = HttpUtil.get(request, "quantity", (int)0);
		int totalAmount = HttpUtil.get(request, "totalAmount", (int)0);
		int taxFreeAmount = HttpUtil.get(request, "taxFreeAmount", (int)0);
		int vatAmount = HttpUtil.get(request, "vatAmount", (int)0);
		
		//카카오페이오더 객체에 각각의 값을 세팅해줌
		KakaoPayOrder kakaoPayOrder = new KakaoPayOrder();
		
		kakaoPayOrder.setPartnerOrderId(orderId);
		kakaoPayOrder.setPartnerUserId(userId);
		kakaoPayOrder.setItemCode(itemCode);
		kakaoPayOrder.setItemName(itemName);
		kakaoPayOrder.setQuantity(quantity);
		kakaoPayOrder.setTotalAmount(totalAmount);
		kakaoPayOrder.setTaxFreeAmount(taxFreeAmount);
		kakaoPayOrder.setVatAmount(vatAmount);
		
		
		return ajaxResponse;
	} 

-여기서 KakaoPayOrder객체는 직접 생성해준 것이다.

package com.icia.web.model;

import java.io.Serializable;

public class KakaoPayOrder implements Serializable{

	private static final long serialVersionUID = 1L;
	
	
	private String partnerOrderId;		//가맹점 주문번호, 최대 100자
	private String partnerUserId;		//가맹점 회원아이디, 최대 100자
	private String itemName;			//상품명, 최대 100자
	private String itemCode;				//상품코드, 최대 100자
	private int quantity;					//상품 수량 
	private int totalAmount;				//상품 총액
	private int taxFreeAmount;				//상품 비과세 금액
	private int vatAmount;					//상품 부가세 금액 값을 보내지 않을 경우 다음과 같이 vat계산 (상품총액 - 상품 비과세 금액)/11 : 소숫점 이하 반올림
	
	private String tId;						//결제 고유번호 20자리
	private String pgToken;					//결제 승인 요청을 인증하는 토큰 사용자 결제 수단 선택 완료시, approve_url로 redirect해줄 때 pg_token을  query string으로 전달 
	
	public KakaoPayOrder() 
	{
		partnerOrderId = "";
		partnerUserId = "";
		itemName = "";
		itemCode = "";
		quantity = 0;
		totalAmount = 0;
		taxFreeAmount = 0;
		vatAmount = 0;
		tId = "";
		pgToken = "";
	}

	public String getPartnerOrderId() {
		return partnerOrderId;
	}

	public void setPartnerOrderId(String partnerOrderId) {
		this.partnerOrderId = partnerOrderId;
	}

	public String getPartnerUserId() {
		return partnerUserId;
	}

	public void setPartnerUserId(String partnerUserId) {
		this.partnerUserId = partnerUserId;
	}

	public String getItemName() {
		return itemName;
	}

	public void setItemName(String itemName) {
		this.itemName = itemName;
	}

	public String getItemCode() {
		return itemCode;
	}

	public void setItemCode(String itemCode) {
		this.itemCode = itemCode;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	public int getTotalAmount() {
		return totalAmount;
	}

	public void setTotalAmount(int totalAmount) {
		this.totalAmount = totalAmount;
	}

	public int getTaxFreeAmount() {
		return taxFreeAmount;
	}

	public void setTaxFreeAmount(int taxFreeAmount) {
		this.taxFreeAmount = taxFreeAmount;
	}

	public int getVatAmount() {
		return vatAmount;
	}

	public void setVatAmount(int vatAmount) {
		this.vatAmount = vatAmount;
	}

	public String gettId() {
		return tId;
	}

	public void settId(String tId) {
		this.tId = tId;
	}

	public String getPgToken() {
		return pgToken;
	}

	public void setPgToken(String pgToken) {
		this.pgToken = pgToken;
	}
	
	@Override
	public String toString() 
	{
		return "{partnerOrderId:"+partnerOrderId+", partnerUserId:"+partnerUserId+", itemName:"+itemName+", itemCode:"+itemCode+", quantity:"+quantity+", totalAmount:"+totalAmount+", taxFreeAmount:"+taxFreeAmount+", vatAmount:"+vatAmount+", tId:"+tId+", pgToken:"+pgToken+"}";
	}
}

그 밖에도 나중에 사용할 KakaoPayReady.java

package com.icia.web.model;

import java.io.Serializable;
import java.util.Date;

public class KakaoPayReady implements Serializable
{

	private static final long serialVersionUID = 1L;
	
	private String tid;						//결제 고유번호 20자
	private String next_redirect_app_url;	//요청한 클라이언트가 웹일 경우 카카오톡 결제페이지 redirect url
	private String next_redirect_mobile_url;	//요청한 클라이언트가 모바일 앱일 경우 카카오톡 결제페이지 redirect url
	private String next_redirect_pc_url;		//요청한 클라이언트가 pc 웹일 경우 카카오톡으로 결제 요청 메세지를 보내기 위한 pc url
	private String android_app_scheme;		
	private String ios_app_scheme;
	private Date created_at;				//결제 준비 요청 시간
	
	
	public KakaoPayReady() 
	{
		tid = "";
		next_redirect_app_url = "";
		next_redirect_mobile_url = "";
		next_redirect_pc_url = "";
		android_app_scheme = "";
		ios_app_scheme = "";
		created_at = null;
	}


	public String getTid() {
		return tid;
	}


	public void setTid(String tid) {
		this.tid = tid;
	}


	public String getNext_redirect_app_url() {
		return next_redirect_app_url;
	}


	public void setNext_redirect_app_url(String next_redirect_app_url) {
		this.next_redirect_app_url = next_redirect_app_url;
	}


	public String getNext_redirect_mobile_url() {
		return next_redirect_mobile_url;
	}


	public void setNext_redirect_mobile_url(String next_redirect_mobile_url) {
		this.next_redirect_mobile_url = next_redirect_mobile_url;
	}


	public String getNext_redirect_pc_url() {
		return next_redirect_pc_url;
	}


	public void setNext_redirect_pc_url(String next_redirect_pc_url) {
		this.next_redirect_pc_url = next_redirect_pc_url;
	}


	public String getAndroid_app_scheme() {
		return android_app_scheme;
	}


	public void setAndroid_app_scheme(String android_app_scheme) {
		this.android_app_scheme = android_app_scheme;
	}


	public String getIso_app_scheme() {
		return ios_app_scheme;
	}


	public void setIso_app_scheme(String iso_app_scheme) {
		this.ios_app_scheme = iso_app_scheme;
	}


	public Date getCreated_at() {
		return created_at;
	}


	public void setCreated_at(Date created_at) {
		this.created_at = created_at;
	}
	
	@Override
	public String toString() 
	{
		//오버라이딩
		return "{tid:"+tid+", next_redirect_app_url:"+next_redirect_app_url+","
				+ " next_redirect_mobile_url:"+next_redirect_mobile_url+","
				+ " next_redirect_pc_url:"+next_redirect_pc_url+","
				+ " android_app_scheme:"+android_app_scheme+","
				+ " ios_app_scheme:"+ios_app_scheme+", created_at:"+created_at+"}";
	}
	
}

그리고 KakaoPayApprove.java도 만들어줬다.

package com.icia.web.model;

import java.io.Serializable;
import java.util.Date;

public class KakaoPayApprove implements Serializable{


	private static final long serialVersionUID = 1L;
	
	private String aid;		//요청고유번호
	private String tid;		//결제 고유 번호
	private String cid;		//가맹점 코드
	private String sid;		//정기결제용 id, 정기결제 CID로 단건결제 요청시 발급
	private String partner_order_id;	//가맹점 주문번호, 최대 100자
	private String partner_user_id;		//가맹점 회원 id, 최대 100자
	private String payment_method_type;	//결제 수단, CARD 또는 MONEY 중 하나
	private Amount amount;				//결제 금액 정보
	private CardInfo card_info;			//결제 상세 정보, 결제수단이 카드일 경우만 포함
	private String item_name;				//상품 이름, 최대 100자
	private String item_code;				//상품 코드, 최대 100자
	private int quantity;					//상품 수량
	private Date created_at;				//결제 준비 요청 시각
	private Date approved_at;				//결제 승인 시각
	private String payload;					//결제 승인 요청에 대해 저장한 값, 요청 시 전달된 내용
	
	
	public KakaoPayApprove() 
	{
		aid = "";
		tid = "";
		cid = "";
		sid = "";
		partner_order_id = "";
		partner_user_id = "";
		payment_method_type = "";
		amount = null;
		card_info = null;
		item_name = "";
		item_code = "";
		quantity = 0;
		created_at = null;
		approved_at = null;
		payload  = "";
	}


	public String getAid() {
		return aid;
	}


	public void setAid(String aid) {
		this.aid = aid;
	}


	public String getTid() {
		return tid;
	}


	public void setTid(String tid) {
		this.tid = tid;
	}


	public String getCid() {
		return cid;
	}


	public void setCid(String cid) {
		this.cid = cid;
	}


	public String getSid() {
		return sid;
	}


	public void setSid(String sid) {
		this.sid = sid;
	}


	public String getPartner_order_id() {
		return partner_order_id;
	}


	public void setPartner_order_id(String partner_order_id) {
		this.partner_order_id = partner_order_id;
	}


	public String getPartner_user_id() {
		return partner_user_id;
	}


	public void setPartner_user_id(String partner_user_id) {
		this.partner_user_id = partner_user_id;
	}


	public String getPayment_method_type() {
		return payment_method_type;
	}


	public void setPayment_method_type(String payment_method_type) {
		this.payment_method_type = payment_method_type;
	}


	public Amount getAmount() {
		return amount;
	}


	public void setAmount(Amount amount) {
		this.amount = amount;
	}


	public CardInfo getCard_info() {
		return card_info;
	}


	public void setCard_info(CardInfo card_info) {
		this.card_info = card_info;
	}


	public String getItem_name() {
		return item_name;
	}


	public void setItem_name(String item_name) {
		this.item_name = item_name;
	}


	public String getItem_code() {
		return item_code;
	}


	public void setItem_code(String item_code) {
		this.item_code = item_code;
	}


	public int getQuantity() {
		return quantity;
	}


	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}


	public Date getCreated_at() {
		return created_at;
	}


	public void setCreated_at(Date created_at) {
		this.created_at = created_at;
	}


	public Date getApproved_at() {
		return approved_at;
	}


	public void setApproved_at(Date approved_at) {
		this.approved_at = approved_at;
	}


	public String getPayload() {
		return payload;
	}


	public void setPayload(String payload) {
		this.payload = payload;
	}
	
	@Override
	public String toString() 
	{
		return "{aid:"+aid+", tid:"+tid+", cid:"+cid+", sid:"+sid+", partner_order_id:"+partner_order_id+", partner_user_id:"+partner_user_id+", payment_method_type:"+payment_method_type+", amount:"+(amount != null ? amount : "null")+", card_info:"+(card_info != null ? card_info : "null")+", item_name:"+item_name+", item_code:"+item_code+", quantity:"+quantity+", created_at:"+(created_at != null ? created_at : "null")+", approved_at:"+(approved_at != null ? approved_at : "null")+", payload:"+payload+"}";
	}
}

-그리고 해당 클래스에서 사용할 변수인 Amount와 CardInfo 객체 타입의 변수를 사용하기 위해서 또 Amount와 CardInfo의 클래스를 작성했다.

package com.icia.web.model;

import java.io.Serializable;

public class Amount implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private int total;		//전체 결제 금액
	private int tax_free;	//비과세 금액
	private int vat;	//부가세 금액
	private int point;	//사용한 포인트 금액
	private int discount;	//할인 금액
	
	public Amount() 
	{
		  total = 0;		
		  tax_free = 0;	
		  vat = 0;	
		  point = 0;	
		  discount = 0;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public int getTax_free() {
		return tax_free;
	}

	public void setTax_free(int tax_free) {
		this.tax_free = tax_free;
	}

	public int getVat() {
		return vat;
	}

	public void setVat(int vat) {
		this.vat = vat;
	}

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}

	public int getDiscount() {
		return discount;
	}

	public void setDiscount(int discount) {
		this.discount = discount;
	}
	
	@Override
	public String toString() 
	{
		return "{total:"+total+", tax_free:"+tax_free+", vat:"+vat+", point:"+point+", discount:"+discount+"}";
	}
}

-다음은 CardInfo다.

package com.icia.web.model;

import java.io.Serializable;

public class CardInfo implements Serializable{


	private static final long serialVersionUID = 1L;
	
	private String purchase_corp;				//매입 카드사 한글명
	private String purchase_corp_code;			//매입 카드사 코드
	private String issuer_corp;					//카드 발급사 한글명
	private String issuer_corp_code;			//카드 발급사 코드
	private String kakaopay_purchase_corp;		//카카오페이 매입사명
	private String kakaopay_purchase_corp_code;	//카카오페이 매입사 코드
	private String kakaopay_issuer_corp;		//카카오페이 발급사명
	private String kakaopay_issuer_corp_code;	//카카오페이 발급사 코드
	private String bin;							//카드 BIN
	private String card_type;					//카드 타입
	private String install_month;				//할부 개월 수
	private String approved_id;					//카드사 승인번호
	private String card_mid;					//카드사 가맹점 번호
	private String interest_free_install;		//무이자할부 여부(Y/N)
	private String card_item_code;				//카드 상품 코드


	public CardInfo() 
	{
		  purchase_corp = "";				
		  purchase_corp_code = "";			
		  issuer_corp = "";					
		  issuer_corp_code = "";			
		  kakaopay_purchase_corp = "";		
		  kakaopay_purchase_corp_code = "";	
		  kakaopay_issuer_corp = "";		
		  kakaopay_issuer_corp_code = "";	
		  bin = "";							
		  card_type = "";					
		  install_month = "";				
		  approved_id = "";					
		  card_mid = "";					
		  interest_free_install = "";		
		  card_item_code = "";				
	}


	public String getPurchase_corp() {
		return purchase_corp;
	}


	public void setPurchase_corp(String purchase_corp) {
		this.purchase_corp = purchase_corp;
	}


	public String getPurchase_corp_code() {
		return purchase_corp_code;
	}


	public void setPurchase_corp_code(String purchase_corp_code) {
		this.purchase_corp_code = purchase_corp_code;
	}


	public String getIssuer_corp() {
		return issuer_corp;
	}


	public void setIssuer_corp(String issuer_corp) {
		this.issuer_corp = issuer_corp;
	}


	public String getIssuer_corp_code() {
		return issuer_corp_code;
	}


	public void setIssuer_corp_code(String issuer_corp_code) {
		this.issuer_corp_code = issuer_corp_code;
	}


	public String getKakaopay_purchase_corp() {
		return kakaopay_purchase_corp;
	}


	public void setKakaopay_purchase_corp(String kakaopay_purchase_corp) {
		this.kakaopay_purchase_corp = kakaopay_purchase_corp;
	}


	public String getKakaopay_purchase_corp_code() {
		return kakaopay_purchase_corp_code;
	}


	public void setKakaopay_purchase_corp_code(String kakaopay_purchase_corp_code) {
		this.kakaopay_purchase_corp_code = kakaopay_purchase_corp_code;
	}


	public String getKakaopay_issuer_corp() {
		return kakaopay_issuer_corp;
	}


	public void setKakaopay_issuer_corp(String kakaopay_issuer_corp) {
		this.kakaopay_issuer_corp = kakaopay_issuer_corp;
	}


	public String getKakaopay_issuer_corp_code() {
		return kakaopay_issuer_corp_code;
	}


	public void setKakaopay_issuer_corp_code(String kakaopay_issuer_corp_code) {
		this.kakaopay_issuer_corp_code = kakaopay_issuer_corp_code;
	}


	public String getBin() {
		return bin;
	}


	public void setBin(String bin) {
		this.bin = bin;
	}


	public String getCard_type() {
		return card_type;
	}


	public void setCard_type(String card_type) {
		this.card_type = card_type;
	}


	public String getInstall_month() {
		return install_month;
	}


	public void setInstall_month(String install_month) {
		this.install_month = install_month;
	}


	public String getApproved_id() {
		return approved_id;
	}


	public void setApproved_id(String approved_id) {
		this.approved_id = approved_id;
	}


	public String getCard_mid() {
		return card_mid;
	}


	public void setCard_mid(String card_mid) {
		this.card_mid = card_mid;
	}


	public String getInterest_free_install() {
		return interest_free_install;
	}


	public void setInterest_free_install(String interest_free_install) {
		this.interest_free_install = interest_free_install;
	}


	public String getCard_item_code() {
		return card_item_code;
	}


	public void setCard_item_code(String card_item_code) {
		this.card_item_code = card_item_code;
	}
	
	@Override
	public String toString() 
	{
		return "{purchase_corp:"+purchase_corp+", purchase_corp_code:"+purchase_corp_code+", issuer_corp:"+issuer_corp+", issuer_corp_code:"+issuer_corp_code+", kakaopay_purchase_corp:"+kakaopay_purchase_corp+", kakaopay_purchase_corp_code:"+kakaopay_purchase_corp_code+", kakaopay_issuer_corp:"+kakaopay_issuer_corp+", kakaopay_issuer_corp_code:"+kakaopay_issuer_corp_code+", bin:"+bin+", card_type:"+card_type+", install_month:"+install_month+", approved_id:"+approved_id+", card_mid:"+card_mid+", interest_free_install:"+interest_free_install+", card_item_code:"+card_item_code+"}";
	}
}

-사실 아직도 이게 전부 뭐에 쓰이는지는 잘 모르겠다. 이 모든 내용은

https://developers.kakao.com/docs/latest/ko/kakaopay/single-payment

위의 링크에 적혀있는데, 왜 이렇게 작성해야 하고 나중에 어느 부분을 수정해야하는지 잘 모르겠다. 일단 정말 열심히 따라 적긴 했는데, 내일이 되어봐야 어느정도 이해할 수 있을 것 같다.

·팀 회의 및 깃허브, 멘붕

·프로젝트 공유

-우선 팀 프로젝트에서 메인페이지에 보여줄 데이터들은 이미 만들어놓은 테이블에 전부 넣어두었고, 이제 스프링 프로젝트를 다 같이 만들어서 환경도 맞추고 하는 작업이 남았다. 그래야 더 구체적인 작업이 가능하니까, 그런데 프로젝트를 만들기에 앞서, 코드 공유에 대한 문제에 직면했다. 우리는 6명이 나눠서 코드를 작성하고 각자가 공유를 해야한다. 문제는 우리는 확실하게 누구는 무엇을 하겠다로 나누지 않고 프로젝트 전반적으로 분업을 실시할 예정이다. 예를 들어, 누구는 html만 만지고, 누구는 쿼리문만 하고 누구는 컨트롤러만 작성하고 이런식의 분업이 아니라, 처음부터 끝까지 구현이 가능하도록 분업 협업을 할 계획이다. 왜냐면 그게 우리가 원한 공부이자 목표이니까. 그런데 이렇게 애매하게 분업을 하면 문제가 생긴다. 만약 우리가 확실하게 어떤 파일을 내가 만들게! 라고 한다면 그냥 파일을 나눠서 공유하면 된다. 그런데, 각자 한 파일에서 분업을 하게 되면, 나중에 코드를 합치는 일이 굉장히 어려워질 수 있다.

·해결책은 깃허브

-이런 문제점을 해결하기 위해서 깃허브와 깃을 이클립스와 연동해서 다 같이 프로젝트를 작성하고 커밋하고 푸시하여 합치는 과정을 거치려고 했고, 깃허브와 local 깃저장소를 연결해서 내가 생성한 Spring legacy project를 올리는 것까지 성공했다. 그리고 다른 팀원이 그것을 받아서 새 프로젝트를 본인의 이클립스에 가져오는 것도 성공했다.

·엄청난 실수 발견, 멘붕

문제는! 세번째 팀원이 이클립스와 깃허브를 연동하고 커밋-푸시하는 순간 모든 것이 잘못되었다. 아마도 경로 문제였는지, 들어가면 안될 파일들이 커밋되고 합쳐졌다. 우리는 당시에 branch란 개념도 merge란 개념도 전혀 모르고 commit push pull에 대한 단편적인 지식만 있었고, 세번째 팀원이 업로드를 하는 순간 그 팀원의 오류가 다른 두명에게 전달되어서 아수라장이 되엇다. 다시 돌리는 방법을 4시부터 지금까지 찾았지만, 결국 그냥 이클립스에서 로컬 프로젝트를 롤백하고, 깃허브의 repository를 삭제 후 다시 새로운 repository를 생성해서 해당 프로젝트를 다시 연동했다. 앞으로는 신중한 merge와 master branch를 쉽게 건들이지 않는 선에서 병합할 수 있도록 해야겠다. 만약 잘못 merge되었을 때 되돌리는 방법도 찾아야 겠다.

·많은 것을 배우지 않았지만, 많은 것을 찾아본 하루

-오늘 수업이 뭐 많은 것을 배우고 지식이 늘고 하지는 않았지만, 많은 것을 찾아보고 직접 해보고 실수도 해보고 한 하루였던 것 같다. 개인적으로 배우는 것이 많이 없는 하루여도 내가 어떻게 나머지 시간을 꽉 채우느냐가 정말 중요한 것 같다. 내일도 파이팅해서 수업부터 프로젝트까지 열심히 달려봐야겠다. 파이팅!

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글

Powered by GraphCDN, the GraphQL CDN