유정잉

57일차 스프링 [ MVC - restcontroller, mybatis ] [ Board ] 본문

네이버 클라우드 부트캠프/복습 정리

57일차 스프링 [ MVC - restcontroller, mybatis ] [ Board ]

유정♡ 2024. 5. 13. 11:07

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>
확인 버튼을 누르면 삭제된 후 다시 Board/board/main으로 이동

 
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; 
	}
		*/
	
}

 
 
 
 
 
 


 

728x90