이전 글에 이어서 먼저 setValue(Object) 메소드를 보겠습니다. 이 녀석이 뭐하는 녀석인지... API에 써있지만 별로 와닿지 않습니다.

그래서 그냥 소스코들 봤습니다. 즉 PropertyEditor 인터페이스의 구현체인 PropertyEditorSupport 클래스를 살펴봤습니다.

    public void setValue(Object value) {
    this.value = value;
    firePropertyChange();
    }

위와같이 구현되어 있습니다. value라는 이름으로 객체를 받아와서 '속성 바꿔치기'를 하고 있군요. 저 메소드도 보이지만, 먼 산으로 갈까봐 관 둡니다. 이런.. 소스를 봐도 별 소득이 없네요. 예제 코드를 봐야겠습니다. 스프링의 Petclinic을 뒤져보면 다음과 같은 코드가 나옵니다.

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        for (PetType type : this.clinic.getPetTypes()) {
            if (type.getName().equals(text)) {
                setValue(type);
            }
        }
    }

setAsText에서 setValue()를 호출하고 있군요. 이 때 넘겨주는 객체는 PetType이라는 객체인 걸 보니, 이 프로퍼티 에디터는 PetType을 다루기 위해 작성된 것 같습니다. 잠깐 딴 길로 새서.. setAsText()를 보겠습니다.

    public void setAsText(String text) throws java.lang.IllegalArgumentException {
    if (value instanceof String) {
        setValue(text);
        return;
    }
    throw new java.lang.IllegalArgumentException(text);
    }

이 메소드는 String을 받아온 다음에 객체를 만들어서 setValue() 메소드에 넘겨주고 있습니다.

이제 조금 감이 잡힙니다.
사용자 삽입 이미지어디에선가 입력된 텍스트를 가지고 객체를 만들어서 setValue() 메소드에 그 객체를 넘겨주는 메소드인가 봅니다. 그리고 setValue()는 아마도 해당 객체를 어딘가에서 값으로 사용하도록 넘겨줄 겁니다.

이제 String getAsText() 하나만 남아있군요. 이 메소드는 setAsText(String)과 반대일 것 같다는 느낌이 팍팍 듭니다. 다음과 같이 구현되어 있습니다.

    public String getAsText() {
    if (value instanceof String) {
        return (String)value;
    }
    return ("" + value);
    }

흠.. value 객체를 이번에는 거꾸로 String 타입으로 변환해서 반환하는 메소드입니다. PetType으로 예를 들자면,

    @Override
    public String getAsText() {
        Object value = getValue();
        if(value instanceof PetType)
            return ((PetType)value).getName();
        else
            throw new RuntimeException();
    }

이런식으로 구현할 수도 있겠습니다. PetType 객체가 오면 이 객체가 가지고 있는 name 속성이 이 객체를 대변하도록 말이죠.
사용자 삽입 이미지
그럼 대체 객체의 어떤 값이 해당 객체를 대신하도록 하는것이 좋을까요? 당연히 유일한 값이 좋겠죠. 흠..

다음에는 이런 PropertyEditor를 사용한 PetClinic 예제를 살펴보겠습니다.