Eggs Sunny Side Up
본문 바로가기
프레임워크(Framework)/Spring

Spring기초_게시글 출력, 조회, 작성

by guswn100059 2023. 6. 2.

스프링 프레임 워크 규칙

 

패키지 이름 = 파일 이름

무조건 동일해야함!


root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- schema에 대한 정의! schema == xml 파일에서 사용하고 싶은 태그를 정의해놓은 파일 -->
	<!-- beans라는 태그들을 사용하겠다! -->
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<!-- shared resources == DB -->
	
	<!-- 1) HikariConfig(DB연결을 위한 데이터 기술) 생성 -->
	<!-- HikariConfig hikari = new HikariConfig() -->
	<!-- hikariConfig.setXXXX(drivername); 
		 hikariConfig.setXXXX(jdbcURL); 
		 hikariConfig.setXXXX(username); 
		 hikariConfig.setXXXX(password); 
	-->
	<bean class="com.zaxxer.hikari.HikariConfig" id="hikariConfig">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/com"/>
		<!-- jdbc url 주소
		=> DataSourceExplorer에 연결된 com계정 우클릭
		=> properties
		=> Driver Properties
		=> jdbcurl
		 -->
		<property name="username" value="com"/>
		<property name="password" value="com01"/>
	</bean>
	
	<!-- 2) DBCP 생성 : HikariDataSource -->
	<bean class="com.zaxxer.hikari.HikariDataSource" id="dataSource">
		<constructor-arg ref="hikariConfig"/>
	</bean>
	
	<!-- 3) SqlSessionFactoryBean 객체 생성 -->
	<!-- : Connection 객체를 빌려서 사용하는 객체 -->
	<!-- : Mapper interface 구현체 역할을 담당 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- 4) 구현해야하는 mapper 파일의 위치 등록하기 -->
	<mybatis-spring:scan base-package="kr.smhrd.mapper"/>
	
	
	<!-- 
		public class SqlSessionFactoryBean implements BoardMapper{
			
			@Override
			public ArrayList<Board> getList(){
				session.selectList(getList);
				return list;
			}
			
		}
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
	 -->
	 
	 
	
	
</beans>

=> implements를 하기 위해서는 mybatis-spring schema 로드 해줘야함
Namespaces탭 들어가서 mybatis-spring 체크해주기


kr.smhrd.model

Board.java

package kr.smhrd.model;

import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor // 기본 생성자 생성
@AllArgsConstructor // 모든 필드에 데이터를 집어넣는 생성자
@Data // getter, setter, toString 메소드 생성
public class Board {

	// 우리의 웹페이지에서 사용할 새로운 사용자 정의 자료형
	// DTO, VO 역할하는 클래스
	
	// 작성자, 게시글 제목, 내용, 작성일, 게시글 번호
	private String writer;
	private String title;
	private String content;
	private Date indate;
	private int num;
	
	
}

 


src/main/resources

src/main/java에서 생성한 패키지 이름으로 똑같은 패키지 생성

패키지로 생성한 후 마지막 폴더에 새로운 mapper 생성

<?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="kr.smhrd.mapper.BoardMapper">
<!-- SQL구문을 작성하는 xml 파일(xml도 엄연히 .java파일임) -->
<!-- 반드시 DAO 역할을 하는 Mapper.java파일과 package명칭을 동일하게 맞추기 -->
<!-- 반드시 DAO역할을 하는 Mapper.java파일과 이름도 동일하게 맞추기 -->
<!-- 해당하는 SQL 구문을 불러서 사용하게 될 메소드명과 id값을 동일하게 맞추기 -->

	<!-- 1) 게시글 전체 조회하기 -->
	<select id="getList" resultType="kr.smhrd.model.Board">
		select * from board
	</select>
	
	<!-- 2) 게시글 작성 -->
	<!-- \#{변수} : 매개변수(parameterType)으로 받아온 getter를 쓰겠다. 
				   parameterType에서 선언된 변수 대,소문자 구분해서 써야함!! 
	-->
	<insert id="insertList" 
	parameterType="kr.smhrd.model.Board">
		insert into board(TITLE, WRITER, CONTENT)
		values(#{title},
			   #{writer},
			   #{content}
				)
	</insert>
	
	

</mapper>

kr.smhrd.mapper

board.sql

mysql로 연결

/*테이블 생성하기
 * 테이블명 : board (vo의 이름이랑 테이블명 일치시켜주기)
 * 컬럼명 (vo의 필드명이랑 일치시켜주기)
 * - 게시글 번호 num
 * - 작성자 writer
 * - 내용 content
 * - 작성일 indate 현재날짜
 * - 제목 title
 */

CREATE TABLE BOARD(
	NUM INT NOT NULL AUTO_INCREMENT,
	TITLE VARCHAR(200) NOT NULL,
	CONTENT VARCHAR(1000) NOT NULL,
	WRITER VARCHAR(50) NOT NULL,
	INDATE DATETIME DEFAULT NOW(),
	PRIMARY KEY(NUM)
); /*실행 단축키 : ALT + X*/

INSERT INTO BOARD(wRITER, TITLE, CONTENT)
VALUES('김은영', 'DB게시글1', '게시글입니다1');
INSERT INTO BOARD(wRITER, TITLE, CONTENT)
VALUES('김운비', 'DB게시글2', '게시글입니다2');
INSERT INTO BOARD(wRITER, TITLE, CONTENT)
VALUES('안현진', 'DB게시글3', '게시글입니다3');

SELECT * FROM BOARD;

 

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

}

 

 


kr.smhrd.web

BoardController.java

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 org.springframework.web.bind.annotation.RequestParam;

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

// servlet-context.xml에 scan이 지정되어있음.
// POJO와 같이 어노테이션(@Controller, @RestController 등)이 붙은 class scan
@Controller // 어노테이션 => POJO임을 명시
public class BoardController {

	//  실제 요청을 처리할 POJO
	@Autowired // => Spring Container에 위치하고 있는 
			   // 	 SqlSessionFactoryBean 구현체를 받아와서 연결
	private BoardMapper mapper;
	
	// 요청이 들어왔을 때, 무슨 일을 할건지? => method
	// /list 라는 요청이 들어오면, boardList.jsp로 이동하겠다.
	
	@RequestMapping("/list") // UrlMapping
	public String list(Model model) {
		
		// request가 필요하면 메소드의 매개변수에 선언을 하게 되면,
		// Spring container가 자동으로 request를 채워준다.
		
		// Model == request 경량화 버전!!
		// SpringFramework에서는 request객체 대신 Model을 사용한다.
		
		
		// 1. 게시글 데이터를 DB에서 조회해서 가져오기
//		// 1-1) Mapper(DAO) 생성
//		BoardMapper mapper = new BoardMapper();
		
		// 1-2) mapper 사용
		ArrayList<Board> list = mapper.getList();
		
		
		// 2. 조회한 데이터를 request에 담아서
//		request.setAttribute("list", list);
		model.addAttribute("list", list);
		
		
		// 3. boardList.jsp로 forward방식으로 이동
		return "boardList"; // /WEB-INF/view/boardList.jsp
		// boardList : 논리적인 주소값
		// /WEB-INF/view/boardList.jsp : 물리적인 주소값 변환(Spring 내부에 있는 객체가)
		
	}
	
	// insert로 GET방식 요청이 들어왔을 때
	@RequestMapping("/insert")
	public String insert() {
		
		// boardInsert.jsp로 forward 이동
		return "boardInsert";
	}
	
	// insert로 POST방식 요청이 들어왔을 때
	// 동일한 url mapping이더라도 요청방식에 따라서 다른 메소드를 연결해줄 수 있다.
//	@RequestMapping(value = "/register", method = RequestMethod.POST)
	@PostMapping("/insert")
	public String insert(Board vo) {
		
		// INSERT INTO BOARD(WRITER, TITLE, CONTENT)
		// VALUES(?, ?, ?)
		
		mapper.insertList(vo);
		// BoardMapper 인터페이스 => BoardMapper.xml 안의 쿼리문을 실행
		
		// redirect방식으로 /list이동
		return "redirect:/list";
		// : 기준으로 split을 진행하고 뒤쪽에 있는 url값만 가져다가
		// redirect방식으로 이동하게끔 Spring 내부에 설계가 되어있다.
	}
	
	// 게시글 클릭 후 조회
	// 방법 1. url path값
	@GetMapping("/boardContent/{num}")
	public String boardContent(@PathVariable("num") int n1, Model model) {
		// 1. Board 파라미터 수집 가능
		// 2. 자료형 name값
		// 3. url path값에 보내줄 데이터를 포함시켜서 수집하는 방법
		// => @PathVariable
		
		// DB에서 게시글 한 개 조회
		Board list = mapper.boardContent(n1);
		
		// 조회한 게시글을 model 담아주기
		model.addAttribute("list", list);
		// session 가져올려면 HttpSession 데려오기
		
		// boardContent.jsp로 forward방식으로 이동
		return "boardContent";
	}
		
	//	방법 2. 쿼리스트링
	//	단, 쿼리스트링을 사용할 땐 테이블 컬럼명과 매개변수명을 일치시켜야함!!!
	//	@GetMapping("/boardContent")
	//	public String boardContent(int num, Model model) {
	//		// 1. Board 파라미터 수집 가능
	//		// 2. 자료형 name값
	//		
	//		Board list = mapper.boardContent(num);
	//		
	//		model.addAttribute("list", list);
	//		
	//		return "boardContent";
	//	}
	
	
	
}

 


views

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"%>
<!-- ContextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}" />
<!-- cpath == /web -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<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">
						<tr>
							<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>
					<tr>
						<td colspan="4">
							<button class="btn btn-success btn-sm" onclick="location.href='insert'">글쓰기</button>
						</td>
					</tr>
				</table>

			</div>
			<div class="card-footer">Spring 마스터를 해봅시다.</div>
		</div>
	</div>

</body>
</html>

 

boardInsert.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>Insert title here</title>
<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<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">
				<form action="insert" method="post">
				  <div class="form-group">
				    <label for="title">제목 : </label>
				    <input type="text" class="form-control" placeholder="제목 입력" 
				    id="title" name="title">
				  </div>
				  <div class="form-group">
				    <label for="writer">작성자 : </label>
				    <input type="text" class="form-control" placeholder="작성자 입력" 
				    id="writer" name="writer">
				  </div>
				  <div class="form-group">
				    <label>내용 : </label>
				    <textarea rows="10" class="form-control" name="content"></textarea>
				  </div>
				  <button type="submit" class="btn btn-primary">작성하기</button>
				</form>

			</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 prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<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>${list.num}</td>
					</tr>
					<tr>
						<td>제목</td>
						<td>${list.title}</td>
					</tr>
					<tr>
						<td>작성자</td>
						<td>${list.writer}</td>
					</tr>
					<tr>
						<td>작성일</td>
						<td>${list.indate}</td>
					</tr>
				</table>
			</div>
			<div class="card-footer">Spring 마스터를 해봅시다.</div>
		</div>
	</div>

</body>
</html>

web.xml

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

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

댓글