프로그래밍/Spring

[게시판] 4. 게시판 작성 기능

daykim 2021. 12. 6. 17:57

본 게시물은 아래 링크 게시물을 정리한 글입니다.

 

Coala Spring Study

A new tool for teams & individuals that blends everyday work apps into one.

eminent-track-b16.notion.site

1. 오라클 테이블 만들기

게시판에 글을 작성하기 위해 테이블 생성

-> 아래 코드들을 쿼리박스에서 작성하고, 오류없이 잘 나온다면 이 쿼리들은 이클립스에 XML 파일에 옮겨 사용한다.

한줄실행 : CTRL + ENTER

1) MP-BOARD 테이블 생성

CREATE TABLE MP_BOARD(
    BNO NUMBER NOT NULL,
    TITLE VARCHAR2(100)		NOT NULL,
    CONTENT VARCHAR2(2000)	NOT NULL,
    WRITER VARCHAR2(100)	NOT NULL,
    REGDATE DATE		DEFAULT SYSDATE,
    PRIMARY KEY(BNO)
)SEGMENT CREATION IMMEDIATE;

SELECT * FROM MP_BOARD;

 

2) 시퀀스 생성

게시판 번호를 1부터 자동으로 1씩 증가시켜주는 코드

CREATE SEQUENCE MP_BOARD_SEQ
START WITH 1
INCREMENT BY 1;

 

3) 데이터 입력

INSERT INTO MP_BOARD(BNO, TITLE, CONTENT, WRITER)
     VALUES (MP_BOARD_SEQ.NEXTVAL, '제목입니다', '내용입니다', 'DAYKIM');

SELECT * FROM MP_BOARD;
COMMIT; // 데이터 저장

 

4) src/main/resources/mappers의 boardMapper.xml 파일에다 작성

 <!-- 게시판 글 작성 -->
   <insert id="insert">
	   INSERT INTO MP_BOARD(    BNO
       				, TITLE
       				, CONTENT
       				, WRITER  )
       		VALUES(    MP_BOARD_SEQ.NEXTVAL 
	                 , #{title}
	                 , #{content}
	                 , #{writer}  )
   
   </insert>

 

2. 패키지 만들기

1) src/main/java에 만들기

  • kr.co.controller
  • kr.co.dao
  • kr.co.service
  • kr.co.vo

역할

controller

  • 웹에서 처리해야할 데이터를 받기
  • 데이터를 담당할 service 선택하여 호출
  • 처리한 데이터를 다음 페이지에서 볼 수 있도록 이동할 페이지 리턴

service

데이터를 dao를 통해 넘겨주거나 받으며 비즈니스 로직을 수행

dao

DB를 통해 데이터를 조회 및 수정, 삭제

vo

DB에 있는 테이블 컬럼 값을 java에서 객체로 다루기 위해 사용

 

 

 

2) kr.co.vo에 BoardVO.java 만들기

그리고 BoardVO 클래스 안 쪽에서 Alt + Shift + s 키 누르면 아래와 같이 나온다.
아래 항목에서 'Generate Getters and Setters' 클릭

package kr.co.vo;

import java.util.Date;

public class BoardVO {
	private int		bno;
	private String	title;
	private String	content;
	private String	writer;
	private Date	regdate;
	public int getBno() {
		return bno;
	}
	public void setBno(int bno) {
		this.bno = bno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
}

 

3) kr.co.dao에 BoardDAO.java와 BoardDAOImpl.java 만들기

- BoardDAO.java

package kr.co.dao;

import kr.co.vo.BoardVO;

public interface BoardDAO {
	// 게시글 작성
	public void write(BoardVO boardVO) throws Exception;
}

 

- BoardDAOImpl.java

package kr.co.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import kr.co.vo.BoardVO;

@Repository
public class BoardDAOImpl implements BoardDAO{
	@Inject
	private SqlSession sqlSession;
	
	// 게시글 작성
	@Override
	public void write(BoardVO boardVO) throws Exception{
		sqlSession.insert("boardMapper.insert", boardVO);
	}
}

 

4) ko.co.service에 BoardService.java, BoardServiceImpl.java 만들기

- BoardService.java

package kr.co.service;

import kr.co.vo.BoardVO;

public interface BoardService {
	// 게시글 작성
	public void write(BoardVO boardVO) throws Exception;
}

 

- BoardServiceImpl.java

package kr.co.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.co.dao.BoardDAO;
import kr.co.vo.BoardVO;

@Service
public class BoardServiceImpl implements BoardService{
	@Inject
	private BoardDAO dao;
	
	// 게시글 작성
	@Override
	public void write(BoardVO boardVO) throws Exception{
		dao.write(boardVO);
	}
}

 

 

5) kr.co.controller에 BoardController.java 만들기

- BoardController.java

package kr.co.controller;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.co.service.BoardService;
import kr.co.vo.BoardVO;

@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
	
	@Inject
	BoardService service;
	
	// 게시판 글 작성 화면
	@RequestMapping(value = "/board/writeView", method = RequestMethod.GET)
	public void writeView() throws Exception{
		logger.info("writeView");
		
	}
	
	// 게시판 글 작성
	@RequestMapping(value = "/board/write", method = RequestMethod.POST)
	public String write(BoardVO boardVO) throws Exception{
		logger.info("write");
		
		service.write(boardVO);
		
		return "redirect:/";
	}
}

 

6) 스프링이 스캔할 수 있도록 root-context.xml에 아래 코드 추가

	<!-- scan -->
    <context:component-scan base-package="kr.co.service"></context:component-scan>
    <context:component-scan base-package="kr.co.dao"></context:component-scan>
    <context:component-scan base-package="kr.co.vo"></context:component-scan>

 

7) src/main/webapp/spring/appServlet/servlet-context.xml에서 component-scat이 'kr.co.controller'로 되어있는지 확인

 

3. 게시판 작성 기능 구현

1) src/main/webapp/WEB-INF/views에 board 폴더 만들기

2) board 폴더에 writeView.jsp 파일 만들기

3) writeView.jsp 파일에 아래 코드 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>게시판</title>
	</head>
	<body>
		<div id="root">
			<header>
				<h1> 게시판</h1>
			</header>
			<hr />
			 
			<nav>
			  홈 - 글 작성
			</nav>
			<hr />
			
			<section id="container">
				<form role="form" method="post" action="/board/write">
					<table>
						<tbody>
							<tr>
								<td>
									<label for="title">제목</label><input type="text" id="title" name="title" />
								</td>
							</tr>	
							<tr>
								<td>
									<label for="content">내용</label><textarea id="content" name="content" ></textarea>
								</td>
							</tr>
							<tr>
								<td>
									<label for="writer">작성자</label><input type="text" id="writer" name="writer" />
								</td>
							<tr>
								<td>						
									<button type="submit">작성</button>
								</td>
							</tr>			
						</tbody>			
					</table>
				</form>
			</section>
			<hr />
		</div>
	</body>
</html>

 

4. 확인하기

1) Tomcat 서버 실행

2) 주소창에 http://localhost:8080/board/writeView 입력

아래와 같이 나오면 완료

 

5. 글 작성해보기

1) 글 작성 후 '작성' 버튼 클릭해보기

에러가 발생하는게 맞다. 

하지만 위의 링크 에러와는 다르다..

2) 참고한 게시글과는 다른 오류지만 우선 DB에 제대로 저장됐는지 확인하기

입력한 내용 저장이 안 되었다..

에러 메세지가 달랐던 이유가 있나보다.

확인해보자.

***
root-context.mxl 에서 oracle 사이트 계정을 입력하는 줄 알았는데
아래 에서 만든 계정을 입력하는 것이었다.

 

[게시판] 1.데이터베이스 사용자 생성

1. 쿼리박스 실행 및 아래와 같이 입력하고 접속 2. system 계정으로 접속 후 아래 코드 실행 (한 줄 실행 단축키 : ctrl + enter) CREATE USER [id] IDENTIFIED BY [password] DEFAULT TABLESPACE USERS TEMPORA..

wldwlddl59.tistory.com

 

위의 문제를 해결하고, 게시판에 글 작성 후 다시 작성 버튼을 누르면 아래와 같이 홈 화면이 나온다.

 

BoardController.java에서 아래와 같은 코드를 작성했었는데,
return "redirect:/"는 홈화면으로 경로를 보내는 것이므로 위와같이 홈 화면이 나오는 것이 맞다.
@RequestMapping(value = "/board/write", method = RequestMethod.POST)
	public String write(BoardVO boardVO) throws Exception{
		logger.info("write");
		
		service.write(boardVO);
		
		return "redirect:/";
	}

 

위와 같이 모든게 잘 실행 되었다면, 테이블을 다시 확인해보자

잘 추가되었다.