본문 바로가기

IT/개발경험기

Enum을 통한 개선경험

안녕하세요 남갯입니다


오늘은 Enum을 통해 소스를 개선한 경험을 작성해보려고 합니다.


http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html


우아한 형제들의 Enum 활용기를 읽으며 참고를 했습니다.



이번에 온 회사에서 기존코드를 리뉴얼하여 서비스를 제공하는 앱을 개발하라는 임무를 맡았습니다.


많은 변경점 중 결제 타입을 설정하는 코드를 변경한 내용을 공유 해보려고합니다.


기존의 코드의 경우 StringArray를 xml을 통해 스피너를 생산하고 그 스피너의 입력값을 가져와서 해당하는 값의 코드를 가져와서 서버로 전송하는 화면이었습니다.




이전코드 1


int position = 0;
switch (payment_type) {
case "1":
position = 1;
break;
case "2": // 현금
position = 3;
break;
case "3":
position = 2;
break;
default:
position = 3;
break;
}


일단 사용자가 요청한 결제타입이 있는지를 서버로부터 받아온 뒤 , 받아온 결제타입에 맞춰 해당 하는 포지션의 스피너를 세팅하는 부분과 사용자가 스피너를 통해 현금/카드/계좌 를 (선택/변경) 하면하면 해당 선택을 확인하여 현금 = "1" 카드는 = ,"2", 계좌는 ="3" 의 코드로 전송해야 했습니다.  이 타입 코드는는 CD,CA,AC라는 특정 코드로 변경되었고 1,2,3을 변경을 해야했습니다.


위의 코드는 첫째로 하드코딩을 하고있다는점에서 문제가 있었습니다. 1,2,3을 직접 입력함으로써 하나의 관리포인트가 생기고,


코드값이 변경된다면 사용하는곳의 코드도 지속적으로 확인한 뒤에 수정을 해줘야하는 단점이 있습니다. 또


그래서 저는 우아한형제의 enum을 적극 활용해보기로 했습니다. 



 // 기존의 코드같은경우 0,1,2,3 을 단순히 비교해서 처리하는 형태
// 완전한 하드코딩
//enum
public enum PaymentTypeEnum {
NONE("", "입금유형", 0),
CARD("CD", "카드", 1),
CASH("CA", "현금 영수증", 2),
BANK("AC", "계좌", 3);
private String code;
private String type;
private int position;
PaymentTypeEnum(String code, String type, int position) {
this.code = code;
this.type = type;
this.position = position;
}
public String getCodeStr() {
return code;
}
public String getTypeStr() {
return type;
}
public int getPosition() {
return position;
}
@Override
public String toString() {
return this.type;
}
public static PaymentTypeEnum codeValueOf(String code) {
for (PaymentTypeEnum paymentTypeEnum : PaymentTypeEnum.values()) {
if (paymentTypeEnum.getCodeStr().equals(code)) {
return paymentTypeEnum;
}
}
return null;
}

}


일단 저는 PaymentTypeEnum이라는 enum 클래스를 만들었습니다. 안드로이드의 경우 String array를 스피너의 리스트로 넘겨주어야 했기때문에 해당 코드를 덜 수정할 수 있도록 type이라는 필드를 만들고 toString을 오버라이드해서 Spinner를 세팅하는 부분에서 해당 Enum의 values값을 받아 세팅할 수 있도록 변경했습니다.





변경코드 1


//after 1
int position = 3;
PaymentTypeEnum paymentTypeEnum = PaymentTypeEnum.codeValueOf(payment_type);
if (paymentTypeEnum != null) {
position = paymentTypeEnum.getPosition();
}



이전코드 2


// 선택된 스피너를 확인한 뒤 그 스피너에 맞는 서버로 보낼 코드를 넘긴다.
//before 2
m_paymenttype = "0";//(입금유형, 1:카드, 2:현금, 3:계좌)

final int selectedPosition = getSelectedItemPosition(R.id.spinnerCostInputType);
if (selectedPosition == 0) {
// 입금유형
} else if (selectedPosition == 1) {
// 카드
m_paymenttype = "1";
} else if (selectedPosition == 2) {
// 계좌
m_paymenttype = "3";
} else if (selectedPosition == 3) {
m_paymenttype = "2";
}


변경코드 2


// after 2
m_paymenttype = ((PaymentTypeEnum) getSelectedItem(R.id.spinnerCostInputType)).getCodeStr();


실제로 사용하는부분에서는 또한 해당하는 코드와 포지션 필드를 만듬으로써 서버에서 받은 데이터를 매핑하여 스피너의 초기값을 세팅가능하도록 변경하였고 CD, CA ,AC를 현재의 스피너의 글자와 비교함으로써 Enum에서만 관리가 가능하도록 변경하였습니다.


이렇게 수정함으로써 더 간결한 코드가 되었고 코드가 스피너의 세팅부분과 서버의 전송부분을 따로 수정하지 않아도 동작이 가능하도록 개선시켰습니다.

'IT > 개발경험기' 카테고리의 다른 글

[코틀린]의 위임 발표자료 공유  (0) 2019.12.01
[스테이트패턴] 스테이트패턴 적용기  (0) 2019.11.26