#35 스프링(Board(게시판프로젝트, 어노테이션 기본개념!!)
오늘의 노래!!!
- 아티스트
- 허각
- 앨범
- 물론
- 발매일
- 2023.04.28
※ Annotation
@Controller : Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation
@Autowired
: 속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.
무조건적인 객체에 대한 의존성을 주입시킨다.
@Autowired를 사용할 시, 스프링이 자동적으로 값을 할당한다.
Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용한다.
필드, 생성자, 입력 파라미터가 여러 개인 메소드(@Qualifier는 메소드의 파라미터)에 적용 가능하다.
Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다.
Bean을 주입받는 방식 (3가지)
@Autowired
setter
생성자 (@AllArgsConstructor 사용) -> 권장방식
@RequestMapping : 들어온 요청을 특정 method와 매핑하기 위해 사용하는 어노테이션

서비스 안에 주의!




//BoardDTO 작성
package com.icia.board.dto;
public class BoardDTO {
// 데이터베이스에 있는 BOARDTO 테이블을 보고 클래스 완성
String bdNum;
String bdWriter;
String bdPw;
String bdTitle;
String bdContent;
String bdDate;
String bdHit;
String bdRilename;
public String getBdNum() {
return bdNum;
}
public void setBdNum(String bdNum) {
this.bdNum = bdNum;
}
public String getBdWriter() {
return bdWriter;
}
public void setBdWriter(String bdWriter) {
this.bdWriter = bdWriter;
}
public String getBdPw() {
return bdPw;
}
public void setBdPw(String bdPw) {
this.bdPw = bdPw;
}
public String getBdTitle() {
return bdTitle;
}
public void setBdTitle(String bdTitle) {
this.bdTitle = bdTitle;
}
public String getBdContent() {
return bdContent;
}
public void setBdContent(String bdContent) {
this.bdContent = bdContent;
}
public String getBdDate() {
return bdDate;
}
public void setBdDate(String bdDate) {
this.bdDate = bdDate;
}
public String getBdHit() {
return bdHit;
}
public void setBdHit(String bdHit) {
this.bdHit = bdHit;
}
public String getBdRilename() {
return bdRilename;
}
public void setBdRilename(String bdRilename) {
this.bdRilename = bdRilename;
}
@Override
public String toString() {
return "BoardDTO [bdNum=" + bdNum + ", bdWriter=" + bdWriter + ", bdPw=" + bdPw + ", bdTitle=" + bdTitle
+ ", bdContent=" + bdContent + ", bdDate=" + bdDate + ", bdHit=" + bdHit + ", bdRilename=" + bdRilename
+ "]";
}
}
//BoardDTO 두번째 작성방법 C:\Users\user\.m2\repository\org\projectlombok\lombok\1.18.24




또는

package com.icia.board.dto;
import java.sql.Date;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@Data
public class BoardDTO {
// 데이터베이스에 있는 BOARDTO 테이블을 보고 클래스 완성
// bd랑 같이 할 필요없다 따라서 bd형식만 맞쳐주면 된당!!
private int bdNum;
private String bdWriter;
private String bdPw;
private String bdTitle;
private String bdContent;
private Date bdDate;
private int bdHit;
private String bdRilename;
private MultipartFile bdFile;
private String bdFileName;
}
//파일업로드를 위한 pom.xml에 추가



// controller에 가서 BoardWritet생성
// writeForm : 게시글 작성페이지 이동
@RequestMapping(value = "/writeForm", method = RequestMethod.GET)
public String writeForm() {
return "BoardWrite";
}
// 이후 view에 BoardWrite.jsp생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_Write</title>
<link rel="stylesheet" href="./resources/css/table.css" />
</head>
<body>
<form action="boardWrite" method="POST" enctype="multipart/form-data">
<table>
<caption>게시글 작성</caption>
<tr>
<th>작성자</th>
<td><input type="text" name="bWriter" /></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="bPw" /></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="bTitle" /></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="20" cols="40" name="bContent"></textarea></td>
</tr>
<tr>
<th>첨부파일</th>
<td><input type="file" name="bFile" /></td>
</tr>
<tr>
<th colspan="2"><input type="submit" value="등록"/></th>
</tr>
</table>
</form>
</body>
</html>

// index.jsp 작성 기본 화면 창!!!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_Index</title>
</head>
<body>
<h1>
게시판 프로젝트
<!-- Member 프로젝트에서 했던 기능
[1] 회원가입 <> 게시글 작성 / 게시글 번호 추가
[2] 로그인 / 로그아웃 <>
[3] 회원목록 <> 게시글 목록 / 페이징 처리
[4] 회원정보 <> 게시글 상세보기 / 조회수 증가
[5] 회원수정 <> 게시글 수정
[6] 회원삭제 <> 게시글 삭제
작성 번튼 id = write : writeForm
목록 버튼 id = list : boardList
-->
</h1>
<button id="write">게시글 작성</button>
<button id="list">게시글 목록</button>
</body>
<script src="https://code.jquery.com/jquery-3.6.4.js"
integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
crossorigin="anonymous">
</script>
<script>
$('#write').click(function() {
location.href = "writeForm";
});
$('#list').click(function() {
location.href = "boardList";
});
</script>
</html>

// BoardController작성
어노테이션 주의!!!
@Controller //주소를 넘길 수 있게 해주는 애노테이션
public class BoardController {
private ModelAndView mav = new ModelAndView();
@Autowired
private BoardService bsvc;
// 프로젝트 홈 화면
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}
// writeForm : 게시글 작성페이지 이동
@RequestMapping(value = "/writeForm", method = RequestMethod.GET)
public String writeForm() {
return "BoardWrite";
}
// boardWrite : 게시글 작성
@RequestMapping(value = "/boardWrite", method = RequestMethod.POST)
public ModelAndView boardWrite(@ModelAttribute BoardDTO board) throws IOException {
System.out.println("[1] jsp > controller >> board : " +board);
mav = bsvc.boardWrite(board);
return mav;
}
// BoardService작성
어노테이션 주의!!!
@Service
public class BoardService {
private ModelAndView mav;
@Autowired
private BoardDAO bdao;
public ModelAndView boardWrite(BoardDTO board) throws IOException {
System.out.println("[2] controller > service >> board : " + board);
mav = new ModelAndView();
// 서비스에서 할일!!!
// (1) 파일정보를 가져오기
MultipartFile bFile = board.getBFile();
// (2) 파일이름 설정하기
UUID uuid = UUID.randomUUID();
/* System.out.println("uuid 확인" + uuid.toString().substring(0,8)); */
/* System.out.println("실제 파일 이름 : " + bFile.getOriginalFilename()); */
// (3) 업로드한 파일이 존재한다면(!없다면)
if(!bFile.getOriginalFilename().isEmpty()) {
// (4) 랜덤한 식별문자 uuid + 실제파일 이름
String fileName = uuid.toString().substring(0,8) + "_" + bFile.getOriginalFilename();
// (5) board 객체의 bfileName에 새로운 이름 저장한다.
board.setBFileName(fileName);
// (6) 저장경로 설정 : fileUpload 폴더 생성
String savePath = "I:/springWorkspace/Board/src/main/webapp/resources/fileUpload/";
System.out.println("저장 경로 확인 : " + savePath);
bFile.transferTo(new File(savePath + fileName));
} else {
System.out.println("파일첨부 x");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////// ↓ 정보 입력할 내용
int result = bdao.boardWrite(board);
if(result > 0) {
mav.setViewName("index");
} else {
mav.setViewName("BoardWrite");
}
return mav;
}
// BoardDAO작성
어노테이션 주의!!!
@Repository
public class BoardDAO {
@Autowired
private SqlSessionTemplate sql;
public int boardWrite(BoardDTO board) {
System.out.println("[3] service >> dao : ");
return sql.insert("Board.boardWrite", board);
}
}
// BoardDAO.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="Board">
<insert id="boardWrite" parameterType="board">
INSERT INTO BOARDTO VALUES(BOARD_SEQ.NEXTVAL, #{bWriter}, #{bPw}, #{bTitle}, #{bContent}, SYSDATE, 0, #{bFileName})
</insert>
</mapper>
// 실행 결과 확인!

list나타내기 전에 먼저 DB에 시퀀스 추가하기!!
-- SEQUENCE : 자동 순차 증가라는 뜻
--생성방법은? : CREATE SEQUENCE [SEQ_NAME] START WITH [시작값] INCREAMENT BY [증가값];
--수정했을때? : ALTER SEQUENCE [SEQ_NAME] START WITH [시작값] INCREAMENT BY [증가값];
--삭제는? : DROP SEQUENCE[SEQ_NAME];
--하나씩 증가 : [SEQ_NAME].NEXTVAL;
--CREATE SEQUENCE TEST_SEQ START WITH 1;
--
--SELECT TEST_SEQ.NEXTVAL FROM DUAL;
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
SELEcT * FROM BOARDTO;
// 이후 view에 BoardList.jsp생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_List</title>
<link rel="stylesheet" href="./resources/css/table.css" />
<style>
</style>
</head>
<body>
<table>
<caption>게시글 목록</caption>
<tr>
<th>게시글 번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
<c:forEach var="list" items="${bList}">
<tr>
<td>${list.BNum}</td>
<td>${list.BTitle}</td>
<td>${list.BWriter}</td>
<td>${list.BDate}</td>
<td>${list.BHit}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
// BoardController작성
어노테이션 주의!!!
@Controller //주소를 넘길 수 있게 해주는 애노테이션
public class BoardController {
// boardList : 게시글 목록페이지 이동
@RequestMapping(value = "/boardList", method = RequestMethod.GET)
public ModelAndView boardList() {
System.out.println("[1] jsp > controller >> board");
mav = bsvc.boardList();
return mav;
}
}
// BoardService작성
어노테이션 주의!!!
addbject("_", _) 문장 같게 할것!!! 주의
@Service
public class BoardService {
private ModelAndView mav;
@Autowired
private BoardDAO bdao;
public ModelAndView boardList() {
System.out.println("[2] controller >> serivce " );
mav = new ModelAndView();
List<BoardDTO> bList = bdao.boardList();
mav.addObject("bList", bList);
mav.setViewName("BoardList");
return mav;
}
}
// BoardDAO작성
어노테이션 주의!!!
@Repository
public class BoardDAO {
@Autowired
private SqlSessionTemplate sql;
public List<BoardDTO> boardList() {
System.out.println("[3] service >> dao : ");
return sql.selectList("Board.boardList");
}
}
// BoardDAO.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="Board">
<select id="boardList" resultType="board">
SELECT * FROM BOARDTO ORDER BY BNUM DESC
</select>
</mapper>
// 결과 출력
