본문 바로가기
개발

[Spring] Generic을 이용하여 다중 pg모듈 Form화면 분기처리하기

by 정보알려주는언니 2021. 5. 15.

Java Generic 


제네릭은 클래스, 메소드에서 사용할 데이터 타입을 나중에 확정하는 기법이다. 나중에라는 말은 클래스나 메소드를 선언할 때가 아닌 사용할 때, 즉 인스턴스를 생성할 때나 메소드를 호출할 때 정한다는 의미이다.  

 

PG 모듈 다루기


솔루션 개발을 진행하다보면 납품하는 업체마다 사용하는 PG가 다르다보니 해당 솔루션에 대표 PG사를 모두 붙여두고

업체마다 선택하여 사용할 수 있도록 만들어두는 경우가 대부분이다. 

이니시스, 나이스페이, KCP, LG U+ 등 대표 업체에서 선호하는 PG사는 정해져있는데 매번 프로젝트 진행할때마다 PG를 새로 붙인다고 하면 업무 시간이 너무 오래걸리기 때문이다. 

 

물론 개인적으로는 PG 모듈만 따로 모아두는 프로젝트를 만들고 업체마다 PG가 정해지면 해당 프로젝트에서 복사하는 식으로 하는 방식이 더 괜찮다고 생각한다. 이렇게 미리 PG 모듈을 미리 세팅해두면 프로젝트 진행시간이 단축될 수는 있지만 업체에 납품했을 경우 해당 업체에서 사용하는 메인 PG 모듈은 1가지일텐데 PG모듈을 모두 들고다녀야하니 말이다. 

 

하지만 현재 진행하는 프로젝트에서는 이미 3개의 모듈을 한번에 올려두고 업체마다 사용하는 PG를 properties에서 세팅하면 해당 PG를 호출하는 방식으로 세팅되어있었다. 

 

현재 Pg모듈 호출시 jsp 화면한곳에서 조건문을 써가며 너무 길게 코딩이 되어있었고, 해당 소스를 generic를 이용하여 간결하게 작업해보았다. 

 

interface

public interface PgAdaptor {
	
    /**
	 * 함수 설명 : form 데이터를 세팅한다
	 * 수정내역 : 2021. 03. 24 / 1000 / 초기생성
	 *
	 * @param <T>
	 * @param pg
	 * @return
	 */
	public <T extends DefaultPg> T initPgFormDataSetting(DefaultPg pg);
    
}

pgAdaptor라는 interface를 신규로 생성해준뒤, initPgFormDataSetting라는 Method를 정의한다.

이 Method는 Form 데이터를 세팅하는 용도로, return값은 각 pg사별로 다르게 세팅된다.

 

parameter model 생성

 

package test.com.adaptor.pg.model.form;

import test.com.adaptor.pg.model.PayMethod;

public class DefaultPg {
    
	/**
	 * 주문번호
	 */
	private String orderNo;
	
	/**
	 * 주문자명 
	 */
	private String buyerName;
	
	/**
	 * 주문자 핸드폰번호
	 */
	private String buyerPhone;
	
	/**
	 * 주문자 이메일
	 */
	private String buyerEmail;
	
	/**
	 * 상품명
	 */
	private String productInfo;
	
	/**
	 * 주문시간
	 */
	private String timestamp;
	
	/**
	 * 결제 방법
	 */
	private PayMethod payMethod;
	
	/**
	 * 총결제금액
	 */
	private String saleTotamt;
 	
    
    public DefaultPg(String orderNo, String buyerName, String buyerPhone, String buyerEmail, String productInfo) {
		
		this.orderNo = orderNo;
		this.buyerName = buyerName;
		this.buyerPhone = buyerPhone;
		this.buyerEmail = buyerEmail;
		this.productInfo = productInfo;
	}
}

parameter로 받아올 model vo는 어떤 내용이 담기는지 확인해보자.

보통 buyerName, buyerPhone등의 값은 주문건마다 값이 달라지기때문에 구현체에 고정값으로 세팅하면 안되고 객체 생성시 값을 넘겨주어서 세팅 해주어야 한다.

 

PG 가이드 문서에서 parameter 값들을 살펴보면 고정값들을 제외하고 주문건마다 달라지는 값들의 경우 DefaultPg 객체에 선언해주고 객체생성시 세팅해주어야 한다.

 

Return Vo 생성

public class Lgu extends DefaultPg{
	
	/**
	 * LG유플러스 결제서비스 선택
	 * (test:테스트, service:서비스)
	 */
	private String CST_PLATFORM;
	
	/**
	 * LG유플러스으로 부터 발급받으신 상점아이디를 입력하세요.
	 */
	private String CST_MID;
    
    .
    .
    .
    (중략)
}

화면에 세팅해줄 변수들을 세팅해준다.

이 변수들의 경우 가이드문서에 나오는 변수명으로 통일하는것이 개발 및 유지보수하기에 편하다.

 

class 생성

public class LguAdaptor implements PgAdaptor {
	
    @Override
	public <T extends DefaultPg> T initPgFormDataSetting(DefaultPg pg) {
		Lgu lgu = new Lgu();
		
		String officeTaskType = pg.getOfficeId() + "." + pg.getTaskType();
		
		lgu.setCST_MID(TopasContext.getProperty(officeTaskType + ".topas.com.lgdacom.cst_mid"));
		lgu.setCST_WINDOW_TYPE("iframe"); // 수정불가 iframe
		lgu.setLGD_BUYERPHONE(pg.getBuyerPhone());
		lgu.setLGD_PRODUCTINFO(pg.getProductInfo());
		lgu.setLGD_BUYEREMAIL(pg.getBuyerEmail());
        
		// 해쉬 암호화
		StringBuffer sb = new StringBuffer();
	    // (암호화코드 생략)

	    String LGD_HASHDATA = strBuf.toString();
		lgu.setLGD_HASHDATA(LGD_HASHDATA);
		
		return (T) lgu;
	}
}

이제 PgAdaptor를 implements 받은 구현체를 생성해준다.

return 값을 위에서 만든 return Model로 선언 해주고, return시 (T) 캐스팅하여준다.

 

 

호출하기


Controller

DefaultPg pg = new DefaultPg("buyerName", "email", "010-0000-0000", "상품명");
							
mv.addObject("pgData", pgAdaptor.initPgFormDataSetting(pg));

Controller단에서 위와같이 세팅해주면된다.

 

Form

<input type='hidden' name="CST_PLATFORM"	id="CST_PLATFORM"	value="${pgData.CST_PLATFORM}">
<input type='hidden' name="CST_MID"			id="CST_MID"		value="${pgData.CST_MID}">

(이하 생략)

form에서는 controller에서 넘겨준 데이터를 위와같이 세팅해주면 된다.

(나는 jstl을 이용해서 form을 세팅해주었다.)

 

 

 

여기서는 Lgu라는 객체를 만들어서 예를 들었지만,

추가적으로 다른 모듈에 대한 구현체를 만들고싶다면 (*)Adaptor class 생성 후 PgAdaptor를 implements 받으면 된다. 


댓글