본문 바로가기

MS-SQL

MSSQL 코딩 스타일 가이드

SQL Coding Style Guide


여러분의 SQL코딩 스타일은 무엇입니까?


쿼리문은 흔히 굉장히 복잡하고 길어질 수 있습니다. 쿼리는 오랫동안 프로그램 내에서 존재하게 되며 오랜기간 여러명의 개발자에 의해 유지보수 될 것입니다.

 

그래서 어떤 패턴을 가져야 하고 가독성을 높여 유지보수에 용이하도록 작성되어야 합니다. 다음의 스타일 가이드가 개발자 여러분에게 좋은 참고가 되었으면 합니다.


먼저, 학습에 사용할 테이블은 두개입니다.


1. Employee



2. Department



가장 기본적인 공통규칙부터 소개합니다.

1. SELECT, FROM, WHERE 등 예약어는 대문자를 사용하세요.

2. 필드명은 카멜법을 사용하세요.(대문자로 시작)

3. SQL의 함수도 대문자를 사용하세요.

4. 툴의 자동정렬 스타일을 따르세요.

5. 들여쓰기는 탭으로 맞추세요.

6. SQL쿼리의 코딩은 SQL툴에서 하세요.

7. 필드명 사이의 콤마는 필드명 뒤가 아닌 앞에 써주세요

SQL쿼리툴에서는 예약어, 함수명 등 쿼리작성에 중요한 부분을 다른 색깔로 보여줍니다. 그리고, 오타 여부나 구문작성의 오류를 쉽게 파악할 수 있게 해주죠


위와 같은 공통규칙을 통해 다음과 같은 효과를 기대할 수 있습니다.

1. 단시간에 작성할 수 있다(타이핑, 편집의 용이성)

2. 가독성이 좋아진다(유지보수의 용이성, 백엔드 프로그래머와의 협업가능성)


SQL쿼리문의 가장 기본이되는 SELECT문 먼저 보겠습니다.


1. SELECT

MS-SQL의 기본툴인 Management Studio를 이용해서 SELECT구문 작성시 툴이 제시하는 기본적인 코딩 스타일을 살펴보도록 하겠습니다.


SELECT [EmployeeId]
    ,[EmployeeName]
    ,[DateOfBirth]
    ,[StartDate]
    ,[FinishDate]
FROM [dbo].[Employee]
GO


어떠신가요? 필드명, 소유자명, 테이블명 등을 모두 대괄호로 묶어주었네요. SELECT, FROM, WHERE등 예약어를 오른쪽 정렬로 맞춰주었습니다.

잘 정리되어있어 가독성도 괜찮아 보입니다.  

하지만 실무에선 대괄호는 잘 쓰지 않습니다. 필수사항이 아닌데 좀 불필요하죠.

다음으로, SQL 코딩스타일 관련 글을 보면 


SELECT
FROM
WHERE

처럼 우측정렬을 권하는 글들이 많습니다. 하지만 제 생각엔 일일이 스페이스를 눌러 오른쪽 정렬하는건 타이핑 속도 측면에서 매우 귀찮은 작업입니다.


먼저 걍 쭉 써봅니다.

SELECT EmployeeId, EmployeeName, DateOfBirth, StartDate, FinishDate, JuminNo FROM Employee WHERE EmployeeName = '홍길동' AND StartDate = '2000-01-31' AND FinishDate = '2010-01-31'

엄청난 와이드 모니터가 필요하겠네요. 먼저 SELECT, FROM, WHERE절을 좀 더 보기좋게 나눠보겠습니다.


SELECT EmployeeId, EmployeeName, DateOfBirth, StartDate, FinishDate, JuminNo
FROM Employee
WHERE EmployeeName = '홍길동' AND StartDate = '2000-01-31' AND FinishDate = '2010-01-31'


조금 나아보이네요. 하지만 가독성을 위해 좀 더 정리가 필요해 보입니다. 쿼리를 읽어나가는데 좌우로 너무 많은 길이를 움직여야 겠네요

또, 내가 필요한 필드가 어디있는지 찾는데 시간이 많이 걸리겠네요. 

전 신입개발자 시절 필드를 5열로 맞춰보기도 했습니다. 네모 반듯해서 규칙성은 있어보여 좋았습니다만 만약 필드를 추가해야 할 경우. 특히 중간에 필드명을 끼워 넣으려면 5열을 맞추기 위해 필요 없는 수정 아니, 교정작업을 해야했습니다.  


SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , JuminNo
FROM Employee
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'

어떠신가요? 개발을 하다보면 필드가 수십개인 테이블들도 많습니다.

필드명을 좌측정렬 해서 눈의 움직임을 최대한 줄여주어 가독성 높은 형태가 됩니다.

이런 경우 최대한 일괄작업 할 수 있는 코딩 스타일이라면 좋겠죠?


필드에 Alias를 사용할 경우

주민번호를 앞자리 뒷자리로 나누어 주어야 하는 경우를 생각해 보겠습니다.

Alias는 대부분 원본 필드명에 AS를 붙여 다음과 같이 작성하도록 권장하고 있습니다.  


SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , JuminNo AS Pid
FROM Employee
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'


필드명 블록을 좌측정렬해서 가독성을 높이려 했는데 AS를 사용하면 우리의 눈은 갈지자로 왔다갔다 해야겠네요. 눈이 아파옵니다.

전 =을 사용하길 권합니다.


SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , Pid = JuminNo
FROM Employee
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'


이렇게 정리하면 필드명의 좌측정렬 규칙이 유지돼 가독성이 좋아집니다.

필드에 함수를 사용할 때도 비슷합니다.


SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , Pid = LEFT(JuminNo, 7)
FROM Employee
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'


2. JOIN

SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , Pid = JuminNo
    , DeptName = DEP.DeptName
FROM Employee EMP
INNER JOIN Department DEP
    ON EMP.DeptCode = DEP.DeptCode
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'


INNER JOIN은 FROM문에 좌측정렬합니다. 많은 컬럼들에서 FROM문에서 한 번 들여쓰기 할 것을 권장하는데


제 생각엔 이렇게 하면 INNER JOIN, ON, AND/OR 까지 들여쓰기가 넘 많아져서 보기 안좋았습니다.

ON은 한 칸 들여쓰기 합니다.

 

3. UPDATE

UPDATE Employee SET
    EmployeeId = ''
    , EmployeeName = ''
    , DateOfBirth = ''
    , StartDate = ''
    , FinishDate = ''
WHERE EmployeeName = '홍길동'
    AND StartDate = '2000-01-31'
    AND FinishDate = '2010-01-31'


UPDATE문은 SELECT와 거의 유사하게 맞춰주면 됩니다.


4. 변수선언

반드시 쿼리에서 변수를 선언해야합니다.

변수를 선언하고 자릿수 제한을 하는것은 시큐어 코딩을 위해서도 반드시 해야합니다.

예를 들어 C#코딩시 PreparedStatement방식으로 C#단에서 쿼리의 변수를 선언하면

쿼리에서 런타임 오류 발생시 변수로 넘어온 값을 확인하는데 불필요한 시간을 많이 허비하게 됩니다. 

변수선언은 @로 시작하는데 신속한 코딩을 위해 필드이름을 그대로 사용하고 @만 붙여줍니다.

필드타입은 소문자로 작성합니다.


DECLARE @EmployeeName nvarchar(50) SET @EmployeeName = '홍길동'
DECLARE @StartDate nvarchar(10) SET @StartDate = '2017-01-01'
DECLARE @FinishDate nvarchar(10) SET @FinishDate = '2017-12-31'

SELECT
    EmployeeId
    , EmployeeName
    , DateOfBirth
    , StartDate
    , FinishDate
    , Pid = LEFT(JuminNo, 7)
FROM Employee
WHERE EmployeeName = @EmployeeName
    AND StartDate = @StartDate
    AND FinishDate = @FinishDate 



이상으로 제가 최적이라 생각되는 SQL구문의 코딩스타일을 설명드렸습니다.

이 글을 보시는 여러분은 참고는 하시되 본인의 스타일에 맞춰 살짝 변형해도 좋을것 같습니다.

물론, 프로젝트에서 표준으로 지키도록 지정된 스타일이 있다면 그에 따르셔야 할 거구요.

이제 DB개발을 시작하시는 여러분에게 작은 참고가 되었으면 좋겠습니다.


프로젝트의 성공을 기원합니다.