일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 상속
- jsp
- spring
- html
- db
- Database
- Thymeleaf
- SpringBoot
- 문자열
- 배열
- Controller
- 이클립스
- string
- View
- Array
- Board
- mysql
- Oracle
- 조건문
- git
- React
- Scanner
- API
- jquery
- JDBC
- rpa
- Uipath
- Java
- MVC
- Eclipse
- Today
- Total
유정잉
57일차 스프링 [ MVC - restcontroller, mybatis ] [ Board ] 본문
14. restcontroller
Restful API : 서버의 응답결과를 데이터만으로 구성하여 클라이언트로 전달하는 서버를 의미
[ MVC_Basic_25 - project ] - restcontroller
1) kr.bit.controller package안에 RestTestController.java class 생성
2) Jackson Databind -> pom.xml에 코드 추가
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
3) kt.bit.beans package에 Data.java class 생성 후 필드 선언
package kr.bit.beans;
public class Data {
private String num1;
private int num2;
private double num3;
private boolean num4;
public Data(String num1, int num2, double num3, boolean num4) {
this.num1=num1;
this.num2=num2;
this.num3=num3;
this.num4=num4;
}
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public double getNum3() {
return num3;
}
public void setNum3(double num3) {
this.num3 = num3;
}
public boolean isNum4() {
return num4;
}
public void setNum4(boolean num4) {
this.num4 = num4;
}
}
4) views 폴더 안에 index.jsp, test1.jsp. test2.jsp
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="t1">test1</a><br>
<a href="t2">test2</a><br>
</body>
</html>
5) kr.bit.controller package 안에 SpringController.java class 에서 Mapping 작업
package kr.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SpringController {
@GetMapping("/t1")
public String t1() {
return "test1";
}
}
6) kr.bit.controller package 안에 RestTestController.java class에서
@RestController 지정 Restful API : 서버의 응답결과를 데이터만으로 구성하여 클라이언트로 전달하는 서버를 의미
Data에 대한 객체를 ArrayList에 담은 후 ResponseEntity객체를 생성해서 전달
package kr.bit.controller;
import java.util.ArrayList;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import kr.bit.beans.Data;
@org.springframework.web.bind.annotation.RestController
public class RestTestController {
@GetMapping("/t2")
public ResponseEntity<ArrayList<Data>> t2() {
Data d1 = new Data("spring", 100, 1.1, false);
Data d2 = new Data("spring", 100, 2.2, false);
Data d3 = new Data("spring", 100, 3.3, false);
ArrayList<Data> li = new ArrayList<Data>();
li.add(d1);
li.add(d2);
li.add(d3);
ResponseEntity<ArrayList<Data>> en = new ResponseEntity<ArrayList<Data>>(li, HttpStatus.OK);
return en;
}
}
[ MVC_Basic_26 - project ] - mybatis를 xml로 설정하기 (java로 설정하는 것이 아님)

1. config 폴더 안에 root-context.xml과 servlet-context.xml 파일 만들고,
WEB-INF 폴더 안에 web.xml 파일 만들기
[ root-context.xml 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
[ servlet-context.xml XML 파일 ]
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 스캔한 패키지 내부의 클래스 중 controller로 로딩하도록 한다 -->
<annotation-driven/>
<!-- 스캔할 Bean들이 모여있는 패키지를 지정한다 -->
<context:component-scan base-package="kr.bit.controller"/>
<!-- controller메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로 설정 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/"/>
<beans:property name="suffix" value=".jsp"/>
</beans:bean>
<!-- 정적파일 세팅 -->
<resources location="/resources/" mapping="/**"></resources>
<!-- properties파일 내용 쓸수있도록 bean정의해야함 -->
<beans:bean class='org.springframework.beans.factory.config.PropertyPlaceholderConfigurer'>
<beans:property name="location">
<beans:value>/WEB-INF/properties/db.properties</beans:value>
</beans:property>
</beans:bean>
<beans:bean class='org.apache.commons.dbcp2.BasicDataSource' id='basic_data_source'>
<beans:property name='driverClassName' value='${db.classname}'/>
<beans:property name="url" value="${db.url}"/>
<beans:property name="username" value='${db.username}'/>
<beans:property name="password" value='${db.password}'/>
</beans:bean>
<beans:bean class='org.mybatis.spring.SqlSessionFactoryBean' id='sqlSession'>
<beans:property name="dataSource" ref='basic_data_source'/>
<beans:property name="mapperLocations" value='/WEB-INF/mapper/*.xml'/>
</beans:bean>
<beans:bean class='org.mybatis.spring.SqlSessionTemplate' id='sqlSessionTemplate'>
<beans:constructor-arg index='0' ref='sqlSession'/>
</beans:bean>
</beans:beans>
[ web.xml XML 파일 ]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로 정의되어 있는 서블릿을 사용하겠다. -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
<servlet>
<servlet-name>appServlet</servlet-name>
<!-- Spring MVC에서 제공하고 있는 기본 서블릿을 지정한다. -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring MVC 설정을 위한 xml 파일을 지정한다. -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Bean을 정의할 xml 파일을 지정한다. -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/root-context.xml</param-value>
</context-param>
<!-- 리스너설정 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 파라미터 인코딩 필터 설정 -->
<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. properties 폴더 안에 db.properties 파일 만들기
db.classname=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/yujung
db.username=root
db.password=00000000
3. mapper 폴더 안에 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="test">
<insert id="insert_data" parameterType="kr.bit.beans.Data">
<![CDATA[
insert into mvc_table(num1, num2, num3)
values(#{num1}, #{num2}, #{num3})
]]>
</insert>
<select id="select_data" parameterType="kr.bit.beans.Data">
<![CDATA[
select num1, num2, num3 from mvc_table
]]>
</select>
</mapper>
4. lib 폴더 안에 mysql-conector-j-8.2.0.jar 파일 넣기

5. pom.xml에 mybatis 라이브러리 넣기
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MVC_Basic_01</groupId>
<artifactId>MVC_Basic_01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
<!-- 라이브러리 버전관리 -->
<properties>
<javax.servlet-version>4.0.1</javax.servlet-version>
<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
<org.springframework-version>5.2.2.RELEASE</org.springframework-version>
<!-- <org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
</properties>
<!-- 라이브러리 셋팅 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${javax.servlet.jsp-version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${javax.servlet.jsp.jstl-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
</dependencies>
</project>
6) kr.bit.controller package 안에 SpringController.java class 에서 Mapping 작업
package kr.bit.controller;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
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.PostMapping;
import kr.bit.beans.Data;
@Controller
public class SpringController {
@Autowired
SqlSessionTemplate sqlSessionTemplate;
@GetMapping("/input_test")
public String input_test() {
return "input_test";
}
@PostMapping("/input_proc")
public String input_proc(Data data) {
//함수호출할때 namespace.id값
sqlSessionTemplate.insert("test.insert_data" , data);
return "input_proc";
}
@GetMapping("/read_test")
public String read_test(Model model) {
List<Data> li = sqlSessionTemplate.selectList("test.select_data");
model.addAttribute("li",li);
return "read_test";
}
}
7) MySQL table
use yujung;
create table mvc_table(
num1 varchar(100) not null,
num2 varchar(100) not null,
num3 varchar(100) not null);
desc mvc_table;
[ Board - project ]
만약에 project 위에 빨간색 엑스 뜨면 Update Project 해주면 됨 !


1) 기본 셋팅 kr.bit.config package 안에 RootAppContext, ServletAppContext, SpringConfigClass 설정
kr.bit.controller pacakge 안에 HomeController.java class 생성 후 첫 페이지 main.jsp로 설정

1-1) HomeController.java 여기는 그냥 project 실행 하자 마자 설정이 되는 것 !
실질적인 Mapping은 MainController를 만들어서 다시 해줘야함
package kr.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value="/", method=RequestMethod.GET)
public String home() {
return "redirect:/main"; //main.jsp를 첫화면으로
}
}
1-2) MainController.java class 에서 main.jsp Mapping 작업 해주기
package kr.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/main")
public String main() {
return "main";
}
}
2) main.jsp JSP 기본 셋팅
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value='/' var="root"/> <!-- 절대주소 설정하기 위해 !!!!!!!!!!!!!!!!!-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>우리반 화이팅~♥</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery-3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp"/>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp"/>
</body>
</html>
2-1) <c:url value="/" var="root" /> <!-- 절대주소 설정하기 위해 -->
"/ 절대경로" 포함하기 위해서 변수 이름 설정 그 이후에 하위경로를 주겠다 => 기본경로 "/" 를 "root"로 설정한 거임
2-2) ☆ BootStrap 부트스트랩 쓸 거면 CSS 코드와 JS 코드 가져와야 사용할 수 있음 <head></head> 사이에 넣어주기
<!-- CSS 코드 -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<!-- JS 코드 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery-3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
https://getbootstrap.com/docs/4.1/getting-started/introduction/
Introduction
Get started with Bootstrap, the world’s most popular framework for building responsive, mobile-first sites, with jsDelivr and a template starter page.
getbootstrap.com
2-3) <c:import url="/WEB-INF/views/include/top_menu.jsp"/> <!-- import url = 경로 설정 작업 -->
<c:import url="" />을 통한 경로 설정 작업
3) views 폴더 안에 include 폴더 생성 후 top_menu.jsp JSP 파일 셋팅 - Navbar 부트스트랩 설정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value='/' var="root"/>
<nav class="navbar navbar-expand-md bg-dark text-white fixed-up shadow-lg">
<a class=navbar-brand" href="${root }main">우리반 화이팅~♥</a>
<div class="container-fluid">
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav"></ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="${root }user/modify">정보수정</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${root }user/logout">로그아웃</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${root }user/login">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${root }user/join">회원가입</a>
</li>
</ul>
</div>
</div>
</nav>
4) views 폴더 안에 include 폴더 생성 후 bottom_menu.jsp JSP 파일 셋팅 - 바닥글에 넣고 싶은 내용 입력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div class="container-fluid bg-white text-dark" style="margin-top: 50px; padding-top: 30px; padding-bottom: 30px">
<div class="container">
<p>화이팅</p>
<p>서울시 서초구 서초동</p>
<p>사업자 번호 : 000-124-4567</p>
</div>
</div>
<!-- 절대경로로 넣으면 새로운 요청이 발생했을 때 localhost:8080 주소만 남음
하위 경로가 어떻게 되어있던 상관없이 원하는 페이지를 직접 요청할 수 있다 -->

5) kr.bit.controller package안에 UserController.java에서 top_menu.jsp 파일의 Mapping 작업 해주기
(href="user/modify"로 줬기 때문에)
@RequestMapping("/user")로 설정해주어 @GetMapping("/modify")에서 /user 생략가능 !! return에서는 생략 불가능 !!
package kr.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/modify")
public String modify() {
return "user/modify";
}
@GetMapping("/logout")
public String logout() {
return "user/logout";
}
@GetMapping("/login")
public String login() {
return "user/login";
}
@GetMapping("/join")
public String join() {
return "user/join";
}
}
6) views 폴더 안에 user 폴더 생성 후 modify.jsp, logout.jsp, login.jsp, join.jsp 파일 생성 후 코드 작성
[ join.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="row">
<div class="col-sm-3"></div>
<div class="col-sm-6">
<div class="card shadow">
<div class="card-body">
<form action="${root}user/login" method="post">
<div class="form-group">
<label for="user_name">이름</label> <input type="text"
class="form-control" id="user_name" name="user_name" />
</div>
<div class="form-group">
<label for="user_id">아이디</label>
<div class="input-group">
<input type="text" class="form-control" id="user_id"
name="user_id" />
<div class="input-group-append">
<button type="button" class="btn btn-primary">중복확인</button>
</div>
</div>
</div>
<div class="form-group">
<label for="user_pw">비밀번호</label> <input type="text"
class="form-control" id="user_pw" name="user_pw" />
</div>
<div class="form-group">
<label for="user_pw2">비밀번호 확인</label> <input type="text"
class="form-control" id="user_pw2" name="user_pw2" />
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">회원가입</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>
[ login.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="row">
<div class="col-sm-3"></div>
<div class="col-sm-6">
<div class="card shadow">
<div class="card-body">
<div class="alert alert-danger">
<h2>로그인 실패</h2>
<p>아이디와 비밀번호 확인하세요</p>
</div>
<form action="${root}main" method="get">
<div class="form-group">
<label for="user_id">아이디</label>
<input type="text" class="form-control" id="user_id" name="user_id"/>
</div>
<div class="form-group">
<label for="user_pw">비밀번호</label>
<input type="password" class="form-control" id="user_pw" name="user_pw"/>
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">로그인</button>
<a href="${root }user/join" class="btn btn-danger">회원가입</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>


7) kr.bit.controller package안에 BoardController.java에서 jsp 파일의 Mapping 작업 해주기
package kr.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/board")
public class BoardController {
@GetMapping("/main")
public String main() {
return "board/main";
}
@GetMapping("/read")
public String read() {
return "board/read";
}
@GetMapping("/write")
public String write() {
return "board/write";
}
@GetMapping("/modify")
public String modify() {
return "board/modify";
}
@GetMapping("/delete")
public String delete() {
return "board/delete";
}
}
8) views 폴더 안에 board 폴더 생성 후 main.jsp, modify.jsp, delete.jsp, write.jsp, read.jsp 파일 생성 후 코드 작성
[ main.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<h3 class="card-title">게시판 이름</h3>
<table class="table table-hover" id="board_list">
<thead>
<tr>
<th class="text-center d-none d-md-table-cell">글번호</th>
<th class="w-50">제목</th>
<th class="text-center d-none d-md-table-cell">글쓴이</th>
<th class="text-center d-none d-md-table-cell">작성날짜</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center d-none d-md-table-cell">10
</th>
<td class="w-50">제목
</th>
<td class="text-center d-none d-md-table-cell">홍길동
</th>
<td class="text-center d-none d-md-table-cell">2024-05-13
</th>
</tr>
<tr>
<td class="text-center d-none d-md-table-cell">10
</th>
<td class="w-50">제목
</th>
<td class="text-center d-none d-md-table-cell">홍길동
</th>
<td class="text-center d-none d-md-table-cell">2024-05-13
</th>
</tr>
<tr>
<td class="text-center d-none d-md-table-cell">10
</th>
<td class="w-50">제목
</th>
<td class="text-center d-none d-md-table-cell">홍길동
</th>
<td class="text-center d-none d-md-table-cell">2024-05-13
</th>
</tr>
<tr>
<td class="text-center d-none d-md-table-cell">10
</th>
<td class="w-50">제목
</th>
<td class="text-center d-none d-md-table-cell">홍길동
</th>
<td class="text-center d-none d-md-table-cell">2024-05-13
</th>
</tr>
<tr>
<td class="text-center d-none d-md-table-cell">10
</th>
<td class="w-50">제목
</th>
<td class="text-center d-none d-md-table-cell">홍길동
</th>
<td class="text-center d-none d-md-table-cell">2024-05-13
</th>
</tr>
</tbody>
</table>
<div class="d-none d-md-block">
<ul class="pagination justify-content-center">
<li class="page-item"><a class="page-link" href="#">이전</a></li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">4</a></li>
<li class="page-item"><a class="page-link" href="#">5</a></li>
<li class="page-item"><a class="page-link" href="#">6</a></li>
<li class="page-item"><a class="page-link" href="#">7</a></li>
<li class="page-item"><a class="page-link" href="#">8</a></li>
<li class="page-item"><a class="page-link" href="#">9</a></li>
<li class="page-item"><a class="page-link" href="#">10</a></li>
<li class="page-item"><a class="page-link" href="#">다음</a></li>
</ul>
</div>
<div class="d-block d-md-none">
<ul class="pagination justify-content-center">
<li class="page-item"><a class="page-link" href="#">이전</a></li>
<li class="page-item"><a class="page-link" href="#">다음</a></li>
</ul>
</div>
<div class="text-right">
<a href="${root }board/write" class="btn btn-primary">글쓰기</a>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>

[ write.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<form action="${root }board/read" method="get">
<div class="form-group">
<label for="board_subject">제목</label>
<input type="text" class="form-control" id="board_subject" name="board_subject" />
</div>
<div class="form-group">
<label for="board_content">내용</label>
<textarea class="form-control" id="board_content" name="board_content"
rows="10" style="resize:none"></textarea>
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">작성하기</button>
</div>
</div>
</form>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>

[ read.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<div class="form-group">
<label for="board_writer_name">글쓴이</label>
<input type="text" value="홍길동" disabled="disabled" class="form-control"
id="board_writer_name" name="board_writer_name"/>
</div>
<div class="form-group">
<label for="board_date">작성날짜</label>
<input type="text" value="2024-05-13" disabled="disabled" class="form-control"
id="board_date" name="board_date"/>
</div>
<div class="form-group">
<label for="board_subject">제목</label>
<input type="text" value="제목" disabled="disabled" class="form-control"
id="board_subject" name="board_subject"/>
</div>
<div class="form-group">
<label for="board_content">내용</label>
<textarea style="resize: none" rows="10" disabled="disabled"
class="form-control" id="board_content" name="board_content">내용</textarea>
</div>
<div class="form-group">
<div class="text-right">
<a href="${root }board/main" class="btn btn-primary">목록</a>
<a href="${root }board/modify" class="btn btn-info">수정</a>
<a href="${root }board/delete" class="btn btn-danger">삭제</a>
</div>
</div>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>

[ modify.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<form action="${root }board/read" method="get">
<div class="form-group">
<label for="board_writer_name">글쓴이</label>
<input type="text" value="홍길동" disabled="disabled" class="form-control"
id="board_writer_name" name="board_writer_name"/>
</div>
<div class="form-group">
<label for="board_date">작성날짜</label>
<input type="text" value="2024-05-13" disabled="disabled" class="form-control"
id="board_date" name="board_date"/>
</div>
<div class="form-group">
<label for="board_subject">제목</label>
<input type="text" value="제목" class="form-control"
id="board_subject" name="board_subject"/>
</div>
<div class="form-group">
<label for="board_content">내용</label>
<textarea class="form-control" id="board_content" name="board_content"
rows="10" style="resize:none"></textarea>
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">수정완료</button>
<a href="${root }board/read" class="btn btn-info">취소</a>
</div>
</div>
</form>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>

[ delete.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<script>
alert("삭제되었습니다")
location.href="${root}board/main"
</script>

9) MySQL table 3개 생성 board_info_table, user_table, content_table
use yujung;
create table board_info_table(
board_info_idx int auto_increment primary key,
board_info_name varchar(500) not null);
insert into board_info_table values(1,'1팀');
insert into board_info_table values(2,'2팀');
create table user_table(
user_idx int auto_increment primary key,
user_name varchar(50) not null,
user_id varchar(100) not null,
user_pw varchar(100) not null);
create table content_table(
content_idx int auto_increment primary key,
content_subject varchar(500) not null,
content_text text not null,
content_writer_idx int not null,
content_board_idx int not null,
content_date date not null,
foreign key(content_writer_idx) references user_table(user_idx),
foreign key(content_board_idx) references board_info_table(board_info_idx));
desc content_table;
desc user_table;
desc board_info_table;
SET SQL_SAFE_UPDATES = 0;
10) kr.bit.beans package 생성 후 BoardInfo.java, Content.java, User.java class 생성하여 DB table에 맞는 필드 선언 후
Getter&Setter 생성
package kr.bit.beans;
public class BoardInfo {
private int board_info_idx;
private String board_info_name;
public int getBoard_info_idx() {
return board_info_idx;
}
public void setBoard_info_idx(int board_info_idx) {
this.board_info_idx = board_info_idx;
}
public String getBoard_info_name() {
return board_info_name;
}
public void setBoard_info_name(String board_info_name) {
this.board_info_name = board_info_name;
}
}
package kr.bit.beans;
import java.util.Date;
public class Content {
private int content_idx;
private String content_subject;
private String content_text;
private int content_writer_idx;
private int contene_board_idx;
private Date content_date;
public int getContent_idx() {
return content_idx;
}
public void setContent_idx(int content_idx) {
this.content_idx = content_idx;
}
public String getContent_subject() {
return content_subject;
}
public void setContent_subject(String content_subject) {
this.content_subject = content_subject;
}
public String getContent_text() {
return content_text;
}
public void setContent_text(String content_text) {
this.content_text = content_text;
}
public int getContent_writer_idx() {
return content_writer_idx;
}
public void setContent_writer_idx(int content_writer_idx) {
this.content_writer_idx = content_writer_idx;
}
public int getContene_board_idx() {
return contene_board_idx;
}
public void setContene_board_idx(int contene_board_idx) {
this.contene_board_idx = contene_board_idx;
}
public Date getContent_date() {
return content_date;
}
public void setContent_date(Date content_date) {
this.content_date = content_date;
}
}
package kr.bit.beans;
public class User {
private int user_idx;
private String user_name;
private String user_id;
private String user_pw;
public int getUser_idx() {
return user_idx;
}
public void setUser_idx(int user_idx) {
this.user_idx = user_idx;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getUser_pw() {
return user_pw;
}
public void setUser_pw(String user_pw) {
this.user_pw = user_pw;
}
}
11) WEB-INF 폴더 안에 lib 폴더에 myslq-connector-j-8.2.0.jar 파일 넣기

12) WEB-INF 폴더 안에 properties 폴더 생성 후 db.properties 파일 생성 후 DB 연결 정보 작성
db.classname=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/yujung
db.username=root
db.password=00000000
13) kr.bit.config package 안에 ServletAppContext.java class에 아래 코드 추가
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
package kr.bit.config;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean
public BasicDataSource dataSource() {
BasicDataSource source= new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception{
SqlSessionFactoryBean fac=new SqlSessionFactoryBean();
fac.setDataSource(source);
SqlSessionFactory factory=fac.getObject();
return factory;
}
/*@Bean
public MapperFactoryBean<MapperInterface> test_mapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<MapperInterface> fac =
new MapperFactoryBean<MapperInterface>(MapperInterface.class);
fac.setSqlSessionFactory(factory);
return fac;
}
*/
}



'네이버 클라우드 부트캠프 > 복습 정리' 카테고리의 다른 글
71일차 리액트 [ node.js, Vite, react ] (0) | 2024.06.03 |
---|---|
61~64일차 스프링 [ xml로 Board 만들기 ] (0) | 2024.05.20 |
56일차 스프링 [ MVC - 어노테이션, 유효성, 인터셉터, DB 설정 ] (4) | 2024.05.10 |
55일차 스프링 [ MVC - session, properties, 유효성검사 ] (2) | 2024.05.09 |
54일차 스프링 [ MVC - 추출, 주입, form taglib ] (1) | 2024.05.08 |