Skip to main content

9 posts tagged with "우리테크"

View All Tags

서버리스 메모 앱 토이 프로젝트

토이 프로젝트를 진행하기 이전에..#

사내에서 화요일 오후2시에 대략 30분 ~ 1시간 정도 자유롭게 참여할 수 있는 기술공유 시간을 가지고 내부적으로 발표시간을 가지고 있었다.

현재 글을 쓰는 시점으로 1년 4개월정도 운영해본 결과 다들 관심있는 기술이 다르고 발표하는 인원이 초반에는 꾸준하게 있었으나 시간이 지날수록 변동폭이나 참여할 수 있는 인원 예측이 어려워 테크톡 시간이 비효율적인 상황이 발생하기도 하였다.

물론, 참여의 경우 부담 없이 참여하는 방식으로 자율방식을 권장 중이지만 최근 6개월 이상은 개인적으로 혼자 발표하는 시간들이 많아진 것 같아 아쉬운 점이 있었다.
(개인적으로 테크톡을 참여하면서 1년 4개월동안 휴계기간 이외에 단 한번도 발표를 하지 않은적이 없다.)

2022.03.15(화) 오후 2시에 테크톡 시간에 테크톡 시간에 각자 IT 관심분야 외에 다 같이 공통 목표를 가지고 토이 프로젝트를 간단하게 구축해 보면 어떨까라는 주제로 회의를 통해 이야기를 나누었다.

이야기의 결론은 CRUD 모두 구현이 가능하고 백앤드부터 프론트앤드까지 전체적으로 구현 가능한 서버리스 메모 웹 어플리케이션 프로그램을 진행하기로 결정하였다.

목표#

메모 웹 어플리케이션을 구성하기 위해 HTTP 웹 어플리케이션에서 요구하는 전반적인 흐름을 파악하고 메모관련 기능 구현을 통해 풀스택 기술스택에 대해 어떤것들이 필요한지 전반적으로 경험할 수 있다.

  • AWS 서비스를 이용해 백앤드에서 회원가입, 로그인, 데이터의 CRUD API를 구성한다.
  • 프론트앤드에서 React를 사용하며 로그인, 세션, 데이터의 추가, 수정, 저장, 삭제, 파일 업로드 등을 구현한다.

요구사항#

  • Javascript 문법에 기본적인 사용법
    • const, let, 분기문, 반복문, array, function, class
  • HTTP 통신에 대한 전반적인 이해
  • React 16.3 이상 사용
  • 1주일에 개인 시간 2~3시간 정도 필요(기능 구현)
  • 1주일 동안 구현한 것을 테크 톡 사이트에 간단히 정리하고 발표
  • 서로에게 코드공유 및 질문할 수 있는 시간을 가진다.

모든 코드가 제공되기 때문에 따라할 순 있지만 이해를 위해서 직접 구현시에 기본적인 사항들을 조사하고 공부하는것이 요구된다.

백앤드#

  • AWS Serverless-Stack Framework 사용
  • AWS Cognito 서비스를 사용해 이메일로 회원가입이 가능하도록 구성
  • AWS Lambda 서비스를 사용해 백엔드에서 필요한 비지니스 로직을 구성
  • AWS ApiGateway 서비스를 사용해 데이터의 컨트롤을 위해 REST API 형태로 구성
  • AWS S3 서비스를 사용해 파일 조회 및 저장을 구성

프론트앤드#

프론트앤드는 기본적으로 백앤드가 구성되있는 상태에서 진행

  • React 16.3 버전 이상으로 데이터를 받아와 화면을 구성
  • 회원가입, 로그인 화면 구성
  • 메모 추가, 수정, 삭제, 조회 구성

준비사항#

AWS의 많은 서비스를 명령줄을 통해 쉽게 사용하기 위해서 AWS CLI 설치가 필요합니다.

AWS CLI는 Python 2 버전 2.6.5+ 또는 Python 3 버전 3.3+ 와 Pip가 필요합니다. Python 또는 Pip 설치가 필요하면 아래 링크를 참고해서 설치합니다.

맥 사용자는 아래 Python과 Pip을 설치해야 합니다.

MAC OS 사용자#

Python, Pip 인스톨 후 아래 명령어를 터미널에서 실행합니다.
(달러는 명령어에 포함되지 않습니다.)

$ sudo pip install awscli

또는 Homebrew를 사용하고 있다면 아래 명령어를 터미널에서 실행합니다.

$ brew install awscli

Window OS 사용자#

윈도우 사용자는 아래 msi로 설치를 진행합니다.

AWSCLIV2 msi 다운로드

서버리스 데이터 분석

AWS 서버리스 데이터 분석 시스템 아키텍쳐#

아래 유튜브 영상을 보고 관심이 생겨 글을 작성하게 되었다.

서버리스 데이터 분석 시스템 구축 | Part 1. 개념 및 워크 플로우

  • Sungmin Kim.
  • Solutions Architect, AWS

데이터로 어떤 작업을?#

  • 네트워크 분석
  • 추천
  • 머신러닝
  • 그 외...

What is Architecting

어떤 문제를 풀기위해서 다양한 방법들이 있을텐데, 다양한 장단점들을 Trade-off 해서 밸런싱하는것이 아키텍팅의 중심이라고 생각할 수 있다.

꼭 어떤 방법론이나 적용법이 가장 좋은 방법이라고 단정지을 순 없다.

데이터#

데이터만 가지고 가치가 있는것이 아니라 데이터를 가지고 원하는 결과 및 인사이트를 내기위하여 과정들이 필요하다.

3+1 Vs of Big Data

과거에 비해서 분석시스템이 만들기가 더 어려워졌을까?

그것은 빅데이터의 4가지 특성#

  • 어마어마게 커진 Volume
  • 생산되는 속도의 차이 Velocity
  • 데이터의 다양성 Variety
  • 원하는 가치 Value

이런 복잡성 때문에 현대에 와서는 데이터분석 시스템이 복잡해지고 구축해지기 어려운 점이 있다.

Structured, Unstructred, and Semi-Structured#

데이터의 다양한 모양 및 구조

Data Structured

  • Structred Data
    • RDB에 잘 정의되있는 데이터
  • Unstructred Data
    • 동영상, 텍스트 데이터
  • Semi-Structured Data
    • CSV 데이터, JSON 데이터

Data Temperature Spectrum#

Data Spectrum

  • Hot data
    • 빠른 빈도로 데이터 요청
    • 응답시간이 빨라야 함
    • 데이터의 양은 적음
    • In-Memory DB 사용

세션값 요청

  • Cold data
    • 많은 양의 데이터 요청
    • 응답시간은 좀 높아도 괜찮음

연말에 정산되는 데이터

  • Warm data
    • 상시적으로 사용하는 데이터
    • 적당한 응답시간

모든 데이터를 동일한 스토리지, 분석 솔루션으로 처리하기 보다는 목적에 맞는 데이터의 온도에 따라 나누어서 적용하는게 바람직하다.

Simpilfy Big Data Processing#

Data Spectrum

아주 단순한 과정을 표현하자면

  1. 데이터 수집
  2. 데이터 저장
  3. 분석 및 프로세싱
  4. 데이터 소비 및 활용

중요한 점#

  • 데이터의 처리 속도
  • 데이터의 볼륨의 처리 가능량
  • 전체적인 프로세스의 비용

Business Intelligence System#

Business Intelligence System

CRM & CDC#

주기적으로 변경되는 데이터 저장

WEB#

쇼핑몰 등에서 클릭하는 데이터등을 저장

IoT#

사물 인터넷의 센서 데이터를 모아서 저장

BI-Architecture#

bi-architecture-system

  • 모바일, 데스크탑등의 접근
  • Amazon RDS 서비스를 통한 데이터 저장
  • QuickSight 서비스를 통한 데이터 시각화

QuickSight#

  • 빠른 응답의 BI 서비스
  • 세션당 요금이 청구
  • 보다 쉽게 적용가능한 머신러닝 적용가능
  • 데이터를 시각화해주는 서비스

aws-quicksight

서버리스 데이터 분석을 통해..#

AWS의 추상화된 서비스를 잘 연계해서 사용하면 보다 복잡하고 여러 기술들을 요구하는 BI 시스템에 대해 보다 쉽게 구축이 가능하다.

아주 간단한 예시외에도 여러 인프라 및 아키텍쳐를 통해 원하는 데이터를 분석하고 보다 미래에 있을 상황 및 수요를 어느정도 정확도 있게 예측하고 대비 가능하지 않을까라고 생각해본다.

Hexo 블로그 만들기

정적 사이트 생성#

기술 블로그를 시작하기전에 Github과 연동하여 운영하고싶어 정적 사이트를 만들만한 프레임워크들을 조사했다.

Jekyll#

  • 루비 기반
  • 가장 보편적이고 인기많은 정적 사이트 제작 프레임워크
  • 문서가 많아지면 빌드하는데 5분이상이 소요될 수 있음
  • 다양한 테마

Hexo#

  • 자바스크립트(Node.js) 기반
  • 한글 레퍼런스 꽤 많음
  • 다양한 테마

Hugo#

  • Golang 기반
  • 매우 빠른 빌드속도
  • 잘 정리된 문서화
  • 사용할만한 테마는 부족

Hugo? Hexo?#

처음에 빠른 빌드속도가 빠른것이 장점이라고 많이 알려져있어서 Hugo로 시작했으나..

하지만, Go언어 기반으로 되어있고 및 테마 사용 시 구조 파악 및 커스텀화 시키기가 매우 어려웠음.

결국, 현재 자바스크립트를 많이 사용하고 있으니 Hexo 프레임웤을 사용하기로 결정.

Hexo 설치#

Hexo는 Node.js 기반이기 때문에 Node.js가 설치되어있어야 한다.

  1. 글로벌하게 hexo-cli 설치한다.
$ npm install hexo-cli -g
  1. hexo로 Blog 프로젝트를 만들어준다.
$ hexo init blog
$ cd blog
$ npm install
  1. 테마적용을 위해 git clone 진행 (필자는 icarus 테마를 선택)
$ git clone https://github.com/ppoffice/hexo-theme-icarus.git
  1. themes 폴더안에 clone 받은 테마의 폴더명을 hexo-theme-icarus -> icarus로 변경해준다.
  2. 루트 경로에서 _config.yml 파일을 아래처럼 수정해준다.
theme: icarus
  1. 테마에 필요한 npm 패키지들을 설치해준다. (icarus 경우 아래 패키지들이 필요함)
  • bulma-stylus
  • hexo-component-inferno
  • hexo-renderer-inferno
  • inferno
  • inferno-create-element
$ npm install --save bulma-stylus hexo-component-inferno hexo-renderer-inferno inferno inferno-create-element
  1. hexo s 명령어로 로컬에서 테마가 적용됬는지 확인
$ hexo s

GitHub Pages#

깃헙 페이지를 이용해 블로그를 배포하기 위해 우선 Repository를 생성해둔다.

"GitHub사용자이름".github.io 로 Repository를 생성해주면 https://사용자이름.github.io/ 블로그 주소로 사용 가능

깃헙 페이지로 홈페이지 만들기

Hexo-Deployer-Git#

Hexo에서 Git으로 정적파일을 생성후 편하게 배포하기위한 패키지를 받아준다.

$ npm install --save hexo-deployer-git

Github에서 만들어둔 Repository의 Clone 주소를 Hexo 프로젝트 설정파일에 적어준다.

_config.yml

deploy:
type: git
repo: 저장소 주소(예: https://github.com/사용자계정/사용자계정.github.io.git)
branch: master

publish용 정적파일 생성

$ hexo generate

Github 배포

$ hexo deploy

동시 생성 & 배포

$ hexo d -g

업데이트가 안될 경우#

캐쉬때문에 간혹 업데이트가 반영이 안될경우가 있는데 아래 명령어 후 다시 배포를 진행하면 된다.

$ hexo clean
$ hexo d -g

정적 사이트 생성기#

내가 찾아본 정적 사이트 생성 프레임웤 외에도 정말 많은 사이트와 자료들이 있으니 잘 찾아보고 활용 후 본인에게 맞는것을 사용했으면 좋을 것 같다.

참고#

Sql Server Bulk Work

Sql Server Bulk Working#

이번에 단독서버를 만드는 업체를 위해 기존에 데이터를 백업하여 작업하는 사항이 생겼다.

현재 운영중인 Sql Server에서 대량 추가, 수정, 삭제 작업을 요구할 때 어떻게 효율적으로 처리해야 하는지에 대한 방법들을 적용시키고 테스트를 진행해보았다.

일반적으로 몇만개의 데이터를 처리할 경우에는 DML 명령어로 처리하면 초~분 단위로 처리가 가능하다.

하지만, 100만개 이상의 데이터가 있는경우 수십분, 수시간의 시간이 소요될 수 있다.

아이랩의 결재정보와 관련된 테이블의 경우 2억개 이상의 Row 데이터가 입력되어있다.

Bulk Insert, Update#

Insert#

Sql Server Bulk Insert

  • 대량 Insert의 경우 가지고 있는 데이터를 Bulk Insert 문을 활용하여 작업한다.
  • 대량의 데이터를 가지고 있는 테이블을 다른 테이블로 옮기려면 insert into + select 문을 사용한다면 Bulk Insert 동작을 발생할 수 있도록 한다.
insert into TestTable
(Id, Name, Size, Crc, Contents, ContentType, CompressedType, CompressedSize, Archived, Created)
select
Id, Name, Size, Crc, Contents, ContentType, CompressedType, CompressedSize, Archived, Created
from BigDataTable -- 1,000,000 Row Table
Order By Id -- PK로 OrderBy로 한다면 인덱스 단편화 없이 Insert가 가능

다른 테이블에서 옮길경우 Index의 적절한 활용도 중요하다.

만약 대량의 데이터가 있는 테이블에서 Index가 없는 조건으로 Table Scan이 발생할 경우 select 절의 속도가 굉장히 오래 소요되기 때문에 Data Search 부분에서 오래 소요될 수 있다.

전체 데이터를 다 옮겨야한다면 Order By PK 조건을 추가하여 진행하는것이 좋다.

Update#

Update의 경우 Index 조건을 잘 맞춰주고 몇십만건 이상의 데이터라면 일정부분 잘라서 작업하는게 좋다.

대량 작업으로 인한 과도한 메모리 사용 및 Dead Lock 방지

select 1
WHILE @@ROWCOUNT > 0
BEGIN
update TOP (10000) dbo.EXPRESSES
set ADDRESS = 'abc'
where Client_Id = 1
END

Bulk Delete#

DELETE 작업의 경우 Insert, Update보다 발생하는 엄청난 양의 트랜잭션 로그가 고려된다.

Sql Server의 경우 백업모드가 3가지가 존재한다.

  • SIMPLE
  • BULK_LOGGED
  • FULL

BULK_LOGGED의 경우 대량 로그변경이 일어날경우, FULL 백업 설정의 경우 모든 수정사항이 트랜잭션 로그가 저장되므로 실제 작업을 할때는 Simple 모드에서 설정 후 작업하는게 좋다.

FULL 백업모드에서 몇천만개의 데이터를 추가, 수정, 삭제하면 오랜 시간이 소요되며 트랜잭션 로그파일의 크기가 순식간에 100GB가 넘게되버리는 마법을 체험할 수 있다.

고려할 사항#

  • SIMPLE 복구 모드로 설정
  • 전체 백업 만들기
  • 데이터 삭제
  • 인덱스 다시 작성
  • FULL 복구 모드로 다시 설정

데이터를 옮기기 위해#

아이랩의 경우 메인 데이터파일의 용량이 약 500GB, 첨부파일 관련 데이터파일의 용량이 약 1.7TB

  1. SIMPLE 복구 모드 설정
  2. 전체 백업 만들기(31분 소요)
  • 백업자료 생성시작 2021.05.19 22:55
  • 백업자료 생성완료 2021.05.19 23:26
  1. 새로운 데이터베이스에 백업하기(1시간 6분 소요)
  • 백업시작 2021.05.19 23:45
  • 백업완료 2021.05.20 00:51
  1. 필요한 데이터만 남기고 삭제하기

데이터 삭제#

아이랩의 경우는 기관마다 기관번호로 구분되어있어 조건을 설정하여 Delete문을 작성하기는 쉬웠지만 시간상에 문제가 발생했다.

특정기관의 데이터만 남기고 백업본을 남기기 위해서..

DML 명령어로 여러 테이블에서 수천만개의 데이터를 삭제하는 동작을 실행 시 최소 4시간 이상이 소요되는 문제가 발생

-- 6,044,679개의 데이터
-- 17번 기관은 34,254 데이터
SELECT 1
WHILE @@ROWCOUNT > 0
BEGIN
delete TOP (10000) dbo.EXPRESSES --10000건씩 삭제하는데 약 10 ~ 15초의 시간이 걸린다.
where ClientId <> 17
and REQUEST_ID not in (select Request_Id from dbo.Requests where Client_Id = 17)
END
-- 6,000,000개의 데이터가 삭제되는데 대략 150분의 시간이 필요하다.
-- 테이블이 300개가 넘고, 특정 테이블은 2억개 이상의 데이터를 가지고 있다.

TRUNCATE 활용#

기존 데이터를 임시 테이블로 Bulk Insert하여 옮긴 후 다시 원본 테이블로 Bulk Insert 하는 작업으로 시간을 단축

TRUNCATE의 경우 DDL 단위의 명령어로 테이블에 기본정보는 유지하고 모든 데이터를 지울 수 있는데 0.1초만에 처리가 가능하다.

-- dbo.EXPRESSES
IF OBJECT_ID('dbo.EXPRESSES_intermediate', 'U') IS NOT NULL
DROP TABLE dbo.EXPRESSES_intermediate;
GO
-- 6,044,679개의 데이터에서 17번 기관은 34,254 데이터만 옮겨둔다.
SELECT * INTO dbo.EXPRESSES_intermediate
FROM dbo.EXPRESSES
WHERE ClientId = 17
TRUNCATE TABLE dbo.EXPRESSES -- 원본 테이블 비우기
SET IDENTITY_INSERT dbo.EXPRESSES ON
INSERT INTO dbo.EXPRESSES (EXPRESS_ID,REQUEST_ID,ZIP_CODE,ZIP_ADDRESS,DETAIL_ADDRESS,EXPRESS_TYPE,CUSTOMER_NAME,EXPRESS_DATE,PRINT_QUANTITY,EXPRESS_GUBUN,ClientId,TelNumber)
SELECT EXPRESS_ID,REQUEST_ID,ZIP_CODE,ZIP_ADDRESS,DETAIL_ADDRESS,EXPRESS_TYPE,CUSTOMER_NAME,EXPRESS_DATE,PRINT_QUANTITY,EXPRESS_GUBUN,ClientId,TelNumber
FROM dbo.EXPRESSES_intermediate
ORDER BY EXPRESS_ID
SET IDENTITY_INSERT dbo.EXPRESSES OFF

위에 작업으로 기존 1시간30분 이상의 작업에서 1분으로 단축

기존 DB에서 새로운 DB로 옮기기#

WAFS의 크기#

WAFS DB는 1.7TB이며 테이블은 한개만 사용하지만 용량이 너무 크기때문에 백업 생성 후 옮기기가 너무 부담스러운 문제가 발생

새로운 데이터베이스를 생성하여 같은 테이블을 생성 후 기존 데이터베이스 정보를 옮기는 전략

insert into NEW_WAFS.dbo.files (
Id, Name, Size, Crc, Contents, ContentType, CompressedType, CompressedSize, Archived, Created
)
select Id, Name, Size, Crc, Contents, ContentType, CompressedType, CompressedSize, Archived, Created
from wafs.dbo.Files
where ClientId = 17 -- 1.7TB가 존재하는 테이블이지만 특정기관만 선택해보면 10GB 미만이다.

고려사항#

  • 새로운 데이터 베이스 생성 NEW_WAFS
  • 기존 데이터베이스에서 특정 데이터를 옮기기

만약 백업을 생성해서 진행했다면 대략 4시간이 소요될 수 있었지만, 해당 작업으로 3분만에 완료되는것을 확인

혹시 모를 상황에 대비해 반드시 데이터는 백업을 해두고 테스트를 진행해자

참고자료#

Sql Server Index

Sql Server Page 구성도#

데이터베이스에서 데이터 파일에 할당되는 디스크공간은 논리적인 페이지로 나뉘면서 연속적인 숫자가 페이지에 매겨진다.

책이 page로 구성되어 있는 것처럼 SQL 서버도 Page로 구성되어 있으며 크기는 8KB 이다.

SQL서버의 가장 기본적인 단위이며, 실제로 SQL서버에 데이터의 접근시에는 페이지 단위로 접근합니다.

페이지는 대부분 Data로 구성되어 있지만 일부 페이지는 인덱스(데이터 위치), 텍스트/이미지, 등등으로도 구성되어 있다.

각 페이지는 96바이트의 헤더로 구성되어 있으며, 헤더는 페이지에 대한 시스템 정보를 저장한다.

sql-server-page 구성

Extents#

Sql Server의 Extent는 공간 관리의 기본 단위이며, 하나의 Extent는 연속하는 8페이지이다.

일반적으로 신규 테이블이나 인덱스는 Mixed extent의 페이지를 할당한다. (효율을 위해서)

이후 해당 테이블이나 인덱스가 8페이지로 증가하면 후속 할당을 위해서 uniform extent를 사용하도록 전환된다.

(SQL Server 2016부터 모든 할당의 기본값은 uniform extent를 사용)

sql-server-extent 구성

typecontent
mixed extent최대 8개의 다른 개체(테이블이나 인덱스등)이 공유된다. (페이지 단위)
uniform extent단일 개체가 모든 8페이지를 소유하며, 전체 페이지는 소유개체만 사용가능.

PFS 페이지#

PFS(Page Free Spece) 페이지는 Page 할당여부 및 빈 공간의 양을 1바이트로 표시한다.

PFS 페이지는 8088개의 페이지(64MB)의 빈공간을 추적하며, 8088개 페이지 이후에는 새로운 PFS 페이지가 생성된다.

페이지 상태 비어 있음 1 ~ 50% 채워짐 51 ~ 80% 채워짐 81 ~ 95% 채워짐 96 ~ 100% 채워짐

Extent 할당 및 빈 공간 관리#

빈 공간 추적#

PFS(Page Free Space) 페이지는 개별 페이지의 할당 여부 및 각 페이지에 있는 빈 공간의 양과 같은 페이지의 할당 상태를 기록하고. PFS는 각 페이지에 1바이트를 사용하여 페이지의 할당 여부를 기록하고 할당된 경우 페이지의 상태를 비어 있음, 1~50% 채워짐, 51~80% 채워짐, 81~95% 채워짐 또는 96~100% 채워짐으로 기록을 진행한다.

개체에 익스텐트가 할당된 후에는 SQL Server 데이터베이스 엔진에서 PFS 페이지를 사용하여 익스텐트의 할당된 페이지 또는 빈 페이지를 기록합니다. 이 정보는 SQL Server 데이터베이스 엔진에서 새 페이지를 할당해야 할 때 사용된다.

추적되는 각 추가 범위에 대한 새 PFS, GAM 또는 SGAM 페이지가 데이터 파일에 추가된다.

따라서 첫 번째 PFS 페이지 뒤에 8,088페이지의 새 PFS 페이지가 있고, 그다음에는 8,088페이지 간격으로 추가 PFS 페이지가 나온다.

밑에 그림을 페이지1할당 후 PFS 페이지로 페이지가 관리되고, 그 뒤에 GAM 페이지 뒤에 64,000개 익스텐트의 새 GAM 페이지가 있고, 그다음에 나오는 64,000개 익스텐트를 추적한다. (이후 64,000개 익스텐트 간격으로 시퀀스가 계속된다)

sql-server-extent 관리

Sql Server Index#

인덱스가 없을경우 아래 그림처럼 저장된다.

sql-server-No-Index

Clusterd Index#

클러스터 인덱스 구조에서 인덱스 페이지의 루트 노드 및 중간 노드들은 인덱스 행을 포함하게 구성되어 있다.

리프 노드들은 기본 테이블의 데이터 페이지로 구성되어 있으며 기본 테이블 데이터 페이지의 데이터 값들은 인덱스 값을 기준으로 정렬된다.

인덱스 페이지를 통해서 인덱스를 통한 데이터 검색을 할 경우 해당하는 데이터 페이지를 찾아갈 수 있다.

sql-server-Index

클러스터 인덱스를 생성할경우 아래 그림처럼 생성이 된다.

sql-server-cluster-index

Non Clusterd Index#

인덱스 페이지의 루트 페이지에는 클러스터와 동일하게 인덱스키와 리프페이지의 페이지 번호로 구성된다.

하지만 클러스터 인덱스와는 다르게 인덱스 페이지의 리프 페이지는 데이터 페이지가 아닌 데이터 페이지의 포인터로

구성된다.(실제로는 페이지 번호 + 행번호(RID)로 구성)

sql-server-non-cluster-index

비 클러스터 인덱스에서 조회를 진행한다면

sql-server-non-cluster-search

  • 첫번째로 인덱스의 루트페이지를 접근해서 찾는 값이 어떤 리프 페이지에 있는지 확인
  • 리프 페이지로 이동 후에 페이지의 내부 행들을 검색해서 데이터의 포인터 정보에 접근
  • 포인터 정보를 기반으로 데이터 페이지에 접근

검색 과정에서 총 3개의 페이지(루트 페이지 + 리프 페이지 + 데이터 페이지)를 참조하게 됨.

참고자료#

코드 리뷰

코드리뷰#

코드리뷰란, 한 명 또는 여러 명의 개발자가 본인이 만들지 않은 코드의 내용을 점검(examining)하고, 피드백을 주는 과정을 말한다.

여기에서 피드백이란 오타, 버그 가능 성, 개발 표준 등에 대한 의견이 될 수도 있고, 좋은 코드에 대한 긍정적인 피드백이 될 수도 있습니다. 코드리뷰의 핵심은 단순히 코딩 스타일을 일관되 게 유지하거나, 예상되는 문제를 일찍 파악하는 데에 그치지 않고 코드에 대한 책임이 그 코드를 만든 사람 혼자에게 있지 않고 우리 모두에게 있다는 문화를 만드는 데에 있다고 할 수 있다.

코드리뷰의 중요성 및 장점#

코드리뷰로 얻을 수 있는 가장 대표적인 장점으로는 ‘버그의 조기 발견’, ‘개발 표준(convention) 준수’, ‘중복 코드를 방지하고 모듈의 재사용성 증대’와 같은 것들 외에도 많은것들이 있다.

본인은 쉽게 발견하지 못하는 실수를 다른 사람은 금방 발견하여 코드의 부작용(side effect)과 오류를 좀 더 일찍 조치할 수 있으며, 정해진 표준 준수를 통해서 많은 사람들의 개발 결과물이 일관된 스타일을 유지할 수 있도록 도와준다. 또한, 동일한 역할을 수행하는 중복 코드를 빨리 발견하고 이미 만들어진 코드를 재사용할 수 있도록 수정할 수 있다.

“코드 컴플릿(Code Complete)”의 저자 스티브 맥코넬(Steve McConnell)은 책에 서 다음과 같은 실험결과를 통해 코드리뷰의 중요성을 강조합니다.

“소프트웨어를 유지보수하는 조직에서 코드 한 줄을 변경한다고 했을 때, 코드리뷰가 도입되기 전에는 그러한 변경의 55% 정도가 문제를 일으켰다. 그러나 리뷰 과정이 도입된 이후에는 그러한 변경의 2% 정도에서만 문제가 발생했다.”

코드 리뷰의 또 다른 장점으로는 다른 사람의 잘 만들어진 코드를 보면서 배울 기회를 얻을 수 있다. 같은 환경에서 개발을 진행하더라도 개인별로 해당 언어나 프레임워크에 대한 이해도와 경험은 크게 차이가 날 수 있다.

예를들어 코드를 작성하는 사람마다 여러 성향이 있을 수 있다.

  • 프로그래밍 언어와 프레임워크가 추구하고자 하는 기본 철학을 이해하고 그에 맞는 방식을 유지하려고 노력하는 사람
  • 기존에 다른 환경에서 개발하던 방식을 벗어나지 못하고 현재 환경의 장점을 활용하지 못하는 사람
  • 언어나 프레임워크가 기본적으로 제공하는 손쉬운 기능들을 잘 숙지하고 적절히 활용하는 사람
  • 이미 만들어져 있는 기능을 사용하지 못하고 직접 불필요한 기능을 추가하는 사람
  • etc..

이러한 여러 성향 및 개인 간의 격차를 해소하는 가장 좋은 방법이 바로 코드리뷰이며 이를 통해 조금 더 좋은 방법을 제시해주고 이해 수준을 상향 평준화하는 것이 될 수 있다.

즉, 코드리뷰는 단순히 버그를 사전에 발견하거나 문제점을 찾는 목적을 넘어서 전체적인 조직의 역량을 강화하는 중요한 역할을 한다.

그럼에도 코드리뷰의 가장 중요한 점 한 가지를 뽑는다면 ‘책임자를 추궁하지 않는 문화’의 정착이라고 말하고 싶습니다.

Logi-Spot 코드리뷰

코드리뷰시 확인해야할 것#

기능의정상동작여부#

기본적으로 모든 코드는 존재하는 목적을 가지고 있습니다. 다른 조건을 모두 만족하더라도 원하는 대로 동작하지 않는 코드는 잘못된 코드라고 할 수 있습니다. 코드리뷰의 시작과 끝은 언제나 기능이 원하는 대로 정상 동작하는지 확인하는 작업이 필수

버그의 조기 발견#

코드 리뷰로 얻을 수 있는 장점 중 하나는 버그를 조기에 발견하여 불필요한 비용을 절감할 수 있다.

같은 버그라고 해도 해당 버그를 코드리뷰 단계에서 발견하는 것과 테스트 단계에서 발견하는 것, 그리고 배포 이후에 발견하는 것은 순서대로 더 비싼 비용을 지불해야 하며, 코드리뷰를 할 때는 버그가 발생할 소지가 없는지 점검해야 한다.

가독성과 유지보수 편의성#

가독성과 유지보수 편의성은 자칫 잘못하면 주관적인 견해로 옳고 그름을 따지는 비생산적 논쟁으로 변질될 수 있으므로 가급적 기준을 정하고 해당 기준을 기반으로 검토하는 것이 좋다. 예를 들어, 들여쓰기(indent)의 크기나, 코드 한 줄의 최대 길이, 메소드 호출의 깊이(depth)등의 표준을 정해두면 좀 더 객관적인 기준으로 코드리뷰를 수행할 수 있습니다.

아이랩 팀은 한라인 80줄, 들여쓰기 2칸규칙이 적용중이다. (메소드 호출 길이는..음)

개발 표준(CONVENTION)의 준수 여부#

개발 표준을 잘 정리하고 지키려는 활동이 계속되면 많은 사람이 함께 개발하더라도 어느정도 일관된 개발 스타일을 유지할 수 있다.

테스트 코드의 작성 여부#

모든 개발자가 테스트 코드 작성을 당연시하고 습관적으로 수행하면 더 바랄 것이 없지만, 만약 그렇지 않다면 어느 정도 강제성을 통해 습관을 만들어나가는 노력이 필요하다.

이런 상황에 적합한 것이 바로 코드 리뷰시 테스트 코드의 작성 여부를 확인하는 것.

실제로 수많은 개발자가 동시에 개발을 진행하는 오픈소스 프로젝트들 대부분은 Pull Request 의 기본 조건으로 테스트 코드의 제출을 요구합니다.

테스트 코드를 작성하는 문화는 수많은 개발 조직에서 시도하지만 쉽게 정착하기 힘든 개발 문화 중 하나입니다.

재사용 가능한 모듈의 중복 개발#

개발을 진행하다 보면, 자주 사용할 것 같은 기능들을 모듈화하여 재사용할 수 있도록 만드 는 경우가 많다. 하지만 모듈을 공유하고 모두가 기억하도록 하는 것은 생각처럼 쉽지 않은 일이다.

코드리뷰는 같은 기능을 하는 중복된 모듈의 개발을 막고, 코드의 재사용을 높이는 아주 좋은 방법이다.

만약, 누군가가 재활용할 수 있는 기존 코드를 인지하지 못하고 스스로 중복된 코드를 만들었다면, 코드리뷰 과정에서 같은 기능을 하는 코드가 존재한다는 피드백을 받아 수정할 수 있다.

배울만한 점은 없는지#

코드리뷰에 많은 사람이 오해하는 부분 중 하나는, 경력이 많거나 실력이 뛰어난 개발자가 후배 개발자의 코드를 검사한다고 생각하는 것이다.

코드리뷰의 목적은 코드 작성자에 게 피드백을 주는 것도 있지만, 해당 코드를 보면서 ‘아, 이런 식으로 코드를 작성하는 것도 가능하구나?’, ‘아, 이렇게 쉬운 방법이 있었구나?’와 같은 학습효과도 함께 가지고 있다.

그렇기 때문에 코드를 리뷰할 때는 피드백을 주기 위한 시각과 좋은 점을 배우려는 시각, 이 두 가지 시각의 균형을 맞추며 진행하는 것이 좋다.

글로벌 기업의 코드리뷰#

구글#

구글 코드리뷰 연습

구글은 100% 코드 리뷰, 모든 코드를 리뷰한다고 한다.

물론 Tricorder라는 정적 분석(잠재결함 분석) 도구와 Rosie라는 코드 정리 시스템(Large-Scale Cleanups and Code Changes)을 활용해 사용하지 않는 코드는 없애고 리팩토링이 필요한 경우에 효율적으로 리뷰를 한다고 알려져있다.

Microsoft#

개발자 업무는 개발 50%, 리뷰 50%인 Microsoft

Microsoft의 개발자라면 매일 코드 리뷰를 해야 합니다. Microsoft의 전체 직원 수는 14만 명이고, 이중 44%인 6만 명에 이르는 개발자의 75%가 매일 코드 리뷰를 하고 있다고 알려져 있다.

“리뷰는 당연하다”, 네카라쿠배*와 스타트업#

국내 스타트업을 중심으로 자동화된 배포와 테스트는 이제 기본기 중의 기본기가 되었다.

테스트 기반의 코딩인 TDD(Test Driven Development)를 필수로 적용하고, 코드 Merge 전에 코드 리뷰는 필수적인 프로세스가 되었다.

국내 IT 선도기업들은 회사에서 표준을 제공하기보다는 팀 상황에 맞추어 자율적으로 코드 리뷰 방법을 결정해서 자율적으로 적용하고 있지만, 대부분의 회사는 GitHub에서 제공하는 PR(Pull Request)을 활용해서 리뷰 요청과 검토를 완료(Approve)하는 방식으로 코드 리뷰를 진행한다고 한다.

우리팀은..?#

현재 아이랩팀은 현재 GitHub에서 Master Branch만 사용중이다.

그 후 로컬환경에서 코드를 작성 Merge후 바로 커밋후 저장소에 Push를 진행하고있다.

앞으로 Pull Request 템플릿을 활용해 필요한 작업은 반드시 코드리뷰 후 Master 브랜치에 Merge를 진행할 예정이다.

  • develop 브랜치 생성(Develop에 푸쉬 시, 반드시 Reviewer 한명이상 지정)
  • 각자 브랜치를 생성하여 작업
  • develop 브랜치에 머지 진행전 PR(Pull Request)를 통한 코드리뷰
  • develop에 모두 merge된 소스를 배포시 master에 병합하여 어플리케이션 버전업

Visual Studio Code 단축키

Visual Studio Code#

Visual Studio Code는 Microsoft 에서 개발한 Code Editor

  • 기본적으로 Dark Theme (눈은 소중하니까요..)
  • 무겁지 않은 프로그램
  • 각 언어 및 개발환경에 제공되는 수많은 extension
  • 등등..

글을 작성한 본인을 포함하여 많인 개발자들이 애용중인 훌륭한 에디터 👍

Visual Studio Code Shortcut#

가볍고 실행하기 좋은 Visual Studio Code(이하 vsc) 에디터를 좀 더 잘 활용하기위해 단축키를 알아보자.

mac shortcut#

window shortcut#

단축키를 모아보니 우주비행선을 조종해야할 것 같다.

많이 사용하는 단축키?#

1. Mac ⌘ + D & Window Ctrl + D#

현재 커서가 있는 단어와 동일한 단어를 아래 단축키 입력시마다 한번에 수정 가능하도록 커서를 잡아준다.

Tip

  • Mac ⌃ + F 단어 찾기 후 ⌥ + Enter
  • Window Ctrl + F 단어 찾기 후 Alt + Enter

위에 단축키 통해 원하는 단어 검색 후 입력을 통해 현재 파일의 해당 단어 모두를 한번에 수정 가능하도록 커서를 잡아준다.

2. Mac ⌥ + Click & Window Alt + Click#

위에 단축키를 누른 상태로 마우스로 클릭하는 곳 커서를 모두 한번에 잡아줘 수정하고싶은 부분들을 한번에 수정할 수 있도록 해준다.

Tip

세로로 한꺼번에 편집하고 싶은 부분만 지정할 때 완전 편함.

3. Mac ⌥ + ↓or↑ & Window Alt + ↓or↑#

현재 커서가 있는 줄을 위로, 아래로 한 줄 보낸다. 보내진 곳에 있던 줄은 이동된 줄의 위치로 이동된다.

4. Mac ⌥ + Shift + ↓or↑ & Window Alt + Shift + ↓or↑#

현재 커서가 있는 줄을 복사하여 위 or 아래로 복사해준다.

5. Mac ⌘ + / & Window Ctrl + /#

현재 사용하는 언어를 VSC에서 알아내 알아서 주석 처리를 해준다. (완전 편함.)

6. Mac ⌥ + Shift + I & Window Alt + Shift + I#

드래그된 모든 줄의 끝에 커서를 모두 생성해준다.

Tip

선택한 라인들의 끝에 뭔가 수정하거나 입력하고 싶을때

7. Mac ⌥ + Shift + Drag & Window Alt + Shift + Drag#

마우스 커서가 드래그하는 곳을 세로줄로 드래그후 한꺼번에 편집 가능

단축키는 잘 쓰면 능률도 올라간다.#

개발자 외에도 많은 사람들이 Ctrl + C, Ctrl + V 복사 붙여넣기를 많이 사용하는 것처럼

VSCode에 내장된 단축키를 잘 활용한다면 좀 더 효율적으로 vsc 코드 에디터를 활용할 수 있다는 기대감을 가지면서..

vsc 단축키 잘 사용하다가 다른 에디터에 vsc 만큼 단축키가 없으면 어떻하지..라는 생각도 든다.

macOS 가상 오디오 드라이버 BlackHole

what why 왜 필요한가?#

회사에서 매주 화요일 기술미팅인 테크톡을 온라인으로 진행하는데, 그 내용을 영상으로 캡쳐해서 유튜브에 올리는 작업을 하고 있습니다. 혼자 말하면서 영상을 캡쳐하는 작업이라면 내가 사용하는 맥북의 기본 마이크 또는, 헤드셋이나 이어셋에 붙어 있는 기본 마이크를 사용하면 됩니다. 하지만 온라인 미팅 내용이나 다른 영상을 플레이 하면서 나오는 소리를 다시 내 영상에 포함하려면 몇 가지 생각해야할 문제가 있습니다.

만약 내 PC의 기본 스피커에서 흘러 나오는 소리를 그대로 기본 마이크를 통해 다시 영상에 넣는다면 주변의 잡음이 오디오에 섞이게 됩니다. 아무리 좋은 비디오편집 도구를 사용한다고 해도 오디오에서 주변 잡음을 제거하는 일이 쉽지 않습니다.

제일 좋은 방법은 PC에서 나오는 오디오를 직접 영상 캡쳐프로그램(QuickTime Player)으로 넣어주는 방법입니다. 그때 필요한 장치가 바로 가상오디오 장치입니다.

macOS 11 이전에는 Soundflower 라는 이름의 가상오디오를 사용했었는데, macOS 11에서 Sourdflower 설치에 어려움이 있습니다. 그래서 검색하다 발견한게 BlackHole 입니다.

how 설치#

BlackHole Download에서 이메일과 이름을 입력하고 구독을 누르면 파일을 받을 수 있습니다. 좋은 프로그램을 무료로 사용하기 위해 구독은 기쁜마음으로 할 수 있습니다. 게다가 이 프로그램은 오픈소스이며 GPL-3.0 License 입니다.

파일을 다운받아 실행하면 BlackHole 2ch 라는 이름의 새로운 오디오기기가 추가됩니다. 추가된 오디오 기기를 확인하기 위해 응용프로그램 > 유틸리티 > 오디오 midi 설정를 실행 합니다.

how 스크린 캡쳐#

맥북에서 스크린 캡쳐는 QuickTime Player를 사용합니다. Command + Shift + 5 키를 누르면 바로 아래 이미지 같이 화면캡쳐 도구가 실행됩니다.

옵션에서 마이크를 BlackHole 2ch로 선택 하면 됩니다. 이때 한 가지 잊지말아야 할 내용은 맥북에서 나오는 출력 오디오도 BlackHole 2ch로 설정해야 한다는 사실입니다. 즉 스피커로 나오는 소리의 출력을 BlackHole 2ch로 우회하는 것이죠.

이 상태로 스크린 캡쳐를 실행하면 맥북에서 실행되는 유튜브 영상과 소리가 깨끗하게 잡음없이 캡쳐됩니다.

more 통합 오디오#

그런데, 여기서 또 하나의 문제가 있습니다. 블랙홀로 출력을 하게 되면 영상을 캡쳐하는 동안 스피커나 이어폰으로 소리를 들을수 없다는 겁니다. 이 문제는 영상을 캡쳐할때 내 목소리를 같이 녹화하지 못한다는 문제와도 연결이 됩니다.

이 문제를 해결하기 위해 mac에서 여러 오디오 장치를 통합 할 수 있는 통합 오디오기능을 이용할 수 있습니다.

위에서 실행했던 오디오 midi 설정을 다시 실행하고 아래쪽 + 버튼을 눌러 통합 기기(Aggregate Device) 를 추가하고 원하는 기기를 체크해서 새로운 입출력기기를 만듭니다.

이 기능을 이용하면 Google Meet 등 온라인 화상회의 내용을 캡쳐할 때 유용하게 이용할 수 있습니다.

즉,

  • 화상회의 프로그램의 출력장치를 위 화면에서 만든 통합기기로 선택하고
  • 캡쳐 프로그램의 입력장치도 통합기기로 설정하면
  • 플레이되는 화상최의 영상을 캡쳐하면서
  • 화상회의 대화도 녹음되고
  • 이어폰으로 대화내용도 듣고
  • 내가 마이크로 하는 말도 녹음이 가능하게 됩니다.

close#

맥북에는 비디오, 오디오 관련해서 다양한 장치와 기능이 있는것 같습니다. 좀더 많은 기능을 확인하려면 오디오 MIDI 설정 사용 설명서를 참고하세요.

more 윈도우용#

윈도우용은 아직 준비중인것 같습니다. 알림을 받고 싶다면 구독~
https://existential.audio/blackhole/windows/