Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-05-06(금) 069일차 [Oracle, Spring Framework] 스프링 웹 MVC 처리 절차

옌炎 2022. 6. 17. 11:34
728x90

수업내용


1교시 (09:30-10:20)

  • 쿼리 공부
SELECT * FROM EMP;
-- 컬럼과 로우 결과를 리턴한다.
-- 1. 로우를 리턴한다.
-- 2. 컬럼을 리턴한다.
-- 3. 해당하는 테이블에 있는 모든 데이터를 리턴한다.
-- 4. 해당하는 테이블의 모든 데이터를 로우 단위로 리턴한다.
SELECT ROWID FROM EMP;

SELECT ROWID, EMPNO FROM EMP;

SELECT ROWID, EMPNO FROM EMP WHERE ROWNUM <= 5;

SELECT 1, 2 FROM EMP WHERE ROWNUM <= 2;

SELECT COUNT(1) FROM EMP;
SELECT 24*60*60 FROM DEPT WHERE ROWNUM <= 1;
SELECT 24*60*60 FROM DUAL;

-- EMP 테이블을 로우 단위로 컬럼 전체를 조회했다.
SELECT * FROM EMP;

-- SELECT 키워드로 테이블을 함수로 사용하여 조회할 떄는
-- 1. 단일행 리턴 - 행 별로 리턴
SELECT ROUND(SAL) FROM EMP;
SELECT TO_CHAR(HIREDATE) FROM EMP;
SELECT TO_DATE(HIREDATE) FROM EMP;

-- 2. 한 개의 행 리턴 - 한 건씩 리턴
SELECT COUNT(*) FROM EMP;
SELECT SUM(SAL) FROM EMP;
SELECT AVG(SAL) FROM EMP;
SELECT MIN(SAL) FROM EMP;
SELECT MAX(SAL) FROM EMP;

2교시 (10:30-11:20)

  • GROUP BY
-- 사원테이블에 있는 사원들의 부서번호를 조회하시오
SELECT DEPTNO FROM EMP;

SELECT DISTINCT DEPTNO FROM EMP;

SELECT DEPTNO FROM EMP GROUP BY DEPTNO;

-- [교재 181p] GROUP BY 절의 기본 사용법
/*
    SELECT      [조회할 열1 이름], [열2 이름] ..., [열N 이름]
    FROM        [조회할 테이블 이름]
    WHERE       [조회할 행을 선별하는 조건식]
    GROUP BY    [그룹화할 열을 지정(여러 개 지정 가능)]
    HAVING      [출력 그룹을 제한하는 조건식]
    ORDER BY    [정렬하려는 열 지정]
*/
SELECT DEPTNO
FROM EMP
GROUP BY DEPTNO
ORDER BY 1;

SELECT DEPTNO
FROM EMP
GROUP BY DEPTNO
ORDER BY 1 DESC;

SELECT DEPTNO 
FROM EMP
GROUP BY DEPTNO;

3교시 (11:30-12:20)

    1. server.xml <Connecter port="8088" : 클라이언트에서 웹 서버로 접속하는 포트tomcat 스타트
      // URIEncoding 속성은 개발자가 추가한 것임 URIEncoding="UTF-8" : request (요청) 스트림에서 header에 들어오는(GET 방식) 문자 중 일부를 UTF-8로 인코딩하세요.
      <Context docBase="kosSpring" path="/kosSpring"
    2. web.xml
      <session-timeout>30</session-timeout>
      MIME Type
    3. context.xml
      <Resource name="jdbc/jndi_orclKSY00"
      jdbc : JNDI 서비스의 JDBC를 연결하는 설정 파일의 메타 데이터 이름
      jdbc/XXX : XXX <-- SID 이름
      jdbc/XXX <-- 데이터 소스 이름
      java:comp/env/jdbc <-- JNDI 서비스에서 JDBC 서비스를 하겠다는 메타데이터 이름
      java:comp/env/jdbc/SID
    4. Context/WEB-INF/web.xml
      2번에 있는 web.xml : web.xml이 있는 해당 WAS 서버의 모든 Context에 적용되는 환경 설정 파일
      4번에 있는 web.xml : web.xml이 있는 해당 Context에만 적용되는 환경설정 파일
          
          4.1 웰컴 파일
          4.2 디스패처 서블릿
          4.3 url-pattern
          4.4 spring-servlet.xml 스프링 프레임워크 환경 설정 파일 불러오기
          4.5 <session-timeout>30</session-timeout>
          4.6 한글 인코딩 : POST 방식으로 들어오는 스트림 UTF-8
          4.7 log4j.xml 불러오기
    5. Context/WEB-INF/spring-servlet.xml
      5.1 <mvc:annotation-driven />
      사용자 정의 콘트롤러를 찾고, 클라이언트에서 가져온 데이터를 넘긴다
      5.2 <context:component-scan based-package="a.b.c.com.**" />
      a.b.c.com 패키지 하위에 있는 패키지의 클래스들
      @Controller
      사용자정의 콘트롤러 클래스
      @Service
      @Transactional
      서비스 인터페이스, 서비스 구현체 클래스
      @Repository
      다오 인터페이스, 다오 구현체 클래스를 메모리에 올리기
      5.3 <property name="prefix" value="/WEB-INF/views/" />
      <property name="suffix" value=".jsp" />
      콘트롤러에서 abc를 호출하면 /WEB-INF/views/abc.jsp를 호합니다.
      머리말 꼬리말 지정

4교시 (12:30-13:20)

  • tomcat
    1 ~ 5번까지 알고 있어야 하는데 이것을 잘 몰라도

    **이클립스에서 tomcat을 서버탭에서 스타트해서

    1. tomcat 서버가 켜져야 한다.
        해당 컨텍스트에 있는 컴포넌트(빈즈, 클래스)는
        모두 메모리에 올라와 있어야 한다.
        @Controller @Service @Transactional @Repository

    2. 콘솔 로그에서 url-parttern을 확인해야만 한다.**

    **INFO :
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -
    Mapped "{[/spring_hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}"
    onto public java.lang.String a.b.c.com.controller.HelloController.hello_spring(org.springframework.ui.Model)**

    / <-- Context
    spring_hello <-- url-pattern : 해당 컨텍스트에서 유니크 해야 한다.
    ->
    HelloController.hello_spring <-- 해당하는 함수에 url-pattern을 찾아간다.

    **INFO :
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -
    Mapped "{[/spring_hello_get],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}"
    onto public java.lang.String a.b.c.com.controller.HelloController.hello_spring_get(org.springframework.ui.Model)**

    /spring_hello_get
    / <-- Context
    spring_hello_get <-- url-pattern : 해당 컨텍스트에서 유니크 해야 한다.
    HelloController.hello_spring_get <- 해당하는 함수에 url-pattern을 찾아간다.

5교시 (14:30-15:20)

  • HelloController.java
package a.b.c.com.controller;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {
	Logger logger = LogManager.getLogger(HelloController.class);

	@RequestMapping(value="spring_hello")
	public String hello_spring(Model model) {
		logger.info("HelloController.hello_spring() 함수 진입 >>> : ");

		model.addAttribute("msg", "Hello Spring !!!");
		logger.info("model >>> : " + model);

		return "spring_hello_return";
	}

	@RequestMapping(value="spring_hello_get", method=RequestMethod.GET)
	public String hello_spring_get(Model model_get) {
		logger.info("HelloController.hello_spring_get() 함수 진입 >>> : ");

		model_get.addAttribute("model_get", "Hello Spring model_get !!!");
		logger.info("model >>> : " + model_get);

		return "spring_hello_get_return";
	}

	@RequestMapping(value="spring_hello_post", method=RequestMethod.POST)
	public String hello_spring_post(Model model_post) {
		logger.info("HelloController.hello_spring_post() 함수 진입 >>> : ");

		model_post.addAttribute("model_post", "Hello Spring model_post !!!");
		logger.info("model >>> : " + model_post);

		return "spring_hello_post_return";
	}
}
  • index.html
<%@ 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>
	<script src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script type="text/javascript">

		$(document).ready(function(){
			// alert("ready >>> : ");

			// GET 방식
			$(document).on("click", "#getbtn", function(){
				alert("getbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_get.ksy",
					"method":"GET",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});

			// POST 방식
			$(document).on("click", "#postbtn", function(){
				alert("postbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_post.ksy",
					"method":"POST",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});
		});
	</script>
</head>
<body>
	<h3>Spring Test</h3>
	<hr>
	<a href="spring_hello.ksy">Hello 보기</a><br>
	<a href="spring_hello_get.ksy">Hello GET Method</a><br>
	<a href="spring_hello_post.ksy">Hello POST Method</a><br>
	<form name="methodForm" id="methodForm">
		<button type="button" id="getbtn">GET</button>
		<button type="button" id="postbtn">POST</button>
	</form>
</doby>
</html>
  • spring_hello_return.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="org.apache.log4j.LogManager" %>  
<%@ page import="org.apache.log4j.Logger" %>   

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>spring_hello_return.jsp</h3>
<hr>
<%
	Logger logger = LogManager.getLogger(this.getClass());
	logger.info("spring_hello_return.jsp >>> : ");

	String mgsV = (String)request.getAttribute("msg");
	logger.info("mgsV >>> : " + mgsV);
	out.println("mgsV >>> : " + mgsV);
%><br>
\${msg } --> ${msg }<br>
</body>
</html>
  • spring_hello_get_return.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>
	<h3>spring_hello_get_return</h3>
	<hr>
</doby>
</html>
  • spring_hello_post_return.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>
	<h3>spring_hello_post_return</h3>
	<hr>
</doby>
</html>

각 방법 별 로그 확인하기

  • [Spring3.pdf 75~86p] 스프링 웹 MVC
    index.jsp : <a href="spring_hello.ksy">Hello 보기 </a>

    1. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    2. <mvc: annotation-driven />
    3. <context:component-scan base-package="a.b.c.com.**" />

    INFO : 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 
    Mapped "{[/spring_hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" 
    onto public java.lang.String a.b.c.com.controller.HelloController.hello_spring(org.springframework.ui.Model)

    @Controller
    public class HelloController

    @RequestMapping(value="spring_hello)
    public String hello_spring(Model model) {
    logger.info("HelloController.hello_spring() 함수 진입 >>> : ");

    model.addAttribute("msg", "Hello Spring !!!");
    logger.info("model >>> : " + model);

    return "spring_hello_return";
    }

    <property name="prefix" value="/WEB_INF/view/" />
    <property name="suffix" value=".jsp" />

    Context/WebContent/WEB-INF/view/spring_hello_return.jsp
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    스프링 웹 엠브이씨 Spring Web MVC
    --------------------------------------

    DispatcherServlet

    HandlerMapping

    Controller

    ViewResolver

    View

6교시 (15:30-16:20)

① 클라이언트에서 url 형태로 웹 서버에게 요청한다. <a href="spring_hello.ksy">Hello 보기 </a>

② 요청 정보는 프론트 컨트롤러인 디스패처 서블릿에 전달되고, 요청한 컨트롤러가 있는지 핸들러 매핑을 검색한다. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

③ 핸들러 매핑은 디스패처 서블릿이 요청한 적절한 컨트롤러를 검색하여 컨트롤러에게 처리를 요청한다. INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/spring_hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.controller.HelloController.hello_spring(org.springframework.ui.Model)

④ 컨트롤러는 요청에 대한 비즈니스 로직을 처리하고, 출력할 뷰명과 처리 결과를 디스패처 서블릿에 전달한다. @Controller public class HelloController @RequestMapping(value="spring_hello) public String hello_spring(Model model) { logger.info("HelloController.hello_spring() 함수 진입 >>> : ");

model.addAttribute("msg", "Hello Spring !!!"); logger.info("model >>> : " + model); return "spring_hello_return";

}

⑤ 디스패처 서블릿은 컨트롤러가 전송한 뷰 명을 뷰 리졸버를 통하여 뷰를 검색한다.

⑥ 뷰리졸버는 해당되는 뷰 명에게 처리 결과를 보낸다. <property name="prefix" value="/WEB_INF/view/" />

⑦ 뷰는 처리 결과가 포함된 뷰를 디스패처 서블릿에게 전송한다. <property name="suffix" value=".jsp" />

⑧ 디스패처 서블릿은 요청한 최종 결과를 클라이언트에 출력한다. Context/WebContent/WEB-INF/view/spring_hello_return.jsp

7교시 (16:30-17:20)

 

  • 서비스가 로직이 많아야 한다.
  • [Spring3.pdf 82p~] 컨트롤러 반환 타입
    • ModelAndView
    • Model, Map, ModelMap : String 빈환 타입으로 선언된 구현 메서드에서 뷰에 데이터만을 전달하는 개체들이다. Map에는 put() 메서드로 설정하고, Model과 ModelMap은 addAttribute() 메서드로 파라미터를 설정할 수 있다.
    • String
    • View: 다운도르 등에 사용
    • void
  • index.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>
	<script src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script type="text/javascript">

		$(document).ready(function(){
			// alert("ready >>> : ");

			// GET 방식
			$(document).on("click", "#getbtn", function(){
				alert("getbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_get.ksy",
					"method":"GET",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});

			// POST 방식
			$(document).on("click", "#postbtn", function(){
				alert("postbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_post.ksy",
					"method":"POST",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});
		});
	</script>
</head>
<body>
	<h3>Spring Test</h3>
	<hr>
	<a href="spring_hello.ksy">Hello 보기</a><br>
	<a href="spring_hello_get.ksy">Hello GET Method</a><br>
	<a href="spring_hello_post.ksy">Hello POST Method</a><br>
	<form name="methodForm" id="methodForm">
		<button type="button" id="getbtn">GET</button>
		<button type="button" id="postbtn">POST</button>
	</form>
</doby>
</html>

8교시 (17:30-18:30)

  • SpringReturnController.java
package a.b.c.com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class SpringReturnController {

	// return 형 String
	@RequestMapping("viewJsp_1_stringTest_find")
	public String returnStringTest(Model m) {
		System.out.println("StringReturnController returnStringTest() 함수 진입 >>> :");
		
		// 데이터는 m.addAttribute(key, value);
		m.addAttribute("mdata", "view에 데이터를 전달 할 때는 가능하면 Model 인터페이스를 사용하자 >>> : ");
		
		// view 페이지는 함수 리턴형을 String으로 해서 String return value 로 보낸다.
		return "viewJsp_1_stringTest_return_file";
	}
	
	// return 형 ModelAndView
	@RequestMapping("viewJsp_2_modelandview_find")
	public ModelAndView returnModelAndViewTest() {
		System.out.println("StringReturnController returnModelAndViewTest() 함수 진입 >>> :");
		
		// mav.addObject(key, value); 데이터 보내기
		// mav.setViewName("View 페이지 이름");
		ModelAndView mav = new ModelAndView();
		mav.addObject("mavdata", "ModelAndView Return Data");
		mav.setViewName("viewJsp_2_modelandview_return_file");
		
		return mav;
	}
	
	@RequestMapping("viewJsp_3_voidTest_find")
	public void voidTest(Model md) {
		md.addAttribute("mmmm",   "스프링에서는 void 리턴형도 " 
	                            + " 리턴이 되네요 신기합니다. !!"
	                            + " 단 조건이 있습니다."
	                            + " 요청 url 이름과 "
	                            + " view 이름이 같아야 합니다. !!! ");
	}
}
  • viewJsp_1_stringTest_return_file.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Model Return Test</title>
</head>
<body>
	<h3>Model Return Test</h3>
	<hr>
	<h3>${mdata}</h3>
	view 페이지에 데이터 전달은 Model 인터페이스<br>
	view 페이지 찾기는 함수의 String 리턴형 value를 이용<br>
</body>
</html>
  • viewJsp_2_modelandview_return_file.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>MovelAndView Return Test</title>
</head>
<body>
	<h3>ModelAndView Return Test</h3>
	<hr>
	<h3>${mavdata}</h3>
</body>
</html>
  • viewJsp_3_voidTest_find.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>VOID RETURN</title>
</head>
<body>
	VOID RETURN<br>
	스프링에서는 함수 리턴형이 void여도 리턴이 가능하다. <br>
	단 : 조건은 요청 url 이름과 view 페이지 이름이 동일해야 한다.
	<hr>
	<h3>${mmmm}</h3>
</body>
</html>
  • index.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>
	<script src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script type="text/javascript">

		$(document).ready(function(){
			// alert("ready >>> : ");

			// GET 방식
			$(document).on("click", "#getbtn", function(){
				alert("getbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_get.ksy",
					"method":"GET",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});

			// POST 방식
			$(document).on("click", "#postbtn", function(){
				alert("postbtn >>> : 진입");

				$("#methodForm").attr({
					"action":"spring_hello_post.ksy",
					"method":"POST",
					"enctype":"applicaton/x-www-urlencoded"
				}).submit();
			});
		});
	</script>
</head>
<body>
	<h3>Spring Test</h3>
	<hr>
	<a href="spring_hello.ksy">Hello 보기</a><br>
	<a href="spring_hello_get.ksy">Hello GET Method</a><br>
	<a href="spring_hello_post.ksy">Hello POST Method</a><br>
	<form name="methodForm" id="methodForm">
		<button type="button" id="getbtn">GET</button>
		<button type="button" id="postbtn">POST</button>
	</form>
	<hr>
	<a href="viewJsp_1_stringTest_find.ksy">viewJsp_1_stringTest_find.ksy 실행</a><br>
	<a href="viewJsp_2_modelandview_find.ksy">viewJsp_2_modelandview_find.ksy 실행</a><br>
	<a href="viewJsp_3_voidTest_find.ksy">viewJsp_3_voidTest_find.ksy 실행</a><br>

</doby>
</html>


Notes

  • 월요일에 Mybatis

728x90