본문으로 바로가기

스프링[Spring] 게시판 만들기_05

category 언어/Spring 2020. 7. 15. 15:44
728x90

기능 추가하기

 

검색을 위한 select 이외의 기능을 게시판에 추가해보기로 하자.

 

화면 이동을 위한 컨트롤러를 아래와 같이 미리 정리해두기로 한다.

 

* 컨트롤러 분석 (프로젝트시 미리 정리해두면 좋음) 

/*
 기능       URL  Method  Form 
글 목록  /board/list   Get     X 
글 등록  /board/register   Post     O 
글 등록 폼 이동 /board/register   Get     X 
글 읽기 /board/get    Get     X 
글 수정삭제로 이동 /board/modify   Get     X 
글 수정처리 /board/modify   Post     O 
글 삭제 /board/remove   Post     X 

*/

 

다음과 같이 미리 정리해둔 후에, Controller에 작성하기로 한다.

 

 

(1) 먼저 src/main/java->MyBoardMapper에서 인터페이스를 추가해준다.

 

나는 게시판에

 

1) insert -> 게시판 추가          2) read -> Primary Key를 통해 찾고자 하는 데이터 읽기
3) delete -> 특정 게시물 삭제  4) update -> 게시판 수정

 

의 기능을 추가로 구현하고자 한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.myboard.mapper;
 
import java.util.List;
import com.myboard.vo.MyBoardVo;
 
public interface MyBoardMapper {
    
    //@Select("SELECT * FROM MYBOARD")
    public List<MyBoardVo> getList();
    
    public void insert(MyBoardVo board);
    
    public MyBoardVo read(String id);
    
    public int delete(String id);
    
    public int update(MyBoardVo board);
    
    
 
}
 
 


(2) 이 인터페이스에 대한 sql문은 BoardMapper.xml에 작성한다.

 

sql문 작성시 #{fieldName}을 통해 VO에 담긴 데이터를 쿼리문의 알맞은 자리에 대입한다.

 

 

(3) 이 틀을 바탕으로 서비스에 추가한다.

 

먼저, MyBoardService에 mapper의 인터페이스를 바탕으로 메서드를 정의한다.

 

이후, MyBoardServiceImpl에 이동하여, 나머지 메서드들을 오버라이드 한다.

 

그에 대한 코드는 아래와 같이 작성한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.myboard.service;
 
import java.util.List;
 
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.myboard.mapper.MyBoardMapper;
import com.myboard.vo.MyBoardVo;
 
 
@Service
public class MyBoardServiceImpl implements MyBoardService {
    
    @Autowired
    private MyBoardMapper mapper;
    
    private Logger log=Logger.getLogger(MyBoardServiceImpl.class);
 
    @Override
    public List<MyBoardVo> getList() {
        log.info("글 목록");
        return mapper.getList();
    }
 
    @Override
    public void register(MyBoardVo board) {
        log.info("새 글 등록: " +board);
        mapper.insert(board);
        
    }
 
    @Override
    public MyBoardVo get(String id) {
        log.info("글 보기: "+id);
        return mapper.read(id);
    }
 
    @Override
    public boolean remove(String id) {
        log.info("글 삭제: "+id);
        return mapper.delete(id)==1;    //결과가 1이면 True, 0이면 False
    }
 
    @Override
    public boolean modify(MyBoardVo board) {
        log.info("글 수정: "+board);
        return mapper.update(board)==1;
    }
 
}
 
 
 

 

(4) 해당 기능들에 대한 jsp 파일들을 생성한다.

 

1) insert 기능 -> register.jsp

 

board 파일 아래에 register.jsp를 생성 후 아래처럼 작성하였다.

 

 

이제, MyBoardController로 가서 아래와 같이 매핑을 시켜준다.

 

	
	@GetMapping("/register")
	public void register() {

	}
	@PostMapping("/register")
	public String register(MyBoardVo board) {
		log.info("register :"+board);
		service.register(board);
		return "redirect:/board/list";
	}

 

* redirect를 쓰는경우 vs 안쓰는 경우

 

 - redirect를 적는 경우 : 클라이언트가 /board/list로 새로운 요청을 보낸다.

 - redirect를 안적는 경우 : /register로 요청하면 board/list.jsp를 보여준다.

   redirect를 안적으면 뒤로가기 했을 때 글이 도배될 위험이 있다.

   즉, 만약 redirect가 없으면 뒤로가기 했을때마다 글이 계속 추가됨

 

이제, http://localhost:8080/board/register에 접속해 page를 작성 후, submit를 해보면

 

 

데이터가 추가된다.

 

 

만일 아래와 같은 에러가 뜬다면,

 

xml parser의 한글처리를 위한 기능이 부족하여 아래의 dependency를 추가해줘야 한다.

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.9.1</version>
</dependency>

 

 

이전에 데이터 등록시 아래와 같이 한글이 깨지는 에러가 떴었는데, 이는

 

https://killsia.tistory.com/entry/Spring%EC%97%90%EC%84%9C-post-%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%84%EB%8B%AC-%EC%8B%9C-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%ED%95%B4%EA%B2%B0form%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1

이 사이트를 통해 해결했다.

 

 

2) read 기능 -> get.jsp

board 파일아래 get.jsp 파일은 register.jsp파일의 소스를 가져와 readonly 처리를 하였다.

그리고, button 태그에 url을 통해 특정 id만 수정할 수 있도록 미리 modify와 연동시켜 두기로 한다.

 

 

 

 

get.jsp에 대한 컨트롤러는 modify와 같은 요청을 하기에 modify.jsp에 대한 컨트롤러시 같이 작성하도록 하겠다.

 

3) update 기능 -> modify.jsp

 

board 파일아래 modify.jsp 파일은 register.jsp 파일을 가져와 value를 설정 후, form 형태로 작성하였다.

그리고 수정에 대한 페이지이므로 삭제와 목록에 대한 버튼을 추가하였다.

 

그리고 이 form에 대한 이벤트는 script태그에서 처리하였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
    <h3>Modify Page</h3>
    <form id="modi-form" method="POST">
    아이디 <input readonly name="id" value="<c:out value='${board.id }'/>"> <br>
    승/패(w/l) <input name="w_l" value="<c:out value='${board.w_l }'/>"> <br>
    챔피언 <input name="champion" value="<c:out value='${board.champion }'/>"> <br>
    킬뎃 <input name="kda" value="<c:out value='${board.kda }'/>"> <br>
    킬 관여율 <input name="kill_invol" value="<c:out value='${board.kill_invol }'/>"> <br>    
    </form>
    <button type="submit" data-todo="modify">Modify</button>
    <button type="submit" data-todo="remove">Delete</button>
    <button type="submit" data-todo="list">List</button>
    
    <script>
    
    //타입이  submit인 모든 버튼 태그를 배열로 가져온다.
    const buttons=document.querySelectorAll("button[type='submit']");
    //id가 modi-form인 html 요소를 하나 가져온다.
    const form=document.querySelector("form");
    
    //가져온 모든 버튼에 이벤트를 추가한다.
    for(i=0;i<buttons.length;++i){
        
        //addEventLister(이벤트종류, 이벤트발생시 실행함수) : 해당 요소에 원하는 이벤트를 추가한다
        buttons[i].addEventListener("click",function(e){
            
            e.preventDefault(); //기본 동작을 막아줌
            
            // 눌린 button의 data-todo를 가져와 todo 변수에 저장한다.
            const todo=e.toElement.dataset.todo;
            //cf 자바 스크립트는 ; 없어도 됨
            if(todo=='remove'){
                //alert('눌린 것은 remove')
                form.setAttribute("action","/board/remove");
            }else if(todo=='list'){
                //alert('눌린 것은 list')
                location.href="/board/list"//Get방식
                //GetMapping 으로 처리되기 떄문에 location.href를 이용
                return;
            }else if(todo=='modify'){
                //alert('눌린 것은 modify')
                form.setAttribute("action","/board/modify");
            }
            
            form.submit();
            
        });
    }
    
    </script>
    
 
</body>
</html>
 
 

 

 

이제, MyBoardController로 가서 매핑을 시켜주도록 하자.

먼저, get.jsp와 modify가 같은 요청을 하기에 아래와 같이 작성한다.

 

	// 같은 작업을 하는 요청의 경우 하나의 컨트롤러에서 함께 처리할 수 있다.
	@GetMapping({"/get","/modify"})
	public void get(@RequestParam("id")String id, Model model) {
		model.addAttribute("board",service.get(id));
	}
	

 

추가로, 수정 후 modify에 대한 매핑은 아래와 같이 post 방식으로 처리하였다.

 

	@PostMapping("/modify")
	public String modify(MyBoardVo board,RedirectAttributes rttr) {
		log.info(board);
		
		if(service.modify(board)) {
			rttr.addFlashAttribute("result","Modify Success");
		}
		return "redirect:/board/list";
	}

 

4) delete 기능 -> remove.jsp

 

board 파일아래 remove.jsp 파일은 보여줄 화면이 필요없기 때문에 단순히 jsp 파일을 생성만 한다.

 

 

마찬가지로, MyBoardController로 가서 아래와 같이 작성해준다.

 

단일 파라미터 반환시에는 @RequestParam을 이용한다.

그리고 브라우저내에 parameter값이 안붙게끔 하기 위해 RedirectAttributes를 이용한다.

	@PostMapping("/remove")
	public String remove(@RequestParam("id") String id, RedirectAttributes rttr) {
		if(service.remove(id)) {
			rttr.addFlashAttribute("result","Delete Success");
		}
		return "redirect:/board/list";
	}

 

최종 점검

 

이제 프로젝트를 Run as->Run on server로 실행시킨 후,

http://localhost:8080/board/list로 이동해보자.

 

 

Register 기능

 

 

http://localhost:8080/board/register 페이지로 이동 후, 아래와 같이 작성한 후 , submit를 해보면

 

위와 같이 데이터가 추가된다.

 

 

Get 기능

 

getMapping을 통해 컨트롤러를 구성하였으므로, 

 

http://localhost:8080/board/get?id=HIDE ON BUSH처럼 url을 이동시켜보자.

 

 

Modify 기능

 

위와 같이 get.jsp 페이지로 이동 후, Modify를 누르게 되면 데이터를 수정할 수 있게 된다.

(이때, 아이디는 readonly처리 되어있으므로 읽기만 가능)

 

Delete 기능

 

삭제하고자 하는 아이디를 url을 통해 modify 페이지로 이동한다.

 

 

 

이후, delete를 누르면 아래와 같이 list목록에서 test001이 사라진다.

 

 

 

 

그리고 마지막으로 깨진 데이터들도 modify 페이지로 이동하여 수정하도록 하겠다.

 

 

 

 

이제, 간단한 수정작업이 가능한 게시판을 구현할 수 있게 되었다.

 

 

728x90