본문 바로가기
Programming/Spring

[스프링 프레임워크]게시판 만들기 #3 : DB 테이블 생성 및 게시판 목록

by hyunipad 2021. 8. 7.
반응형
본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다.
기본적인 내용은 지난 포스팅을 참고해주시기 바랍니다. 

2021.07.10 - [Spring] - [스프링 프레임워크] 게시판 만들기 #2 : Spring과 오라클 DB 연동 및 데이터 베이스 셋팅

 

[스프링 프레임워크]게시판 만들기 #2 : Spring과 오라클 DB 연동 및 데이터 베이스 셋팅

본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다. 기본적인 프로젝트 세팅에 대한 내용은 지난 포스팅을 참고해주시기 바랍니다. 2021.07.05 - [Spring] - [스

hyunipad.tistory.com

2021.07.05 - [Spring] - [스프링 프레임워크]게시판 만들기 #1 : 프로젝트 생성 및 셋팅

 

[스프링 프레임워크]게시판 만들기 #1 : 프로젝트 생성 및 셋팅

본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다. 안녕하세요. 이번 포스팅은 Spring Framework를 이용하여 게시판 만드는 방법을 설명합니다. Spring Framework

hyunipad.tistory.com

안녕하세요. 이번 포스팅은 오라클 DB에 테이블을 생성하고 게시판 목록을 출력해보도록 하겠습니다.

아래와 같이 테이블을 구성하고 임의의 데이터를 넣어두었습니다.

 CREATE TABLE board(
    seq NUMBER,
    subject VARCHAR2(200),
    content VARCHAR2(1000),
    name VARCHAR2(20),
    reg_date VARCHAR2(100),
    readCount NUMBER
    )
INSERT INTO "BOARD"."BOARD" (SEQ, SUBJECT, CONTENT, NAME, READCOUNT) VALUES ('1', 'TEST_SUBJECT1', 'TEST', 'k', '0')
INSERT INTO "BOARD"."BOARD" (SEQ, SUBJECT, CONTENT, NAME, READCOUNT) VALUES ('2', 'TEST_SUBJECT2', 'TEST', 'k', '0')
INSERT INTO "BOARD"."BOARD" (SEQ, SUBJECT, CONTENT, NAME, READCOUNT) VALUES ('3', 'TEST_SUBJECT3', 'TESt', 'k', '0')
INSERT INTO "BOARD"."BOARD" (SEQ, SUBJECT, CONTENT, NAME, READCOUNT) VALUES ('4', 'TEST_SUBJECT4', 'Test', 'k', '0')
INSERT INTO "BOARD"."BOARD" (SEQ, SUBJECT, CONTENT, NAME, READCOUNT) VALUES ('5', 'TEST_SUBJECT5', 'TESt', 'k', '0')

list.jsp

데이터를 보여주기 위한 View를 작성합니다.

src > main > webapp > WEB-INF > views > board > list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>낳짜</th>
			<th>조회수</th>
		</tr>	
	</thead>
	<tbody>
		
	</tbody>
</table>
</body>
</html>

 

BoardController.java

MVC 패턴을 위한 컨트롤러를 작성합니다.

package com.board.controller;


import java.util.Locale;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
@RequestMapping(value="/board/*")
public class BoardController {
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public void list(Locale locale, Model model) {
		
	}
	
}

 

/board/list에 이동하기 위해 home.jsp에 a태그를 입력해줍니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>
<P>  The time on the server is ${serverTime}. </P>
<a href="/board/list">게시판</a>
</body>
</html>

home.jsp
list.jsp

BoardDTO

이제 테이블의 데이터를 담아주기 위한 BoardDTO 클래스 파일을 생성합니다.

클래스 파일을 생성 후 변수를 오라클 DB에서 생성한 테이블의 컬럼의 타입에 맞춰 생성합니다.

테이블 Soruce > Generate Getter and Setter를 통해 get메서드와 set메서드를 생성합니다.

BoardDTO는 의존성 주입을 통해 DB 테이블에서 데이터를 가져올 때 DTO를 통해 데이터를 입출력하게 됩니다.

package com.board.domain;

/*
 CREATE TABLE board(
    seq NUMBER,
    subject VARCHAR2(200),
    content VARCHAR2(1000),
    name VARCHAR2(20),
    reg_date VARCHAR2(100),
    readCount NUMBER
) */

public class BoardDTO {
	int seq;
	String subject;
	String content;
	String name;
	String reg_date;
	int readCount;
	
	public int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getReg_date() {
		return reg_date;
	}
	public void setReg_date(String reg_date) {
		this.reg_date = reg_date;
	}
	public int getReadCount() {
		return readCount;
	}
	public void setReadCount(int readCount) {
		this.readCount = readCount;
	}
	
	
}

 

BoardDAO

오라클 DB에서 데이터를 가져오기 위한 쿼리를 작성하는 DAO 클래스 파일을 생성합니다.

BoardDAO와 뒤에 작성할 BoardService는 먼저 인터페이스를 생성하고 BoardDAOImpl, BoardServiceImpl 클래스 파일을 생성하여 인터페이스를 상속받아 사용합니다.

인터페이스를 생성하여 메서드를 오버 라이딩해서 사용하는 이유는 DAO와 Service에서 각각 로직이 수정되어도 영향이 가지 않게 분리해서 사용하려는 목적과 인터페이스를 통하여 재사용성을 높이기 위함입니다.

 

BoardDAO(인터페이스) 

package com.board.dao;

import java.util.List;

import com.board.domain.BoardDTO;

public interface BoardDAO {
 
 public List list() throws Exception; 

}

 

BoardDAOImpl(클래스)

package com.board.dao;

import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	@Inject
	private SqlSession sqlSession;
	
	private static String namespace = "com.board.mappers.board";

	@Override
	public List list() throws Exception {
		return sqlSession.selectList(namespace + ".list");
	}

}

BoardDAOImple의 namespace는 이전 포스팅에서 생성했던 boardMapper.xml에 있는 namespace와 동일하게 입력해야 합니다.

 

BoardService

BoardDAO에서 쿼리를 통해 가져온 데이터들을 여러 방식으로 가공하기 위한 BoardService를 생성합니다.

BoardDAO와 마찬가지로 인터페이스를 생성 후 상속받아 사용합니다.

 

BoardService

package com.board.service;

import java.util.List;

public interface BoardService {
	public List list() throws Exception; 
}

 

BoardServiceImpl

package com.board.service;

import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardDTO;

@Service
public class BoardServiceImpl implements BoardService {

 @Inject
 private BoardDAO dao;
 
 @Override
 public List list() throws Exception {
  return dao.list();
 }

}

 

boardMapper.xml

스프링에서 모든 쿼리는 mapper.xml에 작성합니다.

<?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.board.mappers.board">
	<select id="list" resultType="com.board.domain.BoardDTO">
	 	select 
 			seq, subject, content, name, reg_date, readCount
		from 
 			BOARD
	</select>
</mapper>

 

BoardController 코드 추가

package com.board.controller;

import java.util.List;
import java.util.Locale;

import javax.inject.Inject;

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

import com.board.service.BoardService;

/**
 * Handles requests for the application home page.
 */
@Controller
@RequestMapping(value="/board/*")
public class BoardController {
	
	 @Inject
	 private BoardService service;
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public void list(Locale locale, Model model) throws Exception {
		  List list = service.list();
		  model.addAttribute("list", list);
	}
	
}

 

list.jsp 코드 추가

jstl을 사용할 수 있도록 taglib를 추가하고 jstl을 작성합니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>내용</th>
			<th>작성자</th>
			<th>날짜</th>
			<th>조회수</th>
		</tr>	
	</thead>
	<tbody>
		<c:forEach items="${list}" var="list">
 			<tr>
 				<td>${list.seq}</td>
  				<td>${list.subject}</td>
				 <td>${list.content}</td>
 				 <td>${list.name}</td>
 				 <td>${list.reg_date}</td>
 				 <td>${list.readCount}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
</body>
</html>

 

servlet-context.xml 코드 추가

Spring에서 생성한 패키지들을 읽을 수 있도록 servlet-context.xml에 코드를 추가합니다.

<context:component-scan base-package="com.board.domain" />
<context:component-scan base-package="com.board.dao" />
<context:component-scan base-package="com.board.service" />

 

 

 

 

 

 

 

 

 

 

반응형

댓글