(편의상.. 반말로 쓰겠습니당)
오랜만에 글을 쓴다! 설날에 할 거 없어서 쓰는거라닌게 학계의 점심..
드디어 첫 업무를 맡게 되었다!
바로! DB이전 작업.
회사 CMS 제품에 쓰이는 db의 테이블과 데이터를 각 db의 sql 문법에 맞게 변형시켜서 옮기고 프로그램상에서 잘 돌아가는지 테스트 하면 끝!
원래 우리 회사에서는 MariaDB를 기존에 사용을 했다. 하지만, 프로젝트에 따라 DB를 알맞게 선택해서 하는게 가장 베스트라고... 마침 신입도 들어왔고 첫 업무로 괜찮은 것 같아서 주셨다고 한다.
각 DB마다 장점이 있는데 예를들면,
- 관계형 데이터베이스 (SQL)
- 장점
- 다양한 용도로 사용이 가능하고, 일반적으로 높은 성능을 보여주고 있다 (범용적 / 고성능)
- 데이터의 일관성을 보증한다.
- 정규화에 따른 갱신 비용 최소화
- 단점
- 대량의 데이터 입력 처리
- 갱신이 발생한 테이블의 인덱스 생성 및 스키마 변경
- 컬럼의 확장의 어려움
- 단순히 빠른 결과
- 주요 제품 종류
- Oracle / Oracle
- MS-SQL Server / Microsoft
- MySQL / Oracle (SunMicroSystems)
- DB2 / IBM
- Infomix / IBM
- Sybase / Sybase
- Derby / APache
- SQLite / Opensource
- 장점
- NoSQL 데이터베이스
- SQL을 사용하지 않는다는 의미로, Not Only SQL (SQL이 필요 없다는 의미가 아니고, 개선/ 보안의 의미)
- Non-Relational Operational Database SQL (관계형 데이터베이스가 아니다.)
- NoSQL의 장점
- 대용량 데이터
- 데이터 분산 처리
- Cloud Computing
- 빠른 읽기/쓰기 속도
- 유연한 데이터 모델링
- NoSQL의 종류
- key / value
- 휘발성/영속성
- Memchached, Tokyo Tyrant, Flare, Roma, Redis
- Document
- 스키마 정의 없음
- MongoDB, CouchDB
- Big Table(Column 형) DB
- 뛰어난 확장성, 검색에 유리
- Hbase, Casandara, Hypertable
- key / value
출처: https://ourcstory.tistory.com/30 [불로]
이렇게 있다고 한다. NoSQL이라는 개념이 잘 이해가 되지 않아 검색을 해봤다.
NoSQL을 구체적으로 뭐라 정의내릴 순 없다고 하지만 여러 정보를 취합해보면,
RDMS와는 다르게 수평적 확장( 장비의 수를 늘림)이 이뤄지는 것과, 메모리 내의 데이터가 어떤 구조이든지 상관하지 않고 하나의 Aggregation으로 취급하여 저장해버리기 때문에 ORM 프레임워크가 필요 없다는것이 가장 큰 차이인 듯 하다.
잠깐 이야기가 옆으로 빠졌지만 다시 돌아와 업무얘기를 해보자면,
나와 함께 일하는 팀원은 나 포함 총 4명이다. 새로 만들 db는 총 3개 (oracle, postgre, mssql)이다.
그 중에, oracle은 경험이 있는 팀원 분이 맡기로 하였고 postgre는 회사에서 아예 처음이라 2명이 붙기로 해서 랜덤으로 나의 입사동기 2명이 작업을 하게 되었다. 자연스럽게 나의 담당은 mssql..
SQL SERVER에서 지원하는 프로그램이 있지만 불편해서 DBeaver로 작업을 하였다.
테이블과 데이터는 mysql에서 heidsql을 이용하여 쿼리를 추출해서 옮겼다. mssql은 커멘트를 쓰는 과정이 복잡해서 일일이 넣었다는.. (기회가 되면 자동화를 만들어보도록 하자)
이제 eclipse에서 잘 작동하는지 확인하는 과정만 남았다. java쪽은 사실상 건드릴 필요가 없고 sql Mapper xml 파일만 수정하면 되는 듯 했다. 서버를 키고 각 페이지를 들어가보며 작동이 안되면 오류메시지를 보며 ctrl + h 를 누르며 각각의 페이지를 찾았다. 작업 상황은 SVN을 통해 공유했다.
(첫 커밋..)
mssql의 기본문법은 mysql과 비슷했다. 자주 쓰이는 문법을 노션에 정리를 해놨는데,
💡 쿼리문
ifnull → isnull DATEFORMAT → CONVERT(CHARACTER(19),getdate(),21) 또는
FORMAT(, 'yyyy:MM:dd:H:mm:ss')
CONVERT 종류:
CONVERT (CHARACTER(19),ST_CONDAY, 20)=YYYY-MM-DD HH:MM:SS
CONVERT (CHARACTER(10),ST_CONDAY, 23)=YYYY-MM-DD
now()→ getdate() ceil() → ceiling limit 1 → top 1 substr → substring
TIMESTAMPDIFF → DATEDIFF
mssql에서는 limit함수가 없음 또 group_concat도 없음 fnc_hierarchi → 계층형 쿼리 구현 함수. mssql에서 구현방법 현재 못찾은 상태 전역변수가 없음
mssql에서 Lpad 구현 기존 REPLICATE방식은 뒷자리에서 추출하는 방식. 여기서 LEFT를 더해 줌으로써 방향을 앞으로 바꿈
CREATE FUNCTION PadLeft
(@TextToPad VARCHAR(8000),
@NumberToPad INT,
@CharacterToPad VARCHAR(1))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @OutputText VARCHAR(8000)
SET @OutputText = REPLICATE(@CharacterToPad, @NumberToPad) + LEFT (@TextToPad,@NumberToPad)
RETURN RIGHT(@OutputText, @NumberToPad)
END
MSSQL Server Zero Pad Left ( 빈 앞자리에 0 채우기) - Format 함수 활용
mssql Lpad구현 함수
💥페이징 처리 유의
mssql은 if 보단
CASE
WHEN A.USE_YN = 'Y' THEN 1
ELSE 0
END
뭐 대충 이런 내용이다. 찾아보니 mssql에는 Lpad 함수가 없어서 인터넷을 참고하여 직접 만들었다. (비슷한 함수는 있었지만 글자 추출방식이 오른쪽에서 추출하는 방식..)
위 내용을 보면 알겠지만 mssql에는 DATEFORMAT함수가 없다. 그래서 CONVERT와 FORMAT을 이용해 변환을 하게 되는데 왜인지는 모르겠지만 CONVERT은 되는데 FORMAT는 안될때가 있다.
(아마 자료형의 차이때문인듯)