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

나누기 연산 중 분모가 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. 예시

 

 

 

 

해당 페이지를 들어갔을 경우

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state[null]; error code [0]; iBatis "The error happend wile setting a property on the result object."

라는 에러가 발생했다.

 

쿼리에서 조회하는 값이 NULL일 경우, resultMap과 VO에 선언된 값이 매핑되지 않아 발생한 오류였다.

 

iBatis에서 resultMap이 선언된 부분에 nullValue를 추가로 기입하여 해결했다.

1
2
3
4
<!-- result property를 선언하는 부분에 nullValue를 추가로 기입한다.
     0이든 공백이든 null일 떄의 값을 처리하는 방식이니 둘 다 가능하다. -->
<result property="viewCount" column="VIEW_COUNT" nullvalue="0" />
<result property="viewCount" column="VIEW_COUNT" nullvalue="" />
cs
1
2
3
4
5
6
<select id="" resultClass="egovMap">
    SELECT
        TO_CHAR(WN_CONCAT(STUDENT)) AS STUDENT
    FROM
        SCHOOL
</select>
cs

 

이와 비슷한 쿼리를 출력하여 json으로 출력해야 하는 일이 있었는데, 자꾸 버전이 맞지 않는다는 JSON 오류가 났었다.

 

오라클에서 WN_CONCAT을 사용시 해당 컬럼을 단일 컬럼으로 합쳐 출력하지만, egovMap에서는 해당 컬럼을 배열로 받아온다는 사실을 깨닳았고 WN_CONCAT으로 단일 컬럼화한 것을 한 번 더 TO_CHAR() 로 문자화 해줬더니 오류가 해결되었다.

+ Recent posts