100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 44 - DI로 Web Project 만들기

ksyke 2024. 9. 26. 15:59

목차

    web project 만들기

    pom.xml에 packing과 lib 올리기

    <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>com.gimhae</groupId>
      <artifactId>day45</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      <properties>
      <spring-version>3.1.4.RELEASE</spring-version>
      </properties>
      <dependencies>
     <!-- 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.4.0</version>
        </dependency>
        <!-- SPRING -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-beans</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-test</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-aop</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-web</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-webmvc</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
    	<dependency>
    	    <groupId>org.springframework</groupId>
    	    <artifactId>spring-jdbc</artifactId>
    	    <version>${spring-version}</version>
    	</dependency>
        
      </dependencies>
      <build>
        <finalName>day44</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
      </build>
    </project>

    기존 프로젝트에 webapp 폴더가 생긴다.

    web.xml을 만들고 Maven 을 업데이트한 뒤 Configure에서 Maven Project로 챼ㅜㅍㄷㄳ gksek.

    schema 정의 [web.xml]

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.1" 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_3_1.xsd">
    
    	<servlet>
    		<servlet-name>sts44</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>/WEB-INF/servlets/sts44-servlet.xml</param-value>
    		</init-param>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>sts44</servlet-name>
    		<url-pattern>*.do</url-pattern>
    	</servlet-mapping>
    
    </web-app>

    sts44-servlet.xml

    sts44-servlet.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">
    
    <bean id="dataSource" class="com.mysql.cj.jdbc.MysqlDataSource">
    	<property name="URL" value="jdbc:mysql://localhost:3306/xe"/>
    	<property name="user" value="scott"/>
    	<property name="password" value="tiger"/>
    </bean>
    
    <bean id="empDao" class="com.gimhae.emp.model.EmpDaoImpl">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- handler mapping -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    	<property name="urlMap">
    		<map>
    			<entry key="/index.do">
    				<value>index</value>
    			</entry>
    			<entry key="/intro.do">
    				<value>intro</value>
    			</entry>
    			<entry key="/emp/list.do">
    				<value>list</value>
    			</entry>
    			<entry key="/emp/add.do">
    				<value>add</value>
    			</entry>
    			<entry key="/emp/insert.do">
    				<value>insert</value>
    			</entry>
    		</map>
    	</property>
    </bean>
    <bean id="index" 
    class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    	<property name="viewName" value="index"/>
    </bean>
    <bean id="intro"
    class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    	<property name="viewName" value="intro"></property>
    </bean>
    
    <bean id="list"
    class="com.gimhae.emp.controller.ListController">
    	<property name="empDao" ref="empDao"></property>
    </bean>
    <bean id="add" 
    class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    	<property name="viewName" value="emp/add"/>	
    </bean>
    <bean id="insert"
    class="com.gimhae.emp.controller.InsertController">
    	<property name="empDao" ref="empDao"/>
    </bean>
    
    <!-- view resolver -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/views/"></property>
    	<property name="suffix" value=".jsp"></property>
    </bean>
    
    <bean id="aroundLog" class="com.gimhae.aop.AroundLog"></bean>
    <bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    	<property name="patterns">
    		<list>
    			<value>.*pull.*</value>
    		</list>
    	</property>
    </bean>
    <bean id="pointcutAdvisor" 
    class="org.springframework.aop.support.DefaultPointcutAdvisor">
    	<property name="advice" ref="aroundLog"></property>
    	<property name="pointcut" ref="pointcut"></property>
    </bean>
    <bean id="beanNameAutoProxyCreator" 
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    	<property name="beanNames" value="empDao"></property>
    	<property name="interceptorNames">
    		<list>
    			<value>pointcutAdvisor</value>
    		</list>
    	</property>
    </bean>
    
    </beans>

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <%@include file="template/head.jspf" %>
    </head>
    <body>
    <%@include file="template/menu.jspf" %>
    
    			<div class="jumbotron">
    				<h2>환영합니다.</h2>
    			</div>
    
    <%@include file="template/footer.jspf" %>
    </body>
    </html>

    intro.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <%@include file="template/head.jspf" %>
    </head>
    <body>
    <%@include file="template/menu.jspf" %>
    
    	<div class="text-center">
    		<img alt="" src="https://www.inje.ac.kr/kor/assets/images/sub/gimhae-campus-1.jpg">
    	</div>
    
    <%@include file="template/footer.jspf" %>
    </body>
    </html>

    template/head.jspf

    <%@ 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}"></c:set>
    <link rel="stylesheet" type="text/css" href="${root }/css/bootstrap.min.css">
    <script type="text/javascript" src="${root }/js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" src="${root }/js/bootstrap.min.js"></script>

    template/menu.jspf

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <nav class="navbar navbar-default">
      <div class="container-fluid">
        <div class="navbar-header">
          <a class="navbar-brand" href="${root }/index.do">인제대학교</a>
          <ul class="nav navbar-nav">
    		<li><a class="active" href="${root }/index.do">home</a></li>
    		<li><a href="${root }/intro.do">intro</a></li>
    		<li><a href="${root }/emp/list.do">emp</a></li>
    		<li><a href="${root }/login/login.do">login</a></li>
    	  </ul>
    	</div>
      </div>
    </nav>
    <div class="container">

    template/footer.jspf

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    </div>

    emp/list.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <%@include file="../template/head.jspf" %>
    </head>
    <body>
    <%@include file="../template/menu.jspf" %>
    
    	<h2 class="page-header">목록</h2>
    	<table class="table">
    		<thead>
    			<tr>
    				<td>사번</td>
    				<td>이름</td>
    				<td>금액</td>
    				<td>날짜</td>
    			</tr>
    		</thead>
    		<tbody>
    			<c:forEach items="${list }" var="bean">
    			<tr>
    				<td><a href="detail.do?idx=${bean.empno }">${bean.empno }</a></td>
    				<td><a href="detail.do?idx=${bean.empno }">${bean.ename }</a></td>
    				<td><a href="detail.do?idx=${bean.empno }">${bean.pay }</a></td>
    				<td><a href="detail.do?idx=${bean.empno }">${bean.hiredate }</a></td>
    			</tr>
    			</c:forEach>
    		</tbody>
    	</table>
    
    <%@include file="../template/footer.jspf" %>
    </body>
    </html>

    com.gimhae.emp.model

    EmpVo.java (Dto)

    package com.gimhae.emp.model;
    
    public class EmpVo {
    	private int empno,pay;
    	private String ename;
    	private LocalDate hiredate;
    	
    	static class Builder{
    		int empno,pay;
    		String ename;
    		LocalDate hiredate;
    		
    		public Builder empno(int empno) {
    			this.empno=empno;
    			return this;
    		}
    		public Builder pay(int pay) {
    			this.pay=pay;
    			return this;
    		}
    		public Builder ename(String ename) {
    			this.ename=ename;
    			return this;
    		}
    		public Builder hiredate(java.sql.Date hiredate) {
    			this.hiredate=hiredate.toLocalDate();
    			return this;
    		}
    		public EmpVo buid() {
    			return new EmpVo(this);
    		}
    	}
    	
    	public EmpVo() {
    	}
    	
    	public EmpVo(Builder builder) {
    		this.empno=builder.empno;
    		this.ename=builder.ename;
    		this.pay=builder.pay;
    		this.hiredate=builder.hiredate;
    	}
    
    	public static Builder builder() {
    		return new Builder();
    	}
    
    	public int getEmpno() {
    		return empno;
    	}
    
    	public int getPay() {
    		return pay;
    	}
    
    	public String getEname() {
    		return ename;
    	}
    
    	public LocalDate getHiredate() {
    		return hiredate;
    	}
    
    	@Override
    	public String toString() {
    		return "EmpVo [empno=" + empno + ", pay=" + pay + ", ename=" + ename + "]";
    	}
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + empno;
    		result = prime * result + ((ename == null) ? 0 : ename.hashCode());
    		result = prime * result + pay;
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		EmpVo other = (EmpVo) obj;
    		if (empno != other.empno)
    			return false;
    		if (ename == null) {
    			if (other.ename != null)
    				return false;
    		} else if (!ename.equals(other.ename))
    			return false;
    		if (pay != other.pay)
    			return false;
    		return true;
    	}
    	
    }

    EmpDao.java (Interface)

    package com.gimhae.emp.model;
    
    public interface EmpDao {
    	List<EmpVo> pullList();
    	EmpVo getList(int pk);
    	void addList(String ename,int pay);
    	int setList(String ename,int pay,int pk);
    	int rmList(int pk);
    }

    EmpDaoImpl.java (implement EmpDao)

    package com.gimhae.emp.model;
    
    public class EmpDaoImpl extends JdbcDaoSupport implements EmpDao{
    	RowMapper<EmpVo> rowMapper=new RowMapper<EmpVo>() {
    
    		@Override
    		public EmpVo mapRow(ResultSet rs, int rowNum) throws SQLException {
    			return EmpVo.builder()
    					.empno(rs.getInt("empno"))
    					.ename(rs.getString("ename"))
    					.pay(rs.getInt("pay"))
    					.hiredate(rs.getDate("hiredate"))
    					.build();
    		}
    	};
    	
    	@Override
    	public List<EmpVo> pullList() {
    		String sql="select * from emp38 order by empno";
    		return getJdbcTemplate().query(sql, rowMapper);
    	}
    
    	@Override
    	public EmpVo getList(int pk) {
    		return null;
    	}
    
    	@Override
    	public void addList(String ename, int pay) {
    		String sql="insert into emp38 (ename,pay,hiredate) values (?,?,now())";
    		getJdbcTemplate().update(sql,ename,pay);
    	}
    
    	@Override
    	public int setList(String ename, int pay, int pk) {
    		return 0;
    	}
    
    	@Override
    	public int rmList(int pk) {
    		return 0;
    	}
    
    
    }

    ListController

    package com.gimhae.emp.controller;
    
    public class ListController implements Controller {
    	EmpDao empDao;
    	
    	public void setEmpDao(EmpDao empDao) {
    		this.empDao = empDao;
    	}
    
    	@Override
    	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		ModelAndView mav=new ModelAndView();
    		mav.addObject("list", empDao.pullList());
    		mav.setViewName("emp/list");
    		return mav;
    	}
    
    }