선배님들 안녕하세요~! 감기나 달고사는 백수입니다..ㅎㅎ;
날씨 많이 추워졌으니 감기조심하시구요,
mustache 학습겸 습작을 해보는 과정중에 난감한 점이 생겨서 질문 올립니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
<input type="text" name="param1" value="{{param1}}"/>
<span>{{param1.error}}</span>
..생략..
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
위의 예와 같은 form.html 파일을 여러군데서 돌려쓰려 합니다.
{{param1}} - 서버측 valid 때문에 리턴되거나 update 상황에서 값 자동 입력용
{{param1.error}} - 서버에서 BindingResult로 얻은 메세지용
이정도로 예상을 하고 작업을 하다보니 난감한 상황이 생겼습니다.
저 mustache 변수의 값이 없을때 입니다.
예로 create 화면에선 두곳의 값이 애초에 없기 때문에 널포인터가 납니다..ㅠ
해결책으로 간단히 두가지 방법이 생각나는데요,
-
mustache 변수에 값이 없는 상황은 컨트롤러에서 empty string 을 할당한다.
-
{{#param1}}{{param1}}{{/param1}} 이런식으로 널을 우회한다 정도 입니다.
1번의 경우엔 유지보수나 작업량, 또 이렇게 empty string 을 남발해도 되나..싶은 걱정이 생기고
2번의 경우엔 널체크를 위해 추가되는 {{콧수염}}이 화면의 복잡도도 증가시키고
logic less template 이라는 의미가 없어지는것 같습니다.
마지막 방법으로는 그냥 페이지마다 form을 다르게 설계해주는것 밖에 없다고 생각되는데요,
제 머리로는 이정도밖에 생각이 안듭니다..ㅠㅠ
어떤 방법이 좋을까요? 아니면 다른 아이디어가 있을까요?
4개의 의견 from SLiPP
일반적으로는 생성과 수정을 같은 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에서 일부 로직을 구현하는 방식으로 처리합니다.
@자바지기 앗 바쁘신 와중에 답변감사합니다~!
말씀해주신 것처럼 헬퍼클래스에서 Form에 매핑되는 Bean의 DeclareFields에 1:1로 대응하는 메세지를 할당해주는식의 로직처리를 해주고있었는데 Form의 Bean과 DB의 Bean을 다르게 제작해서 이 부분을 좀 더 보완해야겠습니다. 리팩토링과 코드수정만 계속 하니 진도가 안나가고 쳇바퀴만 돌고있어 미칠거같습니다..ㅠㅠㅠㅠ
mustache 코드를 조금 살펴보니 모든부분을 파악하긴 어려웠지만 prefix의 # ! ^ 등 기호 값에 swich case로 대응을 해주는것 같더라구요. 물음표정도 추가해서 if not null case 정도만 넣어주면 자연스럽게 해결될것 같은데 이런경우에 라이브러리를 수정해서 사용할수 있는걸까요?
@dexter 라이브러리를 수정해 해결할 수도 있겠지만 이와 같이 구현할 경우 라이브러리에 대한 유지보수 비용이 발생하고, 라이브러리 버전이 업그레이드되는 경우 호환이 되지 않을 수 있는 이슈도 있을 듯 합니다.
가능하면 라이브러리에서 지원하는 기능을 기반으로 확장하는 것을 추천합니다.
@자바지기 어떻게든 일단 해결부터 하고싶은 생각에 눈이 멀어 그런건 생각해보질 못했습니다..크..ㅠ 조언 감사합니다..!
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.