태그 파일 만드는데 무슨 설계가 필요할까? 생각을 하자면, 한 없이 생각할 것이 많을 수 있습니다. 어떤 속성들을 받을 것인가? 속성 타입은 그냥 문자열로 할까 아니면 특정 타입으로 받을까? 태그 파일 코드 중복을 어떻게 제거할까? EL안에 EL을 쓸까? 덩덩덩...

오늘 고민한 건 저 중에서도 어떤 속성과 그 속성에 넘겨줄 값은 무슨 타입인가?에 대한 겁니다. 좀 더 구체적으로 HTML radio, checkbox, select 에 대응하는 태그 파일을 만들 때, items라는 속성에 어떤 값을 넘겨줄지에 대한 고민을 했습니다.

이런 경우가 있겠죠. 취미를 입력받아야 하는데, 예시로 몇개를 제공하고 그 중에서 선택할 수 있게 하려고 합니다. 그럼 화면에 참조할 데이터를 전달해야 합니다. 이 데이터가 최종적으로 items에 설정될 값이죠. 따라서 어떤 값을 넘겨줄 수 있는지 고민을 해야 합니다. 여러 형태로 참조 데이터를 넘겨줄 수 있겠지만, 일단 세 종류로 간추렸습니다.

1. Entity Type Collection

public List<Hobby> getHobbyType{
    return hobbyDao.getAll();
}

public class Member {
    Hobby hobby;
}

Entity 타입의 경우 화면에 보여줄 값을 가지고 있는 변수(textpath)와 실제 값을 가지고 있는 변수(valuepath)가 모두 엔티티의 속성입니다. 그리고 이 변수 이름은 각각의 엔티티에 따라 변할 수 있죠. 따라서 태그 파일에 valuepath와 textpath를 추가하고, 최종적으론 EL의 EL을 사용해서 값을 가져오면 됩니다.

2. Value Type Collection

public List<String> getHobbyType{
  return Arrays.asList("coding", "music", "movie");
}

public class Member{
  String hobby;
}

이 경우는 1번에 비해 매우 간단한데, 일단 차이는 textpath와 valuepath가 콜렉션에 들어있는 값이고, 이 값을 그대로 엔티티에 값으로 설정하면 되며, 일단, 스프링의 form 태그를 활용하면 정말 간단하게 태그 파일을 구현할 수 있습니다.

3. AbstractType's 하위클래스

public HobbyType getHobbyType{
  return HobbyType.getInstance();
}

public class Member {
    int hobby;
}

이 경우는 특수한 경우로, 프레임워크에서 별도의 enum 지원 클래스를 만들었을 때에 해당합니다. 특히 저 코드는 OSAF의 AbstractType을 사용한 경우로, 이 클래스에 대해서는 나중에 자세히 설명할 기회가 있을 것 같아서 자세한 설명은 미루겠습니다. 기본적으로 AbstractType 클래스는 ArrayList 타입입니다. 결국은 1번과 같은 것 아니냐?.. 아닙니다. key, value를 가지고 있는 Pair 타입의 콜렉션이기 때문에, 고정적인 valuepath와 textpath를 가지고 있습니다. 따라서 태그파일에서 컨벤션으로 실제 값과 화면에 보여줄 값을 가져다 보여줄 수 있습니다.

이 세 가지 경우를 모두 고려해서 만들어야 하는 태그 파일들은..

fselect.tag
fradiobuttons.tag
fcheckboxes.tag

Coming Soon...with OSAF!!

ps: 이밖에도 경우수는 더 많습니다. Map, 배열, enum.. 이것들까지 지원할 수 있는 태그를 완성하면.. 짱먹는 폼 태그가 되는거죠. 캬~