Java SpringBoot를 이용하여 게시판 목록 만들기
SpringStarerProject를 이용하였습니다
JUnit을 이용하여 dummy 데이터를 입력한 후 작업을 하였습니다.
2021.12.10 - [Java] - Java Junit 이용하여 DB에 DummyData 입력하기!
Java Junit 이용하여 DB에 DummyData 입력하기!
Junit을 사용할려면 우선 Build Path 로 들어가셔서 추가 해주어야 합니다! . Junit 작업할 프로젝트 마우스 오른쪽 클릭 -> Build Path -> Congifure Build Path... 순서로 들어갑니다. Classpath를 클릭하면..
rowen.tistory.com
데이터를 대량으로 넣을때 유용하니 참고하실분은 참고하시면 됩니다!!!!
간단한 셋팅
pom.xml
<!-- JSP 라이브러리 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!-- version 지우면 알아서 버젼 맞추어준다 -->
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
JSP를 이용하기 위해 의존성 추가.
application.properties
server.port=8080
#기본적인 mvc 모델
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#MySQL 연동
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rowendb716?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true
spring.datasource.username=rowen
spring.datasource.password=1234
#MyBatis 마이바티스
mybatis.mapper-locations=classpath:com/lec/spring/domain/mapper/*.xml
패키지를 Controller, Domain, DAO, DTO, Mapper, Service 로 나누어 관리하기 쉽게 해주었습니다. (MVC)
Mapper(쿼리문작성) -> DAO -> Service -> Controller 흐름으로 코드를 작성하였고 순서대로 설명하겠습니다.
Board.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.lec.spring.domain.BoardDAO">
<select id="selectAll" resultType="com.lec.spring.domain.BoardDTO">
SELECT * FROM board ORDER BY uid DESC
</select>
</mapper>
완성된 쿼리문은 .sql에서 작동 되는지 꼭 확인하세요!!
Mybatis를 이용하였고 mapper 연결을 domain 아래에 있는 BoardDAO 클래스로 잡아주었습니다.
SELECT 구문을 이용하였고 resultType은 게시글의 정보를 가지고 와야하기 때문에 domain 패키지 아래에 있는 BoardDTO 클래스로 경로를 지정해주었습니다.
쿼리문을 보면 테이블 내에 있는 컬럼 전체의 정보를 출겨하기 위해 * 로 출력을하고
최신글이 제일 위에 올라와야하기 때문에 OREDER BY uid(PK) DESC 를 통해 내림차순으로 정렬해주었습니다.
BoardDAO와 BoardDTO를 살펴보겠습니다.
BoardDAO, BoardDAOImpl
package com.lec.spring.domain;
import java.util.List;
public interface BoardDAO {
// 전체 게시글 선택
public abstract List<BoardDTO> selectAll();
}
코드의 효율성이 더 좋게하기 위해 인터페이스를 사용하여 DAO를 작성하였습니다.
(왜 인터페이스를 사용하는지는 공부를 더 열심히 하고 다시 알려드리겠습니다!)
인터페이스 DAO에 있는 메소드의 타입을 List<BoardDTO> 로 작성해줍니다.
package com.lec.spring.domain;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class BoardDAOImpl implements BoardDAO {
private BoardDAO mapper;
@Autowired
public BoardDAOImpl(SqlSession sqlSession) {
mapper = sqlSession.getMapper(BoardDAO.class);
}
@Override
public List<BoardDTO> selectAll() {
return mapper.selectAll();
}
}
BoardDAO를 Implements(상속) 받아 오버라이딩 해줍니다.
그리고 클래스를 루트 컨테이너에 빈(Bean) 객체로 생성해주기 위해 public class BoardDAOImpl 위
@Repository 어노테이션을 작성해줍니다.
그리고 mapper의 sql 문을 찾기 위해
이러한 작업을 해줍니다. ( 더 자세한 내용은 더 열심히 공부후에 업데이트 하겠습니다)
여기까지 DAO가 완성이 되었습니다.
BoardDTO
package com.lec.spring.domain;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Getter
@Setter
public class BoardDTO { // parameter 를 옮겨줄 변수선언 후 Lombok을 이용하여 코드량을 줄임
private int uid;
private String title;
private String summary;
private String userId;
private LocalDateTime b_date;
public BoardDTO(int uid, String title, String summary, String userId, LocalDateTime b_date) {
super();
this.uid = uid;
this.title = title;
this.summary = summary;
this.userId = userId;
this.b_date = b_date;
}
public BoardDTO() {
super();
}
}
변수명은 sql문에서 사용하는 컬럼명과 동일하게 해주는것이 좋습니다!
Parameter를 전달해주는 DTO를 작성하였습니다.
간단한 게시판이기 때문에 uid(PK), title, summary, userId, b_date 변수를 선언하고 Lombok을 이용하여 코드량을 줄여주었습니다.
BoardService
package com.lec.spring.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lec.spring.domain.BoardDAO;
import com.lec.spring.domain.BoardDTO;
@Service
public class BoardService {
BoardDAO dao; // dao 호출
@Autowired
public void setDao(BoardDAO dao) {
this.dao = dao;
}
// 전체선택
public List<BoardDTO> selectAll(){
return dao.selectAll();
}
}
Service 부분의 코드는 위와같이 작성해주었습니다.
DAO를 import 하여 호출해주었고 setter 메소드에 @Autowired로 의존성 주입을 해주었습니다.
List<BoardDTO> 타입을 가지는 selectAll() 메소드에서 dao.selectAll() 호출하여 그 값을 리턴값으로 줍니다.
BoardController
package com.lec.spring.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.lec.spring.domain.BoardDTO;
import com.lec.spring.service.BoardService;
@Controller
@RequestMapping("/board")
public class BoardController {
BoardService boardService;
@Autowired
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}
// 전체 게시글
@RequestMapping("/list") // 게시글 목록 보기 맵핑
public String list(Model model) {
model.addAttribute("list", boardService.selectAll());
return "list";
}
}
@Controller를 붙여 핸들러가 스캔할 수 있는 Bean 객체가 되게 해줍니다.
@RequestMapping 을 이용하여 맵핑할 url을 설정해줍니다. 저는 /board/list 로 url을 지정하여 주었습니다.
http://localhost:8080/board/list 를 url에 입력하게 되면 해당하는 mapping 메소드가 작동하여 view를 보여주게 됩니다.
Model을 이용하여 Service에서 리턴해주는 값을 list라는 변수로 JSP(view)에서 사용할 수 있게 됩니다.
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://sargue.net/jsptags/time" prefix="javatime" %> <!-- LocalDateTime의 값을 포멧해주기 위해 pom.xml에 의존성 주입 -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>LIST</title>
</head>
<style>
body{width:80%; margin:auto;}
.table{
width:80%;
margin:auto;
}
</style>
<style>
#test {
float: right;
position: relative;
left: -50%;
}
#test li {
float: left;
position: relative;
left: 50%;
}
</style>
<body>
<div style="text-align:center;padding:50px 0px;"><h1><b>글 목록</b></h1>
<b style="float:right; margin-right:10%;">전체 게시글 수 : ${allCnt }</b>
<br>
<br>
<table class="table">
<thead>
<tr>
<th scope="col" class="col-md-2">uid</th>
<th scope="col" class="col-md-3">ID</th>
<th scope="col" class="col-md-6">제목</th>
<th scope="col" class="col-md-3">날짜</th>
</tr>
</thead>
<tbody>
<c:forEach var="dto" items="${list }">
<tr>
<th scope="row">${dto.uid }</th>
<td>${dto.userId }</td>
<td><a href="/board/info?uid=${dto.uid }">${dto.title }</a></td>
<td>
<javatime:format value="${dto.b_date}" pattern="yyyy-MM-dd HH:mm:ss" />
</td>
</tr>
</c:forEach>
</tbody>
</table>
JSP는 BootStrap을 이용하여 간단하게 css를 관리했고 JSTL을 이용하였습니다.
Controller에서 Model을 이용하여 받은 리턴값을 list라는 변수명을 사용하여 목록을 완성해주었습니다.
이상으로 게시판 목록 만들기 설명이었습니다!
페이징처리는 작성, 수정, 삭제 게시글 포스팅 후 올려드리겠습니다.
수정해야할 부분이 있다면 댓글로 알려주세요~