Day89 - [Spring]게시판 기능 구현하기

2021. 6. 22. 23:13Spring

이번에는 게시판 기능 구현하는 걸 해볼 겁니다

 

게시판 기능 구현하기

css, html 등 화면 디자인에 필요한 부분은 선생님께서 배포를 해주셨습니다.

 

이를 바탕으로 게시판 기능을 구현해 보겠습니다.

 

현재, 프로젝트는 기본적인 설정이 세팅되어 있는 상태 입니다. ( Lombok, Mybatis, Tiles View Template 등등 )

 

먼저, 배포받은 css, font, img 등은 "src" -> "main" -> "webapp" -> "resource" 폴더에 넣습니다.

그리고, 화면에 보여지는 .jsp 파일은 views 폴더에 넣습니다.

이 외에, 공통적으로 사용되는 header , footer 등은 tiles 폴더에 넣었습니다.

 

이제, 각각의 freeBoard 에 있는 화면들을 각각 컨트롤러를 경유할 수 있도록 매핑해줍니다.

이 때, 설정 파일(servlet-context.xml) 에서 component-scan 을 작성해 주었는지 확인 해야합니다. 

※ "com.team404.controller" 패키지에 있는 파일을 읽어서 bean 으로 생성

 

컨트롤러에서는 각각의 화면에 대한 기능들을 만들어 주면 되는데요, 이 때 서비스와 DB에 접근할 myBatis 기반의 Mapper 를 만들어 줍니다.

 

Service와 Mapper 는 인터페이스를 하나 만들고, 그 인터페이스를 구현할 Impl 을 만듭니다.

그리고, service 도 마찬가지로 설정파일에 component-scan 을 작성해줍니다.

이 때, myBatis는 인터페이스의 구현을 .xml 파일로 합니다.

FreeBoardMapper.xml 에서는 FreeBoardMapper Interface 를 구현화 해주면 됩니다.

그리고, 외부 설정 파일 ( 저는 "DB-context.xml" 이지만, 원래는 "root-context.xml" 입니다 ) 에서 myBatis 에 대한 연결을 해주어야 합니다.

scan 도 있지말고 해주시고, 위의 resultType 에 FreeBoardVO 라고 줄여서 쓰기 위해서, 별칭을 만든 mybatis-config.xml 도 지정 해줍니다.

 

아래는 컨트롤러의 코드 입니다.

package com.team404.controller;

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

import com.team404.command.FreeBoardVO;
import com.team404.freeboard.service.FreeBoardService;


@Controller
@RequestMapping("/freeBoard")
public class FreeBoardController {
	
	@Autowired
	@Qualifier("freeService")
	private FreeBoardService freeService;
	
	
//	리스트 화면
	@RequestMapping("/freeList")
	public void freeList(Model model) {
		
		model.addAttribute("list", freeService.getList()); // 화면에 전달(여러값이라면 맵으로가능)
	}
	
//	변경 화면
//	@RequestMapping("/freeModify")
//	public void freeModify(@RequestParam("bno") int bno, Model model) {
//		model.addAttribute("boardVO", freeService.getDetail(bno));
//	}
	
//	상세 화면과 변경화면은 같기 때문에 하나로 합침
	@RequestMapping({"/freeDetail", "/freeModify"})
	public void getDetail(@RequestParam("bno") int bno, Model model) {
		
		// 메서드이름 - getDetail()
		// sql문을 이용해서 FreeBoardVO에 결과값을 반환받습니다.
		// 화면에서 사용할 수 있도록 boardVO 이름으로 model을 전달하고, 화면에 처리
		model.addAttribute("boardVO", freeService.getDetail(bno));
		
	}
	
//	등록 화면
	@RequestMapping("/freeRegist")
	public void freeRsgist() {
		
	}
	
//	등록요청
	@RequestMapping("/registForm")
	public String registForm(FreeBoardVO vo,
							RedirectAttributes RA) {
		
		int result = freeService.regist(vo); // 성공시 1반환, 실패시 0
		
		if(result == 1) {
			RA.addFlashAttribute("msg", "등록 처리 되었습니다");
		} else {
			RA.addFlashAttribute("msg", "등록에 실패했습니다. 다시 시도하세요");
		}
		
		return "redirect:/freeBoard/freeList"; // 다시 컨트롤러를 태움
	}
	
//	글 업데이트 처리
	@RequestMapping("/freeUpdate")
	public String freeUpdate(FreeBoardVO vo, RedirectAttributes RA) {
		
		/*
		 * 1. form에서 넘어오는 값을 받습니다.
		 * 2. update()를 이용해서 게시글을 수정처리 합니다.
		 * 3. update()메서드는 성공 or 실패의 결과를 받아옵니다.
		 * 4. list화면으로 msg담아서 이동
		 */
		
		int result = freeService.update(vo);
		
		if(result == 1) {
			RA.addFlashAttribute("msg", "성공적으로 변경되었습니다.");
		} else {
			RA.addFlashAttribute("msg", "변경에 실패했습니다. 다시 시도하세요");
		}
		
		return "redirect:/freeBoard/freeList";
	}
	
//	글 삭제 요청
	@RequestMapping("/freeDelete")
	public String freeDelete(@RequestParam("bno") int bno,
							 RedirectAttributes RA) {
		
		int result = freeService.delete(bno);
		
		if(result == 1) {
			RA.addFlashAttribute("msg", "성공적으로 삭제되었습니다");
		} else {
			RA.addFlashAttribute("msg", "삭제에 실패했습니다. 다시 시도하세요");
		}
		
		return "redirect:/freeBoard/freeList";
	}
	
}

위의 코드를 보면, 각각의 기능들마다 필요한 변수들은 화면을 통해서 넘어왔습니다.

위의 코드처럼 get 방식을 사용해서 넘긴 것도 있고, <form> 태그를 이용해서 넘긴 것도 있습니다.

아래는 FreeBoardServiceImpl 코드 입니다.

package com.team404.freeboard.service;

import java.util.List;

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

import com.team404.command.FreeBoardVO;
import com.team404.freeboard.mapper.FreeBoardMapper;

@Service("freeService") // componentscan
public class FreeBoardServiceImpl implements FreeBoardService{
	
	@Autowired
	private FreeBoardMapper freeMapper;
	
	@Override
	public int regist(FreeBoardVO vo) {
		return freeMapper.regist(vo);
	}
	
	@Override
	public List<FreeBoardVO> getList() {
		return freeMapper.getList();
	}
	
	@Override
	public FreeBoardVO getDetail(int bno) {
		return freeMapper.getDetail(bno);
	}
	
	@Override
	public int update(FreeBoardVO vo) {
		return freeMapper.update(vo);
	}
	
	@Override
	public int delete(int bno) {
		return freeMapper.delete(bno);
	}

}

 

※ JSP를 선행하고 왔다면 쉽게 이해가 가실 겁니다.