ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿš€ JSP๋กœ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” JSP๋กœ ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ณ  ์กฐํšŒํ•œ ๋‚ด์šฉ์„ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค :)

์ง€๋‚œ ๊ธ€์—์„œ MyBatis ์„ค์ •์„ ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ถ€ํ„ฐ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

crete table tbl_board (
    board_id int unsigned auto_increment primary key,
    board_title varchar(500) not null,
    board_content varchar(500) not null,
    board_register_date datetime default current_timestamp(),
    board_update_date int unsigned default 0,
    board_read_count int unsigned default 0,
    member_id unsigned,
    constraint fk_board_member foreign key(member_id)
    references tbl_member(member_id) on delete cascade
);

2. VO ๋งŒ๋“ค๊ธฐ

VO๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋งŒํผ๋งŒ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“œ com.app.board.domain (package) / BoardVO.java

package com.app.board.domain;

public class BoardVO {
	private Long boardId;
	private String boardTitle;
	private String boardContent;
	private String boardRegisterDate;
	private String boardUpdateDate;
	private Long boardReadCount;
	private Long memberId;
	
	public BoardVO() {;}

	public Long getBoardId() {
		return boardId;
	}

	public void setBoardId(Long boardId) {
		this.boardId = boardId;
	}

	public String getBoardTitle() {
		return boardTitle;
	}

	public void setBoardTitle(String boardTitle) {
		this.boardTitle = boardTitle;
	}

	public String getBoardContent() {
		return boardContent;
	}

	public void setBoardContent(String boardContent) {
		this.boardContent = boardContent;
	}

	public String getBoardRegisterDate() {
		return boardRegisterDate;
	}

	public void setBoardRegisterDate(String boardRegisterDate) {
		this.boardRegisterDate = boardRegisterDate;
	}

	public String getBoardUpdateDate() {
		return boardUpdateDate;
	}

	public void setBoardUpdateDate(String boardUpdateDate) {
		this.boardUpdateDate = boardUpdateDate;
	}

	public Long getBoardReadCount() {
		return boardReadCount;
	}

	public void setBoardReadCount(Long boardReadCount) {
		this.boardReadCount = boardReadCount;
	}

	public Long getMemberId() {
		return memberId;
	}

	public void setMemberId(Long memberId) {
		this.memberId = memberId;
	}

	@Override
	public String toString() {
		return "BoardVO [boardId=" + boardId + ", boardTitle=" + boardTitle + ", boardContent=" + boardContent
				+ ", boardRegisterDate=" + boardRegisterDate + ", boardUpdateDate=" + boardUpdateDate
				+ ", boardReadCount=" + boardReadCount + ", memberId=" + memberId + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((boardId == null) ? 0 : boardId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BoardVO other = (BoardVO) obj;
		if (boardId == null) {
			if (other.boardId != null)
				return false;
		} else if (!boardId.equals(other.boardId))
			return false;
		return true;
	}
}

3. DTO ๋งŒ๋“ค๊ธฐ

์šฐ๋ฆฌ๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชฉ๋ก๋“ค์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ฆ„์ด ํ•„์š”ํ•œ๋ฐ์š”. ๊ทธ๋Ÿฐ๋ฐ VO ๊ฐ์ฒด์—๋Š” tbl_board์˜ ์ปฌ๋Ÿผ๋งŒ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— tbl_member์— ์žˆ๋Š” member_id๋ฅผ ํ†ตํ•ด์„œ tbl_member์˜ member_name์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ DTO์—๋Š” ๊ธฐ์กด ์ปฌ๋Ÿผ + member_name์ด ์ถ”๊ฐ€๋œ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ‘์—์„œ Mapper์—์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ Join์„ ํ•ด์„œ ๊ฐ€์ง€๊ณ  ์™€์•ผํ•˜๋Š” ๊ฒƒ๋„ ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“œ com.app.board.domain (package) / BoardDTO.java

package com.app.board.domain;

public class BoardDTO {
	private Long boardId;
	private String boardTitle;
	private String boardContent;
	private String boardRegisterDate;
	private String boardUpdateDate;
	private Long boardReadCount;
	private Long memberId;
	private String memberName;
	
	public BoardDTO() {;}

	public Long getBoardId() {
		return boardId;
	}

	public void setBoardId(Long boardId) {
		this.boardId = boardId;
	}

	public String getBoardTitle() {
		return boardTitle;
	}

	public void setBoardTitle(String boardTitle) {
		this.boardTitle = boardTitle;
	}

	public String getBoardContent() {
		return boardContent;
	}

	public void setBoardContent(String boardContent) {
		this.boardContent = boardContent;
	}

	public String getBoardRegisterDate() {
		return boardRegisterDate;
	}

	public void setBoardRegisterDate(String boardRegisterDate) {
		this.boardRegisterDate = boardRegisterDate;
	}

	public String getBoardUpdateDate() {
		return boardUpdateDate;
	}

	public void setBoardUpdateDate(String boardUpdateDate) {
		this.boardUpdateDate = boardUpdateDate;
	}

	public Long getBoardReadCount() {
		return boardReadCount;
	}

	public void setBoardReadCount(Long boardReadCount) {
		this.boardReadCount = boardReadCount;
	}

	public Long getMemberId() {
		return memberId;
	}

	public void setMemberId(Long memberId) {
		this.memberId = memberId;
	}

	public String getMemberName() {
		return memberName;
	}

	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}

	@Override
	public String toString() {
		return "BoardDTO [boardId=" + boardId + ", boardTitle=" + boardTitle + ", boardContent=" + boardContent
				+ ", boardRegisterDate=" + boardRegisterDate + ", boardUpdateDate=" + boardUpdateDate
				+ ", boardReadCount=" + boardReadCount + ", memberId=" + memberId + ", memberName=" + memberName + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((boardId == null) ? 0 : boardId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BoardDTO other = (BoardDTO) obj;
		if (boardId == null) {
			if (other.boardId != null)
				return false;
		} else if (!boardId.equals(other.boardId))
			return false;
		return true;
	}
}

4. Mapper ๋งŒ๋“ค๊ณ  config.xml์— ๋“ฑ๋กํ•˜๊ธฐ

๐Ÿ“œ com.app.mybatis.mapper (package) / boardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">
</mapper>

namespace="member"๋กœ ํ•ด์„œ ํ•ด๋‹น mapper์— ์žˆ๋Š” sql ๋ฌธ์„ ๋ณ„์นญ๊ณผ id๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก member๋ผ๊ณ  ์ง€์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ config.xml์— ํ•ด๋‹น Mapper๋ฅผ ๋“ฑ๋กํ•ฉ์‹œ๋‹ค.

 

๐Ÿ“œ com.app.mybatis.config (package) / config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<typeAlias type="com.app.board.domain.BoardVO" alias="boardVO"/>
		<typeAlias type="com.app.board.domain.BoardDTO" alias="boardDTO"/>
	</typeAliases>

	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/app"/>
				<property name="username" value="root"/>
				<property name="password" value="1234"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="com/app/mybatis/mapper/memberMapper.xml"/>
		<mapper resource="com/app/mybatis/mapper/boardMapper.xml"/>
	</mappers>
</configuration>

5. Mapper์—์„œ ํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑํ•˜๊ธฐ

๐Ÿ“œ com.app.mybatis.mapper (package) / boardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board">
	<select id="selectAll" resultType="boardDTO">
		select board_id, board_title, board_content, board_register_date, board_update_date, board_read_count, m.member_id, member_name 
		from tbl_member m join tbl_board b
		on m.member_id = b.member_id
	</select>
</mapper>

6. DAO์— Mapper์—์„œ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์„ ์–ธํ•˜๊ธฐ

๐Ÿ“œ com.app.board.dao (package) / BoardDAO.java

package com.app.board.dao;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.app.board.domain.BoardDTO;
import com.app.mybatis.config.MyBatisConfig;

public class BoardDAO {
	public SqlSession sqlSession;
	
	public BoardDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}
	
//	๊ฒŒ์‹œ๊ธ€ ์ „์ฒด ์กฐํšŒ
	public List<BoardDTO> selectAll(){
		return sqlSession.selectList("board.selectAll");
	}
}

DAO์˜ ๋ฉ”์†Œ๋“œ๋“ค์€ Controller์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

7. Controller ์ž‘์—…ํ•˜๊ธฐ

๐Ÿ“œ com.app.board.controller (package) / ListOkController.java

package com.study.board.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONObject;

import com.study.Action;
import com.study.Result;
import com.study.board.dao.BoardDAO;

public class ListOkController implements Action {

	@Override
	public Result execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		BoardDAO boardDAO = new BoardDAO();
		Result result = new Result();
		
        	// JSON์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด
		JSONArray jsonArray = new JSONArray();
		boardDAO.selectAll().stream().map(board -> new JSONObject(board)).forEach(jsonArray::put);
		req.setAttribute("boards", jsonArray.toString()); // ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ชฉ๋ก ํŽ˜์ด์ง€์—์„œ ํ‚ค๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
		
		result.setPath("templete/board/list.jsp"); // ๋ชฉ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์•ผ ํ•ด์„œ
		return result;
	}

}

8. FrontController์—์„œ ๋ฐฉ๊ธˆ ๋งŒ๋“  Controller ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๐Ÿ“œ com.app.board (package) / BoardFrontController.java

package com.app.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.app.Result;
import com.app.board.controller.ListOkController;
import com.app.member.controller.CheckEmailOkController;
import com.app.member.controller.CheckIdOkController;
import com.app.member.controller.JoinOkController;
import com.app.member.controller.LoginOkController;

public class BoardFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		
		String target = req.getRequestURI().replace(req.getContextPath() + "/", "").split("\\.")[0];
		Result result = null;
		
		if(target.equals("listOk")) {
			result = new ListOkController().execute(req, resp);
			
		} 
		
		if(result != null) {
			if(result.isRedirect()) {
				resp.sendRedirect(result.getPath());
			}else {
				req.getRequestDispatcher(result.getPath()).forward(req, resp);
			}
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

์šฐ์„  ํ•ด๋‹น FrontController๋Š” ๋ฐ”๋กœ ์•„๋ž˜์— ์ด์–ด์ง€๋Š” web.xml์—์„œ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ณณ์—์„œ .member๋กœ ๋๋‚˜๋Š” url ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ .member๋กœ ๋๋‚˜๋Š” ์š”์ฒญ ์ค‘์—์„œ๋„ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด

if(target.equals("listOk")) {
    result = new ListOkController().excute(req, resp);
}

์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” target ์ฆ‰, .member ์•ž์— ์˜ค๋Š” text๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ„ ๋ถ„๊ธฐ๋ฅผ ํƒ€๊ฒŒ ๋˜๋Š” url ์š”์ฒญ์€ listOk.member๋ผ๋Š” url๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ๊ฒ ์ฃ ?

๊ทธ๋ž˜์„œ listOk.member๋ผ๋Š” url๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด result ๊ฐ์ฒด์— ListOkController์˜ excute ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ListOkController ์ฆ‰, ๋ชจ๋“  Controller๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” Action์ด๋ผ๋Š” interface๋ฅผ implements ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ excute๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  FrontController์˜ req, resp๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์คŒ์œผ๋กœ์จ Controller๋„ HttpServelt์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

9. web.xml์—์„œ ๋ฐฉ๊ธˆ ๋งŒ๋“  FrontController ๋งคํ•‘ํ•ด์ฃผ๊ธฐ

๐Ÿ“œ WebContent/WEB_INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>app</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>Member</servlet-name>
  	<servlet-class>com.app.member.MemberFrontController</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>Member</servlet-name>
  	<url-pattern>*.member</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>Board</servlet-name>
  	<servlet-class>com.app.board.BoardFrontController</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>Board</servlet-name>
  	<url-pattern>*.board</url-pattern>
  </servlet-mapping>
</web-app>

servlet-mapping์—์„œ url-pattern์ด .board๋กœ ๋๋‚˜๋Š” url๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋ชจ๋‘ BoardFrontController๋กœ ๋ณด๋‚ด๊ฒ ๋‹ค๊ณ  ์ž‘์„ฑํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

10. (7)์—์„œ Controller๊ฐ€ setPathํ•œ jsp ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

๐Ÿ“œ WebContent/templete/board/list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€</h1>
	<hr />
</body>
<script>
	console.log(JSON.parse(`${boards}`));
</script>
</html>

ListOkController์—์„œ JSON์„ toString() ํ•˜์—ฌ jsp์—๊ฒŒ ๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๊ทธ๊ฑธ parse ํ•˜์—ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด jsp์—์„œ ํ‚ค๊ฐ’์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ListOkController์—์„œ JSON์œผ๋กœ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋ณด๋‚ด๊ณ  jsp์—์„œ๋„ ๊ทธ๋ƒฅ ๋ฐ›์•˜๋‹ค๋ฉด ์Œฉ ๋ฌธ์ž์—ด์ด๋ผ ํ‚ค๊ฐ’์œผ๋กœ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค....

 

์œ„ jsp ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ , ์„œ๋ฒ„ ๊ตฌ๋™(์ €๋Š” ์•„ํŒŒ์น˜ํ†ฐ์บฃ)์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ BoardFrontController์—์„œ listOk๋ผ๋Š” ๋ถ„๊ธฐ๋ฅผ ํƒ€๋ฉด ์ฆ‰, listOk.member๋ผ๋Š” url๋กœ ์š”์ฒญ์ด ์˜ค๋ฉด ListOkController์˜ excute ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ListOkController์—์„œ๋Š” setPath๋ฅผ templete/board/list.jsp๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์— ๋“ค์–ด๊ฐ€์„œ ์•„ํŒŒ์น˜ ํ†ฐ์บฃ์˜ Modules์—์„œ Web Modules๋ฅผ ํ™•์ธํ•˜๊ณ 

Web Modules

ํ•ด๋‹น ๊ฒฝ๋กœ/listOk.board ํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์šฐ๋ฆฌ๊ฐ€ setPath ํ•ด๋‘์—ˆ๋˜ list.jsp ํŒŒ์ผ์ด ๋ณด์—ฌ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” /study/listOk.board ํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ํ™”๋ฉด
jsp๊ฐ€ ๋ฐ›์€ ๋ฐ์ดํ„ฐ
์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋‚ด์šฉ๊ณผ ๋™์ผํ•˜๊ฒŒ jsp ํŒŒ์ผ์ด ์ž˜ ๋ฐ›์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

11. ๋ฐ›์€ JSON ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ํ™”๋ฉด์— ๋ฐ์ดํ„ฐ ๋ฟŒ๋ฆฌ๊ธฐ

๐Ÿ“œ WEBContent/templete/board/list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/board/board.css">
<title>Insert title here</title>
</head>
<body>
	<h1>๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€</h1>
	<hr />
	<ul>
		
	</ul>
</body>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script>
	const boards = JSON.parse(`${boards}`);
	const contextPath = `${pageContext.request.contextPath}`;
</script>
<script src="${pageContext.request.contextPath}/static/js/board/list.js"></script>
</html>

list.js ํŒŒ์ผ์—์„œ boards๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ul ํƒœ๊ทธ ์•„๋ž˜์— ๊ฒŒ์‹œ๊ธ€๋“ค์„ ์ง‘์–ด๋„ฃ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ contextPath๋Š” jsp๋กœ setPathํ•˜์—ฌ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ์•ž์— ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์žƒ๊ฒŒ ๋˜์–ด ์œ„์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๋ฅผ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ์–ด์ฃผ์–ด์•ผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“œ WebContent/static/js/board/list.js

const $ul = $('ul');
let text = "";

boards.forEach(board => {
	text += `
		<li>
			<div>
				<a href="javascript:location.href='${contextPath}/board/detailOk.board'">
					<section class="content-container">
						<h4>${board.boardTitle}</h4>
						<h5>${board.memberName}</h5>
						<h6>์กฐํšŒ ${board.boardReadCount}</h6>
					</section>
				</a>
			</div>
		</li>
	`;
})

$ul.append(text);

 

๋งˆ์ง€๋ง‰์œผ๋กœ css๋„ ์กฐ๊ธˆ ๋„ฃ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.. :)

๐Ÿ“œ WebContent/static/css/board/board.css

@charset "UTF-8";

ul {
    	list-style: none;
}

a {
	text-decoration: none;
	color: black;
}

section.content-container {
	padding: 20px;
	margin: 10px;
	border: 1px solid black;
}

์‹คํ–‰ ํ™”๋ฉด

์ถ”๊ฐ€๋กœ ์‹œ๊ฐ„๋„ ๋ฐฉ๊ธˆ์ „, 1๋ถ„์ „, 10๋ถ„์ „ ๊ฐ™์ด ์ž‘์„ฑํ•œ ์‹œ๊ฐ„์„ ๋ณ€ํ™˜ํ•˜์—ฌ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๋„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“œ WebContent/static/js/board/list.js

const $ul = $('ul');
let text = "";

boards.forEach(board => {
	text += `
		<li>
			<div>
				<a href="javascript:location.href='${contextPath}/board/detailOk.board'">
					<section class="content-container">
						<h4>${board.boardTitle}</h4>
						<h5>${board.memberName}</h5>
						<h6>${elapsedTime(board.boardRegisterDate)}</h6>
						<h6>์กฐํšŒ ${board.boardReadCount}</h6>
					</section>
				</a>
			</div>
		</li>
	`;
})

$ul.append(text);

/*์‹œ๊ฐ„ ๊ณ„์‚ฐ*/
function elapsedTime(date) {
  const start = new Date(date);
  const end = new Date();

  const diff = (end - start) / 1000;
  
  const times = [
    { name: '๋…„', milliSeconds: 60 * 60 * 24 * 365 },
    { name: '๊ฐœ์›”', milliSeconds: 60 * 60 * 24 * 30 },
    { name: '์ผ', milliSeconds: 60 * 60 * 24 },
    { name: '์‹œ๊ฐ„', milliSeconds: 60 * 60 },
    { name: '๋ถ„', milliSeconds: 60 },
  ];

  for (const value of times) {
    const betweenTime = Math.floor(diff / value.milliSeconds);

    if (betweenTime > 0) {
      return `${betweenTime}${value.name} ์ „`;
    }
  }
  return '๋ฐฉ๊ธˆ ์ „';
}

์‹คํ–‰ํ™”๋ฉด


์—ฌ๊ธฐ๊นŒ์ง€ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์ด์˜€์Šต๋‹ˆ๋‹ค โœจ๐Ÿ‘

728x90
LIST