[Spring Boot+JSP] 이클립스 스프링부트+JSP 초기 프로젝트 세팅 & 간단 DB 조회 구현

류넹·2025년 4월 15일
2

Project

목록 보기
8/14

# 개발환경

항목내용
LanguageJava 17
IDEEclipse 2023-12
Spring Boot3.4.4 (설정파일 : properties)
Tomcat10.1.18
DataBaseMySQL 8.0.37 (MyBatis)
Build ToolMaven (설정파일 : pom.xml)
View template engineJSP

📌 JSP 파일 띄우기까지만 해보기

✅ Spring Initializr 세팅

1. Spring Initializr 다운로드

1) https://start.spring.io/
* 반드시 war로

⚠️ Validation 의존성까지 추가하기

2) 다운받은 파일 압축 해제


2. Eclipse에서 프로젝트 Import

1) 좌측 맨마지막 import projects 클릭

2) General > Projects from Folder or Archive 및 Next 클릭

3) Directory > 위에서 압축 해제한 폴더 찾아서 폴더 선택

4) Finish 클릭




✅ 설정 파일

1. pom.xml > JSP 의존성 추가

		<!-- 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>

2. application.properties

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

3. webapp/WEB-INF/views 폴더 생성

4. mybatis/mappers 폴더 생성




✅ 구현

1. 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>

2. Controller

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";
	}
}



✅ 실행

Run As > Java Application 실행

접속 URL




📌 DB 작업

이클립스에서는 MySQL 연결해서 스키마 확인하려면 번거로우니 MySQL 워크벤치에서 테이블 생성하자..

⚠️ DB 연결 오류나면 Maven > Update Project 한번 해주자

✅ 테이블 및 더미데이터 생성 SQL

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;

✅ mapper, xml 파일 작성

0. vo, dto

  • vo
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;
}
  • dto
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;
}

1. xml

<?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>

2. 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();

}

3. service

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();
	}

}

4. controller

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";
	}

}

5. jsp

<%@ 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>
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글