본문으로 바로가기

02. Spring MVC 게시판 구현② - 리스트

category IT/SpringDay 2022. 5. 17. 10:10

1. dto 생성

package com.oracle.oMVCBoard.dto;
import java.sql.Timestamp;
public class BDto {
	private int bId;
	private String bName;
	private String bTitle;
	private String bContent;
	private Timestamp bDate;
	private int bHit;
	private int bGroup;
	private int bStep;
	private int bIndent;

	public BDto() {
		// TODO Auto-generated constructor stub
	}
	
	public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit, int bGroup, int bStep, int bIndent) {
		// TODO Auto-generated constructor stub
		this.bId = bId;
		this.bName = bName;
		this.bTitle = bTitle;
		this.bContent = bContent;
		this.bDate = bDate;
		this.bHit = bHit;
		this.bGroup = bGroup;
		this.bStep = bStep;
		this.bIndent = bIndent;
	}

	public int getbId() {
		return bId;
	}

	public void setbId(int bId) {
		this.bId = bId;
	}

	public String getbName() {
		return bName;
	}

	public void setbName(String bName) {
		this.bName = bName;
	}

	public String getbTitle() {
		return bTitle;
	}

	public void setbTitle(String bTitle) {
		this.bTitle = bTitle;
	}

	public String getbContent() {
		return bContent;
	}

	public void setbContent(String bContent) {
		this.bContent = bContent;
	}

	public Timestamp getbDate() {
		return bDate;
	}

	public void setbDate(Timestamp bDate) {
		this.bDate = bDate;
	}

	public int getbHit() {
		return bHit;
	}

	public void setbHit(int bHit) {
		this.bHit = bHit;
	}

	public int getbGroup() {
		return bGroup;
	}

	public void setbGroup(int bGroup) {
		this.bGroup = bGroup;
	}

	public int getbStep() {
		return bStep;
	}

	public void setbStep(int bStep) {
		this.bStep = bStep;
	}

	public int getbIndent() {
		return bIndent;
	}

	public void setbIndent(int bIndent) {
		this.bIndent = bIndent;
	}

	
	
}

 

2. interface Command 생성

package com.oracle.oMVCBoard.command;

import org.springframework.ui.Model;
//인터페이스 : 일관성, 표준화, 모듈화
public interface BCommand {
	void execute(Model model);
}


3. Controller 생성 

 

package com.oracle.oMVCBoard.controller;

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

import com.oracle.oMVCBoard.command.BCommand;

@Controller
public class BController {

	private static final Logger logger = LoggerFactory.getLogger(BController.class);
	//인터페이스 연결 
	BCommand command = null;
	
	@RequestMapping("list")
	public String list(Model model) {
		logger.info("list start");
		
		//서비스 연결 
		command = new BListCommand();
		command.execute(model);
		
		return "list";
	}
	
}

1) @Controller 어노테이션. 컨트롤러 등록이라고 생각하자

2) Logger 사용

// 로그를 수집할 클래스에 변수를 선언
private static final Logger logger = LoggerFactory.getLogger(BController.class); 
// 로그를 수집할 메서드에서 로그 수집 명령어 호출
logger.info("로그 타이틀", 출력할 값);

-  로깅 라이브러리는 slf4j을 사용함

- 일반적으로 사용 목적은 서비스 동작 상태 파악, 장애 파악, 로그 분석을 통한 서비스 지표의 확인, 트랜잭션,    성능 파악 등 

-  System.out.println() 명령어는 IO 리소스를 많이 사용하여 시스템이 느려질 수 있음

 

3) @RequestMapping("list")

- Controller 메소드의 파라미터와 웹요청 파라미터를 맵핑

 

4) command = new BListCommand();

- 서비스와 연결 

 

4. command = new BListCommand();

   - Service -> DAO -> DB 

package com.oracle.oMVCBoard.command;


import java.util.ArrayList;

import org.springframework.ui.Model;
import com.oracle.oMVCBoard.dao.BDao;
import com.oracle.oMVCBoard.dto.BDto;


// Service 
public class BListCommand implements BCommand {

	@Override
	public void execute(Model model) {
		BDao dao = new BDao();
		ArrayList<BDto> dtos  = dao.list();
		System.out.println("BListCommand dtos.size()-->"+dtos.size());
		model.addAttribute("list", dtos);
	}

}
package com.oracle.oMVCBoard.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.oracle.oMVCBoard.dto.BDto;

import oracle.net.aso.d;
import scala.annotation.meta.beanSetter;

public class BDao {
	DataSource dataSource;
    //DB 연결
	public BDao() {
		try {
			Context context = new InitialContext();
			dataSource = (DataSource) context.lookup("java:comp/env/jdbc/OracleDB");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("생성자 dataSource-->" + e.getMessage() );
			e.printStackTrace();
		}
		
	}

	public ArrayList<BDto> list() {
		ArrayList<BDto> dtos = new ArrayList<BDto>();
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			connection = dataSource.getConnection();
			String query = "SELECT bId, bName, bTitle, bContent, bDate, bHit,"
					+ "            bGroup, bStep, bIndent "
					+ "     FROM   mvc_board order by bGroup desc, bStep asc";
			preparedStatement = connection.prepareStatement(query);
			resultSet = preparedStatement.executeQuery();

			while (resultSet.next()) {
				int bId = resultSet.getInt("bId");
				String bName = resultSet.getString("bName");
				String bTitle = resultSet.getString("bTitle");
				String bContent = resultSet.getString("bContent");
				Timestamp bDate = resultSet.getTimestamp("bDate");
				int bHit = resultSet.getInt("bHit");
				int bGroup = resultSet.getInt("bGroup");
				int bStep = resultSet.getInt("bStep");
				int bIndent = resultSet.getInt("bIndent");
				BDto dto = new BDto(bId, bName, bTitle, bContent, bDate, bHit, 
						            bGroup, bStep, bIndent);
				dtos.add(dto);
			}

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("list  dataSource-->" + e.getMessage() );
			e.printStackTrace();
		} finally {
			try {
				if(resultSet != null) resultSet.close();
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}

		return dtos;
		
	}
 }

★ 게시판 답글 

bGroup 원글 번호, 답변을 단 원래 글(부모글)의 번호
bId = bGroup 이 같다면 원글(부모글)
bStep 원글과 답글들은 bGroup으로 묶일것이다. 이것을 하나의 그룹으로 볼때 그룹내의 순서를 의미 
bIndent 원글에 대한 답글인지, 답글에 대한 답글인지 구분하는 계층

 

- BDao list 메소드에서 리턴된 dtos 객체가 BListCommand에서 model.addAttribute("list", dtos)을 통해 Controller로 전달된다. (dtos 객체를 가지고 왔던길을 다시 되돌아감)

 

5. view -> list.jsp에서 구현됨

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ include file="header.jsp"   %>  
  
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
	<h1>게시판</h1>
	<table> 
		<tr>
			<td>번호</td><td>이름</td><td>제목</td><td>날짜</td><td>히트</td>
		</tr>
		<c:forEach items="${list}" var="mvc_board">
			<tr>
				<td>${mvc_board.bId}</td>
				<td>${mvc_board.bName}</td>
				<td>
					<c:forEach begin="1" end="${mvc_board.bIndent}">-</c:forEach>
					<a href="content_view?bId=${mvc_board.bId}">${mvc_board.bTitle}</a></td>
				<td>${mvc_board.bDate}</td>
				<td>${mvc_board.bHit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="5"> <a href="write_view">글작성</a> </td>
		</tr>
	</table>
</body>
</html>

 

6. 응답된 웹 화면