728x90
수업내용
1교시 (09:30-10:20)
- GROUP BY
- 쿼리는 모수를 줄이는 방법으로 짜야 한다.
- SELECT FROM WHERE GROUP BY HAVING ORDER BY
2교시 (10:30-11:20)
- [교재 195p] GROUP BY
- ROLLUP
- CUBE
-- 191p 7-21
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP A
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;
-- HAVING 절을 사용하여 EMP 테이블의 부서별 직책의 평균 급여가 500 이상인 사원들의
-- 부서번호, 직책, 부서별 직책의 평균급여를 출력하시오
-- 모수 먼저 확인하기!: 평균 급여가 500 이상인 사원 먼저 확인
SELECT EMPNO, SAL
FROM EMP
WHERE SAL >= 500;
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 500
ORDER BY DEPTNO, JOB;
-- 직책 별 사원 수
SELECT DEPTNO, JOB, COUNT(EMPNO)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
-- 196p 7-24
SELECT DEPTNO, JOB, COUNT(EMPNO), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) > 500
ORDER BY 1, 2;
SELECT DEPTNO, JOB, COUNT(EMPNO), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
3교시 (11:30-12:20)
- Spring WEB MVC
- 화면에서 form tag의 액션을 사용하여 사용자정의 콘트롤러로 데이터를 전달 할 때 script form tag 내의 변수명(”mid”)과 서버 내의 밸류 오브젝트 내의 멤버변수 명(프로퍼티 명, mvo의 mid)이 동일해야 함
- 어제 설명했던 사용자정의 콘트롤러 뒷단의 서비스 부분
a.b.c.com.controller a.b.c.com.service a.b.c.com.dao
@Controller @Service("a") @Repository("d")
@Controller @Service("service") @Repository("dAO")
@Controller @Service @Repository
사용자정의 콘트롤러 ----------------> 서비스 --------------------------> 다오
Service DAO
ServiceImpl DAOImpl
=============================================================================
Service service = new ServiceImpl(); DAO dAO = new DAOImpl();
Service a = new ServiceImpl(); DAO d = new DAOImpl();
=============================================================================
@Autowired(required=false) <- setter()를 해줌 @Autowired(required=false)
Service service DAO dAO
Context/WEB-INF/web.xml
DispatcherServlet
WEB-INF/spring-servlet.xml
Context/WEB-INF/spring_servlet.xml
<mvc
<contextLcomponent-scan base-package="a.b.c.com.**"- 에러 났을 때
1. 어노테이션 빼먹었나 확인
2. 참조변수 제대로 사용했나 확인
3. 환경설정파일 component-scan 패키지 명 확인
- 에러 났을 때
4교시 (12:30-13:20)
- SpringAutowiredDAO.java
package a.b.c.com.dao;
import java.util.List;
import a.b.c.com.vo.FormDataVO;
public interface SpringAutowiredDAO {
public List<FormDataVO> autowiredTest(FormDataVO fvo);
}
- SpringAutowiredDAOImpl.java
package a.b.c.com.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import a.b.c.com.vo.FormDataVO;
@Repository
public class SpringAutowiredDAOImpl implements SpringAutowiredDAO {
private Logger logger = LogManager.getLogger(SpringAutowiredDAOImpl.class);
@Override
public List<FormDataVO> autowiredTest(FormDataVO fvo) {
// TODO Auto-generated method stub
logger.info("SpringAutowiredDAOImpl.autowiredTest() 함수 진입");
List<FormDataVO> list = new ArrayList<FormDataVO>();
list.add(fvo);
return list;
}
}
- SpringAutowiredService.java
package a.b.c.com.service;
import java.util.List;
import a.b.c.com.vo.FormDataVO;
public interface SpringAutowiredService {
public List<FormDataVO> autowiredTest(FormDataVO fvo);
}
- SpringAutowiredServiceImpl.java
package a.b.c.com.service;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import a.b.c.com.dao.SpringAutowiredDAO;
import a.b.c.com.vo.FormDataVO;
@Service
@Transactional
public class SpringAutowiredServiceImpl implements SpringAutowiredService {
private Logger logger = LogManager.getLogger(SpringAutowiredServiceImpl.class);
private SpringAutowiredDAO springAutowiredDAO;
// 오토와이어드 어노테이션 생성자 주입
@Autowired(required=false)
public SpringAutowiredServiceImpl(SpringAutowiredDAO springAutowiredDAO) {
this.springAutowiredDAO = springAutowiredDAO;
}
@Override
public List<FormDataVO> autowiredTest(FormDataVO fvo) {
// TODO Auto-generated method stub
logger.info("SpringAutowiredServiceImpl.autowiredTest() 함수 진입");
List<FormDataVO> list = springAutowiredDAO.autowiredTest(fvo);
return list;
}
}
- SpringAutowiredController.java
package a.b.c.com.controller;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import a.b.c.com.service.SpringAutowiredService;
import a.b.c.com.vo.FormDataVO;
/*
현업에서 서버
개발서버 (개발로그를 콘솔에 찍는다) -> 스테이징서버(리얼서버와 동일한 환경) -> 리얼서버(로그를 로그파일에 쓴다)
개발서버에서 개발해서 단위 테스트를 완료하고 연계 테스트(통합 테스트)가 완료되면
운영팀의 허락을 받고(문서로)
스테이징서버에서 테스트를 한다.
스테이징 서버에서 테스트가 통과되면
운영팀의 허락을 받고(문서로)
리얼 서버에 포팅한다.
*/
// @Controller -> @Service -> @Repository
// 인터페이스에서 어노테이션 사용은 아직 자바에서 허락하지 않는다.
// 어노테이션은 인터페이스를 상속한 클래스에서 적용해야 한다.
@Controller
public class SpringAutowiredController {
private Logger logger = LogManager.getLogger(SpringAutowiredController.class);
// SpringAutowiredController 서비스 클래스를 스프링 프레임워크에서 인스턴스할 때
// SpringAutowiredController 서비스 클래스 이름의 첫 번째 이니셜을 소문자로 변경해서 인스턴스한다.
// SpringAutowiredController springAutowiredService = new springAutowiredServiceImpl();
final private SpringAutowiredService springAutowiredService;
/*
Autowired DI (Dependency Ingection) : VO (DTO)에 데이터를 초기화하는 행위
1. 필드 주입
: @Autowired
final private SpringAutowiredService springAutowiredService;
2. setter 주입(함수에 주입)
: @Autowired
public String autowiredTest(FormDataVO fvo, Model model) {}
3. 생성자 주입
: @Autowired(required=false)
public SpringAutowiredService(SpringAutowiredService springAutowiredService) {
this.springAutowiredService = springAutowiredService;
}
required=true : 디폴트 : Autowired 하려는 bean(컴포넌트 : Service 클래스, DAO 클래스)이 null 이면 에러 발생
required=false : Autowired 하려는 bean(컴포넌트 : Service 클래스, DAO 클래스)이 null 이어도 에러 발생하지 않는다.
*/
// 오토와이어드 어노테이션 생성자 주입
@Autowired(required=false)
public SpringAutowiredController(SpringAutowiredService springAutowiredService) {
this.springAutowiredService = springAutowiredService;
}
@RequestMapping(value="autowired_test", method=RequestMethod.GET)
public String autowired_test() {
logger.info("SpringAutowiredController.autowired_test() 함수 진입");
return "autowired/autowired_test_return";
}
@RequestMapping(value="autowired_test_get", method=RequestMethod.GET)
public String autowiredTest_Get(FormDataVO fvo, Model model) {
logger.info("SpringAutowiredController.autowiredTest_Get() 함수 진입");
List<FormDataVO> list = springAutowiredService.autowiredTest(fvo);
int listSize = list.size();
logger.info("listSize >>> : " + listSize);
model.addAttribute("list", list);
return "autowired/autowired_test_get_return";
}
}
5교시 (14:30-15:20)
- autowired_test_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>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(document).on("click","#getbtn", function(){
alert("getbtn 버튼 클릭");
$("#formData").attr({
"action":"autowired_test_get.ksy",
"method":"GET",
"enctype":"application/x-www-form-urlencoded"
}).submit();
});
});
</script>
</head>
<body>
<%
Logger logger = LogManager.getLogger(this.getClass());
logger.info("autowired_test_return.jsp >>> : ");
%>
<h3 align="center">FORM DATA AUTOWIRED CONSTRUCTOR</h3>
<hr>
<form name="formData" id="formData">
<table border="1" align="center">
<tr>
<td>회원번호</td>
<td>
<input type="text" name="datanum" id="datanum">
</td>
</tr>
<tr>
<td>아이디</td>
<td>
<input type="text" name="dataid" id="dataid">
</td>
</tr>
<tr>
<td>비밀번호</td>
<td>
<input type="text" name="datapw" id="datapw">
</td>
</tr>
<tr>
<td>이름</td>
<td>
<input type="text" name="dataname" id="dataname">
</td>
</tr>
<tr>
<td colspan="2">
<button type="button" id="getbtn">GET AUTOWIRED CONSTRUCTOR</button>
</td>
</tr>
</table>
</form>
</body>
</html>
- autowired_test_get_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" %>
<%@ page import="a.b.c.com.vo.FormDataVO" %>
<%@ page import="java.util.List" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Logger logger = LogManager.getLogger(this.getClass());
logger.info("autowired_test_get_return.jsp");
%>
<h3>autowired_test_get_return</h3>
<hr>
<%
Object obj = request.getAttribute("list");
if (obj == null) return;
List<FormDataVO> list = (List)obj;
if (list.size() > 0) {
FormDataVO fdvo = list.get(0);
out.println("fdvo.getDatanum() >>> : " + fdvo.getDatanum() + "<br>");
out.println("fdvo.getDataid() >>> : " + fdvo.getDataid() + "<br>");
out.println("fdvo.getDatapw() >>> : " + fdvo.getDatapw() + "<br>");
out.println("fdvo.getDataname() >>> : " + fdvo.getDataname() + "<br>");
pageContext.setAttribute("aaa", fdvo);
}
%>
<p>
<h3>el로 출력하기</h3>
<hr>
\${aaa.datanum } >>> : ${aaa.datanum }
\${aaa.dataid } >>> : ${aaa.dataid }
\${aaa.datapw } >>> : ${aaa.datapw }
\${aaa.dataname } >>> : ${aaa.dataname }
</body>
</html>
- index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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":"application/x-www-form-urlencoded"
}).submit();
});
// POST 방식
$(document).on("click", "#postbtn", function(){
alert("postbtn >>> : 진입");
$("#methodForm").attr({
"action":"spring_hello_post.ksy",
"method":"POST",
"enctype":"application/x-www-form-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>
<hr>
<a href="formdata_find.ksy">FORM DATA 실행</a>
<button onclick='location.href="formdata_get_servlet.ksy?datanum=11&dataid=11&datapw=11&dataname=11"'>formdata_get_servlet.ksy :: url전송</button>
<hr>
<a href="autowired_test.ksy">오토와이어드(의존성 주입 : DI) 생성자 실행</a><br>
<a href="autowired_test_field.ksy">오토와이어드(의존성 주입 : DI) 필드 실행</a><br>
</body>
</html>
- Spring과 Mybatis 연동
화면 - F.C - 사용자정의 콘트롤러 - 서비스 - 다오 - 매퍼XML
--------------------------------------
Spring FrameWork
---------------
Mybatis FrameWork
라이브러리
--------------------------------------------
Spring FrameWork library
Spring + Mybatis 연결 library : mybatis-spring-1.2.2.jar
Mybatis FrameWork library : mybatis-3.2.4.jar
spring-aop-3.2.9.RELEASE.jar
spring-beans-3.2.9.RELEASE.jar
spring-context-3.2.9.RELEASE.jar
spring-context-support-3.2.9.RELEASE.jar
spring-core-3.2.9.RELEASE.jar
spring-expression-3.2.9.RELEASE.jar
spring-jdbc-3.2.9.RELEASE.jar
spring-tx-3.2.9.RELEASE.jar
spring-web-3.2.9.RELEASE.jar
spring-webmvc-3.2.9.RELEASE.jar
스프링 로그
commons-logging-1.1.2.jar
jstl 라이브러리
jstl.jar
standard.jar
컴포넌트 로그
log4j-1.2.17.jar
JDBC
ojdbc6.jar
환경설정 파일
--------------------------------------------
Servers/context.xml
<Resource auth="Container"
type="javax.sql.DataSource"
name="jdbc/jndi_orclHBE00"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orclHBE00"
username="scott"
password="tiger"
maxActive="100"
maxIdle="30"
maxWait="10000" />
Context/WEB-INF/web.xml
Context/WEB-INF/spring-servlet.xml <-- 스프링 환경 설정파일
Context/WEB-INF/servlet-context.xml <-- 마이바티스 환경 설정파일
servlet-context.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/jndi_orclHBE00"></property>
</bean>
<!-- 마이바티스 쿼리문 찾아서 연결하기 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--
classpath: == springEmp/Java Resources/src
mybatisconfig 폴더 만들기
springEmp/Java Resources/src 에서 우클릭 New -> Other -> Select a wizard -> folder 검색
-->
<property name="configLocation" value="classpath:/mybatisconfig/mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:/mybatisquery/*.xml"></property>
</bean>
<!-- 트랜잭션 처리 : spring-mybatis 에서는 개발자가 tx 처리에 관여하지 않는다. -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- DAO 또는 Mapper 찾기 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"><value>a.b.c.com.**.dao</value></property>
</bean>
</beans>
6교시 (15:30-16:20)
- 클래스 계획 및 연동 시작
Spring + Mybatis 연동 연습
--------------------------------------
Context : empSpring
테이블 : EMP_SPRING
컬럼 :
EMPNO VARCHAR2(20)
ENAME VHRCHAR2(100)
HIREDATE DATE
클래스
패키지
a.b.c.com.emp.controller
SpringEmpController
a.b.c.com.emp.service
SpringEmpService
public List springEmpSelecAll();
publis List springEmpSelect(SpringEmpVO evo);
public int springEmpInsert(SpringEmpVO evo);
public int springEmpUpdate(SpringEmpVO evo);
SpringEmpServiceImpl
a.b.c.com.emp.dao
SpringEmpDAO
public List springEmpSelecAll();
publis List springEmpSelect(SpringEmpVO evo);
public int springEmpInsert(SpringEmpVO evo);
public int springEmpUpdate(SpringEmpVO evo);
SpringEmpDAOImpl
a.b.c.com.emp.vo
SpringEmpVO
private String empno;
private String ename;
private String hiredate;
mybatis-config.xml
spring_emp.xml
view
-----------------------
/WEB-INF/view/emp/
springEmpForm.jsp
springEmpInsert.jsp
springEmpInsertForm.jsp
wellcom file
------------------------
WebContent/index.jsp
작업순서
==================
1. Context 만들기
2. library 포팅하기
spring library
spring-aop-3.2.9.RELEASE.jar
spring-beans-3.2.9.RELEASE.jar
spring-context-3.2.9.RELEASE.jar
spring-context-support-3.2.9.RELEASE.jar
spring-core-3.2.9.RELEASE.jar
spring-expression-3.2.9.RELEASE.jar
spring-jdbc-3.2.9.RELEASE.jar
spring-tx-3.2.9.RELEASE.jar
spring-web-3.2.9.RELEASE.jar
spring-webmvc-3.2.9.RELEASE.jar
mybatis library
mybatis-spring-1.2.2.jar <-- Spring + Mybatis 연결 library
mybatis-3.2.4.jar <-- Mybatis Framework library
JDBC
ojdbc6.jar
log4j
log4j-1.2.17.jar
jstl
jstl.jar
standard.jar
스프링로그
commons-logging-1.1.2.jar
Context/WebContent/WEB-INF/lib/ 라이브러리 포팅 <-- 이클립스에서는 여기를 사용하지 않는다.
Context/Java Resources/Libraries <-- 이클립스는 여기에 있는 library를 참조한다.
수동으로 Build Path 연결하기
3. xml 환경설정파일 설정하기
Servers/server.xml
<Connector URIEncoding="UTF-8" port="8088"
Servers/web.xml
<session-timeout>30</session-timeout>
Default MIME Type Mapping
Servers/context.xml
<Resource auth="Container"
type="javax.sql.DataSource"
name="jdbc/jndi_spring_orclKSY00"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orclKSY00"
username="scott"
password="tiger"
maxActive="100"
maxIdle="30"
maxWait="10000" />
Context/WebContent/WEB-INF/web.xml
Context/WebContent/WEB-INF/spring-servlet.xml <-- 스프링 환경설정 파일
Context/WebContent/WEB-INF/servlet-context.xml <-- 마이바티스 환경설정 파일
7교시 (16:30-17:20)
- SpringEmpVO.java
package a.b.c.com.emp.vo;
public class SpringEmpVO {
private String empno;
private String ename;
private String hiredate;
// 생성자
public SpringEmpVO() {
}
public SpringEmpVO(String empno, String ename, String hiredate) {
this.empno = empno;
this.ename = ename;
this.hiredate = hiredate;
}
// setters/getters
public String getEmpno() {
return empno;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
}
- SpringEmpDAO.java
package a.b.c.com.emp.dao;
import a.b.c.com.emp.vo.SpringEmpVO;
public interface SpringEmpDAO {
public int springEmpInsert(SpringEmpVO evo);
}
8교시 (17:30-18:30)
- 쿼리문 만들기
CREATE TABLE EMP_SPRING(
EMPNO VARCHAR2(20)
,ENAME VARCHAR2(100)
,HIREDATE DATE
);
SELECT * FROM EMP_SPRING;
INSERT INTO EMP_SPRING (EMPNO, ENAME, HIREDATE) VALUES ('1111', '1111', SYSDATE);
ROLLBACK;
SELECT A.EMPNO EMPNO
,A.ENAME ENAME
,TO_CHAR(TO_DATE(A.HIREDATE), 'YYYY-MM-DD') HIREDATE
FROM EMP_SPRING A;
- spring_emp.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="a.b.c.com.emp.dao.SpringEmpDAO">
<insert id="springEmpInsert" parameterType="springempvo" >
INSERT INTO EMP_SPRING (EMPNO, ENAME, HIREDATE)
VALUES ( #{empno, jdbcType=VARCHAR}
,#{ename, jdbcType=VARCHAR}
,#{hiredate, jdbcType=VARCHAR})
</insert>
</mapper>
- SpringEmpDAOImpl.java
package a.b.c.com.emp.dao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import a.b.c.com.emp.vo.SpringEmpVO;
public class SpringEmpDAOImpl implements SpringEmpDAO {
@Autowired(required=false)
private SqlSession sqlSession;
@Override
public int springEmpInsert(SpringEmpVO evo) {
// TODO Auto-generated method stub
return (Integer)sqlSession.insert("springEmpInsert", "evo");
}
}
Notes
- 3일 동안 3명 팀으로 Spring 홈페이지 만들기
- 상품 테이블
- 게시판 테이블
- 회원 테이블
728x90