인터셉터 구현

HandlerInterceptorAdapter에서 제공하는 메서드는 4가지입니다.

 

PreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

    • 컨트롤러(즉 RequestMapping이 선언된 메서드 진입) 실행 직전에 동작.
    • 반환 값이 true일 경우 정상적으로 진행이 되고, false일 경우 실행이 멈춥니다.(컨트롤러 진입을 하지 않음)
    • 전달인자 중 Object handler는 핸들러 매핑이 찾은 컨트롤러 클래스 객체입니다.
  • PostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    • 컨트롤러 진입 후 view가 랜더링 되기 전 수행이 됩니다.
    • 전달인자의 modelAndView을 통해 화면 단에 들어가는 데이터 등의 조작이 가능합니다.
  • afterComplete(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    • 컨트롤러 진입 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.
  • afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
    • Servlet 3.0부터 비동기 요청이 가능해짐에 따라 비동기 요청 시 PostHandle와 afterCompletion메서드를 수행하지 않고 이 메서드를 수행하게 됩니다. (Spring에서 제공함)

'Spring' 카테고리의 다른 글

이클립스 Spring STS 수동설치  (0) 2020.12.15
Spring Framework 정리  (0) 2020.12.11

https://dist.springsource.com/snapshot/TOOLS/nightly/요기에 이클립스 버전정보 

Help -> About Eclipse IDE 

 

버전 정보가 4.13 이므로 https://dist.springsource.com/snapshot/TOOLS/nightly/e4.13

이후 설치하면 끝!

'Spring' 카테고리의 다른 글

인터셉터 HandlerInterceptorAdapter 제공 메소드  (0) 2020.12.18
Spring Framework 정리  (0) 2020.12.11

Spring Framework의 특징

  • 경량의 컨테이너로써 자바 객체를 직접관리 (메모리 관리관련)
  • POJO(Plain Old Java Ojbect)  방식의 프레임워크
  • IoC(Inersion of Control) 지원
  • DI(Dependency Injection)지원
  • AOP(Aspect-Oriented Programming)지원
  • iBatis, myBatis, Hibernate 등의 데이터베이스 라이브러리를 지원한다.

특징

  • Java파일에서 Java 코드를 줄일 수 있다.
  • 반복되는 작업을 줄일 수 있어 기능 개발에 집중할 수 있다.
  • 프로젝트 관리가 용이하다.
  • 다수의 개발자와 동시에 프로젝트 하기가 용이하다.
  • 처음 프로젝트 셋팅이 다소 복잡하다.
  • 개념을 제대로 숙지하지 못하면 코드 분석 조차 하기 힘들다.

 스프링에서의 DI의 의미

- 부품들을 생성하고, 제품을 조립해주는 공정과정을 대신해 주는 라이브러리 (역할자)

 

 * 개발 핵심 처리 루틴의 수정 없이 제품(객체)를 다른 제품(객체)로 쉽게 대체하여 생성 가능하도록 하는 역할을 함.

 * 명세서에 따라서 자동적으로 부품을 활용하여 제품을 조립.

 * 생성하기 원하는 객체를 명세서(XML)에 기술하고, 그 부품과 의존성(Dependency)들을 보관하는 일을 처리. 그러한 데이터를 보관하는 공간을 컨테이너라 함. (IoC 컨테이너)

 

2-4) XML (Bean) Sample

 

* 빈(Bean) 객체는 반드시 클래스를 사용. 인터페이스나 추상클래스는 객체 생성이 불가능함.
* 빈 객체 생성, 객체 초기화, 객체 값(또는 레퍼런스) 주입.


id : 빈 객체 고유 이름 (접근 가능자)

name : 객체의 이름(별칭)

class : 생성할 클래스

constructor-arg : 초기값 설정 (생성자 함수 사용Java Class 에서

public Main(String name, String age){

      this.name = name;

      this.age = age;

}

property : 초기값 설정 (Setter함수 사용) Java Class 에서

public String name;   setter, getter 

<bean id=“빈 객체 고유 이름” name=“객체 이름” class=“생성할 클래스”>
    <property name=“초기값 설정” value=“프로퍼티 값”></property>
</bean>


짧게 생략 가능 DI setter 
<property name=“초기값 설정” value=“프로퍼티 값”></property>

<property name="height">
	<value>프로퍼티 값</value>
</property>


DI 생성자
<bean id="빈 객체 고유 이름" class="생성할 클래스">
		<constructor-arg value="생성자 첫번째" />
		<constructor-arg value="생성자 두번째" />
		<constructor-arg>  // 3번째 생성자 ArrayList<String> 해당하는
			<list>
				<value생성자List[0]</value>
				<value>생성자List[1]</value>
			</list>
		</constructor-arg>
        
 줄여서 생략시 (c: constructor 줄임, p: property 줄임)      
<bean id="빈 객체 고유 이름" class="생성할 클래스" 
			c:papaName="생성자첫번째" c:mamiName="생성자두번째" p:sisterName="프로퍼티 값">
		<property name="초기값 설정" value="프로퍼티 값" />
	</bean>

 

Java Bean 선언된 걸 xml에 선언된 Bean과 합치는 방법

package com.javalec.ex;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {

	@Bean
	public Student student1(){
		
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("수영");
		hobbys.add("요리");
		
		Student student = new Student("홍길동", 20, hobbys);
		student.setHeight(180);
		student.setWeight(80);
		
		return student;
	}
	
}
<?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"
	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-3.2.xsd">
	
	<context:annotation-config />
	<bean class="com.javalec.ex.ApplicationConfig" />
	
	<bean id="student2" class="com.javalec.ex.Student">
		<constructor-arg value="홍길순"></constructor-arg>
		<constructor-arg value="30"></constructor-arg>
		<constructor-arg >
			<list>
				<value>마라톤</value>
				<value>요리</value>
			</list>
		</constructor-arg>
		<property name="height" value="190" />
		<property name="weight" value="70" />
	</bean>

</beans>
package com.javalec.ex;

import java.util.ArrayList;

public class Student {

	private String name;
	private int age;
	private ArrayList<String> hobbys;
	private double height;
	private double weight;
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}

	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	
	public void setHeight(double height) {
		this.height = height;
	}
	
	public void setWeight(double weight) {
		this.weight = weight;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
	public ArrayList<String> getHobbys() {
		return hobbys;
	}
	
	public double getHeight() {
		return height;
	}
	
	public double getWeight() {
		return weight;
	}
	
}
package com.javalec.ex;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

		public static void main(String[] args) {
			
			AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
			Student student1 = ctx.getBean("student1", Student.class);
			System.out.println("이름 : " + student1.getName());
			System.out.println("나이 : " + student1.getAge());
			System.out.println("취미 : " + student1.getHobbys());
			System.out.println("키 : " + student1.getHeight());
			System.out.println("몸무게 : " + student1.getWeight());
			
			Student student2 = ctx.getBean("student2", Student.class);
			System.out.println("이름 : " + student2.getName());
			System.out.println("나이 : " + student2.getAge());
			System.out.println("취미 : " + student2.getHobbys());
			System.out.println("키 : " + student2.getHeight());
			System.out.println("몸무게 : " + student2.getWeight());
			
			ctx.close();
		}
	
}

xml Bean 선언된 걸 Java에 선언된 Bean과 합치는 방법

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean id="student2" class="com.javalec.ex.Student">
		<constructor-arg value="홍길순"></constructor-arg>
		<constructor-arg value="30"></constructor-arg>
		<constructor-arg >
			<list>
				<value>마라톤</value>
				<value>요리</value>
			</list>
		</constructor-arg>
		<property name="height" value="190" />
		<property name="weight" value="70" />
	</bean>

</beans>
package com.javalec.ex;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:applicationCTX.xml")
public class ApplicationConfig {

	@Bean
	public Student student1(){
		
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("수영");
		hobbys.add("요리");
		
		Student student = new Student("홍길동", 20, hobbys);
		student.setHeight(180);
		student.setWeight(80);
		
		return student;
	}
	
}
package com.javalec.ex;

import java.util.ArrayList;

public class Student {

	private String name;
	private int age;
	private ArrayList<String> hobbys;
	private double height;
	private double weight;
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}

	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	
	public void setHeight(double height) {
		this.height = height;
	}
	
	public void setWeight(double weight) {
		this.weight = weight;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
	public ArrayList<String> getHobbys() {
		return hobbys;
	}
	
	public double getHeight() {
		return height;
	}
	
	public double getWeight() {
		return weight;
	}
	
}
package com.javalec.ex;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

		public static void main(String[] args) {
			
			AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
			
			Student student1 = ctx.getBean("student1", Student.class);
			System.out.println("이름 : " + student1.getName());
			System.out.println("나이 : " + student1.getAge());
			System.out.println("취미 : " + student1.getHobbys());
			System.out.println("키 : " + student1.getHeight());
			System.out.println("몸무게 : " + student1.getWeight());
			
			Student student2 = ctx.getBean("student2", Student.class);
			System.out.println("이름 : " + student2.getName());
			System.out.println("나이 : " + student2.getAge());
			System.out.println("취미 : " + student2.getHobbys());
			System.out.println("키 : " + student2.getHeight());
			System.out.println("몸무게 : " + student2.getWeight());
			
			ctx.close();
			
		}
	
}

스프링 빈 생명주기

인터페이스 이용시

어노테이션 이용시

스프링 빈 범위(scope)

scope default 는 singleton이다.


properties 외부파일 사용

오라클 경우

context.xml 파일설정

<context:property-placeholder location="classpath:config/properties/db.properties"/>


   <!--  bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource"-->
   <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="${db.driverClassName}"/>
      <property name="url" value="${db.url}" />
      <property name="username" value="${db.username}" />
      <property name="password" value="${db.password}" />
   </bean>
db.properties 설정

db.driverClassName=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@오라클주소이름 ex)localhost:1521:aaa or www.xxxx.xxx:1521:aaa
db.username=아이디 (오라클 아이디)
db.password=패스워드 (오라클 비밀번호)

MySql 경우

context.xml 파일설정

<context:property-placeholder location="classpath:config/properties/db.properties"/>


   <!--  bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource"-->
   <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="${db.driverClassName}"/>
      <property name="url" value="${db.url}" />
      <property name="username" value="${db.username}" />
      <property name="password" value="${db.password}" />
   </bean>
db.properties 설정

db.driverClassName=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/aaa?
      useUnicode=true&amp;characterEncoding=utf8&amp;verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=UTC
db.username=아이디 (mysql 아이디)
db.password=패스워드 (mysql 비밀번호)

2. 능동 변환 : SpEL

두 번째는 SpEL(Spring Expression Language)를 이용하는 방법이다.

빈 팩토리 후처리기에서 치환을 해주는 수동적인 방법과 달리, 빈 오브젝트에 직접 접근할 수 있는 표현식을 이용해 원하는 프로퍼티 값을 능동적으로 가져오는 방법이다. (스프링 3.0 에서 소개됨)

SpEL은 다른 빈의 프로퍼티에 접근, 메소드 호출, 다양한 연산도 지원하며 클래스 정보에도 접근할 수 있다. (생성자를 호출해서 오브젝트를 만들 수도 있음)

 

<util:properties> 태그를 이용하면 프로퍼티 파일을 읽어서 Properties 타입의 빈으로 만들 수 있다.

<util:properties id="database" location="classpath:database.properties"/>

<context:property-placeholder> 처럼 빈 팩토리 후처리기로 동작해서 빈의 값을 변경하는 것이 아니라, 단순히 프로퍼티 파일의 내용을 담은 Properties 타입의 빈을 만들어 준다.

이렇게 database.properties의 내용을 빈으로 만들어두고, dataSource 빈에서는 SpEL을 이용해서 database 빈 오브젝트에서 원하는 정보를 읽어오게 한다. (SpEL에서는 Map의 get() 메소드를 호출해주는 표현식이 존재하는데, []안에 키 값을 넣어주면 된다.)

<bean id="dataSource" class="..DataSource">

    <!-- database 빈 오브젝트에서 db.driverclass를 키로 갖는 값을 가져오라는 표현식 -->

    <property name="driverClass" value="#{database['db.driverclass']}"/>     

    ...

</bean>

@Value("#{database['db.driverClass']}") 로도 가능하다.

 


AOP

<bean id="logAop" class="com.javalec.ex.LogAop" />
	
	<aop:config>
	
		<aop:aspect id="logger" ref="logAop">
			<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)"  />
			<aop:around pointcut-ref="publicM" method="loggerAop" />
		</aop:aspect>
		
		<aop:aspect id="logger" ref="logAop">
			<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)"  />
			<aop:before pointcut-ref="publicM" method="beforeAdvice" />
		</aop:aspect>
		
		<aop:aspect id="logger" ref="logAop">
			<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)"  />
			<aop:after-returning pointcut-ref="publicM" method="afterReturningAdvice" />
		</aop:aspect>
		
		<aop:aspect id="logger" ref="logAop">
			<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)"  />
			<aop:after-throwing pointcut-ref="publicM" method="afterThrowingAdvice" />
		</aop:aspect>
		
		<aop:aspect id="logger" ref="logAop">
			<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)"  />
			<aop:after pointcut-ref="publicM" method="afterAdvice" />
		</aop:aspect>
		
	</aop:config>

 

'Spring' 카테고리의 다른 글

인터셉터 HandlerInterceptorAdapter 제공 메소드  (0) 2020.12.18
이클립스 Spring STS 수동설치  (0) 2020.12.15

테이블 null 값 처리시

nvl(컬럼, 바꿀 값)

select ename, sal*12+nvl(comm, 0) "Annsal" from emp;

 

연산자 사용

SELECT SAL + COMM FROM EMP; 

컬럼 + 컬럼 합친 결과 

ex) 만약 컬럼 + 컬럼 null이 포함된다면?? nvl(comm, 0) null을 0으로 처리! 

SELECT SAL - 100 FROM EMP;

컬럼 - 100 결과

SELECT SAL * 12 FROM EMP;

컬럼 * 12의 결과

SELECT SAL / 2 FROM EMP;

컬럼 / 2 의 결과

 

중복되는 데이터를 한번씩만 출력하기 위해서는 distinct 키워드를 사용한다.

select distinct job from emp;

 

10      10         중복되는 값이 합쳐져서 출력된다.

10      20

20      30

30      40

40

 

 


WHERE 조건

SELECT * [컬럼1, 컬럼2, ....., 컬럼N]

 FROM table_name

WHERE 조건절;

 

조건절 구성 : WHERE SAL >= 3000;

                 1.컬럼     2.연산자  3.비교대상값

 

 

 

WHERE 조건시 대소문자 구분

SELECT EMPNO, ENAME, SAL FROM EMP WHERE ENAME = 'SCOTT';


 

날짜 형식 검색시

select * from emp where HIREDATE <= '1982/01/01';

select * from emp where HIREDATE <= '1982-01-01';

select * from emp where HIREDATE <= '82/01/01';

select * from emp where HIREDATE <= '82-01-01';

 


논리연산자

 

컬럼 NOT BETWEEN A and B 

A 미만 이거나 B 초과인 결과를 검색함( 컬럼 < A or 컬럼 > B );


IN 연산자

 

 

컬럼 NOT IN (조건, 조건,...., 조건N)

해당 조건을 제외한 나머지 결과

 


LIKE 연산자와 와일드 카드

select * from emp where ename like 'K%';


K로 시작하는 검색

select * from emp where ename like '%K%';


K를 포함하는 검색

select * from emp where ename like '%K';

 

K로 끝나는 검색

 

select * from emp where ename like '_A%';

공백A A앞에 어떤문자가 와도 상관없고 2번째에 A에 있는 검색결과 조회


 

select * from emp where ename like '__A%';

공백공백A A앞에 어떤문자가 와도 상관없고 3번째에 A에 있는 검색결과 조회

 

select * from emp where ename not like '%A%';

A를 포함하고 있지 않는 검색 결과 조회

 


IS NULL과 IS NOT NULL

 

select * from emp where comm is null;

comm컬럼의 null인 데이터를 검색

select * from emp where comm is not null;

comm컬럼의 null이 아닌 데이터를 검색

 


정렬을 위한 ORDER BY 절

 

SELECT * FROM EMP ORDER BY SAL;
SAL컬럼을 첫번째 데이터를 기준으로 오름차순 정렬 조회

SELECT EMPNO, ENAME, JOB, HIREDATE FROM EMP ORDER BY HIREDATE ASC;
날짜 오름차순으로 정렬 조회

SELECT * FROM EMP ORDER BY SAL DESC;
SAL컬럼을 내림차순으로 정렬 조회

SELECT EMPNO, ENAME FROM EMP ORDER BY EMPNO DESC;
EMPNO컬럼을 내림차순으로 정렬 조회

SELECT * FROM EMP ORDER BY ENAME;
ENAME컬럼을 오름차순 정렬 조회

SELECT * FROM EMP ORDER BY ENAME DESC;
ENAME을 내림차순으로 정렬 조회

SELECT * FROM EMP ORDER BY HIREDATE DESC;
날짜를 내림차순으로 정렬 조회

SELECT * FROM EMP ORDER BY SAL DESC, ENAME ASC;
SAL컬럼을 내림차순 정렬 후 정렬된 기준에서 ENAME을 오름차순으로 정렬 조회 

SELECT DEPTNO, HIREDATE FROM EMP ORDER BY DEPTNO ASC, HIREDATE DESC;
DEPTNO 오름차순 정렬 후 정렬된 기준에서 HIREDATE 내림차순으로 정렬 조회

 


숫자함수

SELECT -10, ABS(-10) FROM DUAL;
10 절대값반환

SELECT 34.5678, FLOOR(34.5678) FROM DUAL;
34 소수점 버림

SELECT 34.5678, ROUND(34.5678) FROM DUAL;
35 반올림

SELECT 34.5678, ROUND(34.5678, 2) FROM DUAL;
34.57 위치지정 반올림

SELECT 34.5678, ROUND(345.5678, -2) FROM DUAL;
300 위치지정 반올림

SELECT TRUNC(34.5678, 2), TRUNC(34.5678, -1), TRUNC(34.5678) FROM DUAL;
34.56 , 30, 34 자릿수 버림

SELECT MOD(27,2), MOD(27, 5), MOD(27, 7) FROM DUAL;
1, 2, 6 나머지 구함

SELECT * FROM EMP WHERE MOD(EMPNO, 2) = 1;
홀수 번호 검색


문자처리 함수

SELECT upper('hello my home') from dual;


대문자로 변환


select lower('HI MY HOME') from dual;


소문자로 변환


select initcap('hohoho start') from dual;


첫글자 대문자 나머지 소문자


select concat('bbb', 'ccc') from dual;


문자열 합치기


select empno, ename, job from emp where lower(job) = 'manager';


테이블 소문자변환 후 소문자 결과 값 조회 가능


select length('oracle'), length('오라클') from dual;


문자열 길이 반환


select lengthb('oracle'), lengthb('오라클') from dual;


영문 1바이트, 한글 2바이트 차이


select substr('hi my oracle',0,2) from dual;


문자열 찾기 왼쪽부터 1 2 3 4 5 6 7 8 9 10  -> 1~2 결과 hi


select substr('Welcome to Oracle', -4, 3) from dual;


뒤에서 부터 찾기 -4칸 이후 3개의 문자열



select substr(HIREDATE, 1, 2) 년도, substr(HIREDATE, 4, 2) 달 from emp;


date 형식 82-12-12 결과 값 찾기 


select * from emp where substr(HIREDATE, 4, 2) = '09';


82-08-08 형식에서 데이터 찾기


select * from emp where substr(HIREDATE, 1,2) = '87';


82-08-08 형식에서 데이터 찾기


select * from emp where substr(ename, -1, 1) = 'E';


마지막글자 E 찾기


select substrb('Welcome To Oracle', 3, 4), substrb('나는 한국사람이다', 1, 4) from dual;


바이트 단위로 찾기


select instr('welcome to oracle', 'o',1, 2) from dual;


검색 조건 위치 찾기


select * from emp where substr(ename, 3, 1) = 'R';


3번째 R인 결과 조회


select * from emp where ename like '__R%';


3번째 R인 결과 조회


select lpad('Oracle', 20, '#') from dual;


총문자열길이 설정 및 왼쪽에 #체워넣기


select rpad('Oracle', 20, '#') from dual;


총문자열길이 설정 및 오른쪽에 #체워넣기


select ltrim(' Oracle') from dual;


왼쪽공백 없애기


select rtrim('Oracle ') from dual;


오른쪽 공백 없애기

 

select trim(' a aaaaOracleaaaaa ') from dual;

 

양쪽 공백 없애기

select replace('abcdefg', 'c', 'CCC') from dual;

지정한 문자 바꾸기

 


날짜함수

select sysdate from dual;


현재 날짜 출력


select sysdate-1 어제, sysdate 오늘, sysdate+1 내일 from dual;


sysdate -1 +1 어제 내일 구할 수 있다


select floor(sysdate-HIREDATE) from emp;


현재날짜 - 입사날짜 시간으로 반환


select HIREDATE, round(HIREDATE, 'month') from emp;


16일기준으로 16이하 1일 16이상은 다음달 1일로


select HIREDATE, trunc(HIREDATE, 'month') from emp;


해당 달 1일로 전부


select ename, sysdate, HIREDATE, months_between(sysdate, HIREDATE) from emp;


현재날짜 - 입사날짜 총 일로 반환


select ename, HIREDATE, trunc(months_between(sysdate, HIREDATE)) from emp;


현재날짜 - 입사날짜 총일 반환 trunc활용 소수점 버림


select ename, HIREDATE, add_months(HIREDATE, 6) from emp;


입사날짜 + 6개월날짜

 

select sysdate, next_day(sysdate, '수요일') from dual;

 

현재날짜에서 다음 수요일날짜 반환

select HIREDATE, last_day(HIREDATE) from emp;

해당날짜 마지막 일 반환


형 변환 함수

select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;

select HIREDATE, to_char(HIREDATE, 'yyyy/mm/dd day') from emp;

select HIREDATE, to_char(HIREDATE, 'yy/mon/dd dy') from emp;

 

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

 

select to_char(1230000) from dual;
숫자를 문자로 변환

select ename, sal, to_char(sal, 'L999,999') from emp;
sal컬럼의 숫자를    ₩800 해당국가표기로 나타낸다.

select to_char(123456, '000000000'), to_char(123456, '999,999,999') from dual;
빈공간은 00으로 채우고, 999,999,999 자릿수 맞춘다.

select ename, HIREDATE from emp where HIREDATE = to_date(19810220,'yyyymmdd');
DATE타입의 날짜형식의 데이터 조회방법

select trunc(sysdate-to_date('2008/01/01', 'yyyy/mm/dd')) from dual;
DATE타입의 연산  오늘날짜 - 2008/01/01 = 4720 결과가 나온다.

select to_number('20,000', '99,999') - to_number('10,000', '99,999') from dual;
문자열 20,000, 10,000 숫자 타입을 변환하여 연산하는 방법

select ename, sal, comm, sal*12*comm, nvl(comm, 0), sal*12+nvl(comm,0) from emp order by job;
null이 포함된 컬럼의 합을 계산할 때 nvl() 활용

select empno, ename, nvl(to_char(MGR), 'CEO') as MANAGER from emp where mgr is null;
null을 변환할 때 해당 컬럼이 number타입일 경우 char타입 변환 null컬럼 조회방법

그룹 함수

 

 

 


수학 함수

 


논리 함수

select ename, deptno,
       decode(deptno, 10, 'ACCOUNTING',
                      20, 'RESEARCH',
                      30, 'SALES',
                      40, 'OPERATIONS')
       AS DNAME
 FROM EMP;

SELECT * FROM EMP;
DEPTNO 10, 20, 30, 40에 따라 특정 문자열 DNAME컬럼 값에 출력


SELECT EMPNO, ENAME, JOB, SAL, DECODE(JOB, 'ANALYST',SAL * 1.05,
                                            'SALESMAN', SAL * 1.1,
                                            'MANAGER', SAL * 1.15,
                                            'CLERK', SAL * 1.20) AS UPSAL
FROM EMP;
JOB에 따라 봉급을 지정해서 UPSAL컬럼에 출력

SELECT ENAME, DEPTNO, CASE WHEN DEPTNO = 10 THEN 'ACCOUNTING'
                           WHEN DEPTNO = 20 THEN 'RESEARCH'
                           WHEN DEPTNO = 30 THEN 'SALES'
                           WHEN DEPTNO = 40 THEN 'OPERATIONS'
                       END AS DNAME
FROM EMP;
DEPTNO조건에 따라 지정한 문자열 출력
CASE WHEN 조건 THEN 결과 ELSE 결과로도 가능
CASE WHEN SAL>=1000 THEN '1000이상이다' ELSE '1000이하이다' END AS 결과 

그룹 함수

SELECT SUM(SAL) FROM EMP;
SAL컬럼의 모든 합

SELECT SUM(COMM) FROM EMP;
COMM컬럼의 모든 합

SELECT AVG(SAL) FROM EMP;
SAL컬럼의 평균 값

SELECT MAX(SAL), MIN(SAL) FROM EMP;
SAL컬럼의 최대값, SAL컬럼의 최소값

SELECT ENAME, MAX(SAL) FROM EMP;
에러 이름은 여러개, MAX값은 하나다

SELECT MAX(HIREDATE), MIN(HIREDATE) FROM EMP;
DATE타입 최대날짜, 최소날짜 검색

SELECT MAX(ENAME), MIN(ENAME)FROM EMP;
알파벳 순서에 따라 조회된다.

SELECT COUNT(COMM) 사원수 FROM EMP WHERE DEPTNO = 10;
DEPTNO가 10인 사원의 커미션 조회

SELECT COUNT(DISTINCT JOB) FROM EMP;
DISTINCT중복제거함수를 이용해 중복되지 않는 데이터의 합을 카운트한다.

GROUP BY 절

SELECT DEPTNO FROM EMP GROUP BY DEPTNO;
DEPTNO 기준으로 중복되는 컬럼을 그룹으로 묶어서 조회

SELECT DISTINCT DEPTNO FROM EMP;
DEPTNO컬럼의 중복되는 컬럼을 묶어서 조회

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;
DEPTNO 기준으로 중복되는 컬럼 그룹및 그룹의 SAL컬럼의 합을 조회

SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO;
DEPTNO 기준으로 중복되는 컬럼 그룹및 그룹의 SAL컬럼의 최대값 및 최소값을 조회

SELECT DEPTNO, COUNT(DEPTNO), COUNT(COMM) FROM EMP GROUP  BY DEPTNO;
DEPTNO 기준으로 중복되는 컬럼 그룹및 그룹의 수 및 COMM컬럼의 수 조회


HAVING 조건

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
DEPTNO와 SAL평균값을 그룹으로 묶은 후 HAVING을 이용해 2000보다 큰경우의 조건 결과

SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO HAVING MAX(SAL) > 2900;
DEPTNO와 SAL컬럼의 최대값, 최소값을 그룹으로 묶은 후 HAVING을 이용해 2900보다 큰 결과 조회

SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO HAVING DEPTNO > 20;
DEPTNO와 SAL컬럼의 최대값, 최소값을 그룹으로 묶은 후 HAVING을 이용해 DEPTNO 20보다 큰 결과 조회

조인을 사용하여 다중 테이블에서 데이터 표시

 

EQUI JOIN

 

EQUI JOIN AND 연산

 

컬럼의 모호성 해결

 

테이블 별칭


NON-EQUI JOIN


SELF JOIN

SELECT E1.ENAME 사원, E2.ENAME 매니저 
  FROM EMP E1, EMP E2 
 WHERE E1.MGR = E2.EMPNO AND E1.ENAME = 'SMITH';
MGR컬럼과 EMPNO컬럼을 JOIN후 E1.ENAME = SMITH인 결과 조회

SELECT E1.ENAME, E1.JOB 
  FROM EMP E1, EMP E2 
 WHERE E1.MGR = E2.EMPNO AND E2.ENAME = 'KING';
MGR컬럼과 EMPNO컬럼을 JOIN후 E2.ENAME = KING인 결과 조회

SELECT E1.ENAME, E2.ENAME 
  FROM EMP E1, EMP E2 
 WHERE E1.DEPTNO = E2.DEPTNO AND E1.ENAME = 'SCOTT';
 E1.DEPTNO와 E2.DEPTNO를 JOIN후 E1.ENAME = SCOTT인 결과 조회
 


OUTER JOIN

SELECT EMPLOYEE.ENAME || '의 매너지는 ' || MANAGER.ENAME || '입니다'
  FROM EMP EMPLOYEE, EMP MANAGER
 WHERE EMPLOYEE.MGR = MANAGER.EMPNO(+);
NULL인 컬럼로 결과에 반영한다.

SELECT E.ENAME, D.DEPTNO, D.DNAME 
  FROM EMP E, DEPT D 
 WHERE E.DEPTNO(+) = D.DEPTNO;
NULL인 컬럼도 결과에 반영한다.

ANSI JOIN

SELECT * FROM EMP,DEFT;
          ||
          \ /
SELECT * FROM EMP CROSS JOIN DEPT;

ANSI INNER JOIN

SELECT ENAME, DNAME
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO
   AND EMP.ENAME = 'SCOTT';
  
      ||
      \/

SELECT ENAME, DNAME
  FROM EMP
 INNER JOIN DEPT
    ON EMP.DEPTNO = DEPT.DEPTNO
 WHERE EMP.ENAME = 'SCOTT';

ANSI INNER JOIN(USING)

SELECT ENAME, DNAME
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO;

       ||
       \/

SELECT ENAME, DNAME
  FROM EMP
 INNER JOIN DEPT
 USING (DEPTNO);

NATURAL JOIN

SELECT ENAME, DNAME
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO;

        ||
        \/

SELECT ENAME, DNAME
  FROM EMP
 INNER JOIN DEPT
 USING (DEPTNO);

        ||
        \/

SELECT EMP.ENAME, DEPT.DNAME 
  FROM EMP 
NATURAL JOIN DEPT;

ANSI OUTER JOIN

연습용 테이블 DEPT01, DEPT02 생성 및 데이터 넣기
CREATE TABLE DEPT01 (
    DEPTNO NUMBER(2),
    DNAME VARCHAR2(14)
                    );

INSERT INTO DEPT01 VALUES(10, 'ACCOUNTING');
INSERT INTO DEPT01 VALUES(20, 'RESEARCH');

SELECT * FROM DEPT01;


CREATE TABLE DEPT02 (
    DEPTNO NUMBER(2),
    DNAME VARCHAR2(14)
                    );

INSERT INTO DEPT02 VALUES(10, 'ACCOUNTING');
INSERT INTO DEPT02 VALUES(30, 'SALES');

SELECT * FROM DEPT02;

LEFT OUTER JOIN

RIGHT OUTER JOIN

FULL OUTER JOIN


서브 쿼리

서브 쿼리의 기본 개념

단일 행 서브 쿼리

SELECT ENAME, DEPTNO 
  FROM EMP 
 WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'SCOTT');


SELECT * 
  FROM EMP 
 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'SCOTT');

SELECT ENAME, SAL 
  FROM EMP 
 WHERE SAL >= (SELECT SAL FROM EMP WHERE ENAME = 'SCOTT');

SELECT ENAME, DEPTNO 
  FROM EMP 
 WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE LOC = 'DALLAS');

 

SELECT ENAME, SAL 
  FROM EMP 
 WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES');

SELECT ENAME, SAL 
  FROM EMP 
 WHERE MGR = (SELECT EMPNO FROM EMP WHERE ENAME = 'KING');

다중 행 서브 쿼리

 IN 연산자

 

SELECT EMPNO, ENAME, SAL, DEPTNO 
  FROM EMP 
 WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);


셋다 같은 결과

SELECT DEPTNO, DNAME, LOC 
  FROM DEPT 
 WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE JOB = 'MANAGER');
 
             ||

SELECT DEPT.DEPTNO, DEPT.DNAME, DEPT.LOC 
  FROM EMP, DEPT 
 WHERE EMP.DEPTNO = DEPT.DEPTNO 
   AND EMP.JOB = 'MANAGER';

            ||

SELECT D.DEPTNO, D.DNAME, D.LOC 
  FROM EMP E 
 INNER JOIN DEPT D 
    on D.DEPTNO = E.DEPTNO 
   AND E.JOB = 'MANAGER';

ALL 연산자

 

SELECT ENAME, SAL 
  FROM EMP 
 WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30);

                        ||

SELECT ENAME, SAL 
  FROM EMP 
 WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30);
 
 같은 결과

SELECT ENAME, SAL,JOB 
  FROM EMP 
 WHERE SAL > ALL(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');
 
 
 SELECT ENAME, SAL,JOB 
  FROM EMP 
 WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE JOB = 'SALESMAN');
 
 

 

ANY 연산자

SELECT ENAME, SAL 
  FROM EMP 
 WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30);

SELECT ENAME, SAL 
  FROM EMP 
 WHERE SAL > ANY(SELECT SAL FROM EMP WHERE DEPTNO = 30);

SELECT ENAME, SAL, JOB 
  FROM EMP 
 WHERE SAL > ANY(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN')
   AND JOB <> 'SALESMAN';
 
 
 SELECT ENAME, SAL, JOB 
  FROM EMP 
 WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE JOB = 'SALESMAN')
   AND JOB <> 'SALESMAN';

SET 연산자

UNION 연산자

 

UNION ALL 연산자

 

UNION과 합칩합의 차이

INTERSECT 연산자

 

MINUS 연산자

SET 연산자와 NULL

SET 연산자 제한사항


DML INSERT

INSERT INTO 테이블명 (컬럼, 컬럼, ....) VALUES (인자값, 인자값,....);
                     NUMBER, VARCHAR2         NUMBER, VARCHAR2  데이터형에 맞게 대입
                     
INSERT INTO 테이블명 VALUES (인자값, 인자값,.....) 
테이블 전체 데이터를 전부 넣을 때 앞에 생략가능  대신 VALUES 뒤에 값에 모든 데이터를 입력해야 함
데이터가 불필요 할 경우 NULL 대체하거나 '' 표현 가능

아니면 테이블 자체 생성시
CREATE TABLE 테이블명 (
	USER_ID VARCHAR2(20),
    USER_YN CHAR(1) DEFAULT 'Y'
);

DEFAULT 값을 생략 가능

DML INSET ALL

다중테이블 입력시
INSERT ALL
INTO EMP_HIR VALUES(EMPNO, ENAME, HIREDATE)
INTO EMP_MGR VALUES(EMPNO, ENAME, MGR)
SELECT EMPNO, ENAME, HIREDATE, MGR FROM EMP WHERE DEPTNO = 20;

EMP테이블에서 데이터를 가져온 후, 
EMP_HIR, EMP_MGR 테이블에 각각 필요한 데이터를 넣을 수 있다.

DML INSERT ALL 조건문

INSERT ALL
WHEN HIREDATE > '1982/01/01' THEN
INTO EMP_HIR02 VALUES(EMPNO, ENAME, HIREDATE)
WHEN SAL > 2000 THEN
INTO EMP_SAL VALUES(EMPNO, ENAME, SAL)
SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP;

EMP테이블에서 데이터를 가져 온 후,
WHEN .... THEN 을 이용해서 조건을 걸어 필요한 데이터만 INSERT시킬 수 있다.

DML UPDATE

UPDATE 테이블명
   SET 컬럼 = 변경내용,
       컬럼 = 변경내용

DML DELETE

DELETE FROM 테이블명
 WHERE 조건;
 

데이터형 종류

 

 

LOB

ROWID


ALTER TABLE

ATLER TABLE ADD

ALTER TABLE MODIFY

ALTER TABLE ~ DROP COLUMN

SET UNUSED 옵션(특정 컬럼 삭제시 컬럼의 사용을 논리적으로 제한하는 방법)


DROP TABLE(테이블 자체 삭제)

DROP TABLE 테이블 이름;

 

DDL TRUNCATE(테이블의 모든 로우를 제거함)

TRUCATE 테이블명;

 

RENAME (테이블 이름 변경)

RENAME 기존테이블명 TO 새로운테이블명;

 


데이터 딕셔너리와 데이터 딕셔너리 뷰

USER_데이터 딕셔너리

ALL_ 데이터딕셔너리

DBA_ 데이터 딕셔너리 뷰


무결성 제약 조건의 개념과 종류

제약 조건 확인하기

컬럼 레벨 정의 방법으로 제약 조건 지정하기


VIEW 뷰의 개념

 

VIEW 뷰 권한주기

[command] 해당 계정에게 view를 create 할 수 있는 권한을 부여하는 명령어
SQL> grant create view to 계정 이름 

복합 뷰


시퀀스 생성


인덱스 INDEX

SELECT * 
  FROM USER_IND_COLUMNS 
 WHERE TABLE_NAME IN('EMP', 'DEPT');

인덱스 생성하기

DELETE일어날 경우 논리적으로 삭제되고 물리적으로 남아있기때문에 사이즈증가에 대한 문제가 발생한다.

주기적으로 REBUILD해야한다.

고유 인덱스 - PK UNIQUE , 비고유 인덱스 - 제약조건 없음


 

-출처 소프트캠퍼스 오라클 11G 강의-

 

'Oracle' 카테고리의 다른 글

Ojdbc6 STS Maven eclipse 강제 추가하는 법  (0) 2020.11.29

+ Recent posts