수업내용
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)
-
- server.xml <Connecter port="8088" : 클라이언트에서 웹 서버로 접속하는 포트tomcat 스타트
// URIEncoding 속성은 개발자가 추가한 것임 URIEncoding="UTF-8" : request (요청) 스트림에서 header에 들어오는(GET 방식) 문자 중 일부를 UTF-8로 인코딩하세요.
<Context docBase="kosSpring" path="/kosSpring" - web.xml
<session-timeout>30</session-timeout>
MIME Type - 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 - 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 불러오기 - 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를 호합니다.
머리말 꼬리말 지정
- server.xml <Connecter port="8088" : 클라이언트에서 웹 서버로 접속하는 포트tomcat 스타트
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