앞서 문제점을 보안하기 위해서 아래와 같은 클래스를 하나 더 만들었다. 

잘못입력 하지못하게 final로 상수로 만들어두었고..

 

package thisjavaexam.enumtest.enumis;

public class FinalGrade {
	// 외부에서 수정 할 수 없도록 private 선, final(상수)로 수정할 수 없도록 필드 선언  
	private static final String BRONZE = "BRONZE";
	private static final String SILVER = "SILVER";
	private static final String GOLD = "GOLD";
	private static final String DIAMOND = "DIAMOND";
	
	//외부에서 접근 가능하도록 게터 선언 
	public static String getBronze() {
		return BRONZE;
	}
	public static String getSilver() {
		return SILVER;
	}
	public static String getGold() {
		return GOLD;
	}
	public static String getDiamond() {
		return DIAMOND;
	}
}

 

요걸이제.. 사용하는 DiscountGrade의 내용을 조금 수정했다. (주석처리)

package thisjavaexam.enumtest.enumis;
 
public class DiscountGrade {
	 
	public int discountPercent(String grade, int price) { 
		int discountPercent = 0;
		
		// 기존 grade.equlas("BRONZE") 에서 이젠 FinalGrade 클래스의 getXXX 를 가져와야한다.
		if (grade.equals(FinalGrade.getBronze())) {
			discountPercent = 5;
		} else if (grade.equals(FinalGrade.getSilver())) {
			discountPercent = 10;
		} else if (grade.equals(FinalGrade.getGold())) {
			discountPercent = 15;
		} else if (grade.equals(FinalGrade.getDiamond())) {
			discountPercent = 20;
		} else {
			System.out.println(grade + "할인이 없습니다.");
		}
		return price * discountPercent / 100;
	}
}

 

 

이래서 실행은 잘된다 .

 

요건..앞선 포스팅과 달라진 내용이 없어서 코드없이 캡쳐했다. 

 

 

하지만..

❗ 그런데도 생길 수 있는 "잠재적 문제점"

값 자체는 여전히 "String"이다

아무리 getter로 감쌌다 해도, String 파라미터로 받는 이상 외부에서 "이상한 문자열"을 넣는 걸 막을 수는 없음

 

외부에서 비슷한 “짝퉁” 클래스 만들 수도 있음

public class FakeGrade {
    public static final String BRONZE = "BRONZE";
}
 
discountPercent(FakeGrade.BRONZE, price) → 이 값도 문자열이기 때문에 동일하게 통과될 수 있음

 

 

여러가지 보안사항들이 있기에...

결과적으로 Enum을 쓰면 해결방법이 더 쉬워진다고 한다. 

 

 

 

+ Recent posts