반응형

자바 변수의 종류

변수는 크게 네 종류로 변수의 선언된 위치에 따라서 클래스변수, 인스턴스변수, 지역변수, 매개변수로 나뉜다.

public class Main {
	public static void main(String[] args) { // 매개변수
    	int num = 0; // 지역변수
    }
}

public class Page {

	private int state = 0; // 인스턴스 변수
    public static int page = 10; // 클래스 변수
    public int get() {
    	return state;
    }
}
변수명 선언위치 설명 저장 메모리
클래스 변수
(class variable)
= static 변수
클래스 영역 클래스 영역에서 타입 앞에 static이 붙는 변
객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의
Method
인스턴스 변수
(instance variable)
클래스 영역에서 static이 아닌 변수
개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능

* 객체/인스턴스 생성만하고 참조 변수가 없는 경우 가비지 컬렉터에 의해 자동 제거됨
Heap
지역 변수
(local variable)
메서드 영역 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수
초기값을 지정한 후 사용할 수 있음
Stack
매개 변수
(parameter)
메서드 호출 시 '전달하는 값'을 가지고 있는 인수
(지역 변수처럼 선언된 곳부터 수행이 끝날 때까지 유효함)

 

자바의 메모리 영역

자바 프로그램을 실행하게되면, JVM은 OS로 부터 메모리를 할당 받고 Method, Stack, Heap 각 세 영역에 맞춰서 할당하게 된다.

 - 메소드 (Method) 영역 : 전역변수와 static 변수를 저장하며, Method 영역은 프로그램의 시작부터 종료까지 메모리에 남아있음

 - 스택 (Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제. LIFO (Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워짐

 - 힙 (Heap) 영역 : new 키워드로 생성되는 객체 (인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리

 - PC Register : JVM이 실행하고 잇는 현재 위치를 저장하며, 스레드가 생성되면서 생기는 공간

 - Native Method Stack : Java가 아닌 다른 언어로 구성된 메소드 실행이 필요할 때 사용되는 공간

 

자바의 각 메모리 영역이 할당되는 시점?

 - Method : JVM 동작 후 클래스가 로딩 될 때 생성

 - Stack : 메소드가 호출될 때 할당

 - Heap : 런타임시 할당

 

원시 타입 vs 참조 타입의 메모리 영역

원시 타입 : Stack에 값이 그대로 저장되는 타입 / 참조가 없어서, 빠르게 값에 접근 가능

참조 타입 : Stack에 Heap의 어딘가를 가리키는 주소가 저장

 

반응형

'개발새발 > Java' 카테고리의 다른 글

인터페이스 vs 추상클래스  (0) 2024.05.26
반응형

인터페이스 vs 추상클래스 비교

인터페이스 (implements) : 인터페이스에 정의된 메서드를 각 클래스 목적에 맞게 기능을 구현

추상클래스 (extends) : 자신의 기능들을 하위 클래스로 확장

  추상 클래스 인터페이스
사용 키워드 abstract interface
사용 가능 변수 제한 없음 static final (상수)
사용 가능 접근 제어자 제한 없음 (public, private, protected, default) public
사용 가능 메소드 제한 없음 abstract method, default method, static method, private method
상속 키워드 extends implements
다중 상속 가능 여부 불가능 가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속)
공통점 1. 추상 메소드를 가지고 있어야한다.
2. 인스턴스화 할 수 없다. (new 생성자 사용 x)
3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야한다.

 

사용 시기 및 목적

추상클래스 : 상속 관계 시, 부모나 조상클래스를 상속하는데 기능까지 같은 경우 추상클래스 사용

                     (상속, 확장하여 사용)

인터페이스 : 상속 관계 시, 부모나 조상클래스를 상속하는데 다른 기능이 필요할 경우 인터페이스 사용

                     (동일한 사용방법과 동작을 보장하기 위해 사용)

반응형

'개발새발 > Java' 카테고리의 다른 글

Java의 메모리 영역  (0) 2024.05.26
반응형

SQL Injection이란?

웹 애플리케이션과 데이터베이스 간의 연동으로 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 방식

 

SQL Injection 공격 유형

Error based SQL injection (논리적 에러를 활용한 SQL 인젝션) 

  - 가장 대중적인 기법으로, 인증 우회를 위해 논리적 에러를 유도하는 방식의 공격 기법

-- 정상적인 input
SELECT * FROM user WHERE id = 'id' AND pwd = 'pwd'

-- 비정상적인 input
'OR 1=1 --'

-- 인증 우회를 통한 비정상적 input
SELECT * FROM user WHERE id = '' OR 1=1 --
==> SELECT * FROM user 결과값 도출

 

Union SQL Injection (UNION 명령어를 활용한 SQL 인젝션)

  - 공격자가 추가적인 쿼리를 삽입하여 정보를 획득하는 기법으로, UNION 명령어를 이용하여 여러 쿼리를 합치는 방식을 이용, UNION을 하려는 두 테이블의 컬럼 수와 데이터 형식이 같아야 하므로 ORDER BY 절이나 HAVING을 이용한 오류 메시지를 통해 컬럼의 수를 유추

-- 정상적인 input
SELECT * FROM board WHERE title = 'title' and contents = 'contents'

-- 비정상적인 input
'UNION SELECT id, pwd FORM user --'

-- UNION을 통한 비정상적 input
SELECT * FROM board WHERE title LIKE '' UNION SELECT id, pwd FORM user --

==> SELECT * FROM board 컬럼에 user 정보 합계되서 결과값 도출


Blind SQL Injection (Boolean based SQL)

  - 서버의 반응을 통해 정보를 얻는 SQL 공격 기법으로, 단순히 참과 거짓의 정보한 알 수 있을 때 사용하는 공격 기법. 조건이 참이면 페이지가 정상적으로 출력되고 그렇지 않은 경우 출력되지 않음으로 구분이 가능

-- Boolean 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --'

-- Boolean 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --

-- Time 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

-- Time을 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

 

Stored Procedure based SQL Injection

  - 웹에서 저장 프로시저에 대한 접근 권한을 가짐으로써 정보를 탈취할 수 있는 공격 기법

 

Mass SQL Injection

  - 한 번의 공격으로 다량의 DB를 조작해 큰 피해를 입히는 공격 기법

 

SQL Injection 대응 방안

입력값 검증

  - 사용자의 입력을 받을 때 검증 로직을 추가하여 값이 유효한지 검증하는 방법
     (데이터 길이 제한, 특수문자와 명령어 필터링 등)

 

Prepared Statement 구문 사용

  - 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일하여 실행하지 않고 대기. 그 후 사용자의 입력 값을 문자열로 인식하여 공격 쿼리가 들어간다고 하더라도, 단순 문자열로 인식하여 공격을 무효화하는 방법

 

Error Message 노출 금지

  - SQL Injection을 수행하기 위해서는 데이터베이스의 정보가 필요하기 때문에, 오류 발생 시 사용자에게 보여주는 로그를 별도로 작업하여 데이터베이스 정보 유출 방지하여 공격을 무효화 하는 방법

 

웹 방화벽 사용

  - 웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 방법

반응형

'개발새발 > 기타' 카테고리의 다른 글

코딩 스타일 괄호 및 표기법  (1) 2021.05.27
반응형

NoSQL이란? 
NoSQL은 SQL만을 사용하지 않는 데이터 베이스로 관계형 데이터 베이스와는 다른 방식으로 데이터를 저장한다. 다만, NoSQL의 경우 한 가지로 정의하기엔 힘든 부분이 RDBMS의 경우 쿼리 언어가 비슷한 반면, NoSQL의 경우 각 SQL에서 사용하는 쿼리 언어들이 다른 편이기 때문에 NoSQL로 엮여있는 데이터 베이스라고 하더라도 각각의 성격이 조금씩은 차이가 나는 경우들이 많다. 그렇기에 조금씩 성격은 다르지만, 대부분이 Schema-less 데이터베이스라는 점에선 동일하다.

 

MongoDB란?

큰 분류로는 Key-value, Document, Column-family, Graph 모델로 나뉘는데, 그 중 도큐먼트 지향 데이터베이스 시스템이 MongoDB이다. 그 외에도 Couchbase나 CouchDB 등이 도큐먼트 데이터베이스 시스템을 이용하고 있다.

Document Database의 경우, Key-Value Database와는 달리 값을 document 형태 (json, xml 등의 표준 형식) 로 저장한다는 점에서 차이가 존재한다.

[데이터 형식]

{
  "_id" : "507f191e810c19729de860ea",
  "name" : "테스트",
  "phones" : ["010-1111-2222", "010-3333-4444"]
}

MongoDB에서는 별도의 ObjectID를 입력하지 않은 이상은 위와같은 _id 형태로 자동으로 값이 부여가되서 저장이 되는데 ObjectID는 12byte 크기의 문자와 숫자로 구성된 값으로, 이 값은 각각의 의미를 가지고 있다.

4byte는 유닉스 타임스탬프, 5byte는 프로세스별로 생성되는 랜덤 값, 3byte는 자동으로 증가하는 카운터 로 구성되어 있다.
다만, ObjectID의 경우는 RDBMS의 서버와는 다르게, 분산 환경 지원을 위해 서버가 아닌 클라이언트에서 해당 키를 생성하는 차이점이 존재한다. (클라이언트에서 키를 생성하기 때문에 중복된 값을 생성할 가능성 자체는 존재하나 해당 부분은 낮추기 위해 ObjectID의 패턴이 존재, 또한 상당히 낮은 편)

[ObjectId 구조]

ObjectId('507f191e / 810c19729d / e860ea')
-- 507f191e : UNIX Timestamp
-- 810c19729d : Random Value
-- e860ea : Count

 

주요 특징 (기술 요소)

RDBMS의 ACID와는 다른 BASE를 채용하였는데, ACID를 채용한 RDBMS는 데이터의 일관성을 BASE를 채용한 NoSQL의 경우 데이터의 가용성을 중시하여, 시스템이 서비스를 정상적으로 제공할 수 있는 상태를 우선시한다. 해당 내용은 CAP (Consistency - 일관성, Availbity - 가용성, Partition tolerance - 분할 내성)을 기반으로 하고 있으며, 세부 내용은 아래와 같다.
  - Basically Available (가용성) : 언제든지 사용할 수 있다 (무중단 서비스 가능)

  - Soft State (소프트 상태) : 외부의 개입이 없어도 정보 변경 가능 (각각의 데이터가 도달한 시점에 데이터가 갱신)

  - Eventually Consistent (결과적 일관성) : 일시적으로 일관적이지 않아도 최종적으론 일관적인 상태가 되어야함 (복제 메커니즘에 의해 모든 서버에 데이터 복제가 동시에 실행될 순 없으나, 최종적으로는 모든 서버에 데이터가 복제)

주요 특징 (데이터 형식)
MongoDB의 경우 데이터를 관리하기 위한 형식으로 JSON (JavaScript Object Notation)과 BSON (Binary JSON) 형식을 사용하고 있다.
두 형식을 사용하는 이유는 JSON의 경우 텍스트 기반으로 구문 분석이 느리고, 공간 효율성이 상대적으로 나쁜편이기 때문에 JSON 구조를 가져가면서 기계가 읽기 쉬운 형태인 binary 형태로 변경하여 저장하는 형식으로 해당 문제를 해결하였다.
JSON의 경우는 Javascript에서 객체 생성 시 사용하는 표현식으로 {"hello": "world"} 형식과 같이 Key : value 형태의 데이터를 가지고 있고, BSON의 경우 JSON을 이진 형식으로 인코딩한 형식으로 \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00 와 같은 구조를 지닌다.
데이터 입출력시에는 JSON을 사용하며, 데이터 저장 시에는 BSON을 사용한다. 이와 같은 구조는 실제로는 데이터베이스 내부에서 처리가 이루어지기 때문에 표면적으로는 구조를 확인하는 일은 드문편이다.

주요 특징 (용어)

MongoDB의 경우 Document 기반 데이터 베이스로, RDBMS와 명칭적인 차이는 존재하나 비슷한 역할을 가진다.

MongoDB RDBMS
데이터베이스 (Database) 데이터베이스 (Database)
컬렉션 (Collection) 테이블 (Table)
도큐먼트 (Document) 로우 (Row)
필드 (Field) 칼럼 (Column)

 

주 사용처
MongoDB와 같은 NoSQL의 경우, 대용량 데이터에서도 원하는 데이터를 빠르게 찾을 수 있고 스키마가 존재하지 않기 때문에 정형 혹은 비정형의 대용량 로그성 데이터와 제일 궁합이 잘 맞는 편이다. 필요에 따라서, 샤드 클러스터를 구성하여 데이터 분산과 Scale-out 등을 통해 지속적인 유지보수 또한 쉬운 편이다.
다만, 이러한 로그성 데이터뿐만 아니라 여러 서비스에서 조금씩 다르게 사용하는 공용 데이터나 조금씩 다른 형태로 들어오는 데이터 등 스키마가 존재하지 않는 자유로움으로 인해 여러면에서 활용성은 점점 늘어나는 추세이다. 해당 부분은 각 데이터베이스 특성을 활용하여 설계하면 효율적인 활용이 가능하다.

마치며

이전에는 몽고 DB 쓰지 마세요 라는 기사와 검색이 있을 정도로 여러가지 이슈가 존재하였으나, 현재는 전통적인 RDBMS를 제외하면 가장 많이 사용되는 데이터베이스기도하고 데이터가 점점 다량화되어가는 추세에 있어서는 RDBMS와 NoSQL을 혼용하여 사용하는 것이 좋은 선택지임은 분명하다.

출처 : https://db-engines.com/en/ranking

 

DB-Engines Ranking

Popularity ranking of database management systems.

db-engines.com

 

반응형
반응형

에러 메시지

 

Database "C:/Users/kai/test" not found, either pre-create it or allow remote database creation [90149-214] 90149/90149

 

원인

H2 Database를 처음 연동할 시 주로 볼 수 있는 에러이다.

주로 연동 이후 웹 H2 Console로 연결 테스트를 진행할 때 볼 수 있는 에러인데, 해당 에러의 경우 보안 정책상 데이터베이스를 생성할 수 없어서 데이터베이스를 별도로 생성해 주거나, 원격 데이터베이스 생성을 허용해야 한다.

 

해결방법

보안상으로 추천되지 않으니, 직접 데이터베이스를 생성하려면 에러 메시지 상의 위치 C:/User/kai [사용자명]/test [데이터베이스명]로 이동하여서 test.mv.db 파일을 생성하면 해당 문제를 해결할 수 있다.
test의 경우 데이터베이스명이므로, jdbc:h2:~/errortest 같은 경우에는 errortest.mb.db로 데이터베이스 파일을 생성하여야 한다.

데이터베이스를 생성한 뒤, 다시 Test Connection을 실행하면 아래와 같은 성공 메시지를 볼 수 있다.

반응형

'개발새발 > 이슈' 카테고리의 다른 글

Connection NetworkTimeout 에러 (HikariCP)  (2) 2021.06.01
반응형

H2 Database 란?
자바로 작성된 관계형 데이터베이스 관리 시스템이다.

서버 (Server) 모드와 임베디드 (Embedded) 모드의 인메모리 DB를 제공하며, 브라우저 기반의 콘솔 모드를 사용할 수 있기 때문에, 과제형 코딩테스트나 개발 단계의 테스트 DB로써 많이 이용된다.


사용법

우선, 사용할 버전을 확인 후, pom.xml이나 build.gradle에 추가하면 된다.

https://mvnrepository.com/artifact/com.h2database/h2

// Maven - pom.xml
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
    <scope>test</scope>
</dependency>

// Gradle - build.gradle
testImplementation group: 'com.h2database', name: 'h2', version: '2.1.214'

 

application.yml or application.properties 설정

그 뒤엔 본인의 사용환경에 맞게 application을 설정해주면 된다.

// DB (2개중 택 1)
spring.datasource.url= jdbc:h2:~/test // 임베디드 모드 (인메모리)
spring.datasource.url= jdbc:h2:tcp://localhost/~/test // 서버 모드

spring.datasource.driver-class-name= org.h2.Driver // 데이터 베이스 설정
spring.datasource.username= sa // 접속 시 사용할 유저명
spring.datasource.password= // 접속 시 사용할 패스워드

// 데이터 설정
spring.sql.init.mode= always // 데이터베이스 초기화 (기본 never)
spring.sql.init.schema-locations= classpath:db/schema.sql // 첫 실행시 실행 할 DDL 데이터
spring.sql.init.data-locations= classpath:db/data.sql // 첫 실행시 실행 할 DML 명령

// H2 DB 콘솔
spring.h2.console.enabled= true // 콘솔 사용 여부
spring.h2.console.path= /h2-console // 콘솔 주소

 

브라우저 콘솔 접속

spring.h2.console.path로 설정한 위치로 접속하면 해당 콘솔을 확인하여, 접속할 수 있다.

 

 

접속하면 schema.sql, data.sql 에서 설정한 바와 같이 미리 테이블과 데이터가 입력되고, SQL문을 사용하여 데이터를 확인 가능하다.

 

 

반응형
반응형

Spring Boot에서 JS(Javascript) 사용?

자바에서 제공하는 API인 Java Scripting API를 통해서, 자바에서 자바스크립트 함수 호출이 가능하다.

js 파일 및 설정

js를 사용하기 위해선, 우선 해당 스크립트가 적용된 js파일을 적용할 필요가 있다.
resources 하단에 사용할 js 파일을 정리하여 resources/js/aes.js 와 비슷한 형태로 적용하면 된다.
해당 부분은 css, image 파일 또한 동일하게 적용 가능하다.

 

application.yml 설정

local.yml
prod.yml

js 파일을 설치하여, 적용하였으면 해당 부분의 경로를 불러오기 위해 설정을 진행하여야 하는데

local, dev, prod 각 설정에 맞게 절대 경로를 지정하여 사용하면 된다. (build 이후 경로의 차이가 존재)

 

Java Scripting API 사용

JavaScripting API의 ScriptEngine을 통해 스크립트 엔진을 호출하여 aes.js 자바 스크립트 파일을 불러오는 소스이다.
간략하게 decrypt 함수를 호출하는 방식으로, JavaScripting의 인터페이스를 활용하여 작업이 가능하다.

// 스크립트 엔진 호출
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");

// js 파일 호출
URL resourceUrl = this.getClass().getClassLoader().getResource("js/aes.js");
String fileLocation = resourceUrl.getFile();

// evel 메소드를 사용하여 컴파일
try {
	se.eval(new FileReader(fileLocation));
} catch (FileNotFoundException | ScriptException e) {
	e.printStackTrace();
}

String aesKey = "test";
String ob = null;
// 자바스크립트의 함수를 실행하게 해주는 Invocable
Invocable inv = (Invocable) se;

// invokeFunction을 통한 특정 함수 호출
try {
	ob = (String) inv.invokeFunction("decrypt", input, aesKey, 256);
} catch (NoSuchMethodException | ScriptException e) {
	e.printStackTrace();
}

 

반응형

'개발새발 > Spring Boot' 카테고리의 다른 글

Lombok 설치 및 STS 연동  (0) 2021.05.22
Spring Boot 프로젝트 설정 방법  (0) 2021.05.19
반응형

자동 증가 값 생성 (IDENTITY)

DB를 설계하는데 있어서 데이터가 생성될 때마다 자동으로 값이 증가하는 컬럼을 생성해야 하는 경우가 존재한다. 이럴 때 주로 사용하는 것이, MSSQL에서는 IDENTITY이다.

사용법

IDENTITY는 아래와 같은 방법으로 테이블을 생성할 때 사용한다.

CREATE TABLE test (
	idx int identity (1, 1) -- (초기값, 증가값)
)

identity (초기값, 증가값) 을 입력하여 초기값과 증가 값을 조절할 수 있으며, 아예 입력을 하지 않은 경우에는 기본 값으로 1부터 하나씩 증가하도록 되어있다.

CREATE TABLE test (
	idx int identity
)

 

임의 지정 및 초기화

기본적으로 identity를 설정하면, 증가값을 설정된 값으로 증가 값을 자동으로 생성한다. 그렇기 때문에, 중간에 데이터가 삭제되는 경우 해당 증가 값을 뛰어 넘어서 생긴다. 이렇게 중간에 비는 데이터를 채워 넣거나 기존 시작 값을 변경하고 싶은 경우에 해당 방법을 사용할 수 있다.

-- 증가값 자동 지정 (기본 설정)
SET IDENTITY INSERT test OFF; -- test : 테이블명

-- 증가값 수동 지정
SET IDENTITY INSERT test ON;

-- 시작값 재지정
DBCC CHECKIDENT ('test', RESEED, 0) -- 0 : 시작값

증가 값은 기본적으로 자동 지정으로 설정되어 있으며, 이 상태의 경우 데이터를 강제적으로 insert해도 값을 넣을 수 없고, 아래와 같은 에러를 볼 수 있다. 

[S001][544] IDENTITY_INSERT가 OFF로 설정되면 테이블 'test'의 ID 열에 명시적 값을 삽입할 수 없습니다.

그렇기 때문에 중간에 비는 데이터를 다시 채워 넣고 싶은 경우 IDENTITY_INSERT를 ON으로 설정한 뒤에 데이터를 입력하여야 정상적으로 처리할 수 있다.

초기화의 경우 DBCC CHECKIDENT를 사용하여, 진행할 수 있다. 데이터를 전부 삭제하여도 기존에 증가 값에 대한 값은 초기화하지 않으면 삭제된 상태로 유지되기 때문에, 다시 기존 초기값부터 재설정하여야 원하는 대로 데이터 처리가 가능하다.

 

자동 증가값 조회

프로시저에서 Insert 한 뒤 자동으로 증가한 IDENTITY 값을 조회하여야 하는 경우 사용한다.

주로, @@IDENTITY, IDENT_CURRENT(), SCOPE_IDENTITY() 세 방법을 사용하며 각각 사용처가 다르게 사용된다.

-- 현재 세션의 테이블에서 생성된 마지막 ID 값 반환 (제한 x)
SELECT @@IDENTITY

-- 현재 세션의 테이블에서 생성된 마지막 ID 값 반환 (현재 범위만)
SELECT SCOPE_IDENTITY()

-- 지정된 테이블에서 생성된 마지막 ID 값 반환
SELECT IDENT_CURRENT('test') -- 테이블명(test)

오류가 발생하거나 개체를 볼 수 있는 권한이 없으면 NULL을 반환하며, 주로 특정 테이블의 마지막 ID 반환에는 IDENT_CURRENT를 사용하고 현재 세션 내의 작업만을 대상으로 하는지 여부에 따라 @@IDENTITY와 SCOPE_IDENTITY가 다르게 사용된다고 생각되면 조금 이해가 편하다.

반응형
반응형

변수란?
임시 저장 영역으로, 값을 담아두는 공간이다.

기본적인 프로그래밍 영역에서 사용하듯이 저장 프로시저에서도 동일하게 사용 가능하다.

 

변수 선언

변수 선언 시에는 DECLARE를 사용하며, 사용법은 아래와 같다.

-- 단일 형태의 변수 생성
DECLARE @name nvarchar(10), @age int -- @name, @age 필요한 변수명 사용

-- 테이블 형태의 변수 생성
DECLARE @data table (name nvarchar(10), age int)

각각 필요한 데이터 형태에 따라서 단일 형태로 선언하거나, 테이블 형태로 여러 행의 변수를 담을 수도 있다.

 

변수 값 대입

변수는 초기 생성 시 null 값을 가지고 있으며, 변수에 값을 대입하여 사용할 수 있다.

주로, SET이나 SELECT 하여 특정 데이터를 변수에 담을 수 있으며 사용법은 아래와 같다.

-- 변수 선언
DECLARE @name nvarchar(10)

-- SET을 통한 변수 값 대입
SET @name = '개발새발'

-- SELECT를 통한 변수 값 대입
SELECT @name = name FROM test WHERE name = '개발새발'

기본적으로는 두가지 방법을 사용하지만, SET 결과에 SELECT 쿼리를 사용하거나 하는 등의 변형도 가능하다.

반응형
반응형

IF EXISTS 란

프로시저를 활용하다 보면, 데이터를 확인하여 특정 조건에 따라 다른 조건의 쿼리를 실행해야 하는 경우가 생긴다.

이럴 때 주로 활용하는 조건문이 IF EXISTS이다.

 

문법

기본적인 문법은 다음과 같으며, 조건문에 값의 유무에 따라 실행되는 쿼리를 다르게 실행할 수 있다.

 

IF EXISTS (
	-- 조건문
	SELECT 1 FROM TEST WHERE TEST_NAME = '개발새발'
    )
	BEGIN
    	-- 조건문에 값이 있는 경우 실행
    	UPDATE TEST SET TEST_TIME = GETDATE()
    END
ELSE
	BEGIN
    	-- 조건문에 값이 없는 경우 실행
    	INSERT INTO TEST (TEST_NAME, TEST_TIME) VALUES ('개발새발', GETDATE())
    END

 

IF EXISTS 문법과 다르게, 조건 결과가 없을 때의 경우도 사용할 수 있으며, 문법은 다음과 같다.

 

IF NOT EXISTS (
	-- 조건문
	SELECT 1 FROM TEST WHERE TEST_NAME = '개발새발'
    )
	BEGIN
    	-- 조건문에 값이 없는 경우 실행
    	INSERT INTO TEST (TEST_NAME, TEST_TIME) VALUES ('개발새발', GETDATE())
    END
ELSE
	BEGIN
    	-- 조건문에 값이 있는 경우 실행
        UPDATE TEST SET TEST_TIME = GETDATE()
    END

 

 

 

해당 함수의 경우 조건에 따라 다양하게 사용되며, 코드단에서 데이터를 두 번 이상 호출하지 않아도 되기 때문에 경우에 따라 유용하게 활용할 수 있는 함수이다.

반응형

+ Recent posts