<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kim-ju-ho.log</title>
        <link>https://velog.io/</link>
        <description>개발공부중입니다.</description>
        <lastBuildDate>Wed, 23 Mar 2022 16:42:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>kim-ju-ho.log</title>
            <url>https://velog.velcdn.com/images/kim-ju-ho/profile/a7658e52-dae8-4379-9214-86a0a3dacaef/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. kim-ju-ho.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kim-ju-ho" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SpringBoot] thymeleaf form 사용]]></title>
            <link>https://velog.io/@kim-ju-ho/SpringBoot-thymeleaf-form-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@kim-ju-ho/SpringBoot-thymeleaf-form-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Wed, 23 Mar 2022 16:42:57 GMT</pubDate>
            <description><![CDATA[<p>thymeleaf를 공부하는 중에 form태그를 이용하여 데이터를 주고 받는 과정에서 고민하고 검색하여 해결했던 내용을 기록한것 입니다.</p>
<h4 id="자세한-내용은-공식-홈페이지를-참고해주세요">자세한 내용은 공식 홈페이지를 참고해주세요</h4>
<blockquote>
<p>  <a href="https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#standard-expression-syntax">공식홈페이지로 이동</a></p>
</blockquote>
<p>일단 thymeleaf를 이용한 form태그에서 자주 사용하는 대해서 간단히 설명하겠습니다.</p>
<h2 id="form">form</h2>
<p>  간단하게 form 태그에서 사용할 수 있는 3가지 입니다. 저는 이 3가지를 사용하였습니다.</p>
<h4 id="thaction">th:action</h4>
<ul>
<li>form data를 보낼 url를 설정<h4 id="thobject">th:object</h4>
</li>
<li>form data를 담을 객체를 설정<h4 id="thfield">th:field</h4>
</li>
<li>담는 객체의 필드을 동적으로 매핑 (사용시 객체의 필드로 id과 name이 자동생성)</li>
</ul>
<h2 id="example">example</h2>
<p>   먼저 form태그를 사용할 페이지에 비어있는 객체를 전달해야합니다.
  <strong>controller</strong></p>
<pre><code class="language-java">@GetMapping(&quot;/writeBbs&quot;)
    public String writeBbs(Model model, BbsRequestDto requestDto){
        model.addAttribute(&quot;requestDto&quot;,requestDto);
        return &quot;writeBbs&quot;;
    }
</code></pre>
<p>Model에 form data를 담을 객체를 비어있는 객체인 BbsRequestDto를 담아서 form태그를 이용할 writeBbs.html로 전달하였습니다.
<strong>writeBbs.html</strong></p>
<pre><code class="language-html">&lt;form th:action=&quot;@{/api/bbs/write}&quot;  th:object=&quot;${requestDto}&quot; method=&quot;post&quot; &gt;
    &lt;table class=&quot;table&quot;&gt;
        &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;제목&lt;/td&gt;
            &lt;td&gt;&lt;input type=&quot;text&quot; th:field=&quot;*{title}&quot;&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;작성자&lt;/td&gt;
            &lt;td&gt;&lt;input type=&quot;text&quot; th:field=&quot;*{writer}&quot;&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style=&quot;height: 300px;&quot;&gt;
            &lt;td&gt;내용&lt;/td&gt;
            &lt;td&gt;&lt;input type=&quot;text&quot; th:field=&quot;*{contents}&quot;&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/tbody&gt;
        &lt;button type=&quot;submit&quot;&gt;등록&lt;/button&gt;
    &lt;/table&gt;
    &lt;/form&gt;</code></pre>
<p>해당 writeBbs.html 보시면 th:action으로 form data를 보낼 url를 지정하고 있고,또한 th:object에는 controller에서 받아온 빈객체인 requestDto를 지정하고 있습니다.</p>
<h6> ps. intellij에서만 제공하는 기능인지는 모르겠지만 빈객체를 보내면 담은 객체의 이름을 자동완성으로 제공해줍니다. 처음에 객체를 안보내서..얼마나 고생했던지.. </h6>


<pre><code class="language-java">import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BbsRequestDto {
    private String title;
    private String contents;
    private String writer;
}</code></pre>
<p>또한 th:field에서는 받아온 객체의 필드변수명을 입력해주셔야 form data를 보낼때 자동으로 매팅을 해줍니다.</p>
<p>여기 부분에서 검색을 많이 했던 부분입니다. 처음에 Dto 작성했을때 Setter를 추가하지 않었는데요 그 이유는 Dto setter를 작성하지 않아도 <code>@ReqeustBody</code>이용하면 json으로 보낼때는 <code>Jackson2HttpMessageConverter</code>가 <code>java Object</code>로 변환해서 넣어준다고.. 
그걸로 모르고 setter를 안썼더니 controller에서 데이터를 못받아준거 같습니다. form data를 받는 <code>@RequestBody</code>가 아닌 <code>@ModelAttribute</code>이용해야 해서 그런거 같습니다.</p>
<h6></h6>
**controller**

<pre><code class="language-java">    @PostMapping(&quot;/api/bbs/write&quot;)
    public String createBbs(@ModelAttribute(&quot;requestDto&quot;) BbsRequestDto requestDto){
       Bbs bbs = new Bbs(requestDto);
       bbsRepository.save(bbs);
       return &quot;redirect:/&quot;;
    }</code></pre>
<p>다음은 form data를 받아서 JPA로 DB에 insert해주는 소스입니다.</p>
<hr>
<p>긴글 읽어주셔서 감사합니다. 혼자 공부하면서 적은 내용이라 틀린 부분이 많을거 같은데 피드백 주시면 공부후에 수정하도록 하겠습니다. 감사합니다.</p>
]]></description>
        </item>
    </channel>
</rss>