Spring boot - Thymeleaf(mainpage)

이진욱·2023년 6월 26일

Spring Boot

목록 보기
7/7
post-thumbnail

뷰페이지를 Thymeleaf로 작성했으며, dependencies에는 미리 등록을 해놓았다.

implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

뷰페이지는 MPA방식으로 만들었고, thymeLeaf에 th:block을 사용했다.

Header

<nav th:fragment="headerFragment">
	
	<div id="menu1">
	
        <ul>
            <li>
                <a th:href="@{/}">HOME</a>
            </li>
            <li>
                <a href="#">ABOUT</a>
            </li>
            <li>
                <a href="#">MY CAFE</a>
                <ul>
                    <li><a href="#">즐겨찾는 카페</a></li>
                    <li><a href="#">이웃 카페</a></li>
                    <li><a href="#">중고 장터</a></li>
                </ul>
            </li>
            <li>
                <a href="#">BOARD</a>
                <ul>
                    <li><a href="#">NOTICE</a></li>
                    <li><a href="#">FREEBOARD</a></li>
                    <li><a href="#">CONTACT</a></li>
                </ul>
            </li>
        </ul>
    </div>
    
</nav>

CSS

header {
    border:30px;
    width: 1000px;
    margin: auto;    
}
#menu1 { 
    width: 1000px;
    height: 50px;
    background: skyblue ;
    color: black;
    line-height: 50px;
    margin: auto;
    text-align: center;
    text-decoration:none;
}

    #menu1 > ul > li {
        float: left;
        width: 250px;
        position: relative;
    }
        #menu1 > ul > li > ul {
            width: 250px;
            display: none;
            position: absolute;
            background: skyblue;
        }
        #menu1 > ul > li:hover > ul {
            display: block;
            z-index: 50;
        }
        #menu1 > ul > li > ul > li:hover {
            background: gray;
            transition: ease 1s;
            z-index: 50;
        }

메인페이지는 hover 를 사용했고, 나중에 사용할 CKeditor와의 겹치는것을 방지하기위해 z-index를 설정하였다.

Layout

<!doctype html>
<html lang="ko-kr" >
<head>
    <meta charset="utf-8">
    <meta name="viewport">
    <link rel="stylesheet" type="text/css" th:href ="@{/css/layout/layout.css}" />
	
    <title>Project</title>
</head>
<body>

	<nav th:replace="~{layout/header :: headerFragment}"></nav>

	<th:block layout:fragment="content"></th:block>  

</body>
</html>

상단네비바는 th:replace를 사용해서 th:block이 변경되더라도 네비바가 reaplace될수있게 설정해놓았다.
contents 안에들어갈 mainpage는 model을 통해서 여러가지 정보를 가져올 계획계획이지만 내용이 필요한것들만 넣겠다.

Main

<html layout:decorate="~{layout}">
<div  layout:fragment="content" class="container">

    <div id="contents">

		
        <div id="login">
        <br><br>
		  
    		<a id="loginTab" sec:authorize="isAnonymous()" th:href="@{/crud/login}">LOGIN
    			<div id=loginOther>
			    	<a th:href="@{/crud/register}">회원가입</a> ||
				    <a href="">아이디찾기</a>	||
				    <a href="">비밀번호찾기</a>
		    	</div>
    		</a>

    		<a id="loginTab" sec:authorize="isAuthenticated()" th:href="@{/crud/logout}">
  				
 				<div th:if="${#authentication.principal instanceof T(org.springframework.security.oauth2.core.user.DefaultOAuth2User)}">
				  	<span th:text="${#authentication.principal.attributes['name']}"></span>님 환영합니다.
				</div>
				
				<div th:if="${#authentication.principal instanceof T(org.springframework.security.core.userdetails.User)}">
				    <span th:text="${#authentication.principal.username}"></span>님 환영합니다.
				</div>
					 <a th:href="@{/crud/update}">개인정보수정</a> ||
					 <a th:href="@{/crud/delete}">회원탈퇴</a>
				</div>
			</a>
		 		 
	    	<br>
	    	
		</div>

    </div>

</div>
</html>

th:if문을 통해서 SNS사용자인지 사이트사용자인지를 확인하도록했다.
사이트사용자와 SNS사용자의 Token값이 다르기때문에 instanceof 연산자를 불러와서 직접대입하는 방법으로 처리를 했고, 일반사용자는 userId가 출력이되고 SNS사용자는 name이 표시되도록 구분시켜놓았다.

CSS


#loginTab {
	
	background-color: skyblue;
	display : block;
	text-align: center;
	height: 30px;
	
}

뷰페이지 작업은 간단히 마무리하였으며, 이제 페이지를 호출할수있는 컨트롤러를 만들어주면된다.

MainController

@RequiredArgsConstructor
@Controller
public class MainController {
	
	@GetMapping("/")
	public String root() {
	
		return "/main/main";
        
	}

전체적인 완성은 이런느낌이지만 시간의 흐름으로 재구성중이다.

profile
열심히 배우자

0개의 댓글