[백업][가리사니] mustache 문법 + 스프링 연동
html, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

머스터치

공식 : https://mustache.github.io/ 데모 : https://mustache.github.io/#demo

  • 을 통해 빠른 치환 장점
  • 웬만한 플랫폼을 모두 지원한다.
  • 속도가 빠르다. 단점
  • 플랫폼 공용으로 만들어졌기에 스프링 같은 곳에서 쓰기위해서는 모두 모델안에 넣어줘야한다.
  • 상위를 선택하는 방법이 한정적임.

문법

예제 데이터

{
  "header": "Colors",
  "items": [
      {"name": "red", "first": true, "url": "#Red"},
      {"name": "green", "link": true, "url": "#Green"},
      {"name": "blue", "link": true, "url": "#Blue"}
  ],
  "empty": false
}

출력


IF

  • NOT (^)을 제외하면 루프와 동일
  • (^) 제외시 IF 개념이 아니라 반복 이지만 이해를 돕기위한 설명입니다.

해더가 존재함


해더가 존재하지 않음


해더333  존재하지 않음

내부출력 - 자기자신


	해드의 값은  

루프 : 사실상 위 IF 가 루프를 통하고있다.

  • 즉 배열형이면 루프를 돌며 출력되며, 배열이 아닌 값이면 단일 출력이되며, 값이 없으면 출력되지않음.

  content<div class="post title">[백업][가리사니] spring boot security : 5. 회원가입</div>

<div class="post ctrl pad-x-4">
    <div class="fl-left">
        
            java, spring
        
    </div>
    <div class="fl-right">
        <a href="https://github.com/ac-saro">박용서</a> •
        <a href="https://github.com/ac-saro/ac-saro.github.io/edit/publish/_posts/old/2016-07-26-[백업][가리사니] Spring boot Security : 5. 회원가입.md">2016-07-26</a>
    </div>
</div>

<div class="hr-line pad-x-4 content-layout">
    <blockquote>
<p>이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다.
오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.</p>
</blockquote>
<h1 id="spring-boot-security-">Spring boot Security 시리즈</h1>
<ul>
<li><a href="/2016/07/24/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-1.-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95.html">1. 설치 및 페이지 설정</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-2.-%EC%9D%B8%EC%A6%9D-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90/html">2. 인증로직을 만들어보자.</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-3.-%EC%9D%B8%EC%A6%9D%EB%A1%9C%EC%A7%81-%EC%9E%A0%EC%9E%AC%EC%A0%81-%EC%9C%84%ED%97%98.html">3. 인증로직 - 잠재적 위험</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">4. 인증 페이지뷰</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-5.-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85.html">5. 회원가입</a></li>
<li><a href="/2016/09/03/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-Security-login-(%EC%84%B1%EA%B3%B5-%EC%8B%A4%ED%8C%A8)-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88.html">부록 : Spring Security login (성공 / 실패) 이벤트 리스너 </a></li>
</ul>
<h1 id="section">뷰</h1>
<p>2장 강의에선 string 으로 뽑았던 메인페이지도 새로 만들어줍니다.
src/main/resources/templates/main.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">&gt;</span>
<span class="nt">&lt;head&gt;</span>
	<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;title&gt;</span>메인페이지<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;div&gt;</span>

	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/mypage"</span><span class="nt">&gt;</span>마이페이지<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>
	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/login"</span><span class="nt">&gt;</span>로그인<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>
	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/create"</span><span class="nt">&gt;</span>회원가입<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>

<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<p>src/main/resources/templates/create.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">&gt;</span>
<span class="nt">&lt;head&gt;</span>
	<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;title&gt;</span>회원가입<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;div&gt;</span>

	<span class="nt">&lt;form</span> <span class="na">th:action=</span><span class="s">"@{/createProcessing}"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">&gt;</span>
		<span class="nt">&lt;h2&gt;</span>회원가입<span class="nt">&lt;/h2&gt;</span>

		<span class="c">&lt;!-- 강의를 간결하게 끝내기 위함.. 원래는 가입실패 여부를 자세히 표시해야한다 --&gt;</span>
		<span class="nt">&lt;div</span> <span class="na">th:if=</span><span class="s">"${param.error}"</span><span class="nt">&gt;</span>
			계정이 중복됩니다.
		<span class="nt">&lt;/div&gt;</span>

		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"ac"</span> <span class="na">placeholder=</span><span class="s">"계정"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/&gt;</span>
		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"password"</span> <span class="na">name=</span><span class="s">"pw"</span> <span class="na">placeholder=</span><span class="s">"암호"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/&gt;</span>
		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"회원가입"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;/form&gt;</span>

<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<h1 id="section-1">서비스</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Component</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AccountService</span>
<span class="o">{</span>
	<span class="nd">@Autowired</span>
	<span class="nc">AccountRepository</span> <span class="n">accountRepository</span><span class="o">;</span>

	<span class="c1">// 리턴을 저런식으로하면 안됩니다.</span>
	<span class="c1">// (무었때문에 가입 실패했는지를 적어주셔야..)</span>
	<span class="nd">@Transactional</span>
	<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">create</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
	<span class="o">{</span>
		<span class="k">if</span> <span class="o">(</span><span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
		<span class="o">{</span>
			<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
		<span class="o">}</span>

		<span class="nc">Account</span> <span class="n">account</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Account</span><span class="o">();</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setPw</span><span class="o">(</span><span class="k">new</span> <span class="nc">BCryptPasswordEncoder</span><span class="o">().</span><span class="na">encode</span><span class="o">(</span><span class="n">pw</span><span class="o">));</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setRole</span><span class="o">(</span><span class="s">"NORMAL"</span><span class="o">);</span>
		<span class="n">accountRepository</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">account</span><span class="o">);</span>

		<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
	<span class="o">}</span>

	<span class="kd">public</span> <span class="nc">Account</span> <span class="nf">getAccount</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">)</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
	<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-2">컨트롤러</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">main</span><span class="o">()</span>
<span class="o">{</span>
	<span class="k">return</span> <span class="s">"main"</span><span class="o">;</span>
<span class="o">}</span>

<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/create"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">create</span><span class="o">()</span>
<span class="o">{</span>
	<span class="k">return</span> <span class="s">"create"</span><span class="o">;</span>
<span class="o">}</span>

<span class="nd">@Autowired</span>
<span class="nc">AccountService</span> <span class="n">accountService</span><span class="o">;</span>

<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/createProcessing"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">createProcessing</span><span class="o">(</span><span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
	<span class="k">if</span> <span class="o">(</span><span class="n">accountService</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">ac</span><span class="o">,</span> <span class="n">pw</span><span class="o">))</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="s">"redirect:/login"</span><span class="o">;</span>
	<span class="o">}</span>
	<span class="k">else</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="s">"redirect:/create?error"</span><span class="o">;</span>
	<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-3">권한설정</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span>
<span class="o">{</span>
	<span class="n">http</span><span class="o">.</span><span class="na">authorizeRequests</span><span class="o">()</span>
		<span class="c1">// 회원가입과 처리부분이 추가</span>
		<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/login"</span><span class="o">,</span> <span class="s">"/create"</span><span class="o">,</span> <span class="s">"/createProcessing"</span><span class="o">).</span><span class="na">permitAll</span><span class="o">()</span>
		<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/**"</span><span class="o">).</span><span class="na">authenticated</span><span class="o">();</span>

	<span class="n">http</span>
		<span class="o">.</span><span class="na">formLogin</span><span class="o">()</span>
		<span class="c1">// 로그인 처리 페이지</span>
		<span class="o">.</span><span class="na">loginProcessingUrl</span><span class="o">(</span><span class="s">"/loginProcessing"</span><span class="o">)</span>
		<span class="c1">// 로그인 페이지</span>
		<span class="o">.</span><span class="na">loginPage</span><span class="o">(</span><span class="s">"/login"</span><span class="o">)</span>
		<span class="o">.</span><span class="na">failureUrl</span><span class="o">(</span><span class="s">"/login?error"</span><span class="o">);</span>

	<span class="n">http</span>
		<span class="o">.</span><span class="na">logout</span><span class="o">()</span>
		<span class="c1">// /logout 을 호출할 경우 로그아웃</span>
		<span class="o">.</span><span class="na">logoutRequestMatcher</span><span class="o">(</span><span class="k">new</span> <span class="nc">AntPathRequestMatcher</span><span class="o">(</span><span class="s">"/logout"</span><span class="o">))</span>
		<span class="c1">// 로그아웃이 성공했을 경우 이동할 페이지</span>
		<span class="o">.</span><span class="na">logoutSuccessUrl</span><span class="o">(</span><span class="s">"/"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-4">요약 - 결론</h1>
<p>회원가입시 암호를 넣을 때 로그인에 적용한 동일한 해시를 적용하시면 됩니다.</p>
<h1 id="section-5">추신</h1>
<p>처음엔 연동부부만 쓰려다가 조금 더 확장하니.... 소스가 난장판이 되었습니다.;;;;;
다듬어서 다시 쓰려고했지만... 요즘 시간이 부족하네요 ㅠㅠ...;;;</p>

</div>

<div class="hr-line pad-t-10 pad-x-4 li-4">
<ul><li>다음글: <a href="/2016/07/27/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-mustache-%EB%AC%B8%EB%B2%95-+-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%97%B0%EB%8F%99.html">[백업][가리사니] mustache 문법 + 스프링 연동</a></li><li>이전글: <a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">[백업][가리사니] spring boot security : 4. 인증 페이지뷰</a></li></ul>
</div>

<div class="pad-t-10">
    <script src="https://giscus.app/client.js"
            data-repo="ac-saro/ac-saro.github.io"
            data-repo-id="R_kgDOKTBZgA"
            data-category="General"
            data-category-id="DIC_kwDOKTBZgM4CdFER"
            data-mapping="url"
            data-strict="1"
            data-reactions-enabled="1"
            data-emit-metadata="0"
            data-input-position="bottom"
            data-theme="https://gs.saro.me/assets/giscus.css"
            data-lang="ko"
            crossorigin="anonymous"
            async>
    </script>
</div>

    <li><strong></strong></li>
  content<div class="post title">[백업][가리사니] spring boot security : 5. 회원가입</div>

<div class="post ctrl pad-x-4">
    <div class="fl-left">
        
            java, spring
        
    </div>
    <div class="fl-right">
        <a href="https://github.com/ac-saro">박용서</a> •
        <a href="https://github.com/ac-saro/ac-saro.github.io/edit/publish/_posts/old/2016-07-26-[백업][가리사니] Spring boot Security : 5. 회원가입.md">2016-07-26</a>
    </div>
</div>

<div class="hr-line pad-x-4 content-layout">
    <blockquote>
<p>이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다.
오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.</p>
</blockquote>
<h1 id="spring-boot-security-">Spring boot Security 시리즈</h1>
<ul>
<li><a href="/2016/07/24/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-1.-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95.html">1. 설치 및 페이지 설정</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-2.-%EC%9D%B8%EC%A6%9D-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90/html">2. 인증로직을 만들어보자.</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-3.-%EC%9D%B8%EC%A6%9D%EB%A1%9C%EC%A7%81-%EC%9E%A0%EC%9E%AC%EC%A0%81-%EC%9C%84%ED%97%98.html">3. 인증로직 - 잠재적 위험</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">4. 인증 페이지뷰</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-5.-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85.html">5. 회원가입</a></li>
<li><a href="/2016/09/03/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-Security-login-(%EC%84%B1%EA%B3%B5-%EC%8B%A4%ED%8C%A8)-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88.html">부록 : Spring Security login (성공 / 실패) 이벤트 리스너 </a></li>
</ul>
<h1 id="section">뷰</h1>
<p>2장 강의에선 string 으로 뽑았던 메인페이지도 새로 만들어줍니다.
src/main/resources/templates/main.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">&gt;</span>
<span class="nt">&lt;head&gt;</span>
	<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;title&gt;</span>메인페이지<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;div&gt;</span>

	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/mypage"</span><span class="nt">&gt;</span>마이페이지<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>
	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/login"</span><span class="nt">&gt;</span>로그인<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>
	<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/create"</span><span class="nt">&gt;</span>회원가입<span class="nt">&lt;/a&gt;&lt;br/&gt;</span>

<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<p>src/main/resources/templates/create.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">&gt;</span>
<span class="nt">&lt;head&gt;</span>
	<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;title&gt;</span>회원가입<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;div&gt;</span>

	<span class="nt">&lt;form</span> <span class="na">th:action=</span><span class="s">"@{/createProcessing}"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">&gt;</span>
		<span class="nt">&lt;h2&gt;</span>회원가입<span class="nt">&lt;/h2&gt;</span>

		<span class="c">&lt;!-- 강의를 간결하게 끝내기 위함.. 원래는 가입실패 여부를 자세히 표시해야한다 --&gt;</span>
		<span class="nt">&lt;div</span> <span class="na">th:if=</span><span class="s">"${param.error}"</span><span class="nt">&gt;</span>
			계정이 중복됩니다.
		<span class="nt">&lt;/div&gt;</span>

		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"ac"</span> <span class="na">placeholder=</span><span class="s">"계정"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/&gt;</span>
		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"password"</span> <span class="na">name=</span><span class="s">"pw"</span> <span class="na">placeholder=</span><span class="s">"암호"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/&gt;</span>
		<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"회원가입"</span><span class="nt">/&gt;</span>
	<span class="nt">&lt;/form&gt;</span>

<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<h1 id="section-1">서비스</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Component</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AccountService</span>
<span class="o">{</span>
	<span class="nd">@Autowired</span>
	<span class="nc">AccountRepository</span> <span class="n">accountRepository</span><span class="o">;</span>

	<span class="c1">// 리턴을 저런식으로하면 안됩니다.</span>
	<span class="c1">// (무었때문에 가입 실패했는지를 적어주셔야..)</span>
	<span class="nd">@Transactional</span>
	<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">create</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
	<span class="o">{</span>
		<span class="k">if</span> <span class="o">(</span><span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
		<span class="o">{</span>
			<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
		<span class="o">}</span>

		<span class="nc">Account</span> <span class="n">account</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Account</span><span class="o">();</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setPw</span><span class="o">(</span><span class="k">new</span> <span class="nc">BCryptPasswordEncoder</span><span class="o">().</span><span class="na">encode</span><span class="o">(</span><span class="n">pw</span><span class="o">));</span>
		<span class="n">account</span><span class="o">.</span><span class="na">setRole</span><span class="o">(</span><span class="s">"NORMAL"</span><span class="o">);</span>
		<span class="n">accountRepository</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">account</span><span class="o">);</span>

		<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
	<span class="o">}</span>

	<span class="kd">public</span> <span class="nc">Account</span> <span class="nf">getAccount</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">)</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
	<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-2">컨트롤러</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">main</span><span class="o">()</span>
<span class="o">{</span>
	<span class="k">return</span> <span class="s">"main"</span><span class="o">;</span>
<span class="o">}</span>

<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/create"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">create</span><span class="o">()</span>
<span class="o">{</span>
	<span class="k">return</span> <span class="s">"create"</span><span class="o">;</span>
<span class="o">}</span>

<span class="nd">@Autowired</span>
<span class="nc">AccountService</span> <span class="n">accountService</span><span class="o">;</span>

<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/createProcessing"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">createProcessing</span><span class="o">(</span><span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
	<span class="k">if</span> <span class="o">(</span><span class="n">accountService</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">ac</span><span class="o">,</span> <span class="n">pw</span><span class="o">))</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="s">"redirect:/login"</span><span class="o">;</span>
	<span class="o">}</span>
	<span class="k">else</span>
	<span class="o">{</span>
		<span class="k">return</span> <span class="s">"redirect:/create?error"</span><span class="o">;</span>
	<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-3">권한설정</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span>
<span class="o">{</span>
	<span class="n">http</span><span class="o">.</span><span class="na">authorizeRequests</span><span class="o">()</span>
		<span class="c1">// 회원가입과 처리부분이 추가</span>
		<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/login"</span><span class="o">,</span> <span class="s">"/create"</span><span class="o">,</span> <span class="s">"/createProcessing"</span><span class="o">).</span><span class="na">permitAll</span><span class="o">()</span>
		<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/**"</span><span class="o">).</span><span class="na">authenticated</span><span class="o">();</span>

	<span class="n">http</span>
		<span class="o">.</span><span class="na">formLogin</span><span class="o">()</span>
		<span class="c1">// 로그인 처리 페이지</span>
		<span class="o">.</span><span class="na">loginProcessingUrl</span><span class="o">(</span><span class="s">"/loginProcessing"</span><span class="o">)</span>
		<span class="c1">// 로그인 페이지</span>
		<span class="o">.</span><span class="na">loginPage</span><span class="o">(</span><span class="s">"/login"</span><span class="o">)</span>
		<span class="o">.</span><span class="na">failureUrl</span><span class="o">(</span><span class="s">"/login?error"</span><span class="o">);</span>

	<span class="n">http</span>
		<span class="o">.</span><span class="na">logout</span><span class="o">()</span>
		<span class="c1">// /logout 을 호출할 경우 로그아웃</span>
		<span class="o">.</span><span class="na">logoutRequestMatcher</span><span class="o">(</span><span class="k">new</span> <span class="nc">AntPathRequestMatcher</span><span class="o">(</span><span class="s">"/logout"</span><span class="o">))</span>
		<span class="c1">// 로그아웃이 성공했을 경우 이동할 페이지</span>
		<span class="o">.</span><span class="na">logoutSuccessUrl</span><span class="o">(</span><span class="s">"/"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-4">요약 - 결론</h1>
<p>회원가입시 암호를 넣을 때 로그인에 적용한 동일한 해시를 적용하시면 됩니다.</p>
<h1 id="section-5">추신</h1>
<p>처음엔 연동부부만 쓰려다가 조금 더 확장하니.... 소스가 난장판이 되었습니다.;;;;;
다듬어서 다시 쓰려고했지만... 요즘 시간이 부족하네요 ㅠㅠ...;;;</p>

</div>

<div class="hr-line pad-t-10 pad-x-4 li-4">
<ul><li>다음글: <a href="/2016/07/27/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-mustache-%EB%AC%B8%EB%B2%95-+-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%97%B0%EB%8F%99.html">[백업][가리사니] mustache 문법 + 스프링 연동</a></li><li>이전글: <a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">[백업][가리사니] spring boot security : 4. 인증 페이지뷰</a></li></ul>
</div>

<div class="pad-t-10">
    <script src="https://giscus.app/client.js"
            data-repo="ac-saro/ac-saro.github.io"
            data-repo-id="R_kgDOKTBZgA"
            data-category="General"
            data-category-id="DIC_kwDOKTBZgM4CdFER"
            data-mapping="url"
            data-strict="1"
            data-reactions-enabled="1"
            data-emit-metadata="0"
            data-input-position="bottom"
            data-theme="https://gs.saro.me/assets/giscus.css"
            data-lang="ko"
            crossorigin="anonymous"
            async>
    </script>
</div>

  
    <li><a href=""></a></li>
  

주석


상위선택

  • 상위를 선택하는 문법이 한정적임
  • 이렇게 사용할 경우 items 안에 해더가 없을때 한단계 위 해더가 선택된다.
  • 단계별로 올라가도 끝내 해더가 나오지 않을 경우 빈값

  

포함 : include

  • 해당 경로에 있는 템플릿을 결합합니다.

스프링에서 적용하기

메이븐 추가

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>

src/main/resources/templates/test.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title></title>
</head>
<body>
<div>
	
</div>
</body>
</html>

컨트롤러

@RequestMapping("/")
public String root(Model model)
{
	model.setAttribute("title", "타이틀 테스트");
	model.setAttribute("msg", "Hello!!");
	return "test";
}

연동이 안되는 경우는 아래와 같이 리졸버를 등록해보세요.

@Configuration
public class WebConfiguration implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        MustacheViewResolver resolver = new MustacheViewResolver();

        resolver.setCharset("UTF-8");
        resolver.setContentType("text/html;charset=UTF-8");
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");

        registry.viewResolver(resolver);
    }
}