Mustache 학습중 난감한점이 생겼습니다

2016-12-13 08:44

선배님들 안녕하세요~! 감기나 달고사는 백수입니다..ㅎㅎ;

날씨 많이 추워졌으니 감기조심하시구요,

mustache 학습겸 습작을 해보는 과정중에 난감한 점이 생겨서 질문 올립니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

<input type="text" name="param1" value="{{param1}}"/>

<span>{{param1.error}}</span>

..생략..

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

위의 예와 같은 form.html 파일을 여러군데서 돌려쓰려 합니다.

{{param1}} - 서버측 valid 때문에 리턴되거나 update 상황에서 값 자동 입력용

{{param1.error}} - 서버에서 BindingResult로 얻은 메세지용

이정도로 예상을 하고 작업을 하다보니 난감한 상황이 생겼습니다.

저 mustache 변수의 값이 없을때 입니다.

예로 create 화면에선 두곳의 값이 애초에 없기 때문에 널포인터가 납니다..ㅠ

해결책으로 간단히 두가지 방법이 생각나는데요,

  1. mustache 변수에 값이 없는 상황은 컨트롤러에서 empty string 을 할당한다.

  2. {{#param1}}{{param1}}{{/param1}} 이런식으로 널을 우회한다 정도 입니다.

1번의 경우엔 유지보수나 작업량, 또 이렇게 empty string 을 남발해도 되나..싶은 걱정이 생기고

2번의 경우엔 널체크를 위해 추가되는 {{콧수염}}이 화면의 복잡도도 증가시키고

logic less template 이라는 의미가 없어지는것 같습니다.

마지막 방법으로는 그냥 페이지마다 form을 다르게 설계해주는것 밖에 없다고 생각되는데요,

제 머리로는 이정도밖에 생각이 안듭니다..ㅠㅠ

어떤 방법이 좋을까요? 아니면 다른 아이디어가 있을까요?

4개의 의견 from SLiPP

2016-12-13 11:07

일반적으로는 생성과 수정을 같은 html로 사용하는 경우 1번 방법으로 Controller에서 데이터를 전달하는 방식으로 구현합니다.

일반적으로 Model에 자바 객체를 View에 전달하는데요. 이 자바 객체의 상태 값 전체를 null로 전달함으로써 해결합니다.

예를 들어 생성의 경우 * model.addAttribute("user", new User());

수정의 경우 * model.addAttribute("user", userRepository.findById(1));

위와 같이 생성의 경우는 빈 값을 가지는 User, 수정의 경우는 id에 해당하는 값을 DB에서 조회해 전달함으로써 View를 재사용할 수 있습니다.

그리고 mustache와 같이 logic less template을 사용하면 Controller에 더 많은 구현 로직이 포함되는 것이 일반벅인 듯 합니다. 이와 같이 구현할 경우 짜증나는 경우가 많아 helper 클래스를 추가해 View에서 일부 로직을 구현하는 방식으로 처리합니다.

2016-12-13 18:51

@자바지기 앗 바쁘신 와중에 답변감사합니다~!

말씀해주신 것처럼 헬퍼클래스에서 Form에 매핑되는 Bean의 DeclareFields에 1:1로 대응하는 메세지를 할당해주는식의 로직처리를 해주고있었는데 Form의 Bean과 DB의 Bean을 다르게 제작해서 이 부분을 좀 더 보완해야겠습니다. 리팩토링과 코드수정만 계속 하니 진도가 안나가고 쳇바퀴만 돌고있어 미칠거같습니다..ㅠㅠㅠㅠ

mustache 코드를 조금 살펴보니 모든부분을 파악하긴 어려웠지만 prefix의 # ! ^ 등 기호 값에 swich case로 대응을 해주는것 같더라구요. 물음표정도 추가해서 if not null case 정도만 넣어주면 자연스럽게 해결될것 같은데 이런경우에 라이브러리를 수정해서 사용할수 있는걸까요?

2016-12-14 10:46

@dexter 라이브러리를 수정해 해결할 수도 있겠지만 이와 같이 구현할 경우 라이브러리에 대한 유지보수 비용이 발생하고, 라이브러리 버전이 업그레이드되는 경우 호환이 되지 않을 수 있는 이슈도 있을 듯 합니다.

가능하면 라이브러리에서 지원하는 기능을 기반으로 확장하는 것을 추천합니다.

의견 추가하기

연관태그

← 목록으로