# 개발환경
항목 | 내용 |
---|---|
Language | Java 17 |
IDE | Eclipse 2023-12 |
Spring Boot | 3.4.4 (설정파일 : properties) |
Tomcat | 10.1.18 |
DataBase | MySQL 8.0.37 (MyBatis) |
Build Tool | Maven (설정파일 : pom.xml) |
View template engine | JSP |
1) https://start.spring.io/
* 반드시 war로
2) 다운받은 파일 압축 해제
1) 좌측 맨마지막 import projects 클릭
2) General > Projects from Folder or Archive 및 Next 클릭
3) Directory > 위에서 압축 해제한 폴더 찾아서 폴더 선택
4) Finish 클릭
<!-- MySQL 오류나면 의존성 이렇게 수정해보기 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- MyBatis 의존성 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- JSP를 지원하는 내장형 Tomcat 의존성 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- JSTL 태그 라이브러리 의존성 -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
spring.application.name=board
server.port=80
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/[DB명 입력]
spring.datasource.username=[user명 입력]
spring.datasource.password=[비밀번호 입력]
mybatis.mapper-locations=classpath:mybatis/mappers/**/*.xml
mybatis.configuration.jdbc-type-for-null=NULL
mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j2.Log4j2Impl
# mvc 패턴에서 뷰 페이지의 경로를 지정하기
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" ></script>
<title>20250415</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12">
<h1>JSP 홈</h1>
</div>
</div>
</div>
</body>
</html>
package com.apptest.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class BoardController {
@GetMapping("/")
public String home() {
return "home";
}
}
이클립스에서는 MySQL 연결해서 스키마 확인하려면 번거로우니 MySQL 워크벤치에서 테이블 생성하자..
⚠️ DB 연결 오류나면 Maven > Update Project 한번 해주자
DROP TABLE board;
CREATE TABLE board (
id INT AUTO_INCREMENT PRIMARY KEY,
nickname VARCHAR(20) NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
create_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE board ADD (delete_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP);
-- 높은 재귀(반복) 횟수를 허용하도록 설정
-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)
SET SESSION cte_max_recursion_depth = 200;
-- board 테이블에 더미 데이터 삽입
INSERT INTO board (nickname, title, content, create_date)
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 200 -- 생성하고 싶은 더미 데이터의 개수
)
SELECT
CONCAT('닉네임', LPAD(n, 3, '0')) AS nickname, -- '닉네임' 다음에 3자리 숫자로 구성된 작성자 생성
CONCAT(LPAD(n, 3, '0'), '번 게시글입니다.') AS title, -- 3자리 숫자로 구성된 제목 생성
CONCAT(LPAD(n, 3, '0'), '번 내용입니다.') AS content, -- 3자리 숫자로 구성된 내용 생성
TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 3650 + 1) DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND) AS create_date
-- 최근 10년 내의 임의의 날짜와 시간 생성
FROM cte;
INSERT INTO board (nickname, title, content)
VALUES
('닉네임1', '오늘의 제목입니다', '내일의 내용입니다');
SELECT *
FROM board;
package com.apptest.board.vo;
import java.util.Date;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Builder
public class Board {
private int id;
private String title;
private String content;
private Date createDate;
private Date deleteDate;
}
package com.apptest.board.dto;
import java.util.Date;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Builder
public class BoardRequestDto {
private int id;
private String title;
private String content;
private Date createDate;
private Date deleteDate;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.apptest.board.mapper.BoardMapper">
<select id="getBoards" resultType="com.apptest.board.dto.BoardRequestDto">
select
b.id as id,
b.title as title,
b.content as content,
b.create_date as createDate,
b.delete_date as deleteDate
from
board b
</select>
</mapper>
package com.apptest.board.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.apptest.board.dto.BoardRequestDto;
@Mapper
public interface BoardMapper {
List<BoardRequestDto> getBoards();
}
package com.apptest.board.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.apptest.board.dto.BoardRequestDto;
import com.apptest.board.mapper.BoardMapper;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class BoardService {
private final BoardMapper boardMapper;
public List<BoardRequestDto> getBoards() {
return boardMapper.getBoards();
}
}
package com.apptest.board.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.apptest.board.dto.BoardRequestDto;
import com.apptest.board.service.BoardService;
import lombok.RequiredArgsConstructor;
@Controller
@RequiredArgsConstructor
public class BoardController {
private final BoardService boardService;
@GetMapping("/list")
public String getBoard(Model model) {
List<BoardRequestDto> boards = boardService.getBoards();
model.addAttribute("boards", boards);
return "list";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" ></script>
<title>게시판 테스트</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12 mt-4">
<h1>게시판</h1>
<table class="table table-bordered">
<tr>
<td>번호</td>
<td>제목</td>
<td>내용</td>
<td>작성자</td>
<td>등록일</td>
</tr>
<c:forEach var="board" items="${boards }">
<tr>
<td>${board.id }</td>
<td>${board.title }</td>
<td>${board.content }</td>
<td>${board.nickname }</td>
<td><fmt:formatDate value="${board.createDate }" pattern="yyyy.MM.dd HH:mm" /></td>
</tr>
</c:forEach>
</table>
<div class="mt-4">
<a class="btn btn-outline-primary" href="">글쓰기</a>
</div>
</div>
</div>
</div>
</body>
</html>