본문 바로가기

회고록(TIL&WIL)

TIL 2023.02.27 Spring framework ver 2.X

POJO (Plain Old Java Object)

자바에서 여러가지를 상속받은 객체를 하나 생성할 뿐인데 모든 부모객체도 생성해야하다보니 점차 프로젝트가 무거워지게 되었는데
최대한 가볍게 써보자 순수한 자바를 이용한 옛날 방식을 이용해보자라는 내용으로 등장한 것이 POJO 이며 이를 통해 탄생한게 스프링
스프링도 가볍지만 않지만 이전에 비해서는 상대적으로 가볍다고 한다. 이후로 모든 프레임 워크들이 POJO 를 지향하며 만들게 되었다고 한다.

ORM (Object Relational Mapping)

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑 해주는 것

ibatis

mybatis의 전신 현재는 사용되지않고 mybatis로 사용함

Spring framework

pom.xml - dependency

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.1.0</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>2.3.3</version>
	    <scope>provided</scope>
	</dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>jstl</artifactId>
	    <version>1.2</version>
	</dependency>
    <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
	<dependency>
	    <groupId>com.mysql</groupId>
	    <artifactId>mysql-connector-j</artifactId>
	    <version>8.0.32</version>
	</dependency>
     <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>3.1.0.RELEASE</version>
   </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>3.1.0.RELEASE</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>3.1.0.RELEASE</version>
   </dependency>

web.xml

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

  <display-name>Archetype Created Web Application</display-name>
  <welcome-file-list>
  	<welcome-file>index.do</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>sts01</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>sts01</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

create config file

handler mapping & view resolve

<?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">
	
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="url" value="jdbc:mysql://localhost:3306/lecture"></property>
		<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
		<property name="username" value="scott"></property>
		<property name="password" value="tiger"></property>
	</bean>
	<bean id="deptDao" scope="singleton" class="com.bit.sts01.model.DeptDao">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- handler mapping -->
	<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
	<bean name="/index.do" scope="singleton" class="com.bit.sts01.controller.IndexController">
		
	</bean>
	<bean name="/list.do" class="com.bit.sts01.controller.ListController">
		<property name="dao" ref="deptDao"></property>
	</bean>
	<bean name="/add.do" class="com.bit.sts01.controller.AddController">
		<property name="dao" ref="deptDao"></property>
	</bean>
	<bean name="/detail.do" class="com.bit.sts01.controller.EditController">
		<property name="dao" ref="deptDao"></property>
	</bean>
	<!-- View Resolve -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
</beans>

DeptDao

package com.bit.sts01.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

public class DeptDao {
	DataSource dataSource;
  // dataSource를 주입 받기
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	public DeptDao() {}
	
	public List<DeptVo> findAll() throws SQLException{
		String sql = "select * from dept";
		List<DeptVo> list = new ArrayList<DeptVo>();
		try(Connection conn = dataSource.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();){
			while(rs.next()) {
				list.add(new DeptVo(rs.getInt("deptno"), rs.getNString("dname"), rs.getNString("loc")));
			}
		}
		return list;
	}

	public void insertOne(int deptno, String dname, String loc) throws SQLException {
		String sql = "insert into dept value (?,?,?)";
		try(Connection conn = dataSource.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);){
			pstmt.setInt(1, deptno);
			pstmt.setNString(2, dname);
			pstmt.setNString(3, loc);
			pstmt.executeUpdate();
		}
	}

	public Object findOne(int deptno) throws SQLException {
		String sql = "select * from dept where deptno=?";
		try(Connection conn = dataSource.getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql);
				){
				pstmt.setInt(1, deptno);
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) {
					return new DeptVo(rs.getInt("deptno"), rs.getNString("dname"), rs.getNString("loc"));
				}
			}
		return null;
	}

	public void updateOne(int deptno, String dname, String loc) throws SQLException {
		String sql = "update dept set dname=?, loc=? where deptno=?";
		try(Connection conn = dataSource.getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql);){
				pstmt.setNString(1, dname);
				pstmt.setNString(2, loc);
				pstmt.setInt(3, deptno);
				pstmt.executeUpdate();
			}
	}
}

Controller

----------- IndexController
public class IndexController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("index");
		return mav;
	}

}

----------- AddController
public class AddController implements Controller {
	DeptDao dao;
	public void setDao(DeptDao dao) {
		this.dao = dao;
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		if("GET".equals(request.getMethod())) {
			mav.setViewName("dept/add");
		} else {
			request.setCharacterEncoding("utf-8");
			int deptno = Integer.parseInt(request.getParameter("deptno"));
			String dname = request.getParameter("dname");
			String loc = request.getParameter("loc");
			dao.insertOne(deptno, dname, loc);
			mav.setViewName("redirect:list.do");
		}
		return mav;
	}

}
-------------- ListController
public class ListController implements Controller {
	DeptDao dao;
  // dao 주입 받기
	public void setDao(DeptDao dao) {
		this.dao = dao;
	}
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		mav.addObject("list", dao.findAll());
		mav.setViewName("dept/list");
		return mav;
	}

}

-------------- EditController
public class EditController implements Controller {
	DeptDao dao;
	// dao 주입 받기
	public void setDao(DeptDao dao) {
		this.dao = dao;
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		request.setCharacterEncoding("utf-8");
		int deptno = Integer.parseInt(request.getParameter("deptno"));
		String dname = request.getParameter("dname");
		String loc = request.getParameter("loc");
		String viewName = "dept/detail";
		if(request.getMethod().equals("GET")) {
			mav.addObject("bean", dao.findOne(deptno));
		} else {
			viewName = "redirect:list.do";
			dao.updateOne(deptno, dname, loc);
		}
		mav.setViewName(viewName);
		return mav;
	}

}