출처 : https://coding-today.tistory.com/123

 

Vue-CLI Project 기본 구조

vue-cli로 생성된 Project의 기본 디렉터리 구조 파악*자세한 설명 생략  ▷ vue-cli Project 기본 구조   ▷ 관련 글 Vue3 기초 예제 프로젝트 정리Vue3 기초 예제 프로젝트 구조 및 소스 중간 정리 *관

coding-today.tistory.com

 

 

 

 

 

 

vue-cli로 생성된 Project의 기본 디렉터리 구조 파악

*자세한 설명 생략

 

 

 vue-cli Project 기본 구조

 

 

---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  -----------

---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  -----------

---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  ---------------  -----------

 

 

 

출처 : https://wildeveloperetrain.tistory.com/161

 

Vue.js 프로젝트 기본 구조에 대한 이해

Vue.js에 대한 공부를 시작하면서 가장 기본이 되는 프로젝트의 구조와 각각의 부분에 대한 이해를 하기 위해 정리한 내용입니다. 잘못된 부분은 댓글로 남겨주시면 확인하고 공부하면서 다시 수

wildeveloperetrain.tistory.com

 

 

Vue.js 프로젝트 구조

Vue.js에 대한 공부를 시작하면서 가장 기본이 되는 프로젝트의 구조와 각각의 부분에 대한 이해를 하기 위해 정리한 내용입니다.

잘못된 부분은 댓글로 남겨주시면 확인하고 공부하면서 다시 수정하겠습니다. 미리 감사드립니다.

 

 


 

 

Vue 프로젝트 구조

'Vue 3'를 기본으로 'vuex' 'router'를 사용하는 프로젝트를 생성한 결과입니다.

 

 

 

package.json, package-lock.json, node_modules

먼저 package.json, package-lock.json, node_modules 폴더에 대해서 살펴보겠습니다.

 

package.json  파일은 프로젝트에 대한 정보를 담고 있는데요.

프로젝트의 이름, 버전, private 여부, 배포 및 개발에서 사용할 모듈 정보, 실행 명령어, 지원할 브라우저에 대한 설정 등을 포함하고 있습니다.

dependencies로 설정된 부분이 배포만에서 사용될 모듈이며, devDependencies로 설정된 부분이 개발에서도 사용되는 모듈입니다.

여기서 사용되는 모듈들도 결국 오픈소스 모듈들인데, 해당 모듈들이 동작을 하기 위해서는 또 다른 모듈들을 필요로 합니다.

즉, 모듈들이 동작하기 위해 필요로 하는 모듈들이 있는데 해당 정보가 package-lock.json 파일에 나와있습니다.

 

그리고 여기에 해당되는 모든 모듈들이 실제로 설치된 곳이 바로 node_modules 폴더가 됩니다.

(package.json에 종속된 라이브러리들이 모여있는 디렉터리입니다.)

 

 

 

/src 

/src 디렉터리는 어플리케이션 디렉터리라고도 불리며, 실제 대부분의 코딩이 이루어지는 곳입니다.

바로 이어서 /src 하위 경로를 살펴보겠습니다.

 

 

 

App.vue, main.js, index.html

vue 동작에서의 가장 핵심이 되는 부분인 것 같습니다.

먼저 main.js 파일은 npm run serve 명령어를 통해 뷰를 실행시켰을 때, 가장 먼저 실행되는 JavaScript 파일입니다.

Vue 인스턴스를 생성하는 핵심 역할을 하는데요.

 

main.js

main.js의 코드입니다. 

내용을 살펴보면 vue로부터 createApp을 가져옵니다. 그리고 createApp 함수를 통해 App.vue 컴포넌트를 가지고 인스턴스를 만들어서 #app(id="app")에다가 해당 인스턴스를 mount 한다는 것인데요.

 

 

 

index.html

위에서 나온 id="app"가 있는 곳이 바로 index.html입니다. index.html은 어플리케이션의 핵심이 되는 파일인데요.

Vue.js 싱글 페이지 어플리케이션(Single Page Application)이라는 특징을 가지고 있는데, 싱글 페이지 어플리케이션이라는 것이 바로 index.html 하나만을 가지고 Vue Application을 구동한다는 것입니다.

 

정리해보면, npm run serve 명령어로 뷰를 실행시키는 순간 main.js 파일이 실행되는데, main.js 파일은 vue를 기반으로 createApp 함수를 실행합니다. 그리고 이때 가장 먼저 가지고 오는 것이 통합 컴포넌트인 App.vue 파일인데요.

이렇게 만들어진 인스턴스를 index.html id="app"에다가 mount 하게 되는 것입니다.

 

App.vue 파일을 하나의 컴포넌트 파일이라고 하는데, App.vue의 경우 내부에 여러 컴포넌트들을 불러와서 main.js로 한 번에 넘겨주는 통합 컴포넌트라고 할 수 있습니다.

 

 

 

Component 파일

컴포넌트 파일은 <template>, <script>, <style> 부분으로 나누어져 있는데요.

template 부분에는 HTML로 화면상에 표시할 요소들을 작성하고, script 부분에는 스크립트 코드를 작성할 수 있습니다. (import와 export가 있습니다.)

style 부분에는 template의 HTML 요소를 꾸며줄 css 구문들을 작성해줄 수 있는데요. scoped 속성을 사용하면 특정 컴포넌트에서만 고유의 스타일을 선언할 수 있습니다.

 

.vue 확장자를 가진 컴포넌트 파일은 /components 디렉터리에도 있으며, /views 디렉터리에도 있습니다.

두 군데로 나눠지는 차이점은 /views 디렉터리의 경우 화면 전체에 해당하는 컴포넌트를 관리하는 부분이며, 화면 전체가 아니라 부분으로 구성되어 재사용할 수 있는 컴포넌트들을 /components 디렉터리에서 관리하게 되는 것입니다.

 

 

 

router/index.js, /views

App.vue의 <template> 부분을 살펴보면  <router-view/>라는 부분을 볼 수 있는데요.

이 부분이 router/index.js와 연결되어 동작하는 부분입니다.

 

라우팅이란, 웹 페이지 간의 이동 방법으로 Single Page Application(SPA)에서 주로 사용되는데요.

SPA이란, 페이지를 이동할 때마다 서버에서 웹 페이지를 요청하여 새로 갱신하는 것이 아니라, 사용할 페이지들을 미리 받아놓고, 페이지 이동시에 클라이언트 라우팅을 이용하여 화면을 갱신하는 방법입니다.

 

router/index.js 파일에는 Object 배열의 routes가 선언되어 있는데요.

각각의 router path, name, component 값을 가지고 있는데, name은 유니크 값을 가져야 하며, component라는 키는 path로 접근했을 때 연결할 실제 컴포넌트 파일 이름을 나타냅니다.

(최종적으로 프로젝트 운영에 올라가게 되는 vue component 파일들은 javascript 파일로 컴파일되어 올라가게 됩니다.)

 

 

 

/assets

font, icons, images, css 등, 어플리케이션에서 사용되는 정적 파일이 모여있는 디렉터리입니다. 

(/public 디렉터리와는 다르게 webpack의 처리를 받을 수 있다는 특징이 있습니다.)

 

 

 

 

 

* 해당 내용은 유튜브 '개발자의품격 - 4시간 만에 완벽하게 끝내는 Vue.js 입문' 영상을 많이 참고한 내용입니다.

(Vue.js 프로젝트를 처음 접하는데 쉽게 잘 설명해주는 영상이었습니다. )

 

 

Posted by 요지
,


출처 :

[VS Code] 상위 10개 VS Code 확장 플러그인 - vscode extension 추천

 

 

 

. Material Theme, Material Icon Theme

  • 설명 : VS Code 테마 및 아이콘 변경하는 플러그인
  • Material Theme 사용법 : 설치 후 왼쪽 하단 설정 아이콘(톱니바퀴) 클릭 > Color Theme 에서 Material Theme 관련 테마 선택
  • Material Icon Theme 사용법 : 설치 후 왼쪽 하단 설정 아이콘(톱니바퀴) 클릭 > File Icon Theme에서 Material Icon Theme 선택

아래 10종의 Material Theme 중 선택 가능

  • Material Theme
  • Material Theme High Contrast
  • Material Theme Darker
  • Material Theme Darker High Contrast (추천)
  • Material Theme Palenight
  • Material Theme Palenight High Contrast
  • Material Theme Ocean
  • Material Theme Ocean High Contrast
  • Material Theme Lighter
  • Material Theme Lighter High Contrast

Material Theme

 

Material Icon Theme

- File icons

- Folder icons

 

2. Prettier

  • 설명 : 파일 저장 시 알아서 포맷에 맞게 소스 코드가 보기좋게 정렬 됨
  • 사용법 : 설치 후 Setting화면 (Ctrl + ,) 에서 "Format on Save" 입력 후 체크해 줌 (사용안 할 경우 다시 체크 해제)

 

3. Bracket Pair Colorizer 2

  • 설명 : 소스에 괄호({}) 영역에 색깔을 표시해줘 코딩하기 편하게 해준다.  간단한 소스일 경우 상관없으나 소스가 길어질 경우 아주 유용하다.
  • 사용법 : 설치 후 바로 적용 됨

샘플 스크린샷

4. indent-rainbow

  • 설명 : 들여쓰기 된 부분에 색깔을 표시 해 줌
  • 사용법 : 설치 후 바로 적용 됨

샘플 스크린샷

5. Auto Rename Tag

  • 설명 : html Tag 명 변경 시 열림 태그 변경 시 닫힘 태그를 자동으로 변경해줌. 물론 닫힘 태그 변경 시 열림태그가 자동으로 변경 됨
  • 사용법 : 설치 후 바로 적용 됨

 

6. REST Client

  • 설명 : URL을 입력하여 간단하게 HTTP 요청을 보내고 직접 응답의 소스를 바로 확인가능.
  • 사용법

      신규파일을 만들고, 확장자를 http로 합니다.(ex. requestTest.http)

      만든 파일에 URL을 입력 ex. GET https://jsonplaceholder.typicode.com/posts 

      입력 하면 입력한 글 상단에 Send Request라는 글자가 생기고 클릭 시 요청하여 응답의 소스를 보여줌

      여러 URL을 입력할 경우 ### 으로 구분하여 입력 가능하며, header 내용 및 파라메터도 직접입력하여 전송 가능

 

7. CSS Peek

  • 설명 : html 파일에 css를 사용한 class의 해당 css 파일의 위치로 이동해줌
  • 사용법 : html 태그에서 css를 사용한 부분에 ctrl+마우스 클릭 또는 F12 

 

8. HTML CSS Support

  • 설명 : CSS 파일 속성 자동완성 기능 제공, html에서 CSS 파일의 class 자동 완성 기능 제공
  • 사용법 : 설치 후 바로 사용 가능

 

9. Live Sass Compiler

  • 설명 : sass 라이브 컴파일러
  • 사용법

설치 후 바로 사용 가능하나, 설정파일(settings.json)을 수정하여 여러가지 활용이 가능하다.

여기서는 아래와 같이 설정

설명하다
 
 
    "liveSassCompile.settings.formats": [
        {
            "format": "compressed",  // 압축
            "extensionName": ".min.css",  // min.css 파일로
            "savePath": null  // 경로 별도 지정 없음, 지정 시 해당 경로로 min.css 파일이 생김
        }
    ],
    "liveSassCompile.settings.generateMap": false  // map 파일 미생성

하단의 Watching Sass 클릭하여 활성화 한다. 파일이 저장될때마다 자동으로 컴파일 됨.

 

10. Live Server

  • 설명 : html 소스등의 내용을 실시간으로 서버로 띄워 화면에 표시해준다. html 소스 수정 시 실시간 반영
  • 사용법 : 설치 후 하단의 Go Live 클릭 또는 마우스 오른쪽 버튼 클릭하여 "Open with Live Server" 메뉴 클릭

  

Emmet

  • 설명 : html 을 일일이 칠 필요없이 약어등을 사용하여 바로 생성 (익숙해지면 정말 빠르게 html 파일을 작성할 수 있다.)
  • 사용법 : 바로 사용가능 (ex. ! 입력 시 자동으로 html 형식에 맞게 내용이 입력 됨.)

 

참고 : https://youtu.be/c5GAS_PMXDs

 

Posted by 요지
,

 

출처 : https://da-new.tistory.com/171

 

[MsSQL] OUTPUT - UPDATE 사용 시, 변경 전/후 행 반환하기 (deleted/inserted)

OUTPUT Output 구문은 insert, update, delete, merge 문과 함께 사용되며, 각 DML문에 처리되는 행을 반환하는 문법이다. 각 행을 반환하여, Into 구문를 통해 TABLE 혹은 TEMP TABLE 에 해당 행을 삽입한다. Update 문

da-new.tistory.com

 

 

 

 

OUTPUT

Output 구문은 insert, update, delete, merge 문과 함께 사용되며, 각 DML문에 처리되는 행을 반환하는 문법이다.

각 행을 반환하여, Into 구문를 통해 TABLE 혹은 TEMP TABLE 에 해당 행을 삽입한다.

 

Update 문 사용 시 Output 

  update TABLE_A
     set a_column1 = 'value3'
  -- output 구문
  output deleted.a_column1, inserted.a_column2, deleted.a_column3 + inserted.a_column3
  -- into 구문
    into TABLE_B (b_column1, b_column2, b_column3)
   where [조건]

 

update문 사용시, update ~set과 조건 문 사이에 output, into 구문이 위치한다.

 

deleted 접두사

Update Output 문에는 output 시, deleted 라는 접두사와 아래 설명할 inserted라는 접두사를 사용 할 수 있다.

 

deleted 접두사는 타겟이 되는 TABLE_A의 row의 변경 전 혹은 삭제가 될 경우 해당 행을 반환하는 접두사이다.

 

Update 문에서는 해당 row의 컬럼이 변경 되므로 변경 전 행이 반환된다.

변경되어 사라지기에 deleted 라고 생각하면 조금 더 이해하기 편하다.

 

inserted 접두사

Update Output 문에서 output 시, deleted라는 접두사 뿐만 아니라 inserted라는 접두사도 사용이 가능하다

 

inserted 접두사는 타겟이 되는 TABLE_A의 row의 변경 후 혹은 삽입이 될 경우 해당 행을 반환하는 접두사이다.

 

 

위에 설명한 것과 마찬가지의 개념으로 Update 문에서는 해당 row의 컬럼이 변경 되므로 변경 후 행이 반환된다.

변경되어 새롭게 바뀌어 추가 되기에 inserted라고 생각하면 조금 더 이해하기 편하다.

 

output 구문

실행 쿼리 1

  update TABLE_A
     set a_column1 = 'value3'
  -- output 구문
  output deleted.a_column1, inserted.a_column2, deleted.a_column3 + inserted.a_column3
   where [조건]

output 구문은 이렇게 update ~ set과  조건문 사이에 위치하게 된다.

update 문에서 output 구문을 단독으로 사용 시,

변경 전 행들은 deleted, 변경 후 행들은 inserted 접두사를 통해 output 구문으로 반환된다.

 

위 사진의 쿼리를 실행시 아래와 같이 반환됨을 알 수 있다.

반환 값 1

여기서 중요한 것은 deleted / inserted를 혼합하여 사용 할 수 있다는 점인데,

두개를 활용하여 변경 전 / 후의 연산으로 값을 비교한다던지의 활용을 할 수 있다.

 

조건문이 없거나, 조건에 해당하는 값이 여러개 일 경우 한 행만 반환되는 것이 아니라, 삭제된 모든 행이 반환된다.

실행 쿼리 2

조건문 없이 TABLE_A의 모든 행을 변경 할 경우 아래와 같이 TABLE_A의 변경 된 모든 값들을 반환한다.

into 구문

  update TABLE_A
     set a_column1 = 'value3'
  -- output 구문
  output deleted.a_column1, inserted.a_column2, deleted.a_column3 + inserted.a_column3
  -- into 구문
    into TABLE_B (b_column1, b_column2, b_column3)
   where [조건]
 

output 구문을 통해 반환되는 값들을 into 구문을 통해 특정 TABLE 혹은 TEMP TABLE 에 해당 행을 삽입한다.

타겟이 되는 TABLE_A, 반환 값을 삽입하는 TABLE_B의 작업이 원자성을 가지어, 하나의 트랜잭션으로 실행된다.

 

TABLE_A의 작업이 실패하거나, TABLE_B의 삽입이 실패할 경우 이 트랜잭션이 원자성으로 인해 rollback처리가 된다.

 

이렇게 하나의 트랜잭션으로 묶어 두개의 테이블에 동시에 작업을 진행 할 수 있는데,

update문을 구성할 때 output, into 구문을 사용할 경우 아래와 같은 작업에 효과적으로 사용할수 있다.

 

특정 컬럼의 변경 전/후를 저장하여 특정 테이블에 로그로 남긴다거나,

컬럼의 전/후 비교값을 계산하여 특정 테이블에 담아두는 등의 작업을 쉽게 진행 할 수 있다.

 

구문의 특징 및 주의사항

output과 into 구문을 사용 할 경우, 여러 가지 특징 들이 있다.

 

output 구문에는 서브쿼리가 들어갈 수 없다. / 변수 값을 사용 할 수 있다.

into 구문의 TABLE_B에 output 구문으로 반환되는 값과

다른 테이블의 값을 동시에 넣고 싶어 서브쿼리를 사용할 경우 에러가 발생한다.

위와 같은 경우, TABLE_C의 값을 변수에 담아 변수를 활용하여 output 절을 사용 함으로 해결한다.

변수를 선언 하여 해당 변수에 값을 사용한다.

 

into 구문의 TABLE에는 트리거가 있으면 안된다.

TABLE_B에 트리거를 생성한 상태이다.

트리거가 설정되어있는 테이블을 into 구문의 TABLE로 사용할 경우 아래와 같은 에러가 발생한다.

 

Posted by 요지
,

 

 

출처 : https://bigenergy.tistory.com/entry/MSSQL-Trigger-%ED%8A%B8%EB%A6%AC%EA%B1%B0-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

MSSQL Trigger, 트리거 사용방법을 알아보자

오늘은 MSSQL Database의 트리거 사용방법을 알아보도록 하겠습니다. 트리거는 무엇에 쓰는 물건인고?? 테이블에 Insert, Update, Delete 등의 데이터 변화가 생길경우 이 이벤트를 감지해 주는 역할을 하

bigenergy.tistory.com

 

 

 

 

오늘은 MSSQL Database의 트리거 사용방법을 알아보도록 하겠습니다.

 

트리거는 무엇에 쓰는 물건인고??

테이블에 Insert, Update, Delete 등의 데이터 변화가 생길경우
이 이벤트를 감지해 주는 역할을 하는것이 트리거입니다.
즉, 삽입, 수정, 삭제등의 데이터조작이 발생할 경우 이를 감지하여 이를 어떠한 특수목적을 가지고
부가적인 처리를 할 수 있다는 것입니다.

 

 

MSSQL Trigger 사용방법

 

 

어떤때에 트리거를 사용하나??

트리거는 다양한 용도로 사용할 수 있는데 보통은 데이터의 입력,수정,삭제등의 이벤트에 따른 로그기록, 
예를 들면 언제 지워졌고, 지워진 데이터가 무엇인지를 로그 테이블에 기록하거나 
특정테이블에 데이터 변화가 감지되면 다른테이블의 데이터도 조작을 해야하는 경우, 
그리고 데이터가 테이블에 기록되기전에 데이터 무결성 체크와 유효성 체크등이 필요한 경우 등에 사용될 수 있습니다.

 

MSSQL Trigger를 이용한 로그테이블 사용해 보기


테스트를 위해 아래와 같이 2개의 테이블을 만들었습니다.
TestA 테이블에 데이터를 인서트,업데이트,딜리트 할 것이고,  TestB 테이블에는 트리거를 이용한 로그를 남길 것입니다.

 

 

트리거 테스트를 위한 샘플 테이블 생성

 

 

CREATE TABLE [dbo].[TestA](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[userSerialNo] [varchar](10) NOT NULL,
	[userName] [varchar](20) NOT NULL,
	[userOld] [int] NULL,
	[userPhone] [varchar](20) NULL,
	[userMemo] [varchar](100) NULL
) ON [PRIMARY]
GO


CREATE TABLE [dbo].[TestB](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[userSerialNo] [varchar](10) NOT NULL,
	[userName] [varchar](20) NOT NULL,
	[userOld] [int] NULL,
	[userPhone] [varchar](20) NULL,
	[userMemo] [varchar](100) NULL,
	[trgType] [varchar](1) NOT NULL
) ON [PRIMARY]
GO

 

테이블을 모두 만들었으면 트리거도 만들어 줘야 합니다.
SSMS 에서 손쉽게 마우스를 클릭해서 새 트리거 메뉴를 이용해 만들어 줍니다.
트리거는 TestA 테이블에 만들어줍니다.

 

 

 

 

MSSQL Trigger 생성

 

 

아래와 같은 기본 구문이 자동으로 생성되는데 트리거 명칭과 트리거가 적용될 테이블명을  지정해주면 됩니다.

-- SSMS 기본 생성 트리거 SQL 구문 
-- 
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>  
   ON  <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>  
   AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> 
AS  
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for trigger here 

END 
GO 

 

트리거 생성시 주의사항

테이블에 인서트가 됐을 경우 inserted 라는 테이블을 통해 인서트된 데이터에 접근이 가능합니다. 또한, delete의 경우 deleted 테이블에 접근해 삭제된 데이터에 접근이 가능하며, updated 라는 테이블은 없는데 이는 SQL UPDATE의 개념이 삭제 후 업데이트 이기 때문에 inserted 를 참조하면됩니다.

 

실제 생성할 트리거의 쿼리문입니다.

 

-- 테스트용 생성 트리거
--
CREATE TRIGGER dbo.TRG_TESTA_IUD_TEST
   ON  dbo.TestA 
   AFTER INSERT,DELETE,UPDATE --트리거 수행이 인서트,딜리트,업데이트 이후에 동작한다는 뜻입니다.
AS 
BEGIN

	SET NOCOUNT ON;

	DECLARE @Action As CHAR(1) -- 인서트인지 업데이트인지 삭제인지 구분할 변수

	SET @Action = 'I' --기본 인서트 플래그

	-- deleted 테이블에 데이터가 있고 inserted에도 데이터가 있으면 UPDATE 된것으로 판단
	-- deleted 테이블에 데이터가 없으면 인서트로 판단
	
	
	IF Exists(select * from deleted)
	begin
		SET @Action = (Case when Exists(select * from inserted) then 'U' else 'D' End)
	end


	Declare @userSerialNo As Varchar(10)
	Declare @userName As Varchar(20)
	Declare @userOld As Int
	Declare @userPhone As Varchar(20)
	Declare @userMemo As Varchar(100)


	-- insert, update, delete를 구분하여 해당 테이블에서 데이터를 가져와 변수에 할당
	
	IF @Action = 'D'
	Begin
		select @userSerialNo=userSerialNo, @userName=userName, @userOld=userOld,
		       @userPhone=userPhone, @userMemo=userMemo
	      from deleted --삭제된 테이블의 알리아스라고 생각하면됨
	End
	Else 
		Begin
		select @userSerialNo=userSerialNo, @userName=userName, @userOld=userOld,
		       @userPhone=userPhone, @userMemo=userMemo
	      from inserted --인서트 또는 삭제된 테이블의 알리아스라고 생각하면됨
		End


	-- 로그테이블인 TestB 에 기록
	
	Insert into TestB (userSerialNo, userName, userOld, userPhone, userMemo, trgType)
	            values (@userSerialNo, @userName, @userOld, @userPhone, @userMemo, @Action)
END
GO

 

트리거가 생성되었으니 TestA 테이블에 인서트, 업데이트, 삭제 등의 데이터 조작을 해보고
정상적인 트리거 동작을 했는지 TestB 테이블을 조회하여 데이터를 검색해 봅니다.

 

 

트리거를 이용한 이력 생성

 

 

TestB.trgType 필드에 I, U, D 등의 플래그가 표시되는 것을 확인 할 수 있습니다.
MSSQL 트리거 사용법을 이해하는데 도움이 되셨길 바랍니다.

출처: https://bigenergy.tistory.com/entry/MSSQL-Trigger-트리거-사용방법을-알아보자 [빅에너지™:티스토리]

Posted by 요지
,

 

 

출처 : https://hongik-prsn.tistory.com/78

 

MSSQL 계층형 쿼리, 트리구조로 실적 구하기(WITH, 재귀 CTE)

1. 트리구조 테이블로 만들기 이것은 한 회사의 부서 조직도를 나타낸 것이다 이것을 테이블로 표현하면 아래와 같이 표현될 것이다. CREATE TABLE DEPT_TABLE ( DEPT_CD VARCHAR(4), PARENT_DEPT_CD VARCHAR(4), DEPT_N

hongik-prsn.tistory.com

 

 

 

 

 

1. 트리구조 테이블로 만들기

예제로 사용할 데이터의 트리구조

이것은 한 회사의 부서 조직도를 나타낸 것이다 

 

이것을 테이블로 표현하면 아래와 같이 표현될 것이다. 

CREATE TABLE DEPT_TABLE (
    DEPT_CD           VARCHAR(4),
    PARENT_DEPT_CD    VARCHAR(4),
    DEPT_NM           VARCHAR(20)
)

INSERT INTO DEPT_TABLE VALUES ('0000', '', '전체')
INSERT INTO DEPT_TABLE VALUES ('1000', '0000', '임원실')
INSERT INTO DEPT_TABLE VALUES ('1001', '1000', '회장실')
INSERT INTO DEPT_TABLE VALUES ('1002', '1000', '사장실')
INSERT INTO DEPT_TABLE VALUES ('2000', '0000', '전략기획팀')
INSERT INTO DEPT_TABLE VALUES ('2001', '2000', '심사')
INSERT INTO DEPT_TABLE VALUES ('2010', '2000', '마케팅')
INSERT INTO DEPT_TABLE VALUES ('2011', '2010', '온라인마케팅')
INSERT INTO DEPT_TABLE VALUES ('2012', '2010', '오프라인마케팅')
INSERT INTO DEPT_TABLE VALUES ('3000', '0000', 'IT')
INSERT INTO DEPT_TABLE VALUES ('3010', '3000', '정보보안')
INSERT INTO DEPT_TABLE VALUES ('3020', '3000', 'IT혁신')
INSERT INTO DEPT_TABLE VALUES ('3021', '3020', '개발1팀')
INSERT INTO DEPT_TABLE VALUES ('3022', '3020', '개발2팀')

부서 테이블(DEPT_TABLE)은 부서코드(DEPT_CD)와 상위부서코드(PARENT_DEPT_CD)를 갖는다. 

 


2. 계층형 쿼리로 만들기(WITH 절)

오라클에서는 CONNECT BY, START WITH과 같은 내장함수로 간단하게 트리구조를 만들 수 있지만, MSSQL은 WITH 절에서 재귀적 CTE를 구현해야 계층형 쿼리를 만들 수 있다.

 

WITH 절에서 재귀적 CTE를 구현하는 형식은 아래와 같다.

WITH CTE_테이블명(열이름1, 열이름2, 열이름3 ...)
AS
(
    <쿼리문1 : SELECT * FROM TABLE_A>
    UNION ALL
    <쿼리문2 : SELECT * FROM TABLE_A JOIN CTE_테이블명>
)
SELECT * FROM CTE_테이블명;

위의 구문에서 쿼리문1을 앵커 멤버(Anchor Member, AC)라 부르고 쿼리문2를 재귀 멤버(Recursive Member, RM)라 부른다.

 

이를 적용해 보면, 동작 원리는 아래와 같다.

WITH DEPT_CTE AS (
    SELECT DEPT_CD, DEPT_NM, PARENT_DEPT_CD
         , 0 AS LEVEL
         , CONVERT(VARCHAR(500), DEPT_CD) AS CD_PATH
         , CONVERT(VARCHAR(500), DEPT_NM) AS NM_PATH
    FROM DEPT_TABLE WITH(NOLOCK)
    WHERE DEPT_CD = '0000'

    UNION ALL

    SELECT DT.DEPT_CD, DT.DEPT_NM, DT.PARENT_DEPT_CD
         , DC.LEVEL + 1
         , CONVERT(VARCHAR(500), DC.CD_PATH + '>' + DT.DEPT_CD) AS CD_PATH
         , CONVERT(VARCHAR(500), DC.NM_PATH + '>' + DT.DEPT_NM) AS NM_PATH
    FROM DEPT_TABLE DT WITH(NOLOCK)
    INNER JOIN DEPT_CTE DC
            ON DC.DEPT_CD = DT.PARENT_DEPT_CD
)
SELECT replicate('		', LEVEL) + DEPT_NM AS 부서명
     , * 
INTO #DEPT_CTE
FROM DEPT_CTE WITH(NOLOCK)
ORDER BY CD_PATH

1. 최초 호출 시 쿼리문1(앵커 멤버)을 실행, 부서이름이 '전체'인 루트노드를 DEPT_CTE라는 테이블을 최초 생성한다. 레벨은 0으로 초기화

 

2. 쿼리문2(재귀 멤버)를 실행, 레벨 +1 증가, 최초 생성된 DEPT_CTE 테이블의 부서코드와 부서 테이블의 부모코드로 조인해서 루트노드(0000)가 부모노드인 노드들을 가져온다.

 

3.  만약 SELECT 결과가 빈 값이 아니라면 쿼리문2(재귀 멤버)를 다시 재귀 호출. 2번 과정 반복, 부서테이블의 부모노드가 임원실(1000), 전략기획팀(2000), IT(3000)인 노드들을 가져온다. 레벨은 +1 증가

 

3. SELECT 결과가 빈값이면 재귀 호출 중단

 

4. 외부의 SELECT 문을 실행해서 앞 단계에서의 누적 결과를 UNION ALL을 통해 가져옴.

레벨 값과 REPLICATE함수를 이용해주면 보다 더 한눈에 표현이 가능하게할 수 있다.

 


3. 각 부서별 실적을 집계해보자.

실적은 리프노드 부서들만 넣어서 테이블을 만들어 준다.

CREATE TABLE DEPT_PERFORMANCE (
    DEPT_CD    VARCHAR(4),
    DEPT_AMT   BIGINT
)

INSERT INTO DEPT_PERFORMANCE VALUES ('1001', '1000')
INSERT INTO DEPT_PERFORMANCE VALUES ('1002', '2000')
INSERT INTO DEPT_PERFORMANCE VALUES ('2001', '3000')
INSERT INTO DEPT_PERFORMANCE VALUES ('2011', '1000')
INSERT INTO DEPT_PERFORMANCE VALUES ('2012', '2000')
INSERT INTO DEPT_PERFORMANCE VALUES ('3010', '3000')
INSERT INTO DEPT_PERFORMANCE VALUES ('3021', '1000')
INSERT INTO DEPT_PERFORMANCE VALUES ('3022', '2000')
SELECT DEPT_AMT, A.*
FROM #DEPT_CTE A WITH(NOLOCK)
OUTER APPLY (
    SELECT SUM(DEPT_AMT) DEPT_AMT
    FROM DEPT_PERFORMANCE B WITH(NOLOCK)
    INNER JOIN #DEPT_CTE C WITH(NOLOCK)
            ON C.DEPT_CD = B.DEPT_CD
           AND C.CD_PATH LIKE A.CD_PATH+'%'
) DP
ORDER BY CD_PATH

1. DEPT_CTE 테이블에 실적 테이블(DEPT_PERFORMANCE)을 조인해 준다.

 

2. CD_PATH와 LIKE를 조건으로 DEPT_CTE 테이블을 다시 조인해서 SUM을 해준다. 1번 이미지와 2번 이미지의 NM_PATH를 보면 이해하기 쉬울 것이다.

DEPT_CTE 테이블을 다시 조인하고 SUM을 하기 전 결과값

 

3. DEPT_AMT를 보면 각 계층별 부서별 합계가 구해진 것을 볼 수 있다.

 

 

 

Posted by 요지
,