코딩하는 문과생

[Spring] 6. 스프링 기본(5) - 게시판 (CRUD) 본문

웹 프로그래밍/Spring

[Spring] 6. 스프링 기본(5) - 게시판 (CRUD)

코딩하는 문과생 2020. 2. 6. 09:49

클래스 기반으로 @RequestMapping을 설정할 수 있다.

@Controller
@requestMapping("/board")
public class UserCtrl {
...

 

[전체를 가져오자: MyBatis연결하기 위한 Mapper설정 후, ctrl, service, dao 작성]

0. JSP 수정 & DB 생성

<li><a href="/listPage.do"><i class="fa fa-clipboard" aria-hidden="true"></i>게시판</a></li>
CREATE TABLE INTERN_BOARD_TBL (
	SEQ		NUMBER PRIMARY KEY,
	TITLE	VARCHAR2(50) NOT NULL,
	CONTENT	VARCHAR2(4000),
	WRITER	VARCHAR2(50) REFERENCES INTERN_USER_TBL(ID),
	REGDATE	DATE DEFAULT SYSDATE,
	VIEWCNT	NUMBER DEFAULT 0
);

CREATE SEQUENCE BOARD_SEQ ;

INSERT INTO INTERN_BOARD_TBL(SEQ, TITLE, CONTENT, WRITER)
VALUES (BOARD_SEQ.NEXTVAL, 'hihi', 'hello', 'sijune');

INSERT INTO INTERN_BOARD_TBL(SEQ, TITLE, CONTENT, WRITER)
VALUES (BOARD_SEQ.NEXTVAL, 'nice to meet you', 'Hi, My name is LSJ', 'park');

SELECT * FROM INTERN_BOARD_TBL;

1. Mapper 먼저 작성 및 수정(boardMapper)

<?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">
  
<!-- 해당 객체의 set과 get을 이용해 접근한다. -->
<mapper namespace="com.sinc.intern.board">
		<select id="list" resultType="board">
			SELECT 	SEQ, TITLE, CONTENT, WRITER, REGDATE, VIEWCNT
			FROM	INTERN_BOARD_TBL 
		</select>
</mapper>  

2. BoardVO 만들기 - 그릇 만들기

 

3. config에 alias 추가

<typeAlias type="com.sinc.intern.board.model.vo.BoardVO" alias="board" />

 4. Ctrl, Service, Dao 수정(Dao, Service, Ctrl 순으로 작성한다.)

- BoardCtrl

package com.sinc.intern.board.ctrl;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.sinc.intern.board.service.BoardService;

@Controller
public class BoardCtrl {

	@Resource(name="boardS")
	private BoardService service;
	
	@RequestMapping("/listPage.do")
	public String list(Model model) {
		System.out.println("-- Board Ctrl --");
		//모델에 데이터를 넣어서 보내기
		model.addAttribute("list", service.list());

		return "board/listPage";
	}
}

결과


[글쓰기:  CREATE하고 전체 글로 Redirect]

0. 준비 - 수정

	$("#newBtn").on("click", function() {
		location.href="registerForm.do";
	});
	@RequestMapping("/registerForm.do")
	public String register() {
		return "board/register";
	}
<form role="form" method="post" action="register.do">
	<!-- 액션 수정 -->
	...
	<input type="text" name="writer" class="form-control" readonly value="${loginUser.id}">
	<!-- 무결성 확보 -->
    ...

1. Mapper수정

//insert, update, delete는 일반적으로 resultType불가, 성공하면 1, 실패하면 0 반환

		<!-- 반환형이 int. 성공하면 1, 실패하면 0 -->
		<insert id="register" parameterType="board">
			INSERT INTO INTERN_BOARD_TBL
			VALUES( BOARD_SEQ.NEXTVAL,
					#{title}, #{content}, #{writer}, DEFAULT, DEFAULT)
		</insert>

2. BoardDaoImpl 추가

	@Override
	public int registerRow(Object obj) {
		System.out.println("-- Register Dao --");
		return session.insert(PREFIX+".register", obj); 
	}

3. BoardServiceImpl 추가

	@Override
	public int register(Object obj) {
		System.out.println("-- Register Service --");
		return dao.registerRow(obj);
	}

4. BoardCtrl: Redirect로 다시 화면이 나오게 한다.

	@RequestMapping("/register.do")
	public String register_do(BoardVO vo) {
		System.out.println("register vo : " + vo);
		int flag = service.register(vo);
//		if(result!=0) {
//			model.addAttribute("list", service.list());
//		}
//		return "board/listPage";
		System.out.println("flag : " + flag);
		return "redirect:/listPage.do";
		
	}

전체 출력


[해당 글 선택시 세부사항 불러오기]

<td><a  href='readPage.do?seq=${boardVO.seq}'>${boardVO.title}</a></td>

0. 준비

readPage.jsp 수정 - 필요없는 태그 주석처리

 

1. Ctrl, Service, Dao, Mapper 작성

//Ctrl에서 Model에 담아 반환한다.

	@RequestMapping(value="/readPage.do", method=RequestMethod.GET)
	public String read(BoardVO vo, Model model) {
		System.out.println("-- read --");
		Object result = service.read(vo);
		model.addAttribute("board", result);
		return "board/readPage";
	}
	
	@Override
	public Object read(Object obj) {
		return dao.readRow(obj);
	}
	@Override
	public Object readRow(Object obj) {
		return session.selectOne(PREFIX+".read", obj);
	}
		<select id="read" parameterType="board" resultType="board">
			SELECT SEQ, TITLE, CONTENT, WRITER, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE, VIEWCNT
			FROM INTERN_BOARD_TBL
			WHERE SEQ = #{seq}
		</select>