IT코딩공부!

#35 스프링(Board(게시판프로젝트, 어노테이션 기본개념!!)

history. 2023. 5. 26. 16:40

오늘의 노래!!!

 
물론
아티스트
허각
앨범
물론
발매일
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와 매핑하기 위해 사용하는 어노테이션


5가지 수정해서 확인하고 넘어 갈것!!!

서비스 안에 주의!

memId = _" 띄어 쓰기 안돼!!!!


기본 초기 설정!!
STS 형식 후 DB테이블 생성
테이블 생성 후 BoardDTO 생성!!!

//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

패키지 설정
pom.xml에 넣기
lombok 경로 확인 후 install
gtter setter tostring 에노테이션!!

또는

lobok.data를 사용하겠다는 뜻

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>

STS편집해서 경로 추가해주기!!!

// 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>

작성버튼 누르면 BoardWrite 목록은 BoardList로 이동

// 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>

// 실행 결과 확인!

http://localhost:9090/board/writeForm 으로 주소가 되어있는지 확인!!


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>

// 결과 출력