Thymeleaf ํ์๋ฆฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ ๋ฆฌ [ํ ์คํธ/๋ณ์/๋ฐ๋ณต/์์ฑ]
ํ์๋ฆฌํ๋ ํ ํ๋ฆฟ ์์ง์ด๋ค.
์คํ๋ง์ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค!
์ฌ๊ธฐ์์ ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ณณ์ ํตํด์ ํ๋ก์ ํธ๋ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ Dependencies์ ํ์๋ฆฌํ๋ฅผ ์ ํํ๋ฉด๋๋ค.
ํน์ ์ ํํ์ง ์์๋ค๋ฉด build.gradle์ ๋ค์ด๊ฐ์
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}
dependencies์์ ์ฝ๋๋ฅผ ์ถ๊ฐ์์ผ ์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค!!
๊ทธ๋ผ ํ์๋ฆฌํ ๊ฐ๋ ์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค๐
ํ์๋ฆฌํ (Thymeleaf)
ํ์๋ฆฌํ๋ ์๋ฒ ์ฌ์ด๋ ์๋ฐ ํ ํ๋ฆฟ ์์ง์ด๋ค.
โพ ์๋ฒ ์ฌ์ด๋ HTML ๋ ๋๋ง
๋ฐฑ์๋ ์๋ฒ์์ HTML์ ๋์ ์ผ๋ก ๋ ๋๋ง ํ๋ ์ฉ๋์ด๋ค.
โพ ๋ด์ถ๋ด ํ ํ๋ฆฟ
ํ์๋ฆฌํ๋ HTML์ ์ต๋ํ ์ ์ง์ํค๋ ํน์ง์ด ์๋ค.
th๋ฅผ ์ฌ์ฉํด์ HTML ์ฝ๋ ์์ ์์ฑํ๋ค.
ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ ๊ทธ๋๋ก ์น๋ธ๋ผ์ฐ์ ์ ์ด์ด๋ ์ ์์ ์ธ HTML์ ํ์ธํ ์ ์๋ค.
ํ์ง๋ง ๋์ ๊ฒฐ๊ณผ๋ ๋ ๋๋ง ๋์ง ์๋๋ค
์์ HTML์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ๋ทฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋ ํ์๋ฆฌํ์ ํน์ง์ ๋ด์ถ๋ด ํ ํ๋ฆฟ์ด๋ผ๊ณ ํ๋ค.
โพ ์คํ๋ง ํตํฉ ์ง์
ํ์๋ฆฌํ๋ HTML์ ์ฐ๊ธฐ ๋๋ฌธ์ HTML๋ฌธ์ ํ์๋ฆฌํ๋ฅผ ์ ์ธํด์ค์ผ ํ๋ค.
<html xmlns:th="http://www.thymeleaf.org">
[ ๊ธฐ๋ณธ ํํ์ ]
์ด ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ํํ์ ์ ๋ฆฌ๊ฐ ์ ๋์ด์๋ค!
[ ํ ์คํธ ]
ํ์๋ฆฌํ์์ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด th:text๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
<sapn th:text=${data}">
HTML ์์ฑ์ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด [[${data}]]๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
โญ ๊ทผ๋ฐ html ์์ฑ ์ค์ ๊ธ์จ๋ฅผ ๊ตต๊ฒ ํ๋ค๊ฑฐ๋ ์ค๊ฐ์ <> ํ๊ทธ๊ฐ ๋ค์ด๊ฐ์ผ ํ ์ผ์ด ์๊ธธ ์๋ ์๋ค. ์ด๋ด ๋๋ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์์ค๋ณด๊ธฐ์์ ์ด์ํ ํํ์ด ๋์จ๋ค.
Hello <b>Spring!</b>๋ฅผ ๋ณด๋ธ ๊ฒ์ด๋ค.
- < ๐ <
- > ๐ >
์์ฒ๋ผ ํ์๋๋ค. ์ด๋ ๊ฒ html์์ ์ฌ์ฉํ๋ ํน์๋ฌธ์๋ฅผ html์ํฐํฐ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด์ค์ผ์ดํ๋ผ๊ณ ํ๋ค.
ํ์๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ค์ผ์ดํ๋ฅผ ์ ๊ณตํ๋ค.
๋ง์ฝ ์์ฒ๋ผ ํํํ๊ธฐ ์ซ๋ค๋ฉด unescape๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- th:text ๐ th:utext
- [[...]] ๐ [(...)]
๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฅ <>์ด ํ๊ทธ๊ฐ ๋ณด์ธ๋ค!
๐ ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก๋ escape๋ฅผ ์ฌ์ฉํ๊ณ ํ์ํ ๋๋ง unescape๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค!!!!
[ ๋ณ์ ]
๋ณ์๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณ์ ํํ์์ ์ฌ์ฉํ๋ค.
${...}
์์ ๊ฐ์ ํํ์์ ์ฌ์ฉํ๋ค.
๊ทธ๋ผ ์๋ฅผ ์ดํด๋ณด์
@Data
static class Person{
private String name;
private int age;
public User(String name, int age){
this.name = name;
this.age = age;
}
}
public String variable(Model model){
Person person = new Person("user1", 10);
List<Person> list = new ArrayList<>();
list.add(user1); //๋ฆฌ์คํธ๋ก ์ ๊ทผ ํ ๋
Map<String, Person> map = new HashMap<>();
map.put("user1", user1);
model.addAttribute("user", user1);
model.addAttribute("userList", list);
model.addAttribute("userMap",map);
return [html๋ก~~];
}
๋ณ์ ์ถ๋ ฅํ๋ ๋ฐ์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
- ${key์ด๋ฆ.๋ณ์์ด๋ฆ}
- ${key์ด๋ฆ['๋ณ์์ด๋ฆ']}
- ${key์ด๋ฆ.getter๋ฉ์๋ ์ด๋ฆ}
<!-- ๊ฐ์ฒด๋ก ๋๊ฒผ์ ๊ฒฝ์ฐ -->
<span th:text="${user.name}"></span>
<span th:text="${user['name']}"></span>
<span th:text="${user.getName()}"></span>
<!--๋ฆฌ์คํธ๋ก ๋๊ฒผ์ ๊ฒฝ์ฐ -->
<span th:text="${userList[0].name}"></span>
<span th:text="${userList[0]['name']}"></span>
<span th:text="${userList[0].getName()}"></span>
<!--๋งต์ผ๋ก ๋๊ฒผ์ ๊ฒฝ์ฐ -->
<span th:text="${userMap['user1'].name}"></span>
<span th:text="${userMap['user1']['name']}"></span>
<span th:text="${userMap['user1'].getName()}"></span>
โ ์ง์ญ ๋ณ์ ์ ์ธ
th:with๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ญ๋ณ์๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์ง์ญ๋ณ์๋ ์ ์ธํ ํ๊ทธ ์์์๋ง ์ฌ์ฉํ ์ ์๋ค.
<div th:with="fist=${userList[0]}">
<span th:text="${first.name}"></span>
</div>
[ url ๋งํฌ ]
ํ์๋ฆฌํ์์ url์ ์ฌ์ฉํ ๋๋@{...} ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด
@{/hello}
๋ผ๊ณ ๊ฒฝ๋ก ์ค์ ์ ํด ๋์ผ๋ฉด "/hello"๋ผ๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ url ์ ๋ ฅ์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
โญ"/"๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ๊ฒฝ๋ก๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. url ๊ฒฝ๋ก์์ ๋ณ์๊ฐ ์์ผ๋ฉด () ๋ถ๋ถ์ด ๊ฒฝ๋ก ๋ณ์๋ก ์ฒ๋ฆฌ๋๋ค. (? A=b ์ด๋ฐ ์)
๐ ๊ฒฝ๋ก ๋ณ์
@{/hello/{param1}/{param2}(param1=${param1}, param2=${param2})
์ด๋ฐ ์์ ์ ๋ ฅํ๋ฉด ์ ๋ ฅ ๊ฒฐ๊ณผ๋
/hello/(param1 value๊ฐ)/(param2 vaule๊ฐ)
์ผ๋ก url๊ฒฝ๋ก๊ฐ ์ค์ ๋๋ค.
๐ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ ()๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
@{/hello(param=${param})
์ด๋ฐ ์์ ์ ๋ ฅํ๋ฉด ์ ๋ ฅ ๊ฒฐ๊ณผ๋
/hello?param=(param value๊ฐ)
์ผ๋ก url์ด ์ ๋ ฅ๋๋ค!! ์ฆ () ์์ ์๋ ๊ฑด ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก?~~~ ์ด ๋ค์ ์๋ ๊ฐ์ ์๋ฏธํ๋ค.
๐ ๊ฒฝ๋ก ๋ณ์ + ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
๊ฒฝ๋ก ๋ณ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ๊ฐ์ด ํ์ฉ๋ ๊ฐ๋ฅํ๋ค.
@{hello/{param1}(param1=${param1}, param2=${param2})
/{}์ฌ๊ธฐ๊น์ง๋ param1๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ param1๊น์ง๊ฐ ๊ฒฝ๋ก ๋ณ์๋ก ์ค์ ๋๊ณ , ์ ๊ธฐ์ ์๊ณ () ์ฌ๊ธฐ ์์ ์กด์ฌํ๋ ํ๋ผ๋ฏธํฐ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅ๋๋ค.
/hello/(param1 value๊ฐ)?param2=(param2 value๊ฐ)
๋ฐ๋ผ์ ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
[ ๋ฆฌํฐ๋ด ]
๋ฆฌํฐ๋ด์ ์์ค ์ฝ๋์์ ๊ณ ์ ๋ ๊ฐ์ ๋งํ๋ ์ฉ์ด์ด๋ค.
๋ฐ๋ผ์ ๊ผญ!!! ์์๋ฐ์ดํ๋ก ๋ฌธ์๋ฅผ ๊ฐ์ธ์ผํ๋ค. ํ์ง๋ง ๊ณต๋ฐฑ์ด ์์ผ๋ฉด ๊ฐ์ธ์ง ์์๋ ๋๋ค. (๊ทธ๋๋ ๊ผญ!!! ํ๊ธฐ)
๐ hello world ์ถ๋ ฅํ๊ณ ์ถ์ ๋
<span th:text ="'hello' + ' world'"></span>
<span th:text="'hello world'"></span>
์ด๋ฐ ์์ผ๋ก ๊ผญ ์์ ์์๋ฐ์ดํ๋ฅผ ๋ถ์ฌ์ผ ํ๋ค. ํ์ง๋ง ์ผ์ผ์ด ๋ถ์ด๊ธฐ ๊ท์ฐฎ์ ๋!! ์ข์ ํ์๋ฆฌํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์๋ค.
||์ด๊ฑฐ๋ก ๊ฐ์ธ๋ฉด ๋๋ค.
<span th:text="|hello world|"></span>
์ด๋ ๊ฒ ํ๋ฉด ๊น๋ํ๊ฒ ์ถ๋ ฅ ๊ฐ๋ฅ๐
[ ์์ฑ ์ค์ ]
th:* ์์ฑ์ ์ด์ฉํ๋ฉด ๊ธฐ์กด ์์ฑ์ ํ์๋ฆฌํ๊ฐ ์ง์ ํ th:* ์์ฑ์ผ๋ก ๋์ฒดํ๊ฒ ๋๋ค!!
name="A" th:name="B"
์ด๋ ๊ฒ ์์ฑํ๋ฉด ํ์๋ฆฌํ์ ์์ฑ์ด ์ฐ์ ์๋์ด์ ์ด๋ฆ์ด B๊ฐ ๋๋ค!!
โ ์์ฑ ์ถ๊ฐ
- th:attrappend : ์์ฑ ๊ฐ์ ๋ค์ ๊ฐ์ ์ถ๊ฐํ๋ค.
- th:attrprepend : ์์ฑ ๊ฐ์ ์์ ๊ฐ์ ์ถ๊ฐํ๋ค.
- th:classappend : class ์์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ์ถ๊ฐํ๋ค.
class="hello" th:attrappend="class=' world'" <!-- class ์์ฑ ๋ค์ world ์ถ๊ฐํ๊ธฐ -->
class="hello" th:attrpreapend="class='world '" <!-- class ์์ฑ ์์ world ์ถ๊ฐํ๊ธฐ -->
class="hello" th:classappend="' world'" <!-- class ์์ฑ์ world ์ถ๊ฐํ๊ธฐ-->
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ค. ๊ทธ๋ผ ๊ฒฐ๊ณผ๋
hello world
world hello
hello world
์ด๋ ๊ฒ ๋์จ๋ค!
โ ์ฒดํฌ๋ฐ์ค
<input type="checkbox" name="active" checked="false"/>
์ฒดํฌ๋ฐ์ค๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด check๋ฐ์ค๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค. ํ์ง๋ง ์์ฒ๋ผ ์ฒดํฌ๋ฅผ ์ ํ๊ณ ์ถ์ง๋ง, checked๋ผ๋ ์์ฑ์ด ์ ๋ ฅ๋๋ฉด true, false์ ์ฌ๋ถ์๋ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์ฒดํฌ๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ํ์๋ฆฌํ ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
<!-- check ๋ฐ์ค ์ฒดํฌ ํ๊ณ ์ถ์ ๋ -->
<input type="checkbox" name="active" th:checked="true"/>
<!-- check ๋ฐ์ค ์ฒดํฌ ํ๊ณ ์ถ์ง ์์ ๋ -->
<input type="checkbox" name="active" th:checked="false"/>
์ฐธ๊ณ ๋ก th:checked="false"๋ฅผ ์ฌ์ฉํ๋ฉด false์ผ ๊ฒฝ์ฐ์๋ ์์ค์ฝ๋๋ฅผ ๋ณผ ๋ th:checked์ ์ฝ๋๋ ๋ณด์ด์ง ์๋๋ค.
[ ๋ฐ๋ณต ]
ํ์๋ฆฌํ์์ ๋ฐ๋ณต์ th:each๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ฆฌ์คํธ๋ก ๊ฐ์ ๋ฃ์๋ค๊ณ ๊ฐ์ ํ๊ณ !
<tr th:each="user : ${userList}">
<td th:text="${user.name}">name</td>
<td th:text="${user.age}">0</td>
</tr>
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ชจ์์ ์๋ฐ ๋ฐ๋ณต๋ฌธ for( : )์ด๊ฑฐ๋ ๋น์ทํ ๊ฒ ๊ฐ๋ค!!
[ ์กฐ๊ฑด๋ถ ํ๊ฐ ]
ํ์๋ฆฌํ์์ ์กฐ๊ฑด๋ถ ํ๊ฐ๋ if, unless, switch๋ก ํ๋ค!
๐ if, unless ์ฌ์ฉ
<span th:text="'๋ฏธ์ฑ๋
์'" th:if="${user.age lt 20}"></span>
<span th:text="'๋ฏธ์ฑ๋
์'" th:unless="${user.age ge 20}"></span>
์ฌ๊ธฐ์ ์ฐธ๊ณ ๋ก lt๋ <์ ๋ปํ๊ณ , ge๋ >=๋ฅผ ๋ปํ๋ค.
์กฐ๊ฑด์ด false์ธ ๊ฒฝ์ฐ์๋ ํ๊ทธ ์์ฒด๋ฅผ ๋ ๋๋ง ํ์ง ์๋๋ค.
๋ฐ๋ผ์ ํ์ด์ง ์์ค๋ณด๊ธฐ๋ฅผ ํ๋ฉด false ์ฝ๋๊ฐ ๋ณด์ด์ง ์๊ฒ ๋๋ค.
๐ switch ์ฌ์ฉ
<td th:switch="${user.age}">
<span th:case="10">10์ด</span>
<span th:case="20">20์ด</span>
<span th:case="*">๊ธฐํ</span>
</td>
switch~case๋ฌธ์ด๋ ๋น์ทํ๋ค.
ํ ๊ฐ์ง ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด *์ด ์๋ฏธํ๋ ๊ฒ์ ๋ง์กฑํ๋ ๊ฐ์ด ์์ ๋ ์ฌ์ฉํ๋ ๋ํดํธ ๊ฐ์ด๋ค.
10์ด, 20์ด์ด ์๋๋ผ๋ฉด ๋ชจ๋ ๊ธฐํ๋ก ๋ ๋๋ง ๋๋ค.
[ ์ฃผ์ ]
HTML ์๋ ์ฃผ์์ด ์์ง๋ง HTML ์ฃผ์์ ์น ๋ธ๋ผ์ฐ์ ์์ค๋ณด๊ธฐ์์ ๊ทธ๋๋ก ๋ณด์ธ๋ค.
๐ ํ์ค HTML ์ฃผ์
<!-- HTML ์ฃผ์์ฒ๋ฆฌ -->
HTML ์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๊ฒ ์ ๋ ๊ฒ ํ์ํ๋ค. HTML ์ฃผ์์ ํ์๋ฆฌํ๊ฐ ๋ ๋๋ง ํ์ง ์๊ณ ๊ทธ๋๋ก ๋จ๊ฒจ๋๋ค.
๐ ํ์๋ฆฌํ ํ์ ์ฃผ์
<!--/* ์ฃผ์ */-->
<!--/*-->
<span ~~></span>
<!--*/-->
๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
/* */ ์ฌ๊ธฐ ์ฌ์ด์ ๋ค์ด๊ฐ ๊ฒ์ ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๐ ํ์๋ฆฌํ ํ๋กํ ํ์ ์ฃผ์
<!--/*/
<span th:text="${data}">data</span>
/*/-->
์ด๊ฑด ์ข ํน๋ณํ ์ฃผ์์ด๋ค.
๊ทธ๋ฅ html ํ์ผ๋ก ์ด์ด๋ณด๋ฉด ์ฃผ์์ฒ๋ฆฌ๊ฐ ๋์ด์์ง๋ง, ํ์๋ฆฌํ๋ฅผ ๋ ๋๋ง ํ์ ๋ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ๋ณด๋ฉด span ํ๊ทธ๋ ์ฃผ์์ฒ๋ฆฌ๊ฐ ๋์ด์์ง ์๋ค!
[ ๋ธ๋ก ]
๋ฐ๋ณต๋ฌธ์ ์ฐ๋ฉด์ ํด๋น ๊ฐ์ฒด ์ ๋ณด๋ผ๋ฆฌ๋ง ๋ฌถ์ด์ ๋ฐ๋ณต์ผ๋ก ์ถ๋ ฅํ๊ณ ์ถ์ ๋๋ ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ธ๋ก์ th:block์ ์ฌ์ฉํ๋ฉด ๋๊ณ , th:each๋ฅผ ์ฐ๋ ๊ณณ์ ์์ฑํ๋ค.
์ค์ํ ์ ! ๋ธ๋ก์ผ๋ก ๋ฌถ๊ณ ์ถ์ ๊ฒ๋ผ๋ฆฌ divํ๊ทธ๋ก ๊ฐ์ธ์ค๋ค.
<th:block th:each="user : ${userList}">
<div>
์ด๋ฆ <span th:text="${user.name}></span>
๋์ด <span th:text="${user.age></span>
</div>
</th:block>
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ด๋ฆ๊ณผ ๋์ด๋ก ๋ฌถ์ฌ์ ์ถ๋ ฅ๋๋ค.
โญ th:block์ ๋ ๋๋ง ์์ ์ฌ๋ผ์ง๊ณ , ๋ฌถ์ธ ์ ๋ณด๋ง ์ถ๋ ฅ๋๋ค!!
๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ํ์๋ฆฌํ์์ ์์ฃผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ๋ง ์ ๋ฆฌํด๋ณด์๋ค!
์ด๋ ๊ฒ ๋ณด๋๊น ์๊ทผํ ๋ง๊ณ ์์ฃผ ์ฐ๋ฉด์ ์ต์ํด์ ธ์ผ ํ ๊ฒ ๊ฐ๋ค๐
์ด ํฌ์คํ ์ ์ธํ๋ฐ ๊น์ํ ๋์ ์คํ๋งmvc 2ํธ์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.