1. /WEB-INF/tags 폴더 : "태그 파일" 기반의 커스텀태그

2. /WEB-INF/tld 폴더 : "핸들러 클래스" 기반의 커스텀태그

 

/WEB-INF/tags/* → /app_config/tags/* 로 경로를 변경할 수 있을까? 

확인한 바로는 이동 불가하다.

 

참고 문서 : https://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

Tag File Location

Tag files can be placed in one of two locations: in the /WEB-INF/tags/ directory or subdirectory of a web application or in a JAR file (see Packaged Tag Files) in the /WEB-INF/lib/ directory of a web application. Packaged tag files require a tag library descriptor (see Tag Library Descriptors), an XML document that contains information about a library as a whole and about each tag contained in the library. Tag files that appear in any other location are not considered tag extensions and are ignored by the web container.

 

 

 

/WEB-INF/tld/* → /app_config/tld/* 로 경로를 변경할 수 있을까? 

가능하다.

 

web.xml 파일에서 아래와 같이 경로를 설정하면 된다.

<jsp-config>
	<taglib>
		<taglib-uri>
			http://abcdefg.co.kr
		</taglib-uri>
		<taglib-location>
			/app_config/tld/abcdefg.tld
		</taglib-location>    
	</taglib>
</jsp-config>

<welcome-file-list>
        <welcome-file>/</welcome-file>
</welcome-file-list>

 

WebContent - WEB-INF/tags

                 - app_config/tld

 

위와 같이 WebContent 하위에서 이동은 가능하지만 그 외 이동은 불가하다.

예를 들어 특정 외부 폴더 (C:/project/Appserver/tomcat/app_config/tld) 로 이동은 안된다.

'JSP' 카테고리의 다른 글

[JSP] cannot be resolved to a type 오류 해결  (0) 2020.10.26
개요

Spring을 사용하면서 보통 *-context.xml, *-properties.xml 과 같은 설정파일은 src/main/resources 아래 위치하여 사용한다.

프로젝트를 war로 Export 하면 보통 /WEB-INF/classes/config/* 에 설정파일이 위치한다.

하지만, 설정파일 모두를 외부 특정 폴더로 이동시켜야 한다면, 톰캣의 외부 classpath 설정은 어떻게 할까?

 

상황 설명

예를 들어 src/main/resources 아래 *-context.xml, *-properties.xml 파일이 있고

Maven Build(Goals : clean package) 하면, 설정파일들을 외부 경로(C:/Project/Appserver/tomcat/app_config) 에 위치한다. 

이런 경우 Tomcat의 외부 폴더를 classpath로 설정해야지 설정파일을 읽어서 정상적으로 동작할 수 있다.

 

방법

tomcat 설정 후 아래 사진과 같이 classpath를 설정한다.

Scope : 해당 의존성을 언제 어떻게 Class Path에 넣어서 사용할 것인가를 정의하는 값이다.

 

Scope Type 

1. Compile : 
 - Compile 시점에 필요하다.
 - 기본값(=Default)이다.
 - 프로젝트의 모든 Class Path에 추가된다.
 - 기본값이기 때문에 만일 scope 설정을 안하면 compile이 기본입니다
 
2. Runtime : 
 - Runtime 시점에 필요하다.
 - Compile 시점에는 필요가 없지만 실행 시점에는 필요하다.
 - Runtime, 테스트 시 Class Path에 추가 되지만 Compile시에는 추가 되지 않는다.
 - ex) JDBC 드라이버
 
3. Provided :
 - Compile 시점에 필요하지만 배포시점에는 불필요한 라이브러리로 JDK, servlet API, Java EE API 등이 해당된다.
 - provided 스코프는 최종 Build Artifact 에 포함되지 않을 때 사용한다. 
 - 예를 들면 프로젝트가 servlet api를 의존하고 있는데, tomcat에서는 기본적으로 servlet api을 제공하고 있을 경우 artifact 에 포함시킬 필요가 없다.
 - Scope 값을 provided로 설정한 의존성에 대해서는 Runtime 시점에 JDK 혹은 컨테이너가 제공한다.
 - 간략 요약하면 Wep Application 개발 시 Servlet API or Java EE API들은 provided Scope으로 지정해야한다. 왜냐하면 톰캣과 같은 컨테이너가 제공해주기 때문이다.
 - 만약 운영환경에서 servlet-api.jar 중복으로 인한 문제가 발생한다면 꼭 provided로 바꿔주셔야 합니다.
 - ex) Servlet API
 
4. Test
 - Compile 시점에 필요하다.
 - 배포때는 제외된다.
 - ex) JUnit
 
5. system
 - system은 provided와 유사하지만 JAR 파일을 직접 사용합니다.
 - 이 때는 JAR 파일의 위치를 지정하는 systemPath 엘리먼트가 따라와야 해요.

에러 내용

ORA-12899: value too large for column

"스키마"."테이블명"."컬럼" (actual: m, maximun: n)

 

→ 해당 테이블 컬럼값의 타입 길이보다 실제 입력된 값이 커서 발생하는 에러이다.

 

해결 방법

해당 테이블의 컬럼의 타입과 길이를 확인하고, 문제가 발생하는 데이터를 찾는다.

이때 문자열 길이 함수를 사용한다.

 

에러 처리 방법은 아래 두가지 방법 중 하나를 선택한다.

1. 해당 문제가 되는 데이터를 찾아 값을(길이) 수정한다.

2. 해당 테이블의 컬럼 길이를 수정한다. ( 예 : VARCHAR2(30) → VARCHAR2(40) )

 


글자 수 구하기 LENGTH()

SELECT * FROM EMP

WHERE LENGTH(ENAME) = 5;

 

바이트 수 구하기 LENGTHB()

SELECT * FROM EMP

WHERE LENGTHB(ENAME) = 5;

 

LENGTH 함수는 입력된 문자열의 글자 수를 반환하고 LENGTHB 함수는 바이트 수로 반환한다. LENGTHB 함수는 시스템 문자셋 설정에 따라서 한글을 2byte 또는 3byte로 계산하므로 주의해야 한다.

 

시스템 문자셋을 확인하는 방법 (몇 byte로 계산되는지), CONVERT()

한글 문자셋

- KO16KSC5601(2byte)

- KO16MSWIN949(2byte)

- UTF8(3byte)

- AL32UTF8(3byte)

 

SELECT * 
 FROM nls_database_parameters 
WHERE parameter LIKE 'NLS_CHARACTERSET'

 

[결과]

PRAMETER VALUE
NLS_CHARACTERSET AL32UTF8

 

한글을 2byte로 인식하게 하기 (3byte → 2byte)

SELECT LENGTHB(CONVERT('오라클', 'KO16MSWIN949')) AS LENGTHB
 FROM dual;

 

[결과]

LENGTHB
6

 

 

3장 인스턴스 & 컴포넌트

1. Vue 인스턴스 속성 
 1) data : data 부분
 2) el : html id를 가진 요소를 의미함
 3) template : 화면에 표시할 html, css 등의 태그 요소를 정의하는 속성
 4) methods : 화면 로직의 제어와 관계된 메소드를 정의하는 속성 (이벤트 처리와 같은 로직)
 5) created : 뷰 인스턴스가 생성되자마자 실행할 로직을 정의할 수 있는 속성
 
2. 뷰 인스턴스 라이프 사이클


 1) 인스턴스 생성 → 인스턴스를 화면에 부착
  1> beforeCreate : 인스턴스가 생성되고 나서 가장 처음으로 실행되는 단계 (data 속성과 methods 속성이 아직 인스턴스에 정의되어 있지 않고 돔과 같은 화면 요소에도 접근할 수 없음)
  2> created : data 속성과 methods 속성에 정의도니 값에 접근하여 로직을 실행할 수 있는 단계 (서버에 데이터를 요청하여 받아오는 로직을 수행하기 좋은 단계)
  3> beforeMount : template 속성을 el에 지정한 화면 요소에 인스턴스를 부착하기 직전 단계
  4> mounuted : el 속성에 지정한 화면 요소에 인스턴스가 부착되고 호출되는 단계로 template 속성에 정의한 화면 요소에 접근할 수 있어 화면 요소를 제어하는 로직을 수행하기 좋은 단계

 2) 인스턴스를 화면에 부착 → 인스턴스 내용 갱신
  1> beforeUpdate : 인스턴스에 정의한 속성이 화면에 치환되는 단계 (데이터가 변경되면 가상 돔으로 화면을 다시 그리기 전에 호출되는 단계, 변경 예정 데이터의 값과 관련된 로직을 미리 넣을 수 있음)
  2> update : 데이터가 변경되고 나서 가상 돔으로 다시 화면을 그리고 나면 실행되는 단계
 
 3) 인스턴스 내용 갱신 → 인스턴스 소멸  
  1> beforeDestroy : 뷰 인스턴스가 파괴되기 직전에 호출되는 단계 (인스턴스에 접근할 수 있음, 데이터를 삭제하기 좋은 단계)
  2> destroyed : 뷰 인스턴스가 파괴되고 나서 호출되는 단계

3. 컴포넌트 : 조합하여 화면을 구성할 수 있는 블록을 의미함
 1) 컴포넌트 등록 방법
  1> 전역 컴포넌트 등록
Vue.component('my-component', {
       template: '<div> 전역 컴포넌트가 등록되었습니다!</div>'
    });
  
  2> 지역 컴포넌트 등록
new Vue({
        components: {
  // 컴포넌트 이름 : 컴포넌트 내용
          'my-local-component': cmp
        }
});

4. 하위에서 상위 컴포넌트로 이벤트 전달하기
 1) 이벤트 발생 :
this.$emit('이벤트명');
 2) 이벤트 수신 :
<child-component v-on:show-log="printText"></child-component>
- show-log : 이벤트명
- printText : 상위 컴포넌트의 메소드명

context 네임스페이스 설정

어노테이션 설정을 하려면 스프링 설정파일의 루트 엘리먼트인 <beans>에 Context 관련 네임스페이스와 스키마 문서의 위치를 등록해야 한다.

 

xmlns:context="http://www.springframework.org/schema/context" 

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd"

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	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-4.2.xsd">
	
</beans>

 

컴포넌트 스캔(component-scan) 설정

스프링 설정파일에 사용할 객체들을 <bean> 등록하지 않고 자동으로 생성하려면 <context:component-scan/> 엘리먼트를 사용해야 한다.

이 설정을 추가하면 스프링 컨테이너는 클래스 path에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성한다.

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	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-4.2.xsd">
	
	<!-- Context nameSpace 추가, 해당 Package class에 @Component 선언해야함! -->
	<context:component-scan base-package="polymorphism"></context:component-scan>
</bean>

 

@Component

스프링 설정파일에 <context:component-scan> 설정을 했다면. 사용할 객체의 클래스 선언부 위에 @Component 를 설정하면 된다.

package polymorphism;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class LgTV implements TV {
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}
}

 

그러나 위에 코드는 클라이언트 프로그램에서 LgTV 객체를 요청할 수는 없다.

클라이언트가 스프링 컨테이너가 생성한 객체를 요청하려면, 요청할 때 사용할 아이디나 이름이 반드시 설정되야함!

→ @Component("tv")

public class TVUser {

	public static void main(String[] args) {
		// 1. Spring 컨테이너를 구동한다.
		AbstractApplicationContext factory = new GenericXmlApplicationContext("root-context.xml");

		// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
		TV tv = (TV) factory.getBean("tv");
    }
}
package polymorphism;

import javax.annotation.Resource;
import org.springframework.stereotype.Component;

@Component("tv")
public class LgTV implements TV {
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}
}

 

@Autowired

@Autowired 는 생성자나 메소드, 멤버변수 위에 모두 사용할 수 있음

주로 멤버변수 위에 선언하여 사용함

스프링 컨테이너는 멤버 변수 위에 붙은 @Autowired 를 확인하는 순간 해당 변수의 타입을 체크한다. 그리고 그 타입의 객체가 메모리에 존재하는지를 확인한 후에, 그 객체를 변수에 주입한다.

 

만약 @Autowired 가 붙은 객체가 메모리에 없다면 스프링 컨테이너는 NoSuchBeanDefinitionException을 발생시킨다.

package polymorphism;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("tv")
public class LgTV implements TV {
	@Autowired
	private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}
package polymorphism;

public interface Speaker {
	void volumeUp();
	void volumeDown();
}
package polymorphism;

import org.springframework.stereotype.Component;

@Component("sony")
public class SonySpeaker implements Speaker{
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("SonySpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("SonySpeaker---소리 내린다.");
	}
}

 

@Qualifier

문제는 의존성 주입 대상이 되는 Speaker 타입의 객체가 두개 이상일 때 발생한다.

만약 SonySpeaker와 AppleSpeaker 객체가 모두 메로리에 생성되어 있는 상황이라면, 스프링 컨테이너는 어떤 객체를 할당할지 스스로 판단할 수 없어서 에러를 발생시킨다.

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: (생략~)
expected single matching bean but found 2 : apple, sony

위와 같은 상황일 때, @Qualifier 어노테이션을 이용하면 의존성 주입될 객체의 아이디나 이름을 지정할 수 있는데, 이때 Speaker 객체의 이름(sony, apple) 중 사용할 하나를 지정한다.

 

package polymorphism;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("tv")
public class LgTV implements TV {
    @Autowired
    @Qualifier("sony")
    private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}

 

어노테이션과 XML 설정 병행하여 사용하기

변경되지 않는 객체는 어노테이션으로 설정하고, 변경될 가능성이 있는 객체는 XML 설정으로 사용한다.

 - 변경되지 않는 객체 : LgTv.java

 - 변경될 가능성이 있는 객체 : SonySpeaker.java, AppleSpeaker.java

package polymorphism;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("tv")
public class LgTV implements TV {
    @Autowired
    private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}
package polymorphism;

public class SonySpeaker implements Speaker{
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("SonySpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("SonySpeaker---소리 내린다.");
	}
}
package polymorphism;

public class AppleSpeaker implements Speaker {
	public AppleSpeaker() {
		System.out.println("===> AppleSpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("AppleSpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("AppleSpeaker---소리 내린다.");
	}
}
<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	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-4.2.xsd">
	
	<!-- LgTv는 어노테이션으로, Speaker는 <bean> xml 설정으로 SonySpeaker 주입 -->
	<context:component-scan base-package="polymorphism"></context:component-scan>
	<bean id="sony" class="polymorphism.SonySpeaker"></bean>
 </beans>

 

어노테이션, <bean>설정 주의사항

직접 개발한 클래스는 어노테이션을 사용할 수도 있고, <bean>를 등록하여 XML 설정을 할 수도 있다.

하지만 라이브러리 형태로 제공되는 클래스는 반드시 XML 설정을 통해서만 사용할 수 있음!

 

예를들어 commons-dbcp-1.4.jar 라이브러리를 이용하여 DB연결을 할 때 XML 설정을 통해 사용해야 한다.

 

정의

스프링 설정파일에 class를 등록하려면 <bean> 엘리먼트를 사용한다.

이때 id와 class 속성을 사용하는데, id는 생략 가능하다.

 

<bean> 엘리먼트 속성

id 속성 : 자바의 식별자 작성 규칙을 따름(CamelCase)

name 속성 : 자바의 식별자 작성 규칙이 아닌, 특수기호가 포함된 아이디를 <bean>으로 지정할 때 사용함

 

init-method : 스프링 컨테이너는 스프링 설정파일에 등록된 클래스를 객체 생성할 때 디폴트 생성자를 호출한다.

객체를 생성한 후에 멤버변수 초기화 작업이 필요할 때, init-method 속성을 class파일에 사용한다.

즉 <bean>에 등록된 객체가 생성된 후 init-method로 지정된 "initMethod()"를 호출한다. 

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod"></bean>
package polymorphism;

public class SamsungTV implements TV {
	public void initMethod(){
    	System.out.println("객체 초기화 작업");
    }
}

 

destroy-method : 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 메소드를 지정할 수 있다.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" destroy-method="destroyMethod"></bean>
package polymorphism;

public class SamsungTV implements TV {
	public void destroyMethod(){
    	System.out.println("객체 삭제 전에 처리할 로직 처리");
    }
}

 

lazy-init : 스프링 컨테이너가 구동되면, 구동되는 시점에 스프링 설정 파일에 등록된 <bean>들을 생성하는 즉시 로딩 방식으로 동작한다.

자주 사용되지 않으면서 메모리를 많이 차지하여 시스템에 부담을 주는 경우가 있기 때문에, 해당 <bean>이 사용되는 시점에 객체를 생성하도록 lazy-init 속성을 사용한다.

즉 클라이언트가 요청하는 시점에 생성한다.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" lazy-init="true"></bean>

 

scope="singleton" : 클래스를 하나만 생성하여 유지하고 싶을때 싱글톤 패턴을 사용하는데, 스프링 컨테이너도 이러한 기능을 scope 속성을 통하여 제공한다.

scope 속성값은 기본이 싱글톤이다. (=값을 생략하면 싱글톤으로 적용됨)

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"></bean>

 

scope="prototype" : 반대로 스프링 컨테이너가 해당 <bean>을 요청될 때마다 매번 새로운 객체를 생성하여 반환할 땐 아래와 같이 사용함.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" scope="prototype"></bean>

 

에러 내용

Error occured processing XML 'Are you using a JRE with an outdated version of '. See Error Log for more details

 

발생 원인

Spring root-context.xml 파일을 생성하자 위와 같은 오류가 발생하였다.

 

해결 방법

아래 사진과 같이 프로젝트에서 마우스 오른쪽 클릭 - Spring - Remove Spring Project Nature 클릭하면 해결된다.

1. 목적 : Spring 프로젝트 생성 후 오라클 DB jdbc 설정하여 정상적으로 연동되어 데이터 조회가 되는지 확인한다.

 

2. SPEC : 

 1) eclipse : 2020-06 (4.16.0)

 2) STS plug in 설치 : Marketplace에서 sts 검색 후 "Spring Tool 3 Add on ~~ " 설치

 3) DB : oracle 11g R2


스프링 pom.xml 설정
<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>4.3.2.RELEASE</org.springframework-version>
	<org.aspectj-version>1.6.10</org.aspectj-version>
	<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

<!-- ojdbc 다운받기위해 추가 -->
<repositories>
	<repository>
		<id>oracle</id>
		<name>ORACLE JDBC Repository</name>
		<url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
	</repository>
</repositories>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency> 
<!-- MyBatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.5</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.3.2</version>
</dependency>
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency> 
<!-- Oracle -->
<dependency>
	<groupId>com.oracle.database.jdbc</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0.4</version>
</dependency>

 

Spring 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 https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

 

Spring TEST 소스 작성 (ex01.java)
package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ex01 {

	public static void main(String[] args) {
		// 1단계 : 데이터 베이스 연결
		try {
			String className = "oracle.jdbc.driver.OracleDriver";
			Class.forName(className);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		// 2단계 : 연결을 관리하는 객체 생성
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
			/* "jdbc:oracle:thin:@"192.168.0.23":1521:xe"; 로 선택 가능 */
			String id = "scott";
			String pass = "scott";

			Connection conn = DriverManager.getConnection(url, id, pass);

			// 3단계 : 작업관리(Query)
			PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM dept");

			// 4단계 : 결과처리
			ResultSet rs = pstmt.executeQuery();

			while (rs.next()) {
				int deptNo = rs.getInt("deptno");
				String deptName = rs.getString("dname");
				String loc = rs.getString("loc");

				System.out.println(deptNo + "\t" + deptName + "\t" + loc);
			}

			// 5단계 : 종료
			rs.close();
			pstmt.close();
			conn.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

ex01.java 실행 결과 (Run As - Java Application)
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES		CHICAGO
40	OPERATIONS	BOSTON

 

JDBCUtil.java 파일 생성

 - DB 설정 내용을 저장해 놓고 재사용하고 싶은 경우 사용함.

package com.springbook.biz.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUtil {
	public static Connection getConnection() {
		try {
			//Class.forName("org.h2.Driver");
			//return DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
			Class.forName("oracle.jdbc.driver.OracleDriver");
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL",	"scott", "scott");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void close(PreparedStatement stmt, Connection conn) {
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}

	public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
		if (rs != null) {
			try {
				if (!rs.isClosed())
					rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}
}

 

TRUNC 함수는 주로 소수점 절사 및 날짜의 시간을 없앨 때 사용한다.

 

SELECT DT

        , TRUNC(DT) --시간 절사

        , NMB

        , TRUNC(NMB) --소수점 절사

FROM TEMP

 

SELECT DT

        , TRUNC(DT, 'DD') --시간 절사

        , TRUNC(DT, 'HH24') --분, 초 절사

        , TRUNC(DT, 'MI') --초 절사

FROM TEMP

 

SELECT DT

        , TRUNC(DT, 'YEAR') --월, 일 초기화

        , TRUNC(DT, 'MONTH') --일 초기화

        , TRUNC(DT, 'DAY') --요일 초기화 (일요일)

FROM TEMP

 

SELECT NMB

        , TRUNC(NMB, 1) --소수점 첫째 절사

        , TRUNC(NMB, 2) --소수점 둘째 절사

        , TRUNC(NMB,-1) --1단위 절사

        , TRUNC(NMB,-2) --10단위 절사

FROM TEMP


select sysdate,
         (sysdate-1/24/60) "1분 전",
         (sysdate-1/24/30) "2분 전",
         (sysdate-1/24/12) "5분 전",
         (sysdate-1/24/6) "10분 전",
         (sysdate-1/144) "10분 전",
         (sysdate-30/1440) "30분 전",
         (sysdate-1/24) "1시간 전",
         trunc(sysdate-1) "1일 전",
         trunc(sysdate-7) "7일 전",
         trunc(sysdate-30) "30일 전",
         trunc(sysdate+1)-6/24 "6AM 전",
         trunc(sysdate+1)-2/24 "2PM 전" 
from dual;

Sysdate : 02/15/2011 14:25:22
1분 전  : 02/15/2011 14:24:22
2분 전  : 02/15/2011 14:23:22
5분 전  : 02/15/2011 14:20:22
10분 전 : 02/15/2011 14:15:22
10분 전 : 02/15/2011 14:15:22
30분 전 : 02/15/2011 13:55:22
1시간 전 : 02/15/2011 13:25:22
1일 전   : 02/14/2011
7일 전   : 02/08/2011
30일 전  : 01/16/2011
6AM 전   : 02/15/2011 18:00:00
2PM 전   : 02/15/2011 22:00:00



select sysdate,
         (sysdate+1/24/60) "1분 후",
         (sysdate+1/24/30) "2분 후",
         (sysdate+1/24/12) "5분 후",
         (sysdate+1/24/6) "10분 후",
         (sysdate+1/144) "10분 후",
         (sysdate+30/1440) "30분 후",
         (sysdate+1/24) "1시간 후",
         trunc(sysdate+1) "1일 후",
         trunc(sysdate+7) "7일 후",
         trunc(sysdate+30) "30일 후",
         trunc(sysdate+1)+6/24 "6AM 후",
         trunc(sysdate+1)+2/24 "2PM 후" 
from dual;

Sysdate  : 02/15/2011 14:19:34
1분 후     : 02/15/2011 14:20:34
2분 후     : 02/15/2011 14:21:34
5분 후     : 02/15/2011 14:24:34
10분 후    : 02/15/2011 14:29:34
10분 후   : 02/15/2011 14:29:34
30분 후   : 02/15/2011 14:49:34
1시간 후 : 02/15/2011 15:19:34
1일 후    : 02/16/2011
7일 후    : 02/22/2011
30일 후  : 03/17/2011
6AM 후  : 02/16/2011 06:00:00
2PM 후  : 02/16/2011 02:00:00

+ Recent posts