02N. ํ ํ๋ฆฟ ์์
02N. ํ ํ๋ฆฟ ์์ ๊ด๋ จ
HTML์ ์ต์ํ ๋ ์๋ผ๋ฉด ๋์น๊ฒ ์ง๋ง, ์ง๊ธ๊น์ง ์์ฑํ ์ง๋ฌธ ๋ชฉ๋ก, ์ง๋ฌธ ์์ธ ํ ํ๋ฆฟ์ ํ์ค HTML ๊ตฌ์กฐ๊ฐ ์๋๋ค. ์ด๋ค ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์น ํ์ด์ง๊ฐ ๋์ผํ๊ฒ ๋ณด์ด๊ณ ์ ์์ ์ผ๋ก ์๋ ํ๊ฒ ํ๋ ค๋ฉด ๋ฐ๋์ ์น ํ์ค์ ์งํค๋ HTML ๋ฌธ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํ์ค HTML ๊ตฌ์กฐ
ํ์ค HTML ๋ฌธ์์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํ๋ค.
ํ์ค HTML ๊ตฌ์กฐ์ ์
<!doctype html>
<html lang="ko">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/bootstrap.min.css}">
<!-- sbb CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/style.css}">
<title>Hello, sbb!</title>
</head>
<body>
(... ์๋ต ...)
</body>
</html>
ํ์ค HTML ๋ฌธ์์ ๊ตฌ์กฐ๋ ์์ ์์ฒ๋ผ html, head, body ์๋ฆฌ๋จผํธ๊ฐ ์์ด์ผ ํ๋ฉฐ, CSS ํ์ผ์ head ์๋ฆฌ๋จผํธ ์์ ๋งํฌ ๋์ด์ผ ํ๋ค. ๋ํ head ์๋ฆฌ๋จผํธ ์์๋ meta, title ์๋ฆฌ๋จผํธ ๋ฑ์ด ํฌํจ๋์ด์ผ ํ๋ค.
ํ๊ทธ์ ์๋ฆฌ๋จผํธ
<table> (... ์๋ต ...) </table> <!-- table ์๋ฆฌ๋จผํธ -->
์์์ <table>
์ table ํ๊ทธ์ด๊ณ <table> ~ </table>
์ฒ๋ผ table ํ๊ทธ๋ก ์์ํด์ table ํ๊ทธ๋ก ๋ซํ ๊ตฌ๊ฐ(Block)์ table ์๋ฆฌ๋จผํธ์ด๋ค.
ํ ํ๋ฆฟ ์์
์์์ ์์ฑํ ์ง๋ฌธ ๋ชฉ๋ก, ์ง๋ฌธ ์์ธ ํ ํ๋ฆฟ์ ํ์ค HTML ๊ตฌ์กฐ๊ฐ ๋๋๋ก ์์ ํด ๋ณด์. ๊ทธ๋ฐ๋ฐ ํ ํ๋ฆฟ ํ์ผ๋ค์ ๋ชจ๋ ํ์ค HTML ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ฉด body ์๋ฆฌ๋จผํธ ๋ฐ๊นฅ ๋ถ๋ถ(head ์๋ฆฌ๋จผํธ ๋ฑ)์ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์ค๋ณต๋๋ค. ๊ทธ๋ฌ๋ฉด CSS ํ์ผ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์๋ก์ด CSS ํ์ผ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ชจ๋ ํ ํ๋ฆฟ ํ์ผ์ ์ผ์ผ์ด ์์ ํด์ผ ํ๋ค.
ํ์๋ฆฌํ๋ ์ด๋ฐ ์ค๋ณต์ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด ํ ํ๋ฆฟ ์์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ ํ๋ฆฟ ์์์ ๊ธฐ๋ณธ ํ์ด ๋๋ ํ ํ๋ฆฟ์ ๋จผ์ ์์ฑํ๊ณ ๋ค๋ฅธ ํ ํ๋ฆฟ์์ ๊ทธ ํ ํ๋ฆฟ์ ์์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ ํ๋ฆฟ ์์์ ๋ํด์ ์์ธํ ์์๋ณด์.
layout.html
๋จผ์ ํ์ค HTML ๊ตฌ์กฐ์ ๊ธฐ๋ณธ ํ์ด ๋๋ layout.html
ํ
ํ๋ฆฟ์ ๋ค์์ฒ๋ผ ์์ฑํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
layout.html
<!doctype html>
<html lang="ko">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/bootstrap.min.css}">
<!-- sbb CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/style.css}">
<title>Hello, sbb!</title>
</head>
<body>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ Start -->
<th:block layout:fragment="content"></th:block>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ End -->
</body>
</html>
. layout.html
ํ
ํ๋ฆฟ์ ๋ชจ๋ ํ
ํ๋ฆฟ์ด ์์ํด์ผ ํ๋ ํ
ํ๋ฆฟ์ผ๋ก ํ์ค HTML ๋ฌธ์์ ๊ธฐ๋ณธ ํ์ด๋๋ค. body ์๋ฆฌ๋จผํธ ์์ <th:block layout:fragment="content"></th:block>
๋ถ๋ถ์ด ๋ฐ๋ก layout.html
์ ์์ํ ํ
ํ๋ฆฟ์์ ๊ฐ๋ณ์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ ์์ญ์ด ๋๋ค. ์ฆ, layout.html
ํ
ํ๋ฆฟ์ ์์ํ๋ฉด <th:block layout:fragment="content"></th:block>
์์ญ์ ํด๋น๋๋ ๋ถ๋ถ๋ง ์์ฑํด๋ ํ์ค HTML ๋ฌธ์๊ฐ ๋๋ ๊ฒ์ด๋ค.
question_list.html
๊ทธ๋ฆฌ๊ณ question_list.html
ํ
ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
question_list.html
<!-- link rel="stylesheet" type="text/css" th:href="@{/bootstrap.min.css}" -->
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
<table class="table">
(... ์๋ต ...)
</table>
</div>
</html>
๋ถํธ์คํธ๋ฉ ์คํ์ผ ๋งํฌ๋ ์ญ์ ํ๋ค. ์๋ํ๋ฉด ๋ถ๋ชจ ํ ํ๋ฆฟ์ธ
layout.html
ํ ํ๋ฆฟ์์ ์ด๋ฏธ ๋ถํธ์คํธ๋ฉ ์คํ์ผ์ ๋งํฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
.layout.html
ํ
ํ๋ฆฟ์ ์์ํ๊ธฐ ์ํด <html layout:decorate="~{layout}">
์ฒ๋ผ ์ฌ์ฉํ๋ค. ํ์๋ฆฌํ์ layout:decorate
์์ฑ์ ํ
ํ๋ฆฟ์ ๋ ์ด์์(๋ถ๋ชจ ํ
ํ๋ฆฟ)์ผ๋ก ์ฌ์ฉํ ํ
ํ๋ฆฟ์ ์ค์ ํ๋ค. ์์ฑ์ ๊ฐ์ธ ~{layout}
์ layout.html
ํ์ผ์ ์๋ฏธํ๋ค.
๋ถ๋ชจ ํ
ํ๋ฆฟ์ธ layout.html
์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์๋ค.
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ Start -->
<th:block layout:fragment="content"></th:block>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ End -->
๋ถ๋ชจ ํ ํ๋ฆฟ์ ์ ๋ถ๋ถ์ ์์ ํ ํ๋ฆฟ์ ๋ด์ฉ์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
<div layout:fragment="content" class="container my-3">
(... ์๋ต ...)
</div>
์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ชจ ํ
ํ๋ฆฟ์ th:block
์๋ฆฌ๋จผํธ์ ๋ด์ฉ์ด ์์ ํ
ํ๋ฆฟ์ div ์๋ฆฌ๋จผํธ์ ๋ด์ฉ์ผ๋ก ๊ต์ฒด ๋๋ค.
.
question_list.html
์layout.html
ํ ํ๋ฆฟ์ ์์๋ฐ์ ํ์ค HTML๋ฌธ์๊ฐ ๋๋ค.
question_detail.html
.question_detail.html
๋ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
question_detail.html
<!-- link rel="stylesheet" type="text/css" th:href="@{/bootstrap.min.css}" -->
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
<h2 class="border-bottom py-2" th:text="${question.subject}"></h2>
(... ์๋ต ...)
</form>
</div>
</html>
.question_list.html
ํ
ํ๋ฆฟ๊ณผ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก layout.html
ํ
ํ๋ฆฟ์ ์์ํ๋ค.
ํ ํ๋ฆฟ ์์์ ์ ์ฉํ ํ ์ง๋ฌธ ๋ชฉ๋ก, ์ง๋ฌธ ์์ธ๋ฅผ ์กฐํํด ๋ณด์. ํ๋ฉด์ ๋ณด์ฌ์ง๋ ๊ฒ์ ๋์ผํ์ง๋ง ํ์ค HTML ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์์ ์์ค๋ณด๊ธฐ ๊ธฐ๋ฅ์ผ๋ก ์์ฑ๋ HTML์ ํ์ธํ ์ ์๋ค.
style.css
๊ทธ๋ฆฌ๊ณ ๋ถํธ์คํธ๋ฉ ์ ์ฉ์ผ๋ก ์ธํด style.css
์ ๋ด์ฉ์ ํ์๊ฐ ์์ด์ก์ผ๋ฏ๋ก ๊ธฐ์กด ๋ด์ฉ์ ๋ชจ๋ ์ญ์ ํ์.
.
style.css
ํ์ผ์ ์ดํ ๋ถํธ์คํธ๋ฉ์ผ๋ก ํํํ ์ ์๋ ์คํ์ผ ์์ฑ์ ์ํด ํ์ผ ์์ฒด๋ฅผ ์ญ์ ํ์ง๋ ๋ง๊ณ ๋ด์ฉ๋ง ์ญ์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/static/
style.css
/*
textarea {
width:100%;
}
input[type=submit] {
margin-top:10px;
}
*/