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. 응답된 웹 화면
'IT > SpringDay' 카테고리의 다른 글
02. Spring MVC 게시판 구현④ - 글작성 (0) | 2022.05.18 |
---|---|
02. Spring MVC 게시판 구현③ - 게시글 상세정보 (0) | 2022.05.17 |
02. Spring MVC 게시판 구현 오류-javax.naming.NameNotFounudException:Name[jdbc/OracleDB] (0) | 2022.05.17 |
02. Spring MVC 게시판 구현① (0) | 2022.05.17 |
01. MVC 흐름 익히기 (0) | 2022.05.17 |