Web/Spring

나프 - 게시판 만들기(2)

now0204 2023. 8. 2. 22:07

1. 게시판 서비스 계층 구현하기 

 

> Service 인터페이스 생성 (책임 정의)

	public interface BoardService {
		public List<BoardVO> getList();//게시물 가져오기
		public void register(BoardVO board); // 게시물 등록
		public BoardVO get(int bno); //게시물 상세보기
		public int remove (int bno); // 게시물 삭제
		public int modify (BoardVO board);
	
	}
 @Service
public class BoardServiceimpl implements BoardService{
	@Autowired
	private BoardMapper mapper;

- 서비스 구현체는 mapper를 주입 받아 메서드 구현하면 된다. 

- 구현체도 @Service 어노테이션을 통해 스프링 컨테이너에 등록해야함 

- Controller가 Service와 메시지를 주고받기 때문 

- root-context나 servlet-context 어느쪽을 통해 등록해도 상관은 없다.

<context:component-scan base-package="kr.inflearn.service" />

 

2. 웹 계층 구현(1) - 리스트 보기 

 

2.1 list 메서드 추가 

6.	@Controller
7.	public class BoardController {
8.	
9.	@Autowired 
10.	private BoardService service;
11.		
12.	@RequestMapping("/list.do")
13.	public String list(Model model) {
14.		List<BoardVO> list = service.getList();
15.		model.addAttribute("list", list);
16.		return "boardList";
17.	}

2.2 boardList.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="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
 
<div class="container">
  <h2>메인화면</h2>
  <div class="panel panel-default">
    <div class="panel-heading">Spring WEB MVC 게시판 만들기</div>
    <div class="panel-body">
 <div class="table-responsive">          
  <table class="table">
    <thead>
      <tr>
        <th>게시물 번호</th>
        <th>제목</th>
        <th>조회수</th>
        <th>등록자</th>
        <th>등록일</th>
        
      </tr>
    </thead>
    <tbody>
    <c:forEach var="vo" items="${list}">
      <tr>
        <td>${vo.idx}</td>
        <td>${vo.title}</td>
        <td>${vo.count}</td>
        <td>${vo.writer}</td>
        <td><fmt:formatDate pattern="yyyy-MM-dd" value="${vo.indate}"/></td>
      </tr>
      </c:forEach>
    </tbody>
  </table>
  </div>
   
    </div>
    <div class="panel-footer">인프런 화이팅</div>
  </div>
</div>

</body>
</html>

3. 등록 UI 만들기 (register.jsp)

 

3.1 boardList.jsp에 등록버튼 및 script 추가 

 

$(document).ready(function(){
	$("#regBtn").click(()=>{  
		location.href="<c:url value='/register.do'/>";
	});
});

<div class="panel-heading">Spring WEB MVC 게시판 만들기
    <button id="regBtn" type="button" class="btn btn-xs pull-right btn-primary">게시물 쓰기</button>
    </div>

 

3.2 컨트롤러 요청 방식에 따라 같은 요청을 다른 메서드가 처리하도록 만들기 

     @RequestMapping(value="/register.do",method=RequestMethod.GET)
	//@GetMapping
	public String registerGET() {
		return "register"; //게시물 등록 화면 보여주기 (boardList에서)
	}
	@RequestMapping(value="/register.do",method=RequestMethod.POST)
	//@PostMapping
	public String registerPOST(BoardVO board) {
    	service.register(board);
		return "redirect:/list.do"; //게시물 등록 (register.jsp에서)
	}

3.3 register.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
 
<div class="container">
<h2>Board Register</h2>
  <div class="panel panel-default">

    <div class="panel-heading">Board Register</div>
    <div class="panel-body">
  
   <form action="<c:url value='register.do'/>" method="post">
  <div class="form-group">
    <label>Title</label>
    <input type="text" class="form-control" id="title" name="title">
  </div>
  <div class="form-group">
    <label>Text area</label>
   <textarea class="form-control" rows=3 name="contents" ></textarea>
  </div>
  <div class="form-group">
    <label>Writer</label>
    <input type="text" class="form-control" id="writer" name="writer">
  </div>
  <button type="submit" class="btn btn-default">등록</button>
  <button type="reset" class="btn btn-default">취소</button>
</form>
    </div>
    <div class="panel-footer"></div>
  </div>
</div>

</body>
</html>

- 게시글은 textarea 태그