Animated Rainbow Nyan Cat

Thymeleaf

View Template Engine

ํƒ€์ž„๋ฆฌํ”„๋Š” ์‘๋‹ต์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ณด๋‚ด์ค€ ๋‚ด์šฉ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

 

Spring EL

Spring Expression Language

๋Ÿฐํƒ€์ž„์‹œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ๊ธฐ๋ณธ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

1) ${...} ํ‘œํ˜„์‹ - ๋ณ€์ˆ˜ ํ‘œํ˜„์‹

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ th:์†์„ฑ๋ช… ํ˜น์€ [[ ]]์•ˆ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

 

2) @{ ... } ํ‘œํ˜„์‹ - URL ํ‘œํ˜„์‹

์„œ๋ฒ„์˜ contextPath๋ฅผ ๋ฐ˜์˜ํ•œ URI๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

 

3) ๋ฌธ์ž ํ•ฉ์น˜๊ธฐ

ํ•ฉ์น˜๊ณ  ์‹ถ์€ ๋ฌธ์ž์—ด์„ "|"๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ +์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž๋ฅผ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

<div th:text="|I am ${info.name} !! |"></div>
<div th:text="'I am '+ ${info.name} + ' !! '"></div>

 

4) ๋น„๊ต ์—ฐ์‚ฐ์ž

์ดํ•ญ ์—ฐ์‚ฐ์ž

<div th:text="${info.name != 'kim'}"></div>

์‚ผํ•ญ์—ฐ์‚ฐ์ž

<div th:text="${info.name == 'kim' ? 'ok' : 'no'}"></div>

 

 

<th:block th:if="${info.age > 18}"><hr><p>์ž…์žฅ ๊ฐ€๋Šฅ</p><hr></th:block>

if- else ๋ฌธ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

each

for ๋ฐ˜๋ณต๋ฌธ๊ณผ ๋น„์Šทํ•จ

<th:block th:each="data,status:${datas}">  
    <h1 th:text="|${status.count} ${data}|"></h1>    
</th:block>

2๊ฐœ ์ด์ƒ ์ ์„ ๋•Œ๋Š” block ํƒœ๊ทธ๋กœ ๋ฌถ๋Š” ๊ฒŒ ์ข‹๋‹ค.

data,status ์ด๋ ‡๊ฒŒ ์ ์–ด์ฃผ๋ฉด row์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

status ๊ฐ์ฒด์˜ ์†์„ฑ

index: 0๋ถ€ํ„ฐ ์‹œ์ž‘

count : 1๋ถ€ํ„ฐ ์‹œ์ž‘

size : ์ด ๊ฐœ์ˆ˜

current : ํ˜„์žฌ index์˜ ๋ณ€์ˆ˜

even / odd : ์ง์ˆ˜ / ํ™€์ˆ˜ ์—ฌ๋ถ€

first / last : ์ฒ˜์Œ / ๋งˆ์ง€๋ง‰ ์—ฌ๋ถ€

 

๋งํฌ๋  ๋Œ€์ƒ URL : th : href="@{}"

<a th:href="@{/insert(pageno=${pageno})}">

์ด ์ฝ”๋“œ๋Š”

<a href="/insert?pageno=123">

์ด ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

 

th:with="${}"

๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ’์„ ์žฌ์ •์˜ํ•˜๋Š” ์†์„ฑ. th:with๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

<div th:with=”userId=${number}” th:text=”${usesrId}”>

 

ํ‘œํ˜„์‹ 

๋ณ€์ˆ˜ ํ‘œํ˜„์‹ : ${ ... }

์„ ํƒ ๋ณ€์ˆ˜ ํ‘œํ˜„์‹ : *{ ... }

๋‹ค๊ตญ์  ์–ธ์–ด ๊ด€๋ จ ๋ฉ”์„ธ์ง€ ํ‘œํ˜„์‹ : #{ ... }

๋งํฌ URL ํ‘œํ˜„์‹ : @{ ... }

์กฐ๊ฐ ํ‘œํ˜„์‹ : ~{ ... }

 

๋น„๊ต์™€ ๋™๋“ฑ

๋น„๊ต: >,<,>=,<= (gt, lt, ge, le)

๋™๋“ฑ ์—ฐ์‚ฐ : ==, != (eq, ne)

 

์กฐ๊ฑด ์—ฐ์‚ฐ 

If-then : (if) ? (then)

If-then-else : (if) ? (then) : (else)

Default : (value) ?: (defaultvalue) (์žˆ์œผ๋ฉด ๊ฑ”๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์—†๋‹ค๋ฉด defaultvalue๋กœ ์ง€์ •ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.)

 

ํŠน๋ณ„ํ•œ ํ† ํฐ

No-Operation: _ (์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ๋ง์•„๋ผ)

 

ํƒ€์ž„๋ฆฌํ”„ ๋‚ด์žฅ ๊ฐ์ฒด

#dates: java.util.Date ์„œ์‹ ์ง€์›

#temporals : ์ž๋ฐ”8 ๋‚ ์งœ ์„œ์‹ ์ง€์› (๋‚ ์งœ๋Š” ์ฃผ๋กœ temporals๋ฅผ ์‚ฌ์šฉ)

#numbers: ์ˆซ์ž ์„œ์‹ ์ง€์›

 

@Data

@RequiredArgsConstructor ์ด๋ฉด @NonNull์ด ์žˆ์–ด์•ผ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค. ๋ฐ˜๋ฉด @AllArgsConstructor๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋“  ํ•„๋“œ์— ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, @Data์—๋Š” @RequiredArgsConstructor๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•„๋“œ์— @NonNull์„ ์ผ์ผ์ด ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.

 

User userA = new User("์‚ฌ์šฉ์ž A", 10);

List<User> list = new ArrayList<>();
list.add(userA);

final HashMap<String, User> map = new HashMap<>();
map.put("userA", userA);

model.addAttribute("user", userA);
model.addAttribute("users", list);
model.addAttribute("userMap", map);

์ด๋Ÿฐ ์‹์œผ๋กœ userA๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , add๋กœ list์— ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๊ณ , put์œผ๋กœ map์— ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

<h3>์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•</h3>
<ul>
    <li>${user.userName} = <span th:text="${user.userName}"></span></li>
    <li>${user['userName']} = <span th:text="${user['userName']}"></span></li>
    <li>${user.getuserName()} = <span th:text="${user.getUserName()}"></span></li>
</ul>
<h3>๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•</h3>
<ul>
    <li>${users[0].userName} span> = <span th:text="${users[1].userName}"></span></li>
    <li>${users[0]['userName']} = <span th:text="${users[1]['userName']}"></span></li>
    <li>${users[0].getuserName()} = <span th:text="${users[1].getUserName()}"></span></li>
</ul>
<h3>์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•</h3>
<ul>
    <li>${userMap['userA'].userName} = <span th:text="${userMap['userA'].userName}"></span></li>
    <li>${userMap['userA']['userName']} = <span th:text="${userMap['userA'] ['userName']}"></span></li>
    <li>${userMap['userA'].getuserName()} = <span th:text="${userMap['userA'].getUserName()}"></span></li>
</ul>

๊ทธ๋Ÿฌ๋ฉด html์—์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. user์— userA๋ฅผ ๋„ฃ์–ด์คฌ์„ ๋•Œ๋Š” ์ฒซ๋ฒˆ์งธ, users์— list๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ์„๋•Œ๋Š” ๋‘๋ฒˆ์งธ, userMap์— map์„ ๋„ฃ์–ด์ฃผ์—ˆ์„ ๋•Œ๋Š” ์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์จ์„œ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

<ul th:with="first=${users[0]}">
    <li>์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์€ '<span th:text="${first.userName}"></span>'</li>
</ul>

์ด๋Ÿฐ์‹์œผ๋กœ with๋ฅผ ์‚ฌ์šฉํ•ด์„œ first์— user[0]์„ ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

if(session.getAttribute("count") == null)
    session.setAttribute("count", new int[1]);
int su[] = (int[])session.getAttribute("count");
su[0]++;

์กฐํšŒ์ˆ˜๊ฐ™์€ ๊ฒƒ์„ ์„ธ๋Š” ์ฝ”๋“œ

 

param, session, application์€ #์„ ์“ฐ์ง€ ์•Š๊ณ  ์“ด๋‹ค.

์•„๋‹Œ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ๋‚ด์žฅ๊ฐ์ฒด๋Š” #์„ ๋ถ™์ด๊ณ  ์“ด๋‹ค.

 

<li>spring bean = <span th:text="${@my.hello('Spring Boot!')}"></span></li>

์ธ์‹๋˜๋Š” bean์ค‘์—์„œ my๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋œ bean๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ ์“ด๋‹ค.. hello๋ฅผ ํ˜ธ์ถœํ•ด ๋ฆฌํ„ด๋œ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

@Component("my")
class HelloBean {
    public String hello(String data) {
        return "์•ˆ๋…•? " + data;
    }
}

javaํŒŒ์ผ์— ์ด๋ ‡๊ฒŒ ์จ๋†“์€ ๊ฒƒ์„ ์ง์ ‘ ์‚ฌ์šฉํ•œ๋‹ค.

[[${#temporals.format(startTime,'yyyy-MM-dd HH:mm:ss')}]]<br>

์ด๋Ÿฐ์‹์œผ๋กœ format์„ ์ง€์ •ํ•ด์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

<li>Request Parameter = <span th:text="${param.Data}"></span></li>

์ฟผ๋ฆฌ๋ฌธ์ž์—ด์—์„œ param์œผ๋กœ ๋ฐ›์•„์™€์„œ Data๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ฃผ์†Œ์ฐฝ์—

http://localhost:8088/step2/basicobjects?Data=DUKE ์ด๋Ÿฐ์‹์œผ๋กœ ์น˜๋ฉด

์ด๋ ‡๊ฒŒ Data๋ฅผ ๋ฐ›์•„์™€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

<li>${#temporals.month(startTime)} = <span th:text="${#temporals.month(startTime)}"></span></li>

์ด๋Ÿฐ์‹์œผ๋กœ #temporals๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[[${#dates.createNow()}]]
[[${#dates.createToday()}]]

createNow๋Š” ์ง€๊ธˆ์ด๊ณ  createToday๋Š” ์˜ค๋Š˜์„ ๋‚˜ํƒ€๋‚ธ๊ฒƒ

์ด๋Ÿฐ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

[[${#strings.isEmpty(param.name)}]]

ํŒŒ๋ผ๋ฏธํ„ฐ์˜ name์ด ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ

๋น„์–ด์žˆ์œผ๋ฉด  true๋ฅผ ์ค€๋‹ค.

[[${#strings.toLowerCase(tech)}]]

์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

[[${#strings.trim(tech)}]]

์•ž์˜ ๊ณต๋ฐฑ์„ ์ง€์›Œ์ค€๋‹ค.

<li>${#numbers.formatDecimal(num, 3, 'COMMA', 2, 'POINT')} = <span th:text="${#numbers.formatDecimal(num, 3, 'COMMA', 2, 'POINT')}"></span></li>

์ด๋Ÿฐ์‹์œผ๋กœ #numbers๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ถœ๋ ฅํ•˜๋ฉด

์ด๋Ÿฐ์‹์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

[[${param.containsKey('foo')}]]

foo๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋А๋ƒ. ์žˆ์œผ๋ฉด true ์—†์œผ๋ฉด false

[[${session.sessionData} ]]

session์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์ค‘์—์„œ sessionData๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

[[${session.keySet()} ]]

keySet()์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

@RequestMapping(value="/character/detail/{name}/{number}")
public String getAllBoards(@PathVariable("number") int num, @PathVariable String name, Model model){

name์ด๋ผ๊ณ  ๋ณด๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ๋‹ค ์‚ฌ์šฉํ•˜๊ณ  number๋ผ๊ณ  ๋ณด๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ๋‹ค๊ฐ€ ์ค€๋‹ค. 

@PathVariable ๊ฐ๊ฐ์˜ ์œ„์น˜์— ์ž‘์„ฑ๋˜์–ด์žˆ๋Š” ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์€ path์ •๋ณด์˜ ์ผ๋ถ€๋ถ„์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

๋ญ๊ฐ€ ์˜ค๋˜ name์œผ๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  number๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค๋Š” ์˜๋ฏธ.

 

@PathVariable("number") int num ๋Š” number๋ฅผ ์ถ”์ถœํ•ด์„œ num์— ๋„ฃ์–ด์ค€๋‹ค๋Š” ๋œป.

@PathVariable String name ๋Š” path์ •๋ณด์ธ name์„ ์ถ”์ถœํ•ด์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ name์— ๋„ฃ์–ด์ค€๋‹ค๋Š” ๋œป. ์ด๋ฆ„ ๊ฐ™์œผ๋ฉด ("")๋ฅผ ๊ตณ์ด ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

<li><a th:href="@{/hello(param1=${param1}, param2=${param2})}">hello query param</a></li>
<li><a th:href="@{/hello/{param1}/{param2}(param1=${param1}, param2=${param2})}">path variable</a></li>
<li><a th:href="@{/hello/{param1}(param1=${param1}, param2=${param2})}">path variable + query parameter</a></li>

์ฐจ๋ก€๋Œ€๋กœ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. (param1์—๋Š” news, param2์—๋Š” ๋‹จํ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.)

path์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ž์—ด์ด ์˜จ๋‹ค.

 

<li>${nullData}?: _ = <span th:text="${nullData}?: _">๋ฐ์ดํ„ฐ๊ฐ€์—†์Šต๋‹ˆ๋‹ค.</span></li>

nullData๊ฐ€ ์—†๊ฑฐ๋‚˜ null์ด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ง์•„๋ผ..

<input type="checkbox" name="active" th:checked="true" />

์ฒ˜์Œ๋ถ€ํ„ฐ ์ฒดํฌ๋œ ์ƒํƒœ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค -> th:checked="true"๋กœ ๋†“์œผ๋ฉด ๋œ๋‹ค.

<input type="checkbox" name="active" th:checked="false" />

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด checked๊ฐ€ false์ด๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ..

 

checked =""ํ•˜๊ณ  ์ด ์•ˆ์— ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋”๋ผ๋„ checkedํ•œ ์ƒํƒœ๋กœ ๊ฐ„์ฃผ๋จ. ์‹ฌ์ง€์–ด ์•ˆ์— false๊ฐ€ ๋“ค์–ด๊ฐ€๋„..

<input type="checkbox" name="active" checked="false" />

<input type="text" class="text" th:attrappend="class=' large'" />

attrappend๋Š” ๋’ค์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด๋ผ.. ๊ฒฐ๊ณผ ์ ์œผ๋กœ class๊ฐ€ text large๊ฐ€ ๋œ๋‹ค.

<input type="text" class="text" th:attrprepend="class='large '" />

attrprepend๋Š” ์•ž์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด๋ผ.. ๊ฒฐ๊ณผ์ ์œผ๋กœ class๊ฐ€ large text๊ฐ€ ๋œ๋‹ค.

private void addUsers(Model model) {
    List<User> list = new ArrayList<>();
    list.add(new User("๋‘˜๋ฆฌ", 10));
    list.add(new User("๋˜์น˜", 20));
    list.add(new User("๋„์šฐ๋„ˆ", 30));
    model.addAttribute("users", list);
}

list์— ๊ฐ์ฒด ๋„ฃ์–ด์ฃผ๊ณ  model ๊ฐ์ฒด์— users๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ list ๋„ฃ์–ด์ค€๋‹ค.

 

ํƒ€์ž„๋ฆฌํ”„ ์ฃผ์„:

<!--/* */-->

ํ˜น์€

<!--/*-->
...
<!--*/-->

์ด ๋ฐฉ์‹์œผ๋กœ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์— ์ „์†ก๋„ ์•ˆ๋˜๊ณ  ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋„ ์•ˆ๋จ.

 

<-- --> ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์— ์ „์†ก์€ ๋˜๋‚˜ ์‹ค์ œ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์˜ค๋Š” ๊ฒƒ์€ ์•„๋‹˜. ์„œ๋ฒ„์—์„œ๋Š” ์ œ์™ธ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—๋Š” ์ „์†ก๋จ.

 

<th:block th:each="user : ${users}">
    <div>
       ์‚ฌ์šฉ์ž ์ด๋ฆ„1 <span th:text="${user.userName}"></span> ์‚ฌ์šฉ์ž ๋‚˜์ด1 <span
          th:text="${user.age}"></span>
    </div>
    <div>
       ์š”์•ฝ <span th:text="${user.userName} + ' / ' + ${user.age}"></span>
    </div>
</th:block>

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. blockํƒœ๊ทธ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Œ.

<script th:inline="javascript">

์ด ์•ˆ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฑด '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค˜.' ํ•˜๋Š” ๋œป

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—๋Ÿฌ๋‚œ๋‹ค.. ""์ด๋Ÿฐ ์ธ์šฉ๋ถ€ํ˜ธ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์—†์Œ.

'๐Ÿ’ผ Full-Stack Study โ‘ก (feat. KOSA)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring & Ajax & Mybatis  (2) 2023.10.11
Spring & Thymeleaf  (2) 2023.10.10
Spring Boot  (1) 2023.10.06
Spring Boot & Thymeleaf  (1) 2023.10.05
Spring  (0) 2023.10.04