2015년 8월 30일 일요일

스프링MVC Flash Attribute(RedirectAttributes, FlashMap)

스프링MVC Flash Attribute(RedirectAttributes, FlashMap)

MVC기반의 일반 웹어플리케이션에서 서버측으로 POST형태로 데이터를 전송하게되면 스프링 컨트롤로에서는 사용자 요청에서 데이터를 꺼내 데이터베이스에 저장하는 등의 일을 한다.
그런다음 사용자에게 성공한 상태정보를 보여주기위해 JSP 페이지등을 포워딩하게 된다. 이 경우 사용자가 F5키 등을 눌러 POST 방식의 요청을 여러번 보내게 되면 문제가 발생할 수도 있다.

이러한 문제점을 보완하기 위해 Spring MVC3.1 이상에서 RedirectAttributes, FlashMap을 이용하여 POST/Redirect/GET 패턴을 보완하기 위한 방법이 나왔는데 이 패턴을 이용하게되면 F5 키등을 눌러 리로드(multiple form submit)하는 경우 POST로 서버측으로 서브밋을 하는 것이 아니라 GET방식 형태로 뜬 JSP만 다시 리로드되게 할 수 있다. 

물론 이때 RedirectAttributes를 사용하여 데이터등을 저장한다면 Redirect된 후 즉시 사라지게 되고 사용자가 F5등을 눌러 리로드 하더라도 다시 서버로 다시 submit되어 저장되지 않게할 수 있다.

FlashMap, RedirectAttributes등을 이용하면 리다이렉트시 값의 전달을  쿼리스트링을 이용한 파라미터등으로 하지않고 임시 플래시메모리를 이용하여 보이지 않게 저장하고, 사용 후 삭제되도록 하는 것이다. 즉 리다이렉트시 데이터 숨겨 넘기는 방법을 제공하는 것이다.

FlashMap은 flash attribute등을 저장 할 수 있고, FlashMapManager를 이용하여  FlashMap 인스턴스등을 저장, 삭제등을 할 수 있다.

Spring MVC에서 FlashAttribute를 사용하기 위해서는 스프링3.1 이상에서만 가능하고
<mvc:annotation-driven /> 태그를 설정파일에 기술해야 한다.


0. flashattr 이라는 스프링 MVC 프로젝트 생성

   top level package명 edi.onj.flashattr 

1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>edi.onj</groupId>
<artifactId>flashattr</artifactId>
<name>flashattr</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>

<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>        
</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>



2. /WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">

<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>

</web-app>




3. /WEB-INF/spring/appServlet/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:mvc="http://www.springframework.org/schema/mvc"
    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/mvc  http://www.springframework.org/schema/mvc/spring-mvc.xsd">
         
     
    <bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
     </bean>
     
    <context:component-scan base-package="edi.onj.flashattr" />
    <mvc:annotation-driven />
  
</beans>


4. 컨트롤러


package edi.onj.flashattr;

import model.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class HomeController {
//EMP를 입력하면 화면을 띄운다.
@RequestMapping(value="addform", method=RequestMethod.GET)
public String showForm(@ModelAttribute("emp") Emp emp) {
return "addemp";
}
//입력화면에서 "Add Emp"버튼 클릭시 호출됨
@RequestMapping(value="add", method=RequestMethod.POST)
public String add(@ModelAttribute("emp") Emp emp,
          final RedirectAttributes rAttr) {
//리다이렉트로 보내는 경우 Flash영역에 임시로 emp, msg를 저장하고 
//화면이 로드된 후에는 값이 사라진다. 결국 리로드 하는 경우라면 
//화면에 아무것도 나타나지 않는다.]
        //값을 output FlashMap에 저장한다.
rAttr.addFlashAttribute("emp", emp);
rAttr.addFlashAttribute("msg", "added success!");
return "redirect:showemp.html";   
}
@RequestMapping(value="showemp", method=RequestMethod.GET)
    public String showCustomer(@ModelAttribute("emp") Emp emp) {
//PAge를 리로드하는 경우 emp.getName, emp.getAge모두 NULL이 넘어온다.
        System.out.println("emp:" + emp.getName() + ":" + emp.getAge());
        return "show";
    }
}



5. 모델

package model;

public class Emp {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}



6. /WEB-INF/views/addemp.jsp

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<body>
    <h1>Add New Emp</h1>
    <form:form action="add.html" method="post" commandName="emp">
    <table>
        <tr>
            <td><form:label path="name">name</form:label></td>
            <td><form:input path="name" /> </td>
        </tr>
       
        <tr>
            <td><form:label path="age">Age</form:label></td>
            <td><form:input path="age" /> </td>
        </tr>
       
        <tr>
            <td colspan="2"><input type="submit" value="Add Emp" />
            </td>
        </tr>
    </table>
    </form:form>
</body>
</html>


7.  /WEB-INF/views/show.jsp


<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<body>
<h1>${msg}</h1>
    ${emp.name}, ${emp.age}
</body>
</html>


8. 실행

http://localhost:8080/flashattr/showemp.html






@CookieValue, @MVC(스프링컨트롤러쿠키사용예,카운터,Spring MVC)

@CookieValue, @MVC(스프링컨트롤러쿠키사용예,카운터,Spring MVC)

@CookieValue :

HTTP쿠키 값을 HttpServletRequest등을 통해 읽을 필요없이 스프링 컨트롤러에서 파라미터로 전달 받을 수 있게해주며, 쿠키가 존재하지 않으면 오류가 발생하고 required 속성 값을 이용해 필수여부 설정도 가능하고, defaultValue 속성 값을 이용해서 기본값을 지정하는 것도 가능하다.

해당하는 쿠키가 없다면 다음과 같은 오류가 발생한다.

java.lang.IllegalStateException: Missing cookie value '쿠키이름' of type java.lang.String

이를 해결하기 위해서 defaultValue를 사용하면 된다.

@RequestMapping("/hello.html")
public String hello(@CookieValue(value = "쿠키이름", defaultValue = "oraclejavacommunity")  String var) {
......
}


[예 : 쿠키를 이용한 간단한 카운터]

컨트롤러

@Controller
public class HomeController {
 
@RequestMapping(value = "/hello.html")
    public String hello(
            @CookieValue(value = "onjCounter",defaultValue = "0") Integer onjCounter,
            HttpServletResponse response) {
 
        //쿠키값을 읽어 우선 counter, 1증가
onjCounter++;
 
        // 응답에 쿠키를 셋팅
        Cookie cookie = new Cookie("onjCounter", onjCounter.toString());
        response.addCookie(cookie);
 
        // view이름
        return "home";
    }
}



JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Spring MVC Cookie example</title>    
</head>
<body> 
    <h1>OracleJavaCommunity </h1>
    <h1>Spring Cookie Example</h1> 
    Page hit counter: <b> ${cookie.onjCounter.value} </b> 
</body>
</html>

[평일야간]자바&웹,jQUERY,스프링프레임워크(JAVA,JSP,SERVLET,제이쿼리,스프링,마이바티스)-본인부담0~20%

[평일야간]자바&웹,jQUERY,스프링프레임워크(JAVA,JSP,SERVLET,제이쿼리,스프링,마이바티스)-본인부담0~20%



자바&웹,jQUERY,스프링프레임워크

강좌명 자바&웹,jQUERY,스프링프레임워크(평일야간)
오라클자바커뮤니티(ojc.asia) 추천 실전강좌
교재 자체 교재 제공(교재비 24,000원 별도)
(최소 개강인원은 5명이며, 5명 미만인 경우 1~2주 정도 강좌가 연기될 수 있습니다.)
강좌 일정 상단 URL 참조
강의 장소 [D강의장]구로디지털단지역2번 출구 -> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 횡단보도 건너기 --> 우회전 후 구로호텔 직전 좌측길, 호텔 바로 뒤편 파트너스타워2차 301호
[약도보기]
지원절차 - 강좌내용 확인 후 페이지 하단 "지원하기" 버튼 클릭
- 고용보험 가입자인 경우 관련 서류 제출(아래 "제출서류" 확인)
- 교육전 : 개강일자/시간 및 공지사항에 대하여 전화 또는 문자 공지
- 교육당일 : 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌 진행방식 등)
- 강좌 수강, 수시로 제출되는 이론/실습 과제에 대하여 제출후 SKILL UP
- 교육후 : 메인 페이지 좌측 배너 클릭 후 교육 후 설문 작성
근로자개인
지원/결제안내
- 평일주간 교육은 사업주환급 교육만 가능하며 근로자 개인수강지원(근로자카드,내일배움카드)은 불가능.
- 근로자 개인수강지원의 경우 재직자내일배움카드 또는 근로자카드 발급 받으신분만 수강가능
- 근로자 카드는 고용보험 가입자라면 누구나 간단한 절차를 통해 발급가능.(근로자카드제도 및 발급안내)
- 본인부담액은 교육비의 0~20% 이며 계좌이체 ,근로자카드 또는 개인카드로 결제가능
카드를 수령하지 않았더라도 근로자카드 신청 후 노동부 승인 받은 상태(2~3일 이후)라면 수강 가능.
- 상시근로자 300인 이상 대기업 재직자(50세미만)는 근로자카드/내일배움카드 지원 불가.
사업주훈련
지원/결제안내
- 고용보험 가입자에 대하여 교육비 환급 가능
채용예정(확정)된 분은 현재 고용보험 미가입이라도 교육가능.(채용예정 기업에서 결제하고 해당 기업으로 환급)
- 교육비는 전액 계좌이체 또는 카드(내방결제만 가능)로 교육전 결제 해야 하며 출석룔80% 이상 수료후 회사에서 관할 산업인력 공단으로 환급신청서 제출해서 환급절차 진행해야 되고 보통 2~3주 정도 후 회사로 환급(환급룔은 과정마다 다르니 확인필요)
수강료
입금안내
- 계좌이체(메인페이지 좌측 신한은행 계좌)
- 카드결제는 방문 카드 결제만 가능하며 온라인 카드결제는 지원하지 않습니다.
- 평일주간 기업100%환급 교육은 계좌이체만 가능합니다.
제출서류 - 고용주/사업주 환급 : 상단 정보마당/자료실의 1번 근로자동의서, 2번 훈련위탁계약서(평일주간 교육은 2번만 필요)
- 근로자/내일배움 카드과정 : 상단 정보마당/자료실의 5번 근로자카드,내일배움카드지원자용 신청서
- 제출방법 : 이메일(webmaster@oraclejavacommunity.com) or 팩스(0505-719-4790) or 내방
수강료 및
환급금액
강사소개
상단 URL 참조
[고용주환급] 대기업:390,186원(1000인 이상기업은 243,866원), 중소기업:585,280원 전후 환급

[근로자개인수강지원(근로자카드, 재직자내일배움카드)] 중소기업 정규직 20%(198,000원) 본인부담, 중소기업 비정규직/이직예정자/무급휴직자 무료, 대기업 정규직은 전액본인부담, 정규직50세이상/이직예정자 20% 본인부담, 비정규직/정규직무급휴직자 무료.


[휴강] 법정공휴일

[강사소개] 본원은 실무에 계신분들이 시간을 내서 강좌를 진행하기에 일부 변동 사항이 있을 수 있으며 강좌가 한 강사님께 고정되지 않는 부분이 있으니 참조 바랍니다.

JAVA/JSP/jQUERY/Spring Framework/MyBatis 기반의 아래 프로젝트외 다수 수행.

국세청 통합 시스템
통계청 MSGIS
흥국생명차세대 개발
우정사업본부 우편물류개발팀 차세대 개발
SKT PM 개발
행안부 중계시스템 개발
신라호텔 면세점 ERP 고도화 SAP 연동 모듈 개발
삼성전자SiTE개선2.0
한화 그룹웨어 차세대 개발
이마트 차세대
증권사 차세대 프로젝트

외 다수 프로젝트 자바기반 개발경력 9년이상, 오라클자바커뮤니티 자바,JSP,스프링 전문강사

* 일정상 강사님은 다른 실무 강사님으로 변경 될 수도 있습니다.
문의안내 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 단기간에 자바&웹기반 프로그래머를 양성하기 위한 과정이며, 프로그래밍 언어의 경험이 있는 분이지만 자바를 처음하시는 분들을 위해 짧은 기간에 현장에서 필요로 하는 기술들을 최적화된 교재 및 강사를 통해 배울 수 있도록 하는 과정 입니다.

자바의 기본적인 사항부터 JDBC 프로그래밍, JSP의 기본이 되는 Servlet 그리고 JSP의 기본적인 문법과 Ajax, jQuery를 통해 화면 깜박임없이 웹페이지를 역동적으로 구성할 수 있도록 배우며, 최근 가장 많이 사용되는 JAVA기반의 프레임워크인 Spring, SQL Data Mapper, Hibernate ORM까지 배울 수 있는 그야말로 단기간에 자바 개발자로 가시고자 하는 분들을 위한 최적의 과정 입니다.

많은 양이라고 생각될지 모르지겠만 강사님들이 주시는 과제와 팁을 적절히 수행하고 그날그날 수업에 대해 복습을 하시면서 따라 온다면 자기도 모르는 사이에 자바 개발자로 거듭나 있을 것입니다.

감사합니다.
교육목표 - 자바 문법의 이해
- 객체지향 프로그램 개발의 이해
- 자바 웹 개발의 이해
- Ajax, jQUERY와 같은 웹 기술에 대한 이해
- Servlet/JSP 개발에 대한 이해
- Spring3.X/4 Framework에 대한 이해
- Spring3/4 @MVC에 대한 이해
- iBATIS/MyBatis에 대한 이해
- Spring Transaction에 대한 이해
- Spring, iBATIS/MyBatis, Hibernate 연동에 대한 이해
교육대상 - 신입 개발자
- 초보프로그래머
- 다른 언어를 사용하다 자바로 전향을 원하는 개발자
선수학습 - 프로그래밍 기초
 

자바프로그래밍 자바 언어 소개
개발환경 설치(JDK7/8, Eclipse4.3 Kepler/Luna)
기본 문법(연산자, 변수, 상수, 제어문, 반복문)
Virtual Machine 소개
JVM 메모리 영역
클래스 패스(Class Path), 설정방법
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type
상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread 우선순위/동기화
Thread Joining/Interrupt
JAVA8 Lambda __EXPRESSION__
JAVA8 Functional Interface
JAVA8 double colon Operator
JDBC 프로그래밍 Connection, Statement, ResultSet, PreparedStatement
(DML 예제 실습)
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
Servlet/JSP 프로그래밍 Servlet의 개요
HelloWorld Servlet
Servlet Mapping, WebServlet Annotation
Servlet의 Request, Response
Servlet에서의 Session, Cookie 다루기
JSP 기본문법
JSP 내장 객체
Java Beans
JSP에서의 Session, Cookie 다루기
JSTL, EL
MVC Model의 이해
AJAX/jQUERY 프로그래밍 Ajax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC

- jQuery 개요, 다운로드, 설치
- $(document).ready() 메소드
- Selector
- $(“*"), $("#ID"), $("DIV"),$(".classname"), $("p > a"),
- $(“elementname.classname")
- 속성 선택자, 속성(attr)
- 입력양식 필터 선택자
- 위치와 관련된 필터 선택자
- jQuery 배열(Array) 관리
- jQuery 객체 확장
- 기본 필터링 메소드
- 특정 위치 문서 객체 선택
- 문서 객체에서 특정 태그를 선택하는 방법
- innerHTML 속성과 관련된 jQuery 메서드
- 문서객체 생성 , 제거
- jQuery Event
- 이벤트 관련 메소드(발생, 제거)
- 이벤트 자동 발생
- 마우스/키보드/윈도우/입력양식 이벤트
- jQuery 기본효과, 사용자지정효과
- jQuery, Ajax 관련 메소드
- XML 문서 다루기
- 입력양식 전송
Spring 3/4 프로그래밍 JAVA Bean vs EJB vs Spring
J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2, MAVEN, STS 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Method Injection
DL. DI 예제를 통한 이해
Spring 설정(XML, Annotation)
Spring AOP 란 ?Code, Advice, JoinPoint,PointCut
Aspect, Weaving, ProxyFactoryBean
Annotation기반 AOP(AspectJ)
Auto Scanning 컴포넌트 (@Component,@Repository,@Service,@Contoroller)
@Resource vs @Autowired
ProxyFactoryBean을 통한 AOP 구현
AOP NAMESPACE를 통한 AOP 구현
@AspectJ Annotation을 통한 AOP 구현
Spring JDBC(이론 및 실습예제)
Spring Web MVC (이론 및 실습예제)
Spring Controller
Spring MVC Interceptor
@Controller, @RequestMapping, @SessionAttributes, @ModelAttribute
Spring4 @MVC Multiple File Upload
Spring 표현언어 SpEL
Spring Tiles 연동
Spring3/4 Transaction 관리
@Transactional Annotation, XML설정방식, 프로그래밍적 트랜잭션 처리방법의 이해
Spring Interceptor
Spring Tile연동
Spring Scheduling(Quartz연동)

Spring3/4 를 이용한 게시판 작성
- 리스트보기,글쓰기,읽기,댓글,답변글처리
- @MVC, @Controller, @RequestParam, @SessionAttibutes, @ModelAttribute 매핑 적용
- 주입(DI)를 Annotatrion으로 변경
- Spring AOP를 적용하여 게시판 DML 로깅 하기
- 스프링 게시판에 MyBatis 적용하여 SQL문을 XML안으로
MyBatis/iBATIS 개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
Spring연동
Hibernate 프로그래밍 Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성
Hibernate 설정을 Annotation으로...@Entity, @Table, @Id, @Column
Spring, Hinernate Transaction 실습
 

 

2015년 8월 27일 목요일

SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝)

[가격인하, 평일주간/야간,주말주간]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝), 기초에서실무까지, SQL의 전부분을 단기간에 배울 수 있습니다.
 
소수 정예 과정!!
 
자세한 교육내용/상세 및 지원방법,환급관련 내용은 아래 URL에서 확인 바랍니다.

 
 


SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝)

강좌명 SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝)(평일야간)
오라클자바커뮤니티(ojc.asia) 추천 실전강좌
교재 PDF or 자체교재제공(교재비 27,000원 별도)
본원에서 SQL실무교육을 위해 자체 제작한 교재(SQL초보에서Schema Object까지, PL/SQL,HINT,TUNING)
강좌 일정 상단 URL 참조(최소 개강인원은 5명이며, 5명 미만인 경우 1~2주 정도 강좌가 연기될 수 있습니다.)
강의 장소 [A강의장]구로디지털단지역2번 출구 -> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 횡단보도 건너기 --> 우회전 후 구로호텔 직전 좌측길, 호텔 바로 뒤편 파트너스타워2차 301호
[약도보기]
지원절차 - 강좌내용 확인 후 페이지 하단 "지원하기" 버튼 클릭
- 고용보험 가입자인 경우 관련 서류 제출(아래 "제출서류" 확인)
- 교육전 : 개강일자/시간 및 공지사항에 대하여 전화 또는 문자 공지
- 교육당일 : 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌 진행방식 등)
- 강좌 수강, 수시로 제출되는 이론/실습 과제에 대하여 제출후 SKILL UP
- 교육후 : 메인 페이지 좌측 배너 클릭 후 교육 후 설문 작성
근로자개인
지원/결제안내
- 평일주간 교육은 사업주환급 교육만 가능하며 근로자 개인수강지원(근로자카드,내일배움카드)은 불가능.
- 근로자 개인수강지원의 경우 재직자내일배움카드 또는 근로자카드 발급 받으신분만 수강가능
- 근로자 카드는 고용보험 가입자라면 누구나 간단한 절차를 통해 발급가능.(근로자카드제도 및 발급안내)
- 본인부담액은 교육비의 0~20% 이며 계좌이체 ,근로자카드 또는 개인카드로 결제가능
카드를 수령하지 않았더라도 근로자카드 신청 후 노동부 승인 받은 상태(2~3일 이후)라면 수강 가능.
- 상시근로자 300인 이상 대기업 재직자(50세미만)는 근로자카드/내일배움카드 지원 불가.
사업주훈련
지원/결제안내
- 고용보험 가입자에 대하여 교육비 환급 가능
채용예정(확정)된 분은 현재 고용보험 미가입이라도 교육가능.(채용예정 기업에서 결제하고 해당 기업으로 환급)
- 교육비는 전액 계좌이체 또는 카드(내방결제만 가능)로 교육전 결제 해야 하며 출석룔80% 이상 수료후 회사에서 관할 산업인력 공단으로 환급신청서 제출해서 환급절차 진행해야 되고 보통 2~3주 정도 후 회사로 환급(환급룔은 과정마다 다르니 확인필요)
수강료
입금안내
- 계좌이체(메인페이지 좌측 신한은행 계좌)
- 카드결제는 방문 카드 결제만 가능하며 온라인 카드결제는 지원하지 않습니다.
- 평일주간 기업100%환급 교육은 계좌이체만 가능합니다.
제출서류 - 고용주/사업주 환급 : 상단 정보마당/자료실의 1번 근로자동의서, 2번 훈련위탁계약서(평일주간 교육은 2번만 필요)
- 근로자/내일배움 카드과정 : 상단 정보마당/자료실의 5번 근로자카드,내일배움카드지원자용 신청서
- 제출방법 : 이메일(webmaster@oraclejavacommunity.com) or 팩스(0505-719-4790) or 내방
수강료 및
환급금액
강사소개
상단 URL 참조
[휴강] 법정공휴일

[강사소개] 오라클자바커뮤니티 교육센터장 직강
* 일정상 강사는 다른 실무 강사님으로 변경 될 수도 있습니다.
문의안내 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 실무에서 다 년간 SQL튜닝을 경험한 실전 DBA, SQL튜닝 전문가가 진행하는 본 과정은 개발 시 흔히 겪게 되는 최적의 SQL 사용법에 중점을 둔 강좌로서 기본적인 SQL문법, SQL기본함수, 서브쿼리, 조인, 효율적인 인덱스 사용법을 세분화해서 집중적으로 학습합니다.

또한 개발하면서 자주 보게되는 스키마 객체(Schema Object, Table, Index, View, Sequence, Synonym, DBLink)들에 대해 다루며 PL/SQL, Stored Program(Procedure, Function, Oracle Cursor, Package, Trigger)을 마스터 후 오라클 옵티마이저, 실행계획, 오라클의 힌트구문를 통해 실행계획을 효율적으로 수립하는 방법을 학습하며 SQL문의 튜닝의 기본에 대해 학습 합니다.

고급SQL, 효과적인 Index사용, Oracle Hint 등을 적절히 이용 한다면 데이터 검색 시 수분이상 걸리는 SQL문장을 수 초안에 데이터가 검색되도록 SQL튜닝 가능하죠^^, 개발자라면 꼭 알고 있어야 합니다! 고급 SQL 사용법, 그룹함수의 튜닝, 각종 인덱스에 대한 이해, 인덱스 활용법, 조인의 원리, 세미조인, 안티조인의 이해 및 관련된 여러가지 힌트구문을 통해 SQL튜닝에 대한 이해를 철저한 실습을 통해 이해하게 되실 것 입니다.

본 과정은 철저한 실습,실무위주의 교육으로 과정을 수료함으로써 SQL 사용에 대한 자신감 및 SQL SKILL을 향상시킬 수 있을 것 입니다.
교육목표 ○ SQL*Plus 사용법에 대한 이해
○ SQL 기본함수에 대한 이해
○ SQL 고급함수에 대한 이해
○ Join 및 Sub Query에 대한 이해
○ DML, DDL, DCL에 대한 이해
○ Oracle Index에 대한 이해
○ Oracle Schema Object 에 대한 이해
(Table, View, Index, Synonym, Trigger, DataBase Link, Sequence등)
○ Oracle Stored Program(Procedure, Function)에 대한 이해
○ 인덱스를 선정하는 기준에 대한 이해
○ 효율적인 인덱스 운영 및 관리
○ B*Tree 인덱스의 단점을 보완하기 위한 기타 인덱스에 대한 이해.
○ Bitmap, Function Based Index, Recerse Key Index에 대한 이해.
○ 대용량 데이터를 효율적으로 저장을 위한 구조에 대한 이해
○ 실행계획 해석방법의 이해
○ 통계정보의 이해
○ Optimizer 구성요소 및 작동원리에 대한 이해
○ 옵티마이저의 기능과 역할을 실행계획을 통해서 정확히 이해
○ INDEX생성, DRIVING TABLE의 ACCESS 순서 변경 및 HINT, 분석함수 등을 사용하여   SQL QUERY 의 응답 속도 향상.
○ 조인방식에 대한 이해 및 CASE별 최적의 조인메카니즘을 이해
○ 오라클 힌트 구문에 대한 이해
○ 힌트의 사용을 통한 SQL튜닝의 이해
○ 본인이 작성한 SQL문에 대하여 옵티마이저의 작동 원리를 파악하고 실행계획을 분석
○ 본인이 작성한 SQL문에 대하여 드라이빙 테이블 및 조인방법/순서를 예측하고실행계획을 분석
○ 현실 실무에서의 튜닝 사례를 설명하고 튜닝을 위한 명확한 실무 활용기준 가이드를 제시
교육대상 초보 개발자 or DB에 관심있는 일반인
SQL에 관심있는 개발자
DB전문가가 되기 위한 개발자
선수학습 데이터베이스에 대한 이해
 

SQL기초에서Schema Objects까지 1. 개요 및 실습데이터 설치
1-1. 오라클, 데이터베이스관련 용어
1-2. 오라클 에디션(ORACLE EDITION)
1-3. 오라클 버전 변화
1-4. 실습데이터 설치 및 SQL*PLUS 실행환경 설정
1-4. 실습데이터 구조(테이블 정의서)
1-5. 데이터베이스 무결성(DataBase Integrity)
2. SQL*Plus
2-1. 개요, 시작, 종료
2-2. 데이터베이스 시작, 종료
2-2. SQL*Plus 명령어
2.2.1 주요 명령어
2.2.2 편집 명령어
2.2.3 파일관련 명령어
2.2.4 SET 명령어
2.2.5 형식 명령어
3. 기본 SQL 명령어
3.1 Schema 계정에서의 기본 쿼리문
3.2 기본 쿼리문
3.2.1 SELECT문
3.2.2 산술 표현식(Arithmetic __EXPRESSION__)
3.2.3 칼럼 별명(Column Alias)
3.2.4 합성 연산자(Concatenated Operator)
3.2.5 조건질의와 ORDER BY
3.2.6 SQL 조건연산자를 이용한 조건검색
3.2.7 ANY(SOME), ALL, EXISTS
3.2.8 집합 연산자
3.3 ROWNUM 및 NULL값, NLS_DATE_FORMAT
3.3.1 ROWNUM
3.3.2 NULL이란?
3.3.3 NLS Parameters
3.4 데이터 타입(Data Type)
4. SQL 함수
4.1 문자함수
4.2 집합 함수(Aggreation Function), GROUP BY, HAVING
4.3 숫자 및 날짜 함수(Number And Date Function)
4.3 변환 함수(Conversion Function)
4.4 일반 함수 및 조건식(General Functions and Conditional __EXPRESSION__s)
5. 서브 쿼리(SUB QUERY)
5.1 서브 쿼리(SUB QUERY) 개요
5.2 복수행 서브쿼리(Multi-Row Sub Query)
5.3 상관 서브쿼리(Correlated Sub Query)
5.4 Scalar SubQuery
5.5 인라인뷰(IN_LINE VIEW)
5.6 WITH 구문
6. 조인(JOIN)
6.1 테이블 별명(Table Alias)
6.2 카티션 프로덕트(Cartesian Product)
6.3 EquiJoin, Non EquiJoin
6.4 Self Join
6.5 Outer Join
6.6 계층형 쿼리(Hierarchical Query)
7. 오라클 분석함수(Analytic Function) 및 SQL 활용
7.1 분석함수란?
7.2 분석함수 기본형식(PARTITION BY, ORDER BY, WINDOW구, MAX, MIN, SUM, AVG, DENSE RANK FIRST/LAST, KEEP, OVER)
7.3 분석함수(LISTAGG)
7.4 분석함수(FIRST_VALUE, LAST_VALUE, RANK, DENSE_RANK, ROW_NUMBER)
7.5 SQL활용
8. 테이블(Table)
8.1 테이블(Table)이란?
8.1.1 Create Table
8.1.2 테이블 구조 변경
8.1.3 테이블 이름변경 및 삭제, 주석추가
8.1.5 FlashBack Drop 및 Recycle Bin
8.1.6 데이터 무결성(Data Integrity) 제약조건(Constraints)
8.1.7 오라클11g 읽기전용 테이블
8.1.8 오라클11g 가상 칼럼(Virtual Column)
9. 데이터 딕셔너리(Data Dictionary)
9.1 데이터 딕셔너리 개요
9.2 USER_ 데이터 딕셔너리 뷰
10. DML(Data Manipulation Language)
10.1 DML 개요
10.2 INSERT 명령어
10.2.1 단일행 입력
10.2.2 복수행 입력(Multi Row Insert)
10.3 UPDATE 명령어
10.4 DELETE 명령어
10.5 MERGE 명령어
11. 인덱스(INDEX)
11.1 단일/복합(결합) 인덱스(Single Column/Composite Index)
11.2 고유/비고유 인덱스(Unique/Non Unique Index)
11.3 Descending Index
11.4 함수기반 인덱스(Function Based Index)
11.5 인덱스 재구성 및 삭제
11.6 인덱스 숨기기(Index Invisible)
12. 뷰(VIEW)
12.1 단순 뷰(Simple View)
12.2 복합 뷰(Complex View)
12.3 인라인 뷰(Inline View)
12.4 WITH CHECK OPTION
12.5 DROP VIEW
13. 동의어(Synonym)
14. 시퀀스(Sequence)
PL/SQL, Hint, tuning 1. PL/SQL 개요
1-1. PL/SQL 이란?
1-2. PL/SQL 장점
1-3. PL/SQL 작성방법
1-4. PL/SQL 블록 구조
1-5. PL/SQL과 관련된 SQL*Plus 명령어
2. PL/SQL 프로그램
2-1. 함수(Function)
2-2 프러시저(Procedure)
2-3. Stored Program과 Dictionary View
2-4. Function Result Caching
3. PL/SQL 변수, 데이터 타입
3.1 변수, 데이터타입
3.1.1 Scalar Data Type
3.1.2 Composite Data Type(Table Type/Record Type)
3.1.2 %TYPE 속성
3.1.3 %ROWTYPE 속성
3.1.4 Bind(Host) 변수
3.2 PL/SQL에서 SQL문장 사용
3.2.1 SELECT문의 사용
3.2.2 INSERT/UPDATE/DELETE문의 사용
4. PL/SQL 프로그래밍(제어문, 반복문)
4.2 BASIC LOOP문
4.3 FOR LOOP문
4.4 WHILE LOOP문
5. PL/SQL Cursor(커서)
5.2 명시적 커서(Explicit Cursor)
5.3 WHERE CURRENT OF 커서
5.4 Parameterized 커서
5.5 참조커서(REF CURSOR)
5.6 DBMS_SQL 패키지를 이용한 REF CURSOR
6. PL/SQL Exception
6.1 Predefined Exception
6.2 Non-Predefined Exception
6.3 사용자 정의 오류(User Defined Exception)
6.3.1 RAISE 구문을 이용하는 방법 59
6.3.2 RAISE_APPLICATION_ERROR 구문을 이용하는 방법
6.4 예외처리와 SQLCODE, SQLERRM 함수
7. Dynamic SQL
7.1 Dynamic SQL 이란?
7.1.1 동적 SQL을 이용하여 DDL을 실행
7.1.2 Dynamic SQL 사용하기(SQL문을 동적으로 생성)
7.1.3 컴파일 타임에 존재하지 않는 데이터베이스 객체 참조
7.1.4 PL/SQL 블록에서 다른 프러시저, 함수 호출하기
8. 패키지(Package)
8.1 개요 및 기본문법
8.2 전위적 선언(Forward Declaration)
8.3 ONE TIME ONLY PROCEDURE
9. 트리거(Trigger)
9.1 트리거 개요, 기본문법
9.2 Setting Trigger Order
9.3 Trigger Mutating Table Exception
9.4 Compound Triggers
9.5 Trigger Enable/Disable/Drop
10.1 DBMS_STATS 패키지 사용하기
10.2 Optimizer Statistics(Table/Column 통계정보)
10.3 Literal SQL & Bind Variable SQL(Soft Parsing/Hard Parsing)
10.4 CURSOR_SHARING 파라미터
10.5 튜닝의 도구 - SQL AUTOTRACE
10.6 튜닝의 도구 – DBMS_XPLAN
10.7 실행계획 해석
10.8 초기화 파라미터 OPTIMIZER_MODE
10.9 Optimizer Mode Setting 방법
10.10 규칙 기반 옵티마이저(Rule-Based Optimizer)
10.11 비용기반 옵티마이저(Cost-Based Optimizer)
11.1 Optimizer Mode를 변경하는 힌트 (RULE)
11.2 Optimizer Mode를 변경하는 힌트(FIRST_ROWS)
11.3 Optimizer Mode를 변경하는 힌트(ALL_ROWS)
11.4 Optimizer Mode를 변경하는 힌트(CHOOSE)
12.1 실행계획 SQL 연산(AND-EQUAL)
12.2 실행 계획 SQL 연산(CONCATENATION)
12.3 실행계획 SQL 연산(COUNT)
12.4 실행계획 SQL 연산(COUNT STOPKEY)
12.5 실행계획 SQL 연산(FILTER)
12.6 실행계획 SQL 연산(HASH ANTI-JOIN)
12.7 실행계획 SQL 연산(HASH SEMI-JOIN)
12.8 실행계획 SQL 연산(NESTED LOOP SEMI-JOIN)
12.9 실행계획 SQL 연산(INDEX RANGE SCAN)
12.10 실행계획 SQL연산(INDEX RANGE SCAN DESCENDING)
12.11 실행계획 SQL연산(INLIST ITERATOR)
12.12 실행계획 SQL연산(MERGE JOIN)
12.13 실행계획 SQL연산(MERGE SEMI JOIN)
12.14 실행계획 SQL연산(MERGE ANTI-JOIN)
13.1 Hints For Online Application Upgrade (CHANGE_DUPKEY_ERROR_INDEX)
13.2 Hints For Online Application Upgrade (IGNORE_ROW_ON_DUPKEY_INDEX)
13.3 Hints For Online Application Upgrade (RETRY_ON_ROW_CHANGE)
14.1 Oracle Index 구조(B*Tree Index)
14.2 Oracle Index 구조(Bitmap Index)
14.3 비트맵 조인 인덱스(Bitmap Join Index)
14.4 Oracle Index 구조(Reverse Key Index)
15.1 Hints For Access Paths(FULL)
15.2 Hints For Access Paths(CLUSTER)
15.3 Hints For Access Paths(HASH)
15.4 Hints For Access Paths(INDEX, INDEX_COMBINE)
15.5 Hints For Access Paths(INDEX_ASC)
15.6 Hints For Access Paths(INDEX_DESC)
15.7 Hints For Access Paths(NO_INDEX)
15.8 Hints For Access Paths(NO_EXPAND)
15.9 Materialized View(구체화뷰)
15.10 Hints For Access Paths(REWRITE)
15.11 Hints For Access Paths(INDEX_FFS)
15.12 Hints For Access Paths(INDEX_SS)
15.13 Hints For Access Paths(INDEX_JOIN)
15.14 Hints For Access Paths(NATIVE_FULL_OUTER_JOIN)
16.1 중첩루프조인(Nested Loop Join)
16.2 Hints for Join Orders(ORDERED)
16.3 Hints for Join Orders(USE_NL)
16.4 Hints for Join Orders(USE_NL_WITH_INDEX)
16.5 Hints for Join Orders(NO_USE_NL)
16.6 해시조인(HASH JOIN, USE_HASH, NO_USE_HASH)
16.7 Hints for Join Orders(HASH_AJ)
16.8 Hints for Join Orders(HASH_SJ, NL_SJ)
16.9 Hints for Join Orders(USE_MERGE)
16.10 Hints for Join Orders(LEADING)
16.11 RBO에서의 드라이빙 테이블 선정
16.12 CBO에서의 드라이빙 테이블 선정
16.13 Semi Join(세미 조인)
16.14 Anti Join(안티조인)
17.1 Additional Hints(DRIVING_SITE)
17.2 Additional Hints(CACHE, NO_CACHE)
17.3 Additional Hints(CURSOR_SHARING_EXACT)
17.4 Additional Hints(GATHER_PLAN_STATISTCS)
17.5 Additional Hints(DYNAMIC_SAMPLING)
17.6 Additional Hints(RESULT_CACHE)
17.7 Additional Hints(QB_NAME)
18.1 Hints For Query Transformations(UNNEST, NO_UNNEST)
19.1 SQL문 튜닝을 위한 접근
19.2 SQL 작성 TIP
SQL튜닝 실전사례연구 SQL튜닝의 도구 AUTO TRACE, EXPLAIN PLAN,
현장 사례연구
INline View, With구문을 활용한 SQL문 튜닝
ORDER BY 튜닝(INDEX, INDEX_ASC, INDEX_DESC를 이용한 튜닝)
MAX, MIN 값의 튜닝(INDEX관련 힌트를 이용한 튜닝, MVIEW를 통한 튜닝)
MINUS를 사용한 그룹함수 튜닝
COUNT(*) 튜닝(index_ffs를 이용한 튜닝, MVIEW를 이용한 성능 튜닝)
Query 및 오라클함수에 대한 RESULT_CACHE 힌트를 이용한 튜닝
DISTINCT의 튜닝(EXISTS)
INDEX를 이용한 튜닝(Bitmap, Function Based Index)
비트맵 인덱스를 이용한 OR연산 튜닝
index_ss(SKIP SCANNING)을 이용한 리딩 칼럼이 없는 경우 튜닝
게시판 페이지 나누기 쿼리문 튜닝
순위 매기기 튜닝
서브쿼리 및 조인 튜닝
SQL문 작성 TIP
 

DBMS_SQL 패키지를 이용한 REF CURSOR(참조커서)

DBMS_SQL 패키지를 이용한 REF CURSOR(참조커서)

 ORACLE 11g이후 DBMS_SQL과 Native Dynamic SQL은 2개의 새로운 API를 통해 REF CURSOR와 DBMS_SQL의 CURSOR를 서로 변경할 수 있도록 있다.

DBMS_SQL.TO_REFCURSOR

 DBMS_SQL을 이용하여 만든 커서를 참조커서(REF CURSOR)로 변환한다.

-- 아래 예제는 EMP 테이블에서 입력한 부서코드의 사원을 출력하는 예제이다.
SQL> SET SERVEROUTPUT ON
SQL> ACCEPT p_deptno PROMPT 'Enter the Deptno:'
SQL> DECLARE
          -- 테이블타입은 데이터를 배열처럼 다룰 수 있는 타입인데
          -- 배열첨자를 위해 4바이트 정수형 PLS_INTEGER를 사용했다.
          TYPE emp_record IS TABLE OF emp%ROWTYPE
          INDEX BY PLS_INTEGER;
          v_emps    emp_record;
          v_sql    CLOB;
          v_cursor  PLS_INTEGER;
          v_rc      SYS_REFCURSOR;  --REF CURSOR형
          v_execute PLS_INTEGER;
      BEGIN
        v_cursor := DBMS_SQL.OPEN_CURSOR;
        v_sql := 'SELECT * FROM emp WHERE deptno = :deptno';
 
        -- Dynamic SQL문 파싱
        DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);
 
        -- 바인드변수 바인딩
        DBMS_SQL.BIND_VARIABLE(v_cursor, 'DEPTNO', '&p_deptno');
 
        -- SQL문 실행
        v_execute := DBMS_SQL.EXECUTE(v_cursor);
 
        -- REF CURSOR로 변환
        v_rc := DBMS_SQL.TO_REFCURSOR(v_cursor);
 
        -- REF CURSOR에서 데이터 추출
        LOOP
            FETCH v_rc BULK COLLECT INTO v_emps LIMIT 100;
            FOR i IN 1 .. v_emps.COUNT LOOP
              DBMS_OUTPUT.PUT_LINE(v_emps(i).ename || v_emps(i).sal);
            END LOOP;
            EXIT WHEN v_rc%NOTFOUND;
        END LOOP;
        CLOSE v_rc;
      END;
    /
'Enter the Deptno:: 20

구  19:      DBMS_SQL.BIND_VARIABLE(v_cursor, 'DEPTNO', '&deptno');
신  19:      DBMS_SQL.BIND_VARIABLE(v_cursor, 'DEPTNO', '20');
SMITH800
……
FORD3000

-- 이번에는 REF CURSOR를 리턴해 보자.
-- 아래처럼 함수의 리턴타입을 SYS_REFCURSOR로 하면 컴파일은 되지만 클라이언트쪽에서 출력되지 않는다.(Oracle 11g Release2 이후에는 가능하다)

SQL> CREATE OR REPLACE FUNCTION emplist (p_deptno emp.deptno%TYPE)
  2      RETURN SYS_REFCURSOR
  3  IS
  4        v_sql    CLOB;
  5        v_cursor  PLS_INTEGER;
  6        v_rc      SYS_REFCURSOR;  --REF CURSOR형
  7        v_execute PLS_INTEGER;
  8    BEGIN
  9        v_cursor := DBMS_SQL.OPEN_CURSOR;
 10      v_sql :='SELECT * FROM emp WHERE deptno = :deptno';
 11
 12        -- Dynamic SQL문 파싱
 13        DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);
 14
 15        -- 바인드변수 바인딩
 16        DBMS_SQL.BIND_VARIABLE(v_cursor, 'DEPTNO', p_deptno);
 17
 18        -- SQL문 실행
 19        v_execute := DBMS_SQL.EXECUTE(v_cursor);
 20
 21        -- REF CURSOR로 변환
 22        v_rc := DBMS_SQL.TO_REFCURSOR(v_cursor);
 23
 24        return v_rc;
 25    END;
 26    /

함수가 생성되었습니다.

SQL> set autoprint on
SQL> variable refcur REFCURSOR
SQL> BEGIN
  2      :refcur := emplist(10);
  3  END;
  4  /
BEGIN
*
1행에 오류:
ORA-03001: 현재에는 구현되어 있지 않은 기능입니다
ORA-06512: "SYS.DBMS_SQL",  1104행
ORA-06512: "SCOTT.EMPLIST",  13행
ORA-06512:  2행

ERROR:
ORA-24338: 문장 처리가 수행되지 않았습니다

-- 출력이 되도록 하고 싶으면 이전에 작성한 형태대로 별도의 패키지등에서 REF CURSOR 타입을 미리 정의하면 된다.
SQL> create or replace package types
as
type curtype is ref cursor;
end;
/

SQL> CREATE OR REPLACE FUNCTION emplist (p_deptno emp.deptno%TYPE)
    RETURN TYPES.CURTYPE
IS         
      v_sql    CLOB;
      v_cursor  PLS_INTEGER;
      v_rc      TYPES.CURTYPE;  --REF CURSOR형
      v_execute PLS_INTEGER;
  BEGIN 
      v_cursor := DBMS_SQL.OPEN_CURSOR;     
    v_sql :='SELECT *  FROM emp WHERE deptno = :deptno';
 
      -- Dynamic SQL문 파싱
      DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);
 
      -- 바인드변수 바인딩
      DBMS_SQL.BIND_VARIABLE(v_cursor, 'DEPTNO', p_deptno);
 
      -- SQL문 실행
      v_execute := DBMS_SQL.EXECUTE(v_cursor);
     
      -- REF CURSOR로 변환
      v_rc := DBMS_SQL.TO_REFCURSOR(v_cursor);
     
      return v_rc;
  END;
/

SQL> set autoprint on
SQL> variable refcur REFCURSOR
SQL> BEGIN
  2      :refcur := emplist(10);
  3  END;
  4  /

    EMPNO ENAME      JOB          MGR  HIREDATE    SAL      COMM    DEPTNO
    -----------------------------------------------------------------------------------------------------
      7782  CLARK      MANAGER    7839    81/06/09    3404.4              10
      7839  KING      PRESIDENT            81/11/17    6946.8              10
      7934  MILLER    CLERK        7782    82/01/23    2257.5              10 

[PL/SQL예외]사전에정의된예외,Predefined Exception

[PL/SQL예외]사전에정의된예외,Predefined Exception

Predefined Exception

 오라클 서버에 사전에 정의된 예외, 자주 발생하므로 오라클 서버 오류번호와 예외명을 미리 매칭시켜 둔 것이다.

Exception Oracle Error SQLCODE Description
ACCESS_INTO_NULL 06530 -6530 NULL Object가 할당되는 경우
CASE_NOT_FOUND 06592 -6592 CASE문을 ELSE없이 사용시 WHEN절에 만족하는 경우가 없을 때
DUP_VAL_ON_INDEX 00001 -1 UNIQUE INDEX 중복오류
INVALID_CURSOR 01001 -1001 커서 조작 실수
INVALID_NUMBER 01722 -1722 숫자를 문자로 바꾸는 경우에 숫자로 바꿀수 없는 문자를 숫자로 바꾸는 경우
LOGIN_DENIED 01017 -1017 사용자명 or 비밀번호 맞지 않은 경우
NO_DATA_FOUND 01403 +100 SELECT 했는데 데이터가 한건도 추출되지 않는 경우
NOT_LOGGED_ON 01012 -1012 로그온 되지 않은 상황에서 SQL문을 실행했을 때
PROGRAM_ERROR 06501 -6501 PL/SQL 내부 오류
ROWTYPE_MISMATCH 06504 -6504 커서 패치하는 경우 데이터 타입이 불일치
STORAGE_ERROR 06500 -6500 PL/SQL등에서 OUT OF MEMORY 발생시
TOO_MANY_ROWS 01422 -1422 BEGIN내부에서 SELECT 사용시 여러건의 데이터가 추출되는 경우
VALUE_ERROR 06502 -6502 산술연산의 변환, 절삭, 사이즈 오류시 발생
ZERO_DIVIDE 01476 1476 숫자를 0으로 나누는 경우에 발생

-- 예외처리를 하지 않은 경우
SQL> create or replace procedure showempbyjob
    (v_job in emp.job%type)
    is
      v_ename emp.ename%type;
      v_sal emp.sal%type;
    begin
      select ename, sal
      into v_ename, v_sal
      from emp
      where job = v_job;
 
      dbms_output.put_line('이름'||'급여');
      dbms_output.put_line('--------------------');
      dbms_output.put_line(v_ename || v_sal);
  end;
  /
프로시저가 생성되었습니다.

SQL> exec showempbyjob('CLERK')
BEGIN showempbyjob('CLERK'); END;
*
1행에 오류:
ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
ORA-06512: "SCOTT.SHOWEMPBYJOB",  7행
ORA-06512:  1행

-- 사전에 정의된 예외를 이용하여 예외처리를 한 경우
SQL> create or replace procedure showempbyjob
    (v_job in emp.job%type)
    is
      v_ename emp.ename%type;
      v_sal emp.sal%type;
    begin
      select ename, sal
      into v_ename, v_sal
      from emp
      where job = v_job;
 
      dbms_output.put_line('이름'||'급여');
      dbms_output.put_line('--------------------');
      dbms_output.put_line(v_ename || v_sal);
  exception
      when no_data_found then
        dbms_output.put_line('해당 직종의 사원은 없음...');
      when too_many_rows then
        dbms_output.put_line('해당 직종을 가진 사원이 2건 이상...');
      when others then
        dbms_output.put_line(SQLCODE || ':' || SQLERRM);
  end;
  /
프로시저가 생성되었습니다.

SQL>  exec showempbyjob('CLERK')
해당 직종을 가진 사원이 2건 이상...

-- 예외처리를 하지 않은 경우
SQL> create or replace procedure insertemp
    (v_empno in emp.empno%type,
    v_ename in emp.ename%TYPE,
    v_sal in emp.sal%TYPE)
    is
    begin
      insert into emp(empno, ename, sal) values (v_empno, v_ename, v_sal);
      commit;
    end;
  /
프로시저가 생성되었습니다.

SQL> exec insertemp(7369,'오자커',9999)
BEGIN insertemp(7369,'오자커',9999); END;
*
1행에 오류:
ORA-00001: 무결성 제약 조건(SCOTT.PK_EMP)에 위배됩니다
ORA-06512: "SCOTT.INSERTEMP",  7행
ORA-06512:  1행

-- 예외처리를 한 경우
SQL> create or replace procedure insertemp
    (v_empno in emp.empno%type,
    v_ename in emp.ename%TYPE,
    v_sal in emp.sal%TYPE)
    is
    begin
      insert into emp(empno, ename, sal) values (v_empno, v_ename, v_sal);
      commit;
    exception
    when dup_val_on_index then
      dbms_output.put_line('데이터가 중복 됩니다...');
  end;
  /
프로시저가 생성되었습니다.

SQL> set serverout on
SQL> exec insertemp(7368,'오자커736',9999)
데이터가 중복 됩니다... 

2015년 8월 26일 수요일

안드로이드앱개발기초실무강좌(Adnroid 교육강좌)-본인부담0~20%


 
소수 정예 과정!!
  
자세한 교육일정/상세 및 지원방법은 아래 URL에서 확인 바랍니다.
 
 
 

 
안드로이드개발자과정

강좌명 안드로이드앱개발기초실무
오라클자바커뮤니티(ojc.asia) 추천 실전강좌
교재 자체교재 or PDF 무료제공
강좌 일정 상단 URL 참조(최소 개강인원은 5명이며, 5명 미만인 경우 1~2주 정도 강좌가 연기될 수 있습니다.)
강의 장소 [C강의장]구로디지털단지역2번 출구 -> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 횡단보도 건너기 --> 우회전 후 구로호텔 직전 좌측길, 호텔 바로 뒤편 파트너스타워2차 301호
[약도보기]
지원절차 - 강좌내용 확인 후 페이지 하단 "지원하기" 버튼 클릭
- 고용보험 가입자인 경우 관련 서류 제출(아래 "제출서류" 확인)
- 교육전 : 개강일자/시간 및 공지사항에 대하여 전화 또는 문자 공지
- 교육당일 : 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌 진행방식 등)
- 강좌 수강, 수시로 제출되는 이론/실습 과제에 대하여 제출후 SKILL UP
- 교육후 : 메인 페이지 좌측 배너 클릭 후 교육 후 설문 작성
근로자개인
지원/결제안내
- 평일주간 교육은 사업주환급 교육만 가능하며 근로자 개인수강지원(근로자카드,내일배움카드)은 불가능.
- 근로자 개인수강지원의 경우 재직자내일배움카드 또는 근로자카드 발급 받으신분만 수강가능
- 근로자 카드는 고용보험 가입자라면 누구나 간단한 절차를 통해 발급가능.(근로자카드제도 및 발급안내)
- 본인부담액은 교육비의 0~20% 이며 계좌이체 ,근로자카드 또는 개인카드로 결제가능
카드를 수령하지 않았더라도 근로자카드 신청 후 노동부 승인 받은 상태(2~3일 이후)라면 수강 가능.
- 상시근로자 300인 이상 대기업 재직자(50세미만)는 근로자카드/내일배움카드 지원 불가.
사업주훈련
지원/결제안내
- 고용보험 가입자에 대하여 교육비 환급 가능
채용예정(확정)된 분은 현재 고용보험 미가입이라도 교육가능.(채용예정 기업에서 결제하고 해당 기업으로 환급)
- 교육비는 전액 계좌이체 또는 카드(내방결제만 가능)로 교육전 결제 해야 하며 출석룔80% 이상 수료후 회사에서 관할 산업인력 공단으로 환급신청서 제출해서 환급절차 진행해야 되고 보통 2~3주 정도 후 회사로 환급(환급룔은 과정마다 다르니 확인필요)
수강료
입금안내
- 계좌이체(메인페이지 좌측 신한은행 계좌)
- 카드결제는 방문 카드 결제만 가능하며 온라인 카드결제는 지원하지 않습니다.
- 평일주간 기업100%환급 교육은 계좌이체만 가능합니다.
제출서류 - 고용주/사업주 환급 : 상단 정보마당/자료실의 1번 근로자동의서, 2번 훈련위탁계약서(평일주간 교육은 2번만 필요)
- 근로자/내일배움 카드과정 : 상단 정보마당/자료실의 5번 근로자카드,내일배움카드지원자용 신청서
- 제출방법 : 이메일(webmaster@oraclejavacommunity.com) or 팩스(0505-719-4790) or 내방
수강료 및
환급금액
강사소개
상단 URL 참조

[휴강] 법정공휴일

[강사 소개] 본원은 실무에 계신분들이 시간을 내서 강좌를 진행하기에 일부 변동 사항이 있을 수 있으며 강좌가 한 강사님께 고정되지 않는 부분이 있으니 참조 바랍니다.

롯데타워 건물관리 Android/Spring3.x, JSP, MyBatis, jQuery/MySQL, SQLite
금융권 WAS, EJB 업그레이드 EJB,JSP/Oracle
전자금융서비스 Spring3.x, JSP, iBatis, jQuery/Oracle
POP 서비스 Android/SQLite
마이초이스 게임 Android/SQLite
그룹웨어개발 Android/Spring3.x, JSP, MyBatis, jQuery/MySQL, SQLite
셀시티 Spring/MyBatis,JSP, iBatis, jQuery/MySQL
QOOK Voice Spring3.X, JSP, iBatis, jQuery,VXML/MySQL
QOOK 한글로서비스 Spring3.X, JSP, iBatis, jQuery/MySQL
증권사 차세대 시스템 Spring3.X, JSP, iBatis, jQuery/Oracle
카드사 차세대 시스템 Spring2.5, JSP, iBatis, jQuery/Oracle

외 다수

프로젝트 개발경력 8년, 오라클자바커뮤니티 자바,스프링,안드로이드 전문강사
최근 개발기술과 관련된 부분을 교육을 통해 배워 보세요^^
문의안내 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 안드로이드는 운영체제를 리눅스에서 빌려왔고 언어는 자바를 채용했으며 개발툴은 이클립스를 사용하여 보다 자바 개발자들에게는 친숙한 환경이며 현시대 스마트폰 개발을 주도하고 있습니다.

또한 본 강좌는 실무 개발시 유연한 개발이 가능하도록 안드로이드에 대한 소개와 개발툴 설치부터 예제 작성 및 관리법까지 예제 중심/실습중심으로 진행되는 과정이며 안드로이드 플랫폼의 이해를 통해 자바 엔지니어 또는 기존 모바일 엔니지어가 쉽게 안드로이드 애플리케이션을 개발할 수 있도록 하며 객체지향개념을 적용한 애플리케이션 개발방법을 프로젝트 기반으로 제공하는과정 입니다.

자바기초가 있는 분들은 대상으로 하며 자바에서부터시작하여 안드로이드 프로그래머로서 거듭날 수 있도록 실용도가 높은 강의 내용을 제공합니다. 실습 위주의 수업을 통해 확실한 이론을 쌓을 수 있도록 안내 합니다. 더불어 확장포인트를 안내하여 실무에 바로 사용할 수 있는 안드로이드 프로그래머 기초/양성과정입니다.
교육목표 - Android 기본 개념의 이해
- Android SDK와 도구들의 설치 방법 및 기본적인 사용법 이해
- Android 응용프로그램 설계의 필수 요소 이해
- Android API 사용법
- Android 기본위젯, 애플리케이션 구성에 대한 이해
- Android 사용자 인터페이스 설계의 필수 요소 이해
- Android 아키텍처와 LifeCycle 이해 및 응용 능력 강화
- Android UI & UI Event, 주요 컴포넌트에 대한 이해를 통한 응용 개발 능력 강화
- Android 응용프로그램의 제작과 배포
교육대상 - Java 기반 애플리케이션 엔지니어
- 자바를 한번이상 배운 학생 및 초보 개발자
- 자바개발자 인데 안드로이드 앱개발자로 전향을 원하는 개발자
- 앱개발에 관심 있는 모든 초보자들(단 자바기초지식은 있어야 합니다.)
선수학습 - 자바 Fundamental
 

안드로이드 개발환경 설정

Java, IDE(Eclipse or Studio), ADT, SDK

개발도구 사용법

ADT, SDK, ADB, DDMS, Log Cat, Tomcat

화면 디자인

Theme, XML기반 선언적 프로그래밍(Layout, View, 배경, 버튼, 애니메이션)

자바기초 및 이벤트 처리

상속구조, 다양한 Event 처리방법, Thread, AsyncTask, Handler

사용자와 대화

Activity, Toast, Dialog, Popup, Notification

컴포넌트간의 대화

명시적 Intent, 암시적 Intent, Flag, 인텐트 Filter 설정을 통한 주고 받기

정보의 백업

SaveInstance, Preference

활용도 높은 클래스 사용하기

SoundPool, TTS, Timer, Vibrator

활용도 높은 위젯 사용하기

ViewFlipper, Spinner, TabHost, SeekBar

ListView 활용하기

Custom Item, Multi Custom Items, Expandable ListView

Fragment 활용하기

가로-세로모드 처리, Sliding Menu

Menu and ActionBar

XML기반 메뉴구성, 프로그래밍적 ActionBar의 활용, Search

데이터 관리

File, SQLiteDatabase, Provider 연동

WebView

Java와 Javascript의 연동 웹앱 프로그래밍

Service and Receiver

AIDL, SMS, Telephone 수신 처리

네트워크

RPC, API-XML, API-Jason, 서블릿연동, NFC, TCP/IP

LBS and GoogleMap

위도경도와 주소간의 정보 전환, 지도 및 위치추적 서비스

앱개발 확장

Sensors, Color-Picker, Chart, MediaPlayer, Calendar
실무 프로젝트 RealProject

-> 화면/기능 설계
-> 사용자 UI제작
-> 사용자 UI 컨트롤 기능 구현
-> 각기능에 대한 코딩
-> 팀별 기능 구현상 문제점 정리 ReView
-> 발표 및 배포