jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Spring

[Spring] Day10 (Code)

2022. 3. 29. 21:13

1. controller

package com.board.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.board.domain.BoardVO;
import com.board.service.BoardService;

import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping("/board/*")
@Log4j
public class BoardController {
	@Autowired
	private BoardService boardService; //서비스 로직 써야하니 주입받기
	
	//글 작성 폼
	@GetMapping("write")
	public void write() {
		System.out.println("write get 요청");
	}
	
	//글작성 처리
	@PostMapping("write")
	public String writePro(BoardVO board,RedirectAttributes rttr) { //포스트 요청 타고 넘어온 정보를 보드vo로 받기
		
		boardService.register(board);
		log.info(board);
		//리다이렉트 할때 데이터 전송하는 방법 중 하나로, 데이터를 일회성으로만 전달하고 싶을 때 Flash 사용.
		rttr.addFlashAttribute("result", board.getBno()); //처음에 전송해서 뷰에 전달하고 끝, 새로고침하면 사라짐. addAttr에 쭉 들고있는거랑은 다름
		return"redirect:/board/list";
	}
	
	//글 목록
	@GetMapping("list")
	public void list(Model model) {
		model.addAttribute("list",boardService.getList());
	}

	//조회 폼
	@GetMapping({"content","modify","delete"})
	public void content(@RequestParam("bno") Long bno, Model model) {
		model.addAttribute("board",boardService.get(bno));
	}
	
	//조회 처리
	@PostMapping("modify")
	public String modify(BoardVO board) {
		boolean res =boardService.modify(board);
		if(res)System.out.println("수정 완료");
		else System.out.println("수정 불가");
		return "redirect:/board/list";
	}
	
	@PostMapping("delete")
	public String delete(@RequestParam("bno") Long bno,RedirectAttributes rttr) {
		
		if(boardService.remove(bno)){
			rttr.addFlashAttribute("result","success");
		}
		
		return "redirect:/board/list";
	}
	
}

 

 

2. Service

package com.board.service;

import java.util.List;

import com.board.domain.BoardVO;

public interface BoardService {
	
	//글 저장
	public void register(BoardVO board);
	
	//글 하나 가져오기
	public BoardVO get(Long bno);
	
	//글 수정
	public boolean modify(BoardVO board);
	
	//글 삭제
	public boolean remove(Long bno);
	
	//전체 글 목록 가져오기
	public List<BoardVO> getList();
	

}

 

 

3. ServiceImpl

package com.board.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.board.domain.BoardVO;
import com.board.mapper.BoardMapper;

@Service
public class BoardServiceImpl implements BoardService{
	@Autowired
	private BoardMapper boardMapper;

	@Override
	public void register(BoardVO board) {
		System.out.println("service register: "+ board);
		int result = boardMapper.insertSelectKey(board);
		System.out.println("reqister result: " +result);
		
	}

	//글 하나 가져오기
	@Override
	public BoardVO get(Long bno) {
		return boardMapper.read(bno);
	}

	//글 하나 수정
	@Override
	public boolean modify(BoardVO board) {
		return boardMapper.update(board)==1;
	}

	//글 하나 삭제
	@Override
	public boolean remove(Long bno) {
		return boardMapper.delete(bno)==1;
	}
	
	//전체 글 목록 가져오기
	@Override
	public List<BoardVO> getList() {
		return boardMapper.getList();
	}

}

 

 

4. mapper

package com.board.mapper;

import java.util.List;

import com.board.domain.BoardVO;

public interface BoardMapper {
	
	//글 전체 가져오기
	public List<BoardVO> getList();//리턴 타입이 여러개. 리턴되는 항목도 여러개.
	
	
	//글 DB에 저장 
	public int insert(BoardVO vo);
	public int insertSelectKey(BoardVO vo);
	
	
	//글 하나 가져오기
	public BoardVO read(Long bno); //bno 번호를 가지고 글 가져오기
	
	
	//글 하나 삭제
	public int delete(Long bno);
	
	
	//글 수정 
	public int update(BoardVO vo);
	
	
}

 

 

5. mapper.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.board.mapper.BoardMapper"> 
  
 <select id="getList" resultType="BoardVO">
 <!-- 비교식이나 기호( < > 를 꺽쇠가 닫히는걸로 오인할 가능성 있음)가 있을때는 한번 묶어줘야함 -->
 	<![CDATA[select * from board where bno > 0 
 	]]>
 </select>
 
 
 <!-- insert하고 bno 따로 사용할 일 없으면 이 insert 사용. bno 쓸 일 없고 번호가 뭐가 되든 상관안해! -->
 <insert id="insert">
 	insert into board(bno, title, content, writer)
 	values(board_seq.nextval, #{title}, #{content}, #{writer}) 
 	<!-- 컬럼 명에 해당하는 이름을 다 넣어주면 sysdate 디폴트가 적용이 됨. 
 	그냥 val이런 식으로 하면 디폴트 설정 적용 안됨 -->
 </insert>
 
 
 
 <!-- vo에 bno가 채워져있는 형태로 넘어감..? 
 insert 쿼리 실행하고 bno 값이 바로 필요하면 아래꺼 사용. 난 bno 값 사용해야해!-->
 <insert id="insertSelectKey">
 	<selectKey keyProperty="bno" order="BEFORE" resultType="long">
 		select board_seq.nextval from dual
 	</selectKey>
 	insert into board(bno, title, content, writer)
 	values(#{bno}, #{title}, #{content}, #{writer}) 
  </insert>
 
 
 <!-- 글 한개 가져오기 -->
 <select id="read" resultType="boardVO">
 	select * from board where bno =#{bno} <!-- 컬럼명과 동일한 셋 메서드를 호출해서 채워준다 -->
 </select>
 
 
 <!-- 글 하나 삭제 -->
 <delete id="delete">
 	delete from board where bno = #{bno}
 </delete>
 
 
 <!-- 글 수정 -->
 <update id="update">
 	update board 
 	set title = #{title}, content = #{content}, 
 	writer=#{writer},updateDate = sysdate
 	where bno =#{bno}
 </update>
 
 
  </mapper>

 

 

6. write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>write form</title>
   <link href="/resources/css/style.css" rel="stylesheet" type="text/css">
   
</head>
<body>
   <br/>   
   <h1 align="center"> 글 작성 </h1>
   <form action="/board/write" method="post">
      <table>
         <tr>
            <td>제목</td>
            <td><input type="text" name="title" /></td>
         </tr>      
         <tr>
            <td>내용</td>
            <td><textarea rows="10" cols="30" name="content"></textarea></td>
         </tr>      
         <tr>
            <td>작성자</td>
            <td><input type="text" name="writer" /></td>
         </tr>      
         <tr>
            <td colspan="2">
               <input type="submit" value="저장" />
               <input type="reset" value="재작성" />
               <input type="button" value="리스트" onclick="window.location='/board/list'"/>
            </td>
         </tr>      
      </table>
   </form>
   
   
</body>
</html>

 

writePro

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>write Pro</title>
</head>
<body>
<h2>write Pro page</h2>
</body>
</html>

 

7. list

<%@ page language="java" contentType="text/html; charset=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>
<head>
<meta charset="UTF-8">
<title>list</title>
  <link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h1 align="center">게시판</h1>
<table>
	<tr>
		<td colspan="5" align="left">
			<button onclick="window.location='/board/write'">글 작성</button>
		</td>
	<tr> <!-- 위에 카테고리 안내 -->
		<td>No.</td>
		<td>제목</td>
		<td>작성자</td>
		<td>작성일</td>
		<td>수정일</td>
	</tr>	

<!-- board: BoardVO 객체 담기는 변수
items: 컨트롤러로부터 전달 받은 List<BoardVO> 리스트
list의 요소 개수만큼 자동으로 반복하며, 하나씩 꺼내서 board 변수에 채워줌
 -->
<c:forEach var="board" items="${list}">
	<tr> <!-- 글 리스트로 출력 -->
		<td>${board.bno}</td>
		<td><a href="/board/content?bno=${board.bno}">${board.title}</a></td>
		<td>${board.writer}</td>
		<td><fmt:formatDate value="${board.regdate}" pattern="yyyy-MM-dd HH:MM"/></td>
		<td><fmt:formatDate value="${board.updateDate}" pattern="yyyy-MM-dd HH:MM"/></td>
	</tr>	
</c:forEach>
</table>


<script>
	//글 작성후 list로 리다이렉트 되었을 때 alert 띄워주기
	let result="${result}";
	checkResult(result); // alert 띄울지 말지 함수 호출
	
	//글 작성 처리 post -> 리스트로 이동 -> content로 갔다가 브라우저 뒤로하면 alert가 또 뜨기 때문에 수정해줌.
	//                     히스토리 삭제
	history.replaceState({},null,null);
	
	function checkResult(result){
		//result 값이 없거나 historu 기록이 없으면 그냥 함수 종료
		if(result=="" ||history.state){
			return;
		}
		//result 넘어와서 글 고유번호가 0보다 크면, alert 띄워라
		if(result == "success"){
			alert("요청 처리가 잘 처리되었습니다.")
		}else if(parseInt(result)>0){
			alert(result +"번 글이 등록 되었습니다.");
		}
	}
</script>
</body>
</html>

 

 

8. modify

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
        <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>modify</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>   
   <h1 align="center"> 글 수정 </h1>
   <form action="/board/modify" method="post">
      <table>
      	<tr>
            <td>글 번호</td>
            <td><input type="text" name="bno" value="${board.bno}" readonly = "readonly"/></td>
            <%--<td><input type="text" name="title" value='<c:out value=${board.bno}"/> 이게 더 보안이 좋음 --%>
         </tr> 
         <tr>
            <td>제목</td>
            <td><input type="text" name="title"  value="${board.title}"  /></td>
         </tr>      
         <tr>
            <td>내용</td>
            <td><textarea rows="10" cols="30" name="content">${board.content}</textarea></td>
         </tr>      
         <tr>
            <td>작성자</td>
            <td><input type="text" name="writer"  value="${board.writer}" /></td>
         </tr>
         <tr>
			<td>작성일</td>
			<td><fmt:formatDate value="${board.regdate}" pattern="yyyy-MM-dd HH:MM"/></td>
		</tr>
		<tr>
			<td>수정일</td>
			<td><fmt:formatDate value="${board.updateDate}" pattern="yyyy-MM-dd HH:MM"/></td>
		</tr>      
         <tr>
            <td colspan="2">
               <input type="submit" value="수정" />
               <input type="button" value="리스트" onclick="window.location='/board/list'"/>
            </td>
         </tr>      
      </table>
   </form>
</body>
</html>

 

9. content

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Content</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h1 align="center">Content</h1>
<table>
	<tr>
		<td>글 번호</td>
		<td>${board.bno}</td>
	</tr>
	<tr>
		<td>제목</td>
		<td>${board.title}</td>
	</tr>
	<tr>
		<td>작성자</td>
		<td>${board.writer}</td>
	</tr>
	<tr>
		<td>내용</td>
		<td><textarea rows="10" cols="30" disabled>${board.content}</textarea></td>
	</tr>
	<tr>
		<td>작성일</td>
		<td><fmt:formatDate value="${board.regdate}" pattern="yyyy-MM-dd HH:MM"/></td>
	</tr>
	<tr>
		<td>수정일</td>
		<td><fmt:formatDate value="${board.updateDate}" pattern="yyyy-MM-dd HH:MM"/></td>
	</tr>
	<tr>
		<td colspan="2">
			<button onclick="window.location='/board/modify?bno=${board.bno}'">수정</button>
			<button onclick="window.location='/board/delete?bno=${board.bno}'">삭제</button>
			<button onclick="window.location='/board/list'">리스트</button>
			
		</td>
	</tr>


</table>
</body>
</html>

 

 

10. delete

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>delete</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
	<br/>
	<h1> 게시글 삭제</h1>
	<form action="/board/delete" method="post">
	<table>
		<tr>
			<td> [ #${board.bno}. ${board.title} ] <br />
			이 게시글을 삭제 하시겠습니까? <br/>
				<input type="hidden" name="bno" value="${board.bno}" />
				<input type="submit" value="삭제 확인"/>
				<input type="button" value="취소" onclick="history.back()"/>
			</td>
			
		</tr>
	</table>
	</form>
	
	
	
</body>
</html>
    'Spring' 카테고리의 다른 글
    • [Spring] Day11 (Code): 페이징 처리
    • [Spring] Day11 (Note): 페이징 처리
    • [Spring] Day10 (Note): Ajax, CRUD 게시판
    • [Spring] Day09 (Code): 자동 로그인, 아이디 중복 체크, 제이쿼리

    티스토리툴바