2019. 9. 30. 12:31ㆍProject B (SPMS)/Project B 파트2
게시판 라우팅 테이블 설계
작 업 | URL | 메소드 | 파라미터 | 입력화면 필요 | URL 이동 |
전체 목록 | /board/list | GET | × | × | × |
등록 처리 | /board/register | POST | 전체 항목 | 〇 | 〇 |
상세 조회 | /board/read | GET | 글번호 | × | × |
수정 처리 | /board/remove | POST | 전체 항목 | 〇 | 〇 |
삭제 처리 | /board/modify | POST | 글번호 | 〇 | 〇 |
게시판 구현을 하기에 앞서서 게시판 라우팅 설계 작성을 하는게 좋다.
게시판 컨트롤러 작성 : 조회
src/main/java
com.spms.controller
BoardController.java
get()
package com.spms.controller;
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.spms.domain.BoardVO;
import com.spms.service.BoardService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
private BoardService boardService;
@GetMapping("/list")
public void list(Model model) {
log.info("list");
boardService.getList().forEach(board -> log.info(board));
model.addAttribute("list", boardService.getList());
}
@PostMapping("/register")
public String register(BoardVO board, RedirectAttributes rttr) {
log.info("register : " + board);
boardService.register(board);
rttr.addFlashAttribute("result", board.getBno());
return "redirect:/board/list";
}
@GetMapping("/get")
public void get(@RequestParam("bno") Long bno, Model model) {
log.info("/get");
model.addAttribute("board", boardService.get(bno));
}
}
@RequestParam("bno") Long bno
게시글 번호인 bno 값을 조금 더 명시적으로 처리하는 @RequestParam을 이용해서 지정한다.
(파라미터 명과 변수명을 기준으로 동작하기때문에 생략해도 상관은 없다.)
Model model
화면 쪽으로 해당 번호의 게시물을 전달해야하기때문에 모델을 파라미터로 지정한다.
게시판 서비스 인터페이스 작성 : 조회
src/main/java
com.spms.service
BoardService.java 인터페이스
get()
package com.spms.service;
import java.util.List;
import com.spms.domain.BoardVO;
public interface BoardService {
public List<BoardVO> getList();
public void register(BoardVO board);
public BoardVO get(Long bno);
}
게시판 서비스 인터페이스 구현 작성 : 조회
src/main/java
com.spms.service
BoardServiceImpl.java
get()
package com.spms.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.spms.domain.BoardVO;
import com.spms.mapper.BoardMapper;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {
private BoardMapper boardMapper;
@Override
public List<BoardVO> getList() {
log.info("getList....");
return boardMapper.getList();
}
@Override
public void register(BoardVO board) {
log.info("register......" + board);
boardMapper.insertSelectKey(board);
}
@Override
public BoardVO get(Long bno) {
log.info("get......" + bno);
return boardMapper.read(bno);
}
}
게시판 매퍼 인터페이스 작성 : 조회
src/main/java
com.spms.mapper
BoardMapper.java 인터페이스
read()
package com.spms.mapper;
import java.util.List;
import com.spms.domain.BoardVO;
public interface BoardMapper {
public List<BoardVO> getList();
public Long insertSelectKey(BoardVO board);
public BoardVO read(Long bno);
}
게시판 매퍼 인터페이스 구현 작성 (SQL XML) : 조회
src/main/resources
com
spms
mapper
BoardMapper.xml
read()
<?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.spms.mapper.BoardMapper">
<!-- 목록 조회 -->
<select id="getList" resultType="com.spms.domain.BoardVO">
<![CDATA[
select *
from TBL_BOARD
where BNO > 0
]]>
</select>
<!-- 등록 (선택키 활용) -->
<insert id="insertSelectKey">
<selectKey keyProperty="bno" order="BEFORE" resultType="long">
select SEQ_BOARD.nextval
from DUAL
</selectKey>
insert into TBL_BOARD (
BNO, TITLE, CONTENT, WRITER
)
values (
#{bno}, #{title}, #{content}, #{writer}
)
</insert>
<!-- 조회 -->
<select id="read" resultType="com.spms.domain.BoardVO">
select *
from TBL_BOARD
where BNO = #{bno}
</select>
</mapper>
게시판 조회 유닛테스트 작성
src/test/java
com.spms.controller
BoardControllerTests.java
testGet()
package com.spms.controller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {
com.spms.config.RootConfig.class,
com.spms.config.ServletConfig.class} )
@Log4j
public class BoardControllerTests {
@Setter(onMethod_ = { @Autowired })
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
}
public void testList() throws Exception {
log.info(
mockMvc.perform(MockMvcRequestBuilders.get("/board/list")
).andReturn().getModelAndView().getModelMap());
}
public void testRegister() throws Exception {
String resultPage = mockMvc
.perform(MockMvcRequestBuilders.post("/board/register")
.param("title", "테스트 새글 제목")
.param("content", "테스트 새글 내용")
.param("writer", "tester01"))
.andReturn().getModelAndView().getViewName();
log.info(resultPage);
}
@Test
public void testGet() throws Exception{
log.info(mockMvc.perform(MockMvcRequestBuilders
.get("/board/get")
.param("bno", "2")
).andReturn().getModelAndView().getModelMap()
);
}
}
게시판 조회 유닛테스트 결과
INFO : jdbc.resultsettable -
|----|-----------|-----------|-------|----------------------|----------------------|
|bno |title |content |writer |regdate |updatedate |
|----|-----------|-----------|-------|----------------------|----------------------|
|2 |첫번째 테스트 제목 |첫번째 테스트 내용 |guest1 |2019-09-29 13:46:56.0 |2019-09-29 13:46:56.0 |
|----|-----------|-----------|-------|----------------------|----------------------|
'Project B (SPMS) > Project B 파트2' 카테고리의 다른 글
[B -2-12] CRUD 게시판 삭제 구현 (0) | 2019.09.30 |
---|---|
[B -2-11] CRUD 게시판 수정 구현 (0) | 2019.09.30 |
[B -2-9] CRUD 게시판 등록 구현 (0) | 2019.09.30 |
[B -2-8] CRUD 게시판 목록 구현 (0) | 2019.09.29 |
[B -2-7] 스프링 MVC 프로젝트의 기본 구조 1 (0) | 2019.09.29 |