SOME과 ANY는 명칭만 다를 뿐, 동일한 기능을 하는 연산자라고 생각하면 된다.

ANY, ALL은 서브쿼리와 함께 사용하는 다중 행 연산자이며, ANY는 조건을 만족하는 값이 하나라도 있으면 결과를 보여주고 ALL은 모든 값이 조건을 만족해야 결과를 보여준다.

 

ANY (SOME)

WHERE 100 = ANY (100, 200, 300) : ANY 값과 동일한 데이터인 100만 조회된다

WHERE 100 > ANY (100, 200, 300) : ANY의 최소값 100보다 큰 데이터인 200, 300이 조회된다

WHERE 100 >= ANY (100, 200, 300) : ANY의 최소값 100보다 크거나 같은 데이터인 100, 200, 300이 전부 조회된다

WHERE 100 < ANY (100, 200, 300) : ANY의 최대값 300보다 작은 데이터인 100, 200이 조회된다

WHERE 100 <= ANY (100, 200, 300) : ANY의 최대값 300보다 작거나 같은 데이터인 100, 200, 300이 전부 조회된다

WHERE 100 <> ANY (100, 200, 300) : ANY 값 중 모두 일치하지 않는 데이터가 조회된다

                                                 ANY의 값이 2개 이상인 경우, 해당 조건 의미 없이 모든 데이터가 조회된다

 

 

 

ALL

WHERE STUDENT > ALL (100, 200, 300) : ALL의 최대값 300보다 큰 데이터만 조회된다

WHERE STUDENT >= ALL (100, 200, 300) : ALL의 최대값 300보다 크거나 같은 데이터만 조회된다

WHERE STUDENT < ALL (100, 200, 300) : ALL의 최소값 100보다 작은 데이터만 조회된다

WHERE STUDENT <= ALL (100, 200, 300) : ALL의 최소값 100보다 작거나 같은 데이터만 조회된다

WHERE STUDENT = ALL (100, 200, 300) : ALL의 모든 값을 만족해야 데이터가 조회된다

                                                                      ALL 값이 2개 이상인 경우, 조건을 만족할 수 없어 사용할 수 없다

WHERE STUDENT <> ALL (100, 200, 300) : ALL의 모든 값과 일치하지 않는 데이터만 조회된다

객체 지향의 4대 특성

객체 지향은 현실 세계를 인지하는 방식으로 프로그램을 만들기 때문에 직관적이다. 인간의 인지 및 사고 방식까지 프로그래밍에 접목하는 인간 지향을 실천하고 있다.

 

캡 : 캡슐화(Encapsulation). 정보 은닉.

상 : 상속(Inheritance). 재사용.

추 : 추상화(Abstraction). 모델링.

다 : 다형성(Polymorphism). 사용 편의.

 

 

 

클래스와 객체의 차이

클래스와 객체의 차이는 분류(class)와 사물(Object)의 관계라고도 할 수 있다.

사물(객체) : 분류(클래스) = 개념 : 실체 라고도 표현할 수 있다.

 

 

 

추상화

객체지향의 추상화는 모델링이다. 비슷한 개념으로, 객체지향에서 추상화의 결과는 클래스다.

개념을 넓게 본다면 상속을 통한 추상화, 인터페이스를 통한 추상화, 다형성을 통한 추상화. 이 3가지 내용도 포함된다.

 

 

 

상속

객체지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속하고, 거기에 더해 필요한 특성을 추가(확장)해 사용할 수 있다는 의미이다. 상위 클래스 쪽으로 갈수록 추상화, 일반화 되었다고 말하며 하위 클래스 쪽으로 갈수록 구체화, 특수화 되었다고 말한다.

상속한다는 것이 상위 클래스의 특성을 상속한다는 것이지, 부모-자식 관계는 아니다.

상위 클래스의 특성을 재사용하는 것, 상위 클래스의 특성을 확장하는 것, is a kind of 관계(분류 관계)를 만족하는 것이다.

 

c++에서는 다중 상속이 없으나, 자바에서는 인터페이스를 도입해 다중 상속의 득만 취했다.인터페이스는 be able to (할 수 있는)의 표현 형태이다. Serializable(직렬화할 수 있는), Runnable(실행할 수 있는) 등의 인터페이스가 있다.

 

조금 더 깊이 생각해보면, 상위 클래스는 물려줄 특성이 풍부할수록 좋고, 인터페이스는 구현을 강제할 메소드의 개수가 적을수록 좋다. 상위 클래스가 풍성할수록 좋은 이유는 리스코프 치환 원칙에 따른 이유이며 인터페이스 메소드가 적을수록 좋은 이유는 인터페이스 분할 원칙에 따른 이유이다.

 

 

 

다형성

자바에서의 다형성 기본은 오버로딩과 오버라이딩이다.

오버로딩 : 같은 메소드 이름, 같은 인자 목록으로 상위 클래스의 메소드를 재정의

오버라이딩 : 같은 메소드 이름, 같은 인자 목록으로 다수 메소드를 중복 정의

오버라이딩, 오버로딩을 통해 이 다형성이 개발자가 프로그램을 작성할 때 사용 편의성을 준다.

 

 

 

캡슐화

정보를 은닉하기 위해 사용하며, 접근 제어자인 private, default, protected, public을 생각해야 한다.

call by value : 기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 판단

call by reference : 참조 변수는 저장하고 있는 값을 주소로 판단

'BackEnd > Java' 카테고리의 다른 글

객체지향 디자인 패턴1 (퍼사드, 싱글톤)  (0) 2020.11.03
Java :: NULL vs isEmpty() 차이  (0) 2018.01.16
LinkedHashMap  (0) 2017.06.29
RSA 암호화 구현  (0) 2017.03.14
Java :: Spring 파일 업로드 (multipart-form/data)  (2) 2017.03.14

디자인 패턴이란 이미 알려진 설계 문제를 해결할 답안을 제시하면서 다양한 프로그램이 언어 개발자가 서로 같은 용어를 써서 효과적으로 소통할 수 있게 해준다. 문제가 생길 우려가 있는 부분에만 패턴을 사용하면 된다.

 

- 생성 패턴 : 객체 생성, 초기화, 클래스 선택에 관한 패턴(싱글톤 패턴), 팩토리 패턴

- 행동 패턴 : 객체 간 소통, 메시징, 상호 작용에 관한 패턴(옵저버 패턴)

- 구조 패턴 : 클래스와 객체 관계를 조직하는 패턴, 관련된 객체를 서로 묶어 원하는 로직을 구현하는 방법을 안내(장식자 패턴)

 

 

1. 퍼사드 패턴 (Facade Pattern)

하위 시스템의 복잡도를 감추는 동시에 그 전체 기능을 사용하기 쉬운 인터페이스로 제공하는 것이다. 예를 들어, 인터페이스도 일종의 퍼사드라 할 수 있다. (내부의 많은 서브 시스템을 외부의 거대한 클래스로 감싸서 편리한 인터페이스를 제공하는 것)

 

public class WashingMachine {
    public void heavilySoilded() {
        setWaterTemperature(100);
        setWashCycleDuration(90);
        setSpinCycleDuration(10);
        addDetergent();
        addBleach();
        addFabricSoftener();
        heatWater();
        satartWash();
    }
 
    public void lightlySoilded() {
        setWaterTemperature(40);
        setWashCycleDuration(20);
        setSpinCycleDuration(10);
        addDetergent();
        heatWater();
        satartWash();
    }
}
 
new WashingMachine().lightlySolied();
cs

 

메소드 구현체는 클라이언트와 완전히 분뢰되어 있어 구현체를 부꿔도 접근하는 클라이언트에는 아무런 영향이 없다.또 클라이언트는 두 메소드를 어떻게 구현했는지 알 수 없고, 알 필요도 없다.

 

장점으로는 결합도가 낮아지고, 유지보수성이 좋아지며 여러 번 실행해도 호출하는 메소드는 동일하기 때문에 일관된 서비스가 보장된다. 비즈니스 로직이 덜 복잡해지고 보안 및 트렌잭션 관리를 중앙화한다.

 

복잡한 로직을 상위 레벨에서 캡슐화하고, 접근 지점을 명확하게 단일화해 API를 통해서만 접근할 수 있게 유도한다.

퍼사드 패턴 사용시 메소드 호출의 계층 구조를 단순하게 만들 수 있다.

 

퍼사드 패턴은 POJO 또는 상태성/무상태성 세션 빈으로 구현할 수 있으나, 상태성 세션 빈으로 구현시에는 리소스가 바닥나지 않도록 주의해야 한다. 클라이언트가 일부러 대화를 끝내거나 타임아웃이 나기 전에는 서버 리소스를 붙들고 있기 때문이다.

 

 

2. 싱글톤 패턴 (Singleton Pattern)

자신의 인스턴스를 가리키는 레퍼런스가 유일하게 존재하고, getter 메소드 하나로만 생성/접근이 가능한 클래스를 가리킨다.

 

클래스 내 인스턴스가 하나 뿐이므로 프로그램 전역에서 해당 클래스의 인스턴스를 바로 얻을 수 있고 불필요한 메모리 낭비를 최소화한다. 하지만 싱글톤 남용시 쓸데없이 리소스를 캐시하고 가비지 컬렉터가 객체를 회수하지 못해 쓸 수 있는 메모리 리소스가 줄어들 수 있다. (단위 테스트에도 싱글톤은 좋지 않음)

 

public class ExampleSingleton {
    private static ExampleSingleton instance;
 
    private ExampleSingleton() {}
    
    public static ExampleSingleton getInstance() {
        if (instance == null) {
            instance = new ExampleSingleton();
        }
 
        return instance;
    }
}
cs

 

싱글톤은 생성자가 외부에 들어나지 않으면 간단히 해결된다. 인스턴스를 반환하는 메소드도 필요한데, 인스턴스를 생성하는 메소드는 클래스명을 통해 접근할 수 있도록 정적 메소드로 표시한다. (ex. ExampleSingleton.getInstance();)

 

반드시 접근제한자를 이용해 외부의 접근을 막거나 fianl로 레퍼런스를 변경하지 못하도록 설정해야 하는데, 생성자를 다른 곳에서도 사용할 수 있으면 그 곳에서도 인스턴스를 생성할 수 있기 때문이다. 생성자에 접근제한자를 사용하면 다른 인스턴스로 레퍼런스 시키지는 못해도, null값을 넣어 레퍼런스 자체를 지워버릴 수도 있어 그렇다.

 

자바 싱글톤은 자바5부터 도입된 Enum 타입을 사용해 생성하는 방법이 가장 좋다. Enum은 형태 자체가 싱글톤이라, 그 외의 생성 과정은 JVM이 처리하므로 객체 생성 및 동기화, 초기화 관련 문제를 신경 쓰지 않아도 된다.

 

public class ExampleSingleton {
    private enum ExampleSingletonEnum {
        INSTANCE;
        public void doAnythingAmazing() {}
    }
}
cs

 

싱글톤 자체 인스턴스 참조법 : ExampleSingletonEnum ese = ExampleSingletonEnum.INSTANCE;

'BackEnd > Java' 카테고리의 다른 글

자바와 객체 지향  (0) 2020.11.17
Java :: NULL vs isEmpty() 차이  (0) 2018.01.16
LinkedHashMap  (0) 2017.06.29
RSA 암호화 구현  (0) 2017.03.14
Java :: Spring 파일 업로드 (multipart-form/data)  (2) 2017.03.14

1. 프레임워크 개념

   1-1. 등장 배경

     아키텍처에 해당하는 골격 코드. 애플리케이션을 개발하는 개발에서 기본이 되는 뼈대나 틀을 제공한다.

     개발자에게 모든 것을 위임하는 것이 아니라 애플리케이션의 기본 아키텍처는 프레이워크가 제공하고,

     뼈대에 살을 붙이는 작업만 개발자가 하는 것이다.

   1-2. 장점

     빠른 구현 시간, 쉬운 관리, 개발자들의 역량 획일화, 검증된 아키텍처의 재사용과 일관성 유지

   1-3. 자바 기반 프레임워크 종류

     - Struts : UI 레이어에 중점을 두고 개발된 MVC 프레임워크

     - Spring(MVC) : MVC 아키텍처를 제공하는 UI 레이어 프레임워크. Struts처럼 독립된 프레임워크는 아님

     - Spring(IoC, AOP) : 컨테이너 성격을 가지는 프레임워크

                                       스프링의 IoC, AOP 모듈 이용해 컨테이너에서 동작하는 엔터프라이즈 비즈니스 컴포넌트

                                       개발 가능

     - Hibernate : 완벽한 ORM(Object Relation Mapping) 프레임워크

                           SQL 명령어를 프레임워크가 자체적으로 생성해 DB 연동을 처리

     - JPA : Hibernate를 비롯한 모든 ORM의 공통 인터페이스를 제공하는 자바 표준 API

     - Ibatis : 개발자가 작성한 SQL 명령어와 자바 객체(VO or DTO)를 매핑해주는 기능 제공

                   기존에 사용한 SQL 명령어 재사용하여 개발하는 차세대 프로젝트에 유용하게 적용 가능

     - Mybatis : Ibatis에서 파생된 프레임워크. 기본 개념과 문법은 Ibatis와 동일

 

2. 스프링 프레임워크

   2-1. 스프링 탄생 배경

    2004년 로드 존슨이 만든 오픈소스 프레임워크이다.

    스프링 이전의 자바 기반 엔터프라이즈 애플리케이션은 대부분 EJB(Enterprise Jaba Beans)로 개발되었으나,

    EJB 컨테이너는 스펙이 복잡하여 개발 및 유지보수에 복잡하고, 실행하려면 값비싼 WAS가 필요하다.

    => 평범한 POJO를 사용하면서도 복잡하지 않고 비용을 절감할 수 있는 프레임워크가 대두하게 됨

 

* POJO (Plain Old Java Object)

평범한 옛날 자바 객체. 대표적으로 POJO가 아닌 클래스는 Servlet이다.

POJO가 아닌 클래스는 개발자 마음대로 만들 수 없으며, 요구하는 규칙에 맞게 클래스를 만들어야 실행할 수 있다.

 

   2-2. 스프링 특징

    - 경량 : 개발과 실행, 배포가 빠르고 쉬움. POJO 형태 객체 관리가 쉬움

    - 제어의 역행(IoC) : 낮은 결합도와 높은 응집도. 객체 생성을 자바 코드로 직접 처리하지 않고 컨테이너가 대신

                              처리한다. 객체-객체 사이의 의존관계 역시 컨테이너가 처리한다. (유지보수 편리)

    - 관점지향 프로그래밍(AOP) : 반복해서 등장하는 공통 로직을 분리함으로서 응집도를 높혀 개발하는 것

    - 컨테이너 : 특정 객체의 생성과 관리를 담당하며, 객체 운용에 필요한 다양한 기능을 제공한다.

                    일반적으로는 서버 안에 포함되어 배포 및 구동된다. (Servlet 컨테이너, EJB 컨테이너 등)

   2-3. IoC 컨테이너

     스프링을 이해하는데 가장 중요한 개념.

    컨테이너는 자신이 관리할 클래스들이 등록된 XML 설정 파일을 로딩해 구동하고, 클라이언트 요청이 들어오는

    순간 XML 설정 파일을 참조하여 객체를 생성하고 객체 생명 주기를 관리한다.

    개발자가 어떤 객체를 생성할지, 객체간의 의존관계 등의 작업들을 코드로 처리하지 않고 컨테이너로 처리하는

    것을 의미한다. (낮은 결합도)

 

    대부분의 IoC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정 파일이 있다.

    스프링에서는 BeanFactory와 이를 상속한 ApplicationContext 두 개 유형의 컨테이너를 제공한다.

    - BeanFactory : 설정 파일에 등록된 <bean> 객체 생성하고 관리하는 기본 컨테이너 기능만 제공한다.

                             클라이언트 요청에 의해서만 bean 객체 생성되는 방식을 사용하기 때문에, 일반적인 스프링에서는

                             BeanFactory를 사용할 일은 없다.

    - ApplicationContext : 기본 객체 관리 기능 외 트랜잭션 관리, 메시지 기반 다국어 처리 등의 기능을 지원한다.

                                         컨테이너 구동 시험에 <bean> 등록된 클래스들 객체를 생성하는 즉시 로딩 방식으로 동작한다.

                                         웹 애플리케이션 개발도 지원하므로 대부분의 스프링 프로젝트는 해당 컨테이너를 이용한다.

  2-4. 스프링 XML 설정

    스프링 컨테이너는 bean 저장소에 해당하는 XML 설정 파일을 참조해 bean 생명 주기를 관리하고 서비스를 제공한다.

  

1. 정의

문법이 간단하고 다양한 패키지가 제공되어 생산성이 높으며, 유지 보수 비용이 적게 듦.

객체 지향적인 언어이며, 무료. 리눅스, 윈도우, 맥에서 설치 가능.

 

 

2. 설치

ㄱ. 사이트 접속

http://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

사이트에 접속하여 'Download Python'을 클릭한다.

다운 받은 .exe 파일을 실행한다.

 

설치 중, 하단 아래쪽에 보이는 'Add Python 3.6 to PATH' 체크박스를 체크한다.

(도스에서 실행 가능하기 위한 체크)

 

 

ㄴ. IDLE 실행

파이썬이 정상적으로 설치되었는지 알아보기 위해

Window 시작 버튼 > Python 3.X > IDLE (Python~ ) 파일을 실행한다.

 

실행시 마우스 커서가 정상적으로 깜빡거린다면, 프로그램이 잘 설치된 것.

나누기 연산 중 분모가 0일 때 발생하는 오류.

 

1. NVL(분자 / DECODE(분모, 0, NULL, 분모), 0) 사용

 

2. CASE WHEN NVL(분모, 0) > 0 THEN 연산식~ ELSE 0 END AS ~

 

두 방법으로 해결 가능.

'BackEnd > DBMS' 카테고리의 다른 글

Oracle :: SOME, ANY, ALL 연산자  (0) 2020.11.18
Oracle :: 배수 출력 쿼리  (0) 2020.02.17
Oracle :: Procedure (프로시저)  (0) 2019.08.08
Oracle :: DB Function vs Procedure vs Package  (0) 2019.04.10
Oracle :: DB Link (Database Link)  (0) 2019.04.09
1
2
3
4
SELECT * 
FROM 
SELECT LEVEL AS NO FROM DUAL CONNECT BY LEVEL <= 50) BBB
WHERE MOD(NO, 5= 0;

N의 배수를 출력하기 위한 배수 출력 쿼리이다.

LEVEL 값을 어디까지 반복하느냐에 따라 배수를 조절하여 출력할 수 있다.

1. 정의

- SQL 문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)를 지원

- 오라클에 내장되어 있는 Procedure Language

- PL/SQL 문은 블록 구조로 되어있고, PL/SQL 자신이 컴파일 엔진을 가지고 있음

- DECLARE문을 이용하여 정의됨(선언문의 사용은 선택 사항)

 

 

2. 생성

 

3. 실행

 

 

4. 제거

1. Function (함수)

- 값을 계산한 후 결과값을 반환하기 위해 주로 사용

- 프로시져와의 차이점

  ㄱ) IN 파라미터만 사용 가능

  ㄴ) 반환될 데이터 타입을 반드시 RETURN문에 선언해야 함 (값 없이는 RETURN문을 포함할 수 없음)

  ㄷ) PL / SQL 블록 내에서 RETURN문을 통해 반드시 값을 반환해야 함

- 코딩을 클라이언트 상에서 함

  (화면단~클라이언트~에서 함수에게 값을 호출하면, 함수는 서버에서 필요한 값들을 가지고 와

   함수 내에서 작업하여 얻어낸 값을 호출했던 클라이언트에게 넘겨줌

 

 

2. Procedure (프로시져)

- 지정된 특정 처리를 시행하는 서브 프로그램의 한 유형

- 단독으로 실행되거나, 다른 프로시져나 다른 틀 또는 다른 환경 등에서 호출되어 실행됨

- 처음 생성 후 컴파일 할 때 오브젝트로서 데이터베이스 내에에 저장되며

  이후로 반복적으로 호출되어 실행 될 때 별도의 컴파일 없이 생성된 코드로 바로 실행

- 명칭이 있는 PL / SQL 블록

- 매개 변수를 받을 수 있고, 반복적으로도 사용 가능

- 보통은 연속 실행, 구현이 복잡한 트랜잭션을 수행하는 PL / SQL 블록을 DB에 저장하기 위해 생성

- 코딩을 서버(DB)상에서 함

  (화면단~클라이언트~에서 프로시져에게 값을 호출하면, 프로시져는 받은 값을 가지고

  서버에서 작업하여 얻어낸 값을 호출했던 클라이언트에게 넘겨줌)

- 값 없이 RETURN문을 포함할 수 있음

- 함수보다 속도가 빠름

 

 

3. Package (패키지)

- Oracle DB에 저장되어 있는, 서로 관련 있는 PL / SQL 프로시져, 함수의 집합

- 선언부 / 본문. 두 부분으로 나눠짐

 

* Package > Procedure > Function

1. 정의

- 물리적으로 다른 위치에 있는 DB를 마치 자신의 DB에 있는 것처럼 사용할 수 있도록 링크를 거는 것

- 현재의 DB에서 네트워크 상의 다른 DB에 접속하기 위한 접속 설정

- Oracle DB만이 가진 특징

 

 

2. 조건

- 오라클 인스턴스 (DBMS가 작업을 하는 공간)가 2개 이상이어야 함

- 연결할 두 DB의 Host Name과 Oracle SID가 달라야 함

- NLS_CHARACTER SET은 동일해야 함

 

 

3. 예시

 

 

 

 

+ Recent posts