주먀

3. 게시판 조회하기 본문

학원/Spring

3. 게시판 조회하기

주먀 2023. 6. 5. 09:20

1. 점선 위아래 두개 다른 객체이다.

2. 기본적인 특징들은 꼭 외우기 ( 또 다른 특징. Aop -> 관점지향 프로그램 )

BoardMapper.xml

1. 매우중요! mapper id 와 xml 메서드명 일치해야한다.

2. mysql -> 조회해온 값이 한줄이면 : BroadCast / 여러줄 : ArrayList<BroadCast> 로 받아오기

3. mapper -> db

4. vo -> 고객에게 받아온 값이다.

5. #{} -> 파라미터로 Board 안에 수많은 필드가 있을건데, 그 중에서 대문자 Writer의 Getter 메서드를 사용한다는 뜻이다.

6. sql 구문은 대문자로 -> 빨리 읽힌다.

7. 인터페이스를 거쳐야만 xml로 갈 수 있다

8. 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" >
<!-- SQL구문을 작성하는 xml파일 -->
<!-- 반드시 DAO역할을 하는 Mapper.java파일과 package명칭을 동일하게 맞추기
	 반드시 DAO역할을 하는 Mapper.java파일과 이름도 동일하게 맞추기 -->
<mapper namespace="kr.smhrd.mapper.BoardMapper">

	<!-- 1) 게시글 전체조회하기 -->
	<!-- 매우중요! 해당하는 SQL구문을 불러서 사용하게 될 메소드명과 id값을 동일하게 맞추기 -->
	<select id="getList" resultType="kr.smhrd.model.Board">
	SELECT * FROM BOARD
	</select>
	
	<!-- 2) 게시글 추가하기 -->
	<insert id="boardInsert" parameterType="kr.smhrd.model.Board">
	INSERT INTO BOARD(WRITER, TITLE, CONTENT)
	VALUES(#{writer}, #{title}, #{content})
	</insert>
	<!-- \#{필드명} : parameterType으로 받아온 데이터의 getter메소드를 부르는 기호 -->
</mapper>

 

BoardController.java

- url 앞에 슬래쉬 필수이다. ( .do랑 같은 의미 )

- 비동기통신전까지는 무조건 String타입이다.

- url 변경이 되면 controller로 잡아주기

package kr.smhrd.web;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.smhrd.mapper.BoardMapper;
import kr.smhrd.model.Board;

// servlet-context.xml에 scan 지정이 되어있음
// POJO와 같이 어노테이션(@Controller, @RestController 등)이 붙은 class scan
// 이것만 잘 적어주면 spring이 알아서 스캔해줄거임
@Controller // POJO임을 명시
public class BoardController {
	// 실제 요청을 처리할 POJO

	// 1-1) Mapper(DAO) 생성
	@Autowired // --> Spring Container에 위치하고 있는
				// SqlSessionFactoryBean 구현체를 받아와서 연결
	private BoardMapper mapper;

	// 요청이 들어왔을 때, 무슨 일을 할건지 정해주자 --> method 정의
	// /list 라는 요청 들어오면, boardList.jsp로 이동하겠다.
	@RequestMapping("/list") // @RequestMapping 달고 UrlMapping 지정
	public String list(Model model) {
		// request가 필요하면 메소드의 매개변수에 선언을 하게 되면,
		// Spring Container가 자동으로 request를 채워준다.

		// Model == request 경량화 버전
		// SpringFramework에서는 request객체 대신 Model 사용한다.

		// 1. 게시글 데이터를 DB에서 조회해서 가져오기

		// 1-2) mapper 사용
		ArrayList<Board> list = mapper.getList();
		// 2. 조회한 데이터를 request에 담아서
		model.addAttribute("list", list);
		// 3. boardList.jsp 로 forward방식으로 이동
		return "boardList"; // /WEB-INF/View/boardList.jsp ->root-context.xml에 들어있음
		// boardList : 논리적인 주소값
		// /WEB-INF/View/boardList.jsp : 물리적인 주소값 변환 해줌(Spring 내부 객체가)
	}

	// boardInsert로 GET방식 요청이 들어왔을 때
	@GetMapping("/boardInsert")
	public String boardInsert() {
		// boardInsert.jsp로 forward 이동
		return "boardInsert";
	}

	// boardInsert로 Post방식 요청이 들어왔을 때
	// 동일한 url mapping이더라도 요청방식에 따라서 다른 메소드를 연결해줄 수 있다!!
//   @RequestMapping(value="/boardInsert",method=RequestMethod.POST)
	@PostMapping("/boardInsert")
	public String boardInsert(Board vo) {
		// INSERT INTO BOARD(WRITER, TITLE, CONTENT)
		// VALUES(?,?,?)
		// 1. db에 데이터 추가
		mapper.boardInsert(vo);
		// BoardMapper인터페이스 --> BoardMapper.xml 안의 쿼리문을 실행!!!

		// 2. redirect방식으로 /list로 이동
		return "redirect:/list";
		// : 기준으로 split을 진행하고 뒤쪽에 있는 url값만 가져다가
		// redirect방식으로 이동하게끔 Spring 내부에 설계가 되어있다.
	}

	// 게시글 조회하기
	@GetMapping("/boardContent/{num}")
	public String boardContent(@PathVariable("num") int n1, Model model) {
		// HttpSession --> session
		
		// 1. Board 파라미터 수집 가능
		// 2. 자료형 name값
		// 3. url path값에 보내줄 데이터를 포함시켜서 수집하는 방법
		// >>>>> @PathVariable
		// 1. DB에서 게시글 한개를 조회해오기
		Board result = mapper.boardContent(n1);
		//2. 조회한 게시글을 model 담아주기
		model.addAttribute("result", result);
		//3. boardContent.jsp로 forward방식으로 이동
		return "boardContent";
	}

}

 

BoardMapper.java

package kr.smhrd.mapper;

import java.util.ArrayList;
import java.util.Date;

import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import kr.smhrd.model.Board;

public interface BoardMapper {
	// DAO 역할을 하는 클래스

	// 1. 전체 게시글을 조회하는 기능
	public ArrayList<Board> getList();
	// 추상메소드
	
	// 2. 게시글 추가하는 기능
	public void boardInsert(Board vo);

	// 간단한 쿼리구문은 annotation을 사용해서 mapper interface에 작성할 수 있다.
	// annotation과 xml에 쿼리구문이 두개이상 존재하면 에러가 난다!!!
	// 3. 게시글 한개를 조회하는 기능
	@Select("SELECT * FROM BOARD WHERE NUM = #{n1}")
	public Board boardContent(int n1);
	// SpringContainser에 적재되어있는
	// SqlSessionFactoryBean클래스가 알아서 작동시킴~!
	///////////////////////////////////////////////////////////////////////
	// SqlSession session = SqlSessionFactory.openSession(true);
	// ArrayList<Board> list = session.selectList("getList");
	// session.close();
	// // 생성한 게시글을 리턴
	// return list;
	///////////////////////////////////////////////////////////////////////


}

 

* 1. web.xml 해석 *  ( 스키마추가 : Namespaces -> 스키마 체크 )

1-1. root-context.xml 해석 -> HikariConfig -> 유효성 검사 ( ContextLoader ( web.xml 16줄 ) 에러안뜨면 -> root-context.xml에 문제가 있는 것다. )

1-2. DispatcherServlet ( appServlet 명칭 )-> FrontController -> servlet-context.xml해석을 해야 FrontController로 간다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container
	shared by all Servlets and Filters -->
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>

	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

	<!-- Processes application requests -->
	<!-- FronController 생성하는 구간 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- FronController 생성하는 구간 -->

	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 한글 잡아주는 인코딩 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

* 2. root-context.xml 해석 *

2-1. property 값 잘 들어가있는지 체크하기 -> 잘만들어져야 dbcp 생성이 된다. -> mapper 파일의 위치 등록하는 것 체크하기

-> 에러뜨면 -> sql구문을 잘 못 썻을때 해당 체크하기

 

*3.  servlet-context.xml 해석 *

3-1. POJO 해석이다.

3-2. 폴더 위치 해석이다. ( res로 하고싶으면 작성 하면됨 )

3-3. ViewResolver -> 앞뒤로 풀어준다.

3-4. 폴더만들어주고 싶으면 view/ 뒤에 추가하면된다.

3-5. ★★★★★ Controller가 어디에 위치되어있는지 스캔하는 기능 ★★★★★

패키지명 변경할때 web 대신 다른 패키지명으로 변경하기

 

boardList.jsp

1. 태그는 태그안에 추가 가능하다.

2. <!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->

3. get -> url 포함 ( 쿼리스트링 )

4. 1Controller -> 1Mapper 생성하기

5. 쿼리스트명 -> 변수명 동일해야함

6. 쿼리스트링 말고 새로운 방법 -> url만 꺼내오는 방법 ( @PathVariable )

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<!-- jQuery library -->
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<!-- Popper JS -->
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script
	src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>

<body>
   <div class="jumbotron jumbotron-fluid">
      <div class="container">
         <h1>Spring Framework 게시판</h1>
         <p>spring MVC를 이용해서 간단한 게시판을 만들어봅시다~</p>
      </div>
   </div>
   <div class="container">
      <div class="card">
         <div class="card-header">빅데이터 분석서비스 개발자과정 게시판</div>
         <div class="card-body">
            <table class="table table-bordered table-hover" border = '1'>
         <tr>
            <th>번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>작성일</th>
         </tr>
         <!-- jstl 문법을 써서 반복 -->
         <c:forEach items="${list}" var="b">
               <td>${b.num}</td>
               <td><a href="${cpath}/boardContent/${b.num}">${b.title}</a></td>
               <td>${b.writer}</td>
               <td>${b.indate}</td>
            </tr>
         </c:forEach>
         
         
         	<td colspan="4">
         	<button class="btn btn-success btn-sm" onclick="location.href='boardInsert'">글쓰기</button>
         	</td>
         
         
         </tr>
         
         
         </table>
         </div>
         <div class="card-footer">Spring 마스터를 해봅시다.</div>
      </div>
   </div>
</body>
</html>

 

boardContent.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<!-- jQuery library -->
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<!-- Popper JS -->
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script
	src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>

<body>
   <div class="jumbotron jumbotron-fluid">
      <div class="container">
         <h1>Spring Framework 게시판</h1>
         <p>spring MVC를 이용해서 간단한 게시판을 만들어봅시다~</p>
      </div>
   </div>
   <div class="container">
      <div class="card">
         <div class="card-header">빅데이터 분석서비스 개발자과정 게시판</div>
         <div class="card-body">
            <table class="table table-bordered table-hover" border = '1'>
     			<tr>
     				<td>번호</td>
     				<td>${result.num}</td>
     			</tr>
     			<tr>
     				<td>제목</td>
     				<td>${result.title}</td>
     			</tr>
     			<tr>
     				<td>작성자</td>
     				<td>${result.writer}</td>
     			</tr>
     			<tr>
     				<td>작성일</td>
     				<td>${result.indate}</td>
     			</tr>
         
         
         </table>
         </div>
         <div class="card-footer">Spring 마스터를 해봅시다.</div>
      </div>
   </div>
</body>
</html>