๐Ÿ’ช(6-6) [Spring&mybatis] ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - tiles๋ฅผ ์ด์šฉํ•œ ์›นํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์„ค์ • / ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””์ž์ธ ์ถ”๊ฐ€

์”ฉ์”ฉํ•œ ์กฐ์•ฝ๋Œยท2023๋…„ 2์›” 7์ผ
0

๋ฏธ๋‹ˆํ”„๋กœ์ ํŠธ๐Ÿคน

๋ชฉ๋ก ๋ณด๊ธฐ
21/21

๊ฐœ๋ฐœํ™˜๊ฒฝ

์–ธ์–ด : JAVA (JDK 11)
์„œ๋ฒ„ : Apache Tomcat 9.0
ํ”„๋ ˆ์ž„์›Œํฌ : Spring Framework 3.9.18, MyBatis 3.5.8, Bootstrap 5.2.3
DB : OracleXE 11gR2
IDE : sts-3.9.18.RELEASE, SQL Developler

๊ตฌํ˜„๋‚ด์šฉ

  1. ๋ฉ”์ธํŽ˜์ด์ง€ / ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ๊ตฌํ˜„
  2. CREATE : ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ
  3. READ : ๊ฒŒ์‹œ๊ธ€ ๋ณด๊ธฐ + ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€
  4. UPDATE : ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •
  5. DELETE : ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
  6. tiles๋ฅผ ์ด์šฉํ•ด ์›นํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์„ค์ •

tiles๋ฅผ ์ด์šฉํ•ด ์›นํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์„ค์ •

1. tiles dependency ์„ค์น˜ (4๊ฐœ)

  • tiles-core / tiles-jsp / tiles-servlet / tiles-extras

2. tiles : ํ™”๋ฉด layout ๊ตฌํ˜„

0. WEB-INF์— views์— ํ•„์š”ํ•œ jspํŒŒ์ผ ์ƒ์„ฑ

1. WEB-INF - tilesํด๋” - tiles.xml ์ƒ์„ฑ

  • dtd์„ค์น˜
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
       
<tiles-definitions>
  
</tiles-definitions>

2. tiles.xml์— baselayout์„ค์ •ํ•˜๊ธฐ

  • baseLayout : ์ „์ฒด ํ™ˆํŽ˜์ด์ง€์˜ baselayout (๋ฐ˜๋ณต๋˜๋Š” header์™€ footer์˜ ๋””์ž์ธ ์ง€์ •)
  • index : ๋ฉ”์ธํŽ˜์ด์ง€. baselayout์—์„œ header, footer๋ฅผ ๋ฐ›์•„์˜ด / content๋Š” index.jsp๋กœ ์ง€์ •
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
       
<tiles-definitions>

	<definition name="baseLayout" template="/WEB-INF/tiles/layout/baselayout.jsp">
		<put-attribute name="title" value=""/>	
		<put-attribute name="heading" value=""/>	
		<put-attribute name="subheading" value=""/>	
		<put-attribute name="header" value="/WEB-INF/tiles/common/header.jsp"/>	
		<put-attribute name="content" value=""/>	
		<put-attribute name="footer" value="/WEB-INF/tiles/common/footer.jsp"/>	
	</definition>
	
	<definition name="home" extends="baseLayout">
		<put-attribute name="title" value="Main"/>	
		<put-attribute name="heading" value="WELCOME TO MY SPACE!"/>	
		<put-attribute name="subheading" value="๋กœ๊ทธ์ธํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด๋ณด์„ธ์š”!"/>	
		<put-attribute name="content" value="/WEB-INF/views/home.jsp"/>	
	</definition>	

</tiles-definitions>

3. ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์„ค์น˜ (๐Ÿ‘พ)

4. baselayout.jsp

  • core / tag-tiles ์„ค์น˜
  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์—ฐ๊ฒฐ
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

  <div class="b-example-divider"></div>

  <header class="p-3 text-bg-dark">
    <div class="container">
      <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
        <a href="/" class="d-flex align-items-center mb-2 mb-lg-0 text-white text-decoration-none">
          <svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" fill="currentColor" class="bi bi-egg-fried" viewBox="0 0 16 16">
  <path d="M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/>
  <path d="M13.997 5.17a5 5 0 0 0-8.101-4.09A5 5 0 0 0 1.28 9.342a5 5 0 0 0 8.336 5.109 3.5 3.5 0 0 0 5.201-4.065 3.001 3.001 0 0 0-.822-5.216zm-1-.034a1 1 0 0 0 .668.977 2.001 2.001 0 0 1 .547 3.478 1 1 0 0 0-.341 1.113 2.5 2.5 0 0 1-3.715 2.905 1 1 0 0 0-1.262.152 4 4 0 0 1-6.67-4.087 1 1 0 0 0-.2-1 4 4 0 0 1 3.693-6.61 1 1 0 0 0 .8-.2 4 4 0 0 1 6.48 3.273z"/>
</svg>
        </a>

        <ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
          <li><a href="#" class="nav-link px-2 text-secondary"></a></li>
          <li><a href="#" class="nav-link px-2 text-white">Board</a></li>
        </ul>


        <div class="text-end">
          <p class="nav-link px-2 text-white"></p>
          <button type="button" class="btn btn-outline-light me-2">Login</button>
          <button type="button" class="btn btn-warning">Sign-up</button>
        </div>
      </div>
    </div>
  </header>

4. header.jsp

  • core / tag-tiles์„ค์น˜
  • Board : list.jsp ์™€ ์—ฐ๊ฒฐ
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

  <div class="b-example-divider"></div>

  <header class="p-3 text-bg-dark">
    <div class="container">
      <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
        <a href="/" class="d-flex align-items-center mb-2 mb-lg-0 text-white text-decoration-none">
          <svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" fill="currentColor" class="bi bi-egg-fried" viewBox="0 0 16 16">
  <path d="M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/>
  <path d="M13.997 5.17a5 5 0 0 0-8.101-4.09A5 5 0 0 0 1.28 9.342a5 5 0 0 0 8.336 5.109 3.5 3.5 0 0 0 5.201-4.065 3.001 3.001 0 0 0-.822-5.216zm-1-.034a1 1 0 0 0 .668.977 2.001 2.001 0 0 1 .547 3.478 1 1 0 0 0-.341 1.113 2.5 2.5 0 0 1-3.715 2.905 1 1 0 0 0-1.262.152 4 4 0 0 1-6.67-4.087 1 1 0 0 0-.2-1 4 4 0 0 1 3.693-6.61 1 1 0 0 0 .8-.2 4 4 0 0 1 6.48 3.273z"/>
</svg>
        </a>

        <ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
          <li><a href="#" class="nav-link px-2 text-secondary"></a></li>
          <li><a href="/list.do" class="nav-link px-2 text-white">Board</a></li>
        </ul>


        <div class="text-end">
          <p class="nav-link px-2 text-white"></p>
          <button type="button" class="btn btn-outline-light me-2">Login</button>
          <button type="button" class="btn btn-warning">Sign-up</button>
        </div>
      </div>
    </div>
  </header>

5. footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<div class="b-example-divider"></div>

<div class="container">
  <footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
    <div class="col-md-4 d-flex align-items-center">
      <a href="/" class="mb-3 me-2 mb-md-0 text-muted text-decoration-none lh-1">
        <svg class="bi" width="30" height="24"><use xlink:href="#bootstrap"/></svg>
      </a>
      <span class="mb-3 mb-md-0 text-muted">&copy; 2023 Company, Inc</span>
    </div>

    <ul class="nav col-md-4 justify-content-end list-unstyled d-flex">
      <li class="ms-3"><a class="text-muted" href="#"><svg class="bi" width="24" height="24"><use xlink:href="#twitter"/></svg></a></li>
      <li class="ms-3"><a class="text-muted" href="#"><svg class="bi" width="24" height="24"><use xlink:href="#instagram"/></svg></a></li>
      <li class="ms-3"><a class="text-muted" href="#"><svg class="bi" width="24" height="24"><use xlink:href="#facebook"/></svg></a></li>
    </ul>
  </footer>
</div>

6. index.jsp

  • core ์„ค์น˜
  • ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ : src="resources/images/mainphoto.png"
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Home</title>
</head>
<body>
	<div align="center">
		<img src="resources/images/mainphoto.png" width="200" height="200"/>
	</div>
</body>
</html>

7. tiles ๋“ฑ๋ก : common-context.xml

  • tiles.xml์—์„œ ์„ค์ •ํ•œ definition name์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— InternalResourceViewResolver ๋Œ€์‹ ์— UrlBasedViewResolver๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- controller -->
	<bean class="com.mycompany.myapp.HomeController" />

	<!-- tiles -->
	<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<property name="definitions">
			<list>
				<value>/WEB-INF/tiles/tiles.xml</value>
			</list>
		</property>
	</bean>

	<!-- viewResolver -->
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
	</bean>

</beans>

8. ์‹คํ–‰

9. ๊ฒŒ์‹œํŒ ํŽ˜์ด์ง€ tiles ์—ฐ๊ฒฐ : tiles.xml

  • name์€ controller์—์„œ jsp๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•œ ์ด๋ฆ„๊ณผ ๋˜‘๊ฐ™์ด ์ ๊ธฐ
	<definition name="/board/list" extends="boardLayout">
		<put-attribute name="title" value="Board"/>	
		<put-attribute name="content" value="/WEB-INF/views/board/list.jsp"/>	
	</definition>	
	
	<definition name="/board/write" extends="baseLayout">
		<put-attribute name="title" value="Write"/>		
		<put-attribute name="content" value="/WEB-INF/views/board/write.jsp"/>	
	</definition>		
	
	<definition name="/board/read" extends="baseLayout">
		<put-attribute name="title" value="Write"/>		
		<put-attribute name="content" value="/WEB-INF/views/board/read.jsp"/>	
	</definition>

	<definition name="/board/update" extends="baseLayout">
		<put-attribute name="title" value="Write"/>		
		<put-attribute name="content" value="/WEB-INF/views/board/update.jsp"/>	
	</definition> 

10. ์—ฐ๊ฒฐํ™•์ธ

3. ๊ฒŒ์‹œํŒ ๊ด€๋ จ jsp์— ์ถ”๊ฐ€ ์ž‘์—…

3-1. write.jsp -'์ทจ์†Œ'๋ฒ„ํŠผ ์ถ”๊ฐ€

1. ์ทจ์†Œ๋ฒ„ํŠผ ์ƒ์„ฑ : write.jsp

		<input type="submit" value="์ž‘์„ฑ" id='btnWrite'/>
		<input type="submit" value="์ทจ์†Œ" id='btnCancle'/>
	</form>

2. ์ œ์ด์ฟผ๋ฆฌ ์ž‘์„ฑ : write.jsp

  • ์ œ์ด์ฟผ๋ฆฌ ์„ค์น˜(๐Ÿฆฉ)
  • 'btnCancle'๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋ฉด list.do๊ฐ€ ์‹คํ–‰
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script>
	$(document).ready(function(){
		$('#btnCancle').click(function(){
			$('#frm').attr('action', 'list.do').submit();
		})
	});
</script>

3-1. ์‹คํ–‰ -> '์ทจ์†Œ'๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋น„์–ด์žˆ๋Š” ๊ธ€์ด ์ž‘์„ฑ๋จ

3-2. ๋น„์–ด์žˆ๋Š” ๊ฐ’์€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ • ๋ฐ ๊ฒŒ์‹œํŒํ…Œ์ด๋ธ” ์žฌ์ƒ์„ฑ

  • NOT NULL : null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
DROP TABLE boardBasic;

CREATE TABLE boardBasic(
    num number CONSTRAINT boardBasic_num PRIMARY KEY,
    writer varchar2(50) not null,
    title varchar2(50) not null,
    content varchar2(100) not null,
    regdate date,
    readcount number default 0
    );

DROP SEQUENCE boardBasic_num_seq;

CREATE SEQUENCE boardBasic_num_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;

INSERT INTO boardBasic (num, writer, title, content, regdate, readcount)
VALUES(boardBasic_num_seq.nextval, '๋ฐ•์žฌ์–ธ','์ฒซ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€','์ฒซ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค',sysdate,0);

INSERT INTO boardBasic (num, writer, title, content, regdate, readcount)
VALUES(boardBasic_num_seq.nextval, '์ด์ง€ํ›ˆ','๋‘๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€','๋‘๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค',sysdate,0);

commit;

3-3. ๋ฒ„ํŠผ ํƒ€์ž… ๋ณ€๊ฒฝ : write.jsp

  • form์— action์†์„ฑ ์ง€์šฐ๊ธฐ
  • id ์ถ”๊ฐ€
	<form name="frm" method="post">
		<input type="button" value="์ž‘์„ฑ" id='btnWrite'/>
		<input type="button" value="์ทจ์†Œ" id='btnCancle'/>
	</form>

3-4. ์ œ์ด์ฟผ๋ฆฌ ์ž‘์„ฑ : write.jsp

  • btnWrite๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด frm์— action์†์„ฑ(write.do) ์ถ”๊ฐ€
  • btnCancle๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด frm์— action์†์„ฑ(list.do) ์ถ”๊ฐ€
<script>
	$(document).ready(function(){
		$('#btnWrite').click(function() {
			$('#frm').attr('action', 'write.do').submit();
		});
		$('#btnCancle').click(function() {
			$('#frm').attr('action', 'list.do').submit();
		});	
	});
</script>

3-5. ์‹คํ–‰

3-2. list.jsp ๋””์ž์ธ ์ˆ˜์ •

1. ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””์ž์ธ ์ถ”๊ฐ€

2. '๊ธ€์“ฐ๊ธฐ' ๋ฒ„ํŠผ์œผ๋กœ ๋ณ€๊ฒฝ

	<table class="table table-border mt-1">
		<form name="frm" id="frm" method="post">
			<input type="button" href="write.do" value="๊ธ€์“ฐ๊ธฐ" id="btnWrite" class="btn btn-secondary btn-sm"/>
		</form>

3. ์ œ์ด์ฟผ๋ฆฌ ์ถ”๊ฐ€

<script>
	$(document).ready(function(){
		$('#btnWrite').click(function() {
			$('#frm').attr('action', 'write.do').submit();
		});
	});
</script>

4-1. ์‹คํ–‰ -> ์˜ค๋ฅ˜

4-2. form์˜ method๋ฅผ GET๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ

	<table class="table table-border mt-1">
		<form name="frm" id="frm" method="get">
			<input type="button" href="write.do" value="๊ธ€์“ฐ๊ธฐ" id="btnWrite" class="btn btn-secondary btn-sm"/>
		</form>

5. ์‹คํ–‰

3-3. write.jsp ๋””์ž์ธ ์ˆ˜์ •

1. ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””์ž์ธ ์ถ”๊ฐ€

3-4. read.jsp ๋””์ž์ธ ์ˆ˜์ •

1. ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””์ž์ธ ์ถ”๊ฐ€

2. <a>์š”์†Œ๋ฅผ <input> button์œผ๋กœ ๋ณ€๊ฒฝ

  • form์˜ method="get"๋กœ ๋ณ€๊ฒฝ
<form name="frm" id="frm" method="get">
		<input type="button" value="๋ชฉ๋ก" id="btnList" class="btn btn-secondary btn-sm"/>
		<input type="button" value="์ˆ˜์ •" id="btnUpdate" class="btn btn-secondary btn-sm"/>
		<input type="button" value="์‚ญ์ œ" id="btnDelete" class="btn btn-secondary btn-sm"/>
</form>

3. ์ œ์ด์ฟผ๋ฆฌ ์ถ”๊ฐ€

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script>
	$(document).ready(function(){
		$('#btnUpdate').click(function() {
			$('#frm').attr('action', 'update.do?num=${dto.num}').submit();
		});
		$('#btnDelete').click(function() {
			$('#frm').attr('action', 'delete.do?num=${dto.num}').submit();
		});
		$('#btnList').click(function() {
			$('#frm').attr('action', 'list.do').submit();
		});	
	});
</script> 

4-1. ์˜ค๋ฅ˜ -> num๊ฐ’์„ ๋ชป ๋ฐ›์•„์˜ด

4-2. read.jsp์— num๊ฐ’์ด ์—†์—ˆ์Œ -> hidden์œผ๋กœ ๋ฐ›์•„์˜ค๋„๋ก ์ฒ˜๋ฆฌ

<tr><input type="hidden" name="num" value="${dto.num}" />

5. ์‹คํ–‰

3-5. update.jsp ๋””์ž์ธ ์ˆ˜์ •

1. '์ทจ์†Œ'๋ฒ„ํŠผ ์ถ”๊ฐ€ ๋ฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””์ž์ธ ์ถ”๊ฐ€

  • ๋ฒ„ํŠผ, ์ œ์ด์ฟผ๋ฆฌ ์ถ”๊ฐ€
  • form์— id=frm, action์†์„ฑ์€ ์‚ญ์ œ
  • num๊ฐ’ hidden์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ

2. ์‹คํ–‰

profile
์”ฉ์”ฉํ•˜๊ฒŒ ๊ณต๋ถ€์ค‘ (22.11~)

0๊ฐœ์˜ ๋Œ“๊ธ€