ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ 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๋ฅผ ํ์ธํ๊ณ
ํด๋น ๊ฒฝ๋ก/listOk.board ํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ฐ๋ฆฌ๊ฐ setPath ํด๋์๋ list.jsp ํ์ผ์ด ๋ณด์ฌ์ง ๊ฒ์ ๋๋ค.
์ ๋ /study/listOk.board ํ๊ณ ์์ฒญ์ ๋ณด๋์ ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ๋ด์ฉ๊ณผ ๋์ผํ๊ฒ 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 '๋ฐฉ๊ธ ์ ';
}
์ฌ๊ธฐ๊น์ง ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ ๊ธฐ๋ฅ์ด์์ต๋๋ค โจ๐
'๋ฐฑ์๋ > JSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JSP] ๋ก๊ทธ์ธ, ํ์๊ฐ์ , ์์ด๋ ์ค๋ณต๊ฒ์ฌ ๊ธฐ๋ฅ ๊ตฌํํด๋ณด๊ธฐ (0) | 2023.04.20 |
---|---|
[JSP] MVC ํจํด์ด๋? (0) | 2023.04.20 |
[JSP] ์๋ธ๋ฆฟ(Servlet)์ด๋ ? (0) | 2023.04.19 |
[JSP] MyBatis๋ ? (0) | 2023.04.19 |
[JSP] JSP๋ก ์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ (0) | 2023.04.19 |
- Total
- Today
- Yesterday
- ์๋ฐ
- rtl
- react
- ๋ฆฌ์กํธ ํ
- react-query
- ์๋ฐ์คํฌ๋ฆฝํธ
- HTML
- ํ๋ก์ ํธ ํ๊ณ
- ํ๋ก ํธ์๋
- ๋ฅ๋ฌ๋
- TypeScript
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด
- ๋จธ์ ๋ฌ๋
- ํ์ ์คํฌ๋ฆฝํธ
- ํ๋ก ํธ์๋ ๊ณต๋ถ
- ๋ํ๋ง
- CSS
- styled-components
- ์คํ์ผ ์ปดํฌ๋ํธ styled-components
- frontend
- ์ธํ๋ฐ
- ๋ฐ์ดํฐ๋ถ์
- next.js
- JSP
- ํ์ด์ฌ
- ํ๋ก ํธ์๋ ๊ธฐ์ด
- jest
- Python
- testing
- ๋ฆฌ์กํธ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |