스프링 프레임 워크 규칙
패키지 이름 = 파일 이름
무조건 동일해야함!
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>
'프레임워크(Framework) > Spring' 카테고리의 다른 글
DB에 저장된 데이터값을 ajax로 그래프 그리기 (1) | 2023.06.08 |
---|---|
DB에 저장된 데이터 불러오기 (0) | 2023.06.08 |
mysql 연결&데이터 불러오기 (0) | 2023.06.07 |
Spring 코드 흐름 (0) | 2023.06.05 |
Spring 다운로드 & 기본설정 (0) | 2023.05.31 |
댓글