03A. ๋ด๋น๊ฒ์ด์ ๋ฐ
03A. ๋ด๋น๊ฒ์ด์ ๋ฐ ๊ด๋ จ
์ง๊ธ๊น์ง ๋ง๋ SBB๋ก ์ง๋ฌธ ๋ชฉ๋ก์ ์กฐํํ๊ณ ์ง๋ฌธ์ ๋ฑ๋กํ๊ณ , ๋ค์ ๋ด์ฉ์ ๋ณด๊ณ ๋ต๋ณ์ ๋ฌ๊ณ ์ด๋ ๊ฒ ์กฐ์์ ํ๋ค ๋ณด๋ฉด ์๋ง๋ ๋ถํธํจ์ ๋๋ผ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก ๋ฉ์ธํ์ด์ง(Home)๋ก ๋์๊ฐ ์ ์๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฒ์๋ ์ด๋ฌํ ๋ถํธ์ ํด์ํ ์ ์๋ ๋ด๋น๊ฒ์ด์ ๋ฐ๋ฅผ ๋ง๋ค์ด ๋ณด์. ๋ด๋น๊ฒ์ด์ ๋ฐ๋ ๋ชจ๋ ํ๋ฉด ์์ชฝ์ ๊ณ ์ ๋์ด ์๋ ๋ถํธ์คํธ๋ฉ ์ปดํฌ๋ํธ์ด๋ค.
๋ด๋น๊ฒ์ด์ ๋ฐ
๋ด๋น๊ฒ์ด์
๋ฐ๋ ๋ชจ๋ ํ์ด์ง์์ ๊ณตํต์ ์ผ๋ก ๋ณด์ฌ์ผ ํ๋ฏ๋ก ๋ค์์ฒ๋ผ 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>
<nav class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
<div class="container-fluid">
<a class="navbar-brand" href="/">SBB</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#">๋ก๊ทธ์ธ</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ Start -->
<th:block layout:fragment="content"></th:block>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ End -->
</body>
</html>
ํญ์ ํ ํ์ด์ง๋ก ์ด๋ํด ์ฃผ๋ 'SBB' ๋ก๊ณ ๋ฅผ ๊ฐ์ฅ ์ผ์ชฝ์ ๋ฐฐ์นํ๊ณ , ์ค๋ฅธ์ชฝ์๋ '๋ก๊ทธ์ธ' ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ค. (๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๋์ค์ ๊ตฌํํ๋ค.)
์ด์ ์ง๋ฌธ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ํ๋ฉด ์๋จ์ ๋ค์๊ณผ ๊ฐ์ ๋ด๋น๊ฒ์ด์ ๋ฐ๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค.
๋ด๋น๊ฒ์ด์ ๋ฐ์ 'SBB' ๋ก๊ณ ๋ฅผ ๋๋ฅด๋ฉด ์๋ฌด ๊ณณ์์๋ ๋ฉ์ธ ํ์ด์ง๋ก ๋์๊ฐ ์ ์๋ค. 'SBB' ๋ก๊ณ ๋ฅผ ๋๋ฌ์ ์ ์๋ํ๋์ง ํ์ธํด ๋ณด์.
๊ทธ๋ฆฌ๊ณ ๋ถํธ์คํธ๋ฉ ๋ด๋น๊ฒ์ด์ ๋ฐ์๋ ์ฌ๋ฏธ์๋ ๊ธฐ๋ฅ์ด ํ๋ ์จ์ด ์๋ค. ์๋ฌด ํ์ด์ง๋ ์ ์ํด์(์ฌ๊ธฐ์๋ ์ง๋ฌธ ๋ชฉ๋ก์ ์ ์ํ๋ค) ์น ๋ธ๋ผ์ฐ์ ์ ํฌ๊ธฐ๋ฅผ ๋ง์ฐ์ค๋ฅผ ์ด์ฉํ์ฌ ์ ์ ์ค์ฌ๋๊ฐ ๋ณด์. ๊ทธ๋ฌ๋ฉด ์ด๋ ์๊ฐ ํ๋ฒ๊ฑฐ ๋ฉ๋ด ๋ฒํผ์ด ์๊ธด๋ค. ๊ทธ๋ฆฌ๊ณ '๋ก๊ทธ์ธ' ๋งํฌ๋ ์ฌ๋ผ์ง๋ค.
๋ถํธ์คํธ๋ฉ์ ๋ธ๋ผ์ฐ์ ์ ํฌ๊ธฐ๊ฐ ์์์ง๋ฉด ๋ด๋น๊ฒ์ด์ ๋ฐ์ ์๋ ๋งํฌ๋ค์ ์์ ํ๋ฒ๊ฑฐ ๋ฉ๋ด ๋ฒํผ์ผ๋ก ์จ๊ธด๋ค. (๋ถํธ์คํธ๋ฉ์ ๋ฐ์ํ ์น ๊ธฐ๋ฅ์ด๋ค.)
๋ฉ๋ด ๋ฒํผ์ ํด๋ฆญํด์ผ ์จ๊ฒจ์ง "๋ก๊ทธ์ธ" ๋งํฌ๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค. ํ์ง๋ง ์์ง์ ๋ฉ๋ด ๋ฒํผ์ ํด๋ฆญํด๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๋ค. ๊ทธ ์ด์ ๋ ๋ถํธ์คํธ๋ฉ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(bootstrap.min.js
)์ด layout.html
ํ์ผ์ ํฌํจ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถํธ์คํธ๋ฉ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ด๋ฏธ ๋ค์ด๋ก๋ ๋ฐ์ bootstrap-5.2.3-dist.zip
์์ถํ์ผ์ ์์ผ๋ฏ๋ก ๋ค์ ์์น์ ๋ณต์ฌํด ์ฃผ์.
- ์์ถํ์ผ๋ด ๊ฒฝ๋ก: bootstrap-5.2.3-dist.zip/bootstrap-5.2.3-dist/js/bootstrap.min.js
- ๋ถ์ฌ ๋ฃ์ ์์น:
/sbb/src/main/resources/static/
bootstrap.min.js
์ฆ, ๋ค์์ฒ๋ผ /sbb/src/main/resources/static
๋๋ ํฐ๋ฆฌ ํ์์ bootstrap.min.js
ํ์ผ์ด ์์นํด ์์ด์ผ ํ๋ค.
์ด์ ์ถ๊ฐํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฌ์ฉํ ์ ์๋๋ก layout.html
ํ๋จ์ </body>
ํ๊ทธ ๋ฐ๋ก์์ ๋ค์์ฒ๋ผ ์ถ๊ฐํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
layout.html
<!doctype html>
<html lang="ko">
(... ์๋ต ...)
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ Start -->
<th:block layout:fragment="content"></th:block>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ End -->
<!-- Bootstrap JS -->
<script th:src="@{/bootstrap.min.js}"></script>
</body>
</html>
์ด๋ ๊ฒ ์์ ํ๋ฉด ๋ฉ๋ด ๋ฒํผ ํด๋ฆญ์ ์จ๊ฒจ์ง ๋งํฌ๊ฐ ๋ค์์ฒ๋ผ ํ์๋๋ ๊ฒ์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
๋ค๋น๊ฒ์ด์ ๋ฐ ๋ถ๋ฆฌํ๊ธฐ
์ด์ ์ฅ์์ ์ค๋ฅ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๊ณตํต ํ ํ๋ฆฟ์ ์์ฑํ๊ณ ์ง๋ฌธ ๋ฑ๋ก๊ณผ ์ง๋ฌธ ์์ธ ํ ํ๋ฆฟ์ ์ฝ์ ํ์๋ค. ๋ค๋น๊ฒ์ด์ ๋ฐ๋ ๊ณตํต ํ ํ๋ฆฟ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฆฌํด ๋ณด์.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด layout.html
์ ํฌํจ์ํฌ navbar.html
ํ
ํ๋ฆฟ์ ์์ฑํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
navbar.html
<nav th:fragment="navbarFragment" class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
<div class="container-fluid">
<a class="navbar-brand" href="/">SBB</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#">๋ก๊ทธ์ธ</a>
</li>
</ul>
</div>
</div>
</nav>
.navbar.html
์ ๋ด์ฉ์ layout.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>
<!-- nav class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
<div class="container-fluid">
<a class="navbar-brand" href="/">SBB</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#">๋ก๊ทธ์ธ</a>
</li>
</ul>
</div>
</div>
</nav -->
<!-- ๋ค๋น๊ฒ์ด์
๋ฐ -->
<nav th:replace="~{navbar :: navbarFragment}"></nav>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ Start -->
<th:block layout:fragment="content"></th:block>
<!-- ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ์์ ์ฝ์
๋ ๋ด์ฉ End -->
<!-- Bootstrap JS -->
<script th:src="@{/bootstrap.min.js}"></script>
</body>
</html>
๋ด๋น๊ฒ์ด์
๋ฐ HTML ์ฝ๋๋ค์ ์ญ์ ํ๊ณ navbar.html
ํ
ํ๋ฆฟ์ ํ์๋ฆฌํ์ th:replace
์์ฑ์ผ๋ก ํฌํจ์์ผฐ๋ค.
.
navbar.html
ํ์ผ์ ๋ค๋ฅธ ํ ํ๋ฆฟ๋ค์์ ์ค๋ณต๋์ด ์ฌ์ฉ๋์ง๋ ์์ง๋ง ๋ ๋ฆฝ๋ ํ๋์ ํ ํ๋ฆฟ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ ์ง ๋ณด์์ ์ ๋ฆฌํ๋ฏ๋ก ๋ถ๋ฆฌํ์๋ค.