이번 주는 데이터베이스 모델링 관련 내용을 마무리 하면서 기반 기술 프로젝트를 병행하는 느낌으로 가져갔다.
월~금을 전부 소화하는 것은 이번이 처음이었는데, 갈수록 아침에 일어나기 힘들다는 점만 빼면 다 괜찮았던 것 같다.
지난번 연휴때 체했던 여파로 뭔가 먹어도 얹히고 소화가 잘 되질 않는 증상이 계속되어서
참다참다 수요일 즈음에 야간 진료하는 내과를 찾아가서 약을 탔고, 덕분에 글을 쓰는 시점에는 거의 다 나은 듯하다.
필요할 때는 병원을 빨리 가는 것이 현명하다는 것을 느꼈다.
[수업 내용]
이번 주는 일부 추가적인 SQL 문법과 함께 데이터베이스의 꽃이라고 할 수 있는 모델링, 정규화에 대해 배웠다.
한정적인 시간동안 주어진 진도를 나가기 위해 훑고 지나가는 느낌이 강했지만, 전반적인 흐름에 대해 복기할 수 있어 좋았다.
수업한 내용은
-BUILD IN FUNCTIONS(문자열, 숫자, 날짜 및 시간 관련 함수)
-테이블 외 대상 객체(VIEW, INDEX, STORED PROCEDURE & FUNCTION, TRIGGER)
-DCL(Data Control Language, GRANT, REVOKE)
-DB 모델링(데이터 무결성, ERD, 논리&물리 모델링)
-온라인 도서 대여 시스템 구현하기 실습
와 같았다.
복습할 겸 주요 내용들을 정리해보려한다.
[BUILD IN FUNCTIONS]
-문자열
- CONCAT - 문자열 합치기
- ELT - 입력되는 문자열들에 대해 특정 인덱스 위치의 문자열을 반환
- FIELD - 입력되는 문자열들에 대해 특정 문자열과 일치하는 문자열의 인덱스 위치를 반환
- SUBSTRING(문자열, 시작위치, 길이) - 특정 문자열을 시작위치부터 길이만큼 잘라 반환
- SUBSTRING_INDEX(문자열, 구분자, 횟수) - 특정 문자열이 나타난 횟수를 기준으로 잘라서 반환, 횟수가 음수면 뒤에서부터 탐색하여 자름
-숫자
- CONV(숫자, 원래 진수, 변환할 진수) - 숫자를 특정 진수를 기준으로 다른 진수법으로 변환하여 반환
- RAND - m 이상 n 미만 실수 반환하려면, RAND() * (n - m) + m
-날짜 및 시간
- CURDATE - 현재 날짜 반환
- CURTIME - 현재 시각 반환
- NOW - 현재 날자 + 시각 반환
- YEAR, MONTH, DAYOFMONTH - CURDATE()와 함께 활용하여 년도, 달, 달의 몇번째 날짜인지 정보를 추출
- HOUR, MINUTE, SECOND - CURTIME()과 함께 활용하여, 시, 분, 초 정보를 추출
- DATEDIFF, TIMEDIFF - 날짜, 시간간의 차이를 반환, 앞 - 뒤
- DAYOFWEEK - CURDATE()와 함께 활용, 해당 주의 몇번째 날짜인지 반환(일요일의 값이 1로 기준, 화요일이면 3)
- MONTHNAME - 해당 달의 이름 반환
- DAYOFYEAR - 해당 년도에서 몇 일이 흘렀는지 반환
- LAST_DAY - 특정 날짜가 속한 달의 마지막 날짜를 반환
- MAKEDATE - 특정 년도에서 숫자번째 날을 반환
[테이블 외 대상 객체]
-VIEW
- SELECT 쿼리문을 저장한 객체, 논리테이블의 속성을 지님
- 보안과 관련하여 테이블에서 특정 컬럼만을 접근 가능하도록 VIEW로 추출하여 관리할 수 있음
- with local check option, with cascaded check option을 통해 뷰의 where절의 조건에 부합하는 데이터만을 뷰에 insert할 수 있는지의 여부를 관리할 수 있다.
-INDEX
- 데이터 검색 속도를 향상시키는 데이터 구조로 데이터를 빠르게 조회할 수 있는 포인터를 제공
- 실제 디스크 상에 저장되는 주솟값과 컬럼 값을 노드로 한 tree구조로 정렬하여 저장한다
- 데이터의 변경(삭제)에 따라 최적화가 다시 필요한 경우 OPTIMIZE TABLE <테이블명>을 활용
- SQL where 절에서 비교 대상이 되거나, join 절에 사용되는 컬럼에 대해 적용
- 인덱스로 지정된 컬럼에 의해 검색 시, 선택률이 10~15% 미만이어야 유의미함
-PROCEDURE & FUNCTION
- 일련의 SQL 문장을 저장하고 실행할 수 있도록 하는 기능
- 데이터베이스 서버에서 직접 실행되어 클라이언트 - 서버 간 네트워크 트래픽 감소하는 효과
- 반복적인 작업을 자동화하는 효과
- 특정 사용자에게 Procedure 실행 권한을 부여하는 식으로 데이터베이스의 접근 권한을 세밀하게 제어할 수 있음
- Stored Function의 경우 항상 하나의 값을 반환해야 하며, 입력 매개변수만 가질 수 있음(Stored Procedure의 out과 같은 성격의 변수는 X)
- 특별히 Stored Function의 경우 (Not) Deterministic 설정을 통해 해당 함수의 리턴 값이 난수, 시각 등에 의해 영향받아 값이 다른지 아닌지 명시해주어야 함(영향 받지 않는 경우가 Deterministic)
- DELIMITER //을 통해 구분자를 변경하고, BEGIN ~ END //문 내부에 동작 내용을 정의, 이후 다시 DELIMITER ;를 통해 구분자를 원래대로 복구
-TRIGGER
- 데이터베이스 테이블에서 발생하는 특정 이벤트(insert, update, delete)를 감지하여 자동으로 실행되는 데이터베이스 객체
- 데이터의 무결성을 유지하고 복잡한 비즈니스 로직을 처리하기 용이
- BEFORE, AFTER는 트리거 동작시점을 각각 해당 TRIGGER를 유발한 행위가 이루어지기 전, 후로 설정한다
- FOR EACH ROW를 항상 포함
- OLD, NEW 키워드를 통해 해당 트리거를 유발시킨 이벤트 발생 이전, 이후의 값을 사용할 수 있음
- ex) create trigger <트리거명> after update on <테이블명> for each row begin ~ end // 의 경우 해당 테이블에 update가 일어나고 나서 trigger가 동작하며, 이 insert가 이루어진 이후의 값을 사용하고 싶으면 NEW. 키워드를 사용하면 된다
[논리 모델링 및 정규화]
-이상 현상
- 삽입 이상 : 릴레이션에서 새로운 인스턴스를 삽입할 때, 불필요한(중복되는) 정보를 같이 삽입해야 함
- 갱신 이상 : 릴레이션에서 속성의 값을 업데이트 할 때, 중복되는 정보를 가진 모든 row에 대해 수정이 필요함
- 삭제 이상 : 릴레이션에서 인스턴스를 삭제할 때, 유용한 정보도 함께 삭제하게 됨(단 하나의 ROW를 삭제하려는데 해당 상품에 대한 정보가 테이블에서 사라짐)
-정규화
- 중복 데이터를 제거하여 안정성과 확장성을 도모
- 일반적으로 제3정규형까지 만족하는 테이블은 정규화되었다고 표현

- 제1정규형 - 다가 속성이나, 복합 속성을 제거하고 모든 속성의 원자값을 가지도록 수정
- 제2정규형 - 부분 함수적 종속성 제거, 기본키에 속하지 않는 속성은 기본키 그룹(기본키 구성요소 집합)에 대해 종속
- 제3정규형 - 이행적 함수 종속성 제거, 키가 아닌 모든 속성이 기본키 그룹에 직접 종속,기본키에 속하지 않는 속성들간 종속 관계가 존재하면 안됨
[물리 모델링]
- 논리적 모델링이 완료된 테이블을 실제 데이터베이스에 이식하는 작업
- 인덱스, 뷰, 테이블 타입과 사용하는 DBMS 종류와 같은 물리적인 요소를 결정

-반정규화
- 논리적으로는 문제가 없지만 실제 성능적인 면을 고려하여 엔티티를 합치거나 모델 구조를 변경(이미 진행된 정규화 수준을 낮춤)
- 중복을 일부 감수하고, 다수 사용자가 동시 이용하는 환경에서 일정 수준의 성능을 유지하기 목적
[프로젝트]
주제는 '공연 통합 예매 및 커뮤니티 플랫폼'으로 잡게 되었다.
우리 조는 팀명과 프로젝트명을 고르는데 고민이 많았는데,
오랜 고민 끝에 팀명은 '짱구는 못말려'의 '떡잎방범대'에서 따와 Beyond와 방범대를 합친 '비욘드방범대'로
프로젝트명은 CultureRecord로 정했다.
매번 회의록을 작성하여 논의된 사항을 꼼꼼히 기록해나갔고,조원들별로 조금씩 견해가 다른 문제에 대해 충분한 이야기를 통해 다수결로 결정해나가며 정리했다.
프로젝트의 구성 단계인 팀 노션 생성, 그라운드 룰, WBS를 마무리하고아이디어 회의를 추가적으로 진행하며 기획에 대해 살을 붙여나갔다.
단계를 나눠 부지런히 프로젝트를 진척시킨 결과프로젝트 기획서, 요구사항 명세서와 그에 따른 UML(유스케이스 다이어그램), 정규화를 통한 논리 ERD + DBMS를 고려한 물리 ERD 작성까지의 단계를 완료하였고,추가적으로 테이블 생성 쿼리문 및 일부 더미 데이터 생성까지 완료된 상황이다.
2/14(금)이 마감일인 만큼 인덱스 및 트리거 설정, DB서버 구축, 테스트, Github 구성, 발표 자료 준비 등을 부지런히 해야겠다.
'Beyond SW > 주간 회고' 카테고리의 다른 글
| 한화시스템 Beyond SW캠프 15기 6주차 회고 (1) | 2025.03.03 |
|---|---|
| 한화시스템 Beyond SW캠프 15기 5주차 회고 (0) | 2025.03.02 |
| 한화시스템 Beyond SW캠프 15기 4주차 회고 (1) | 2025.02.17 |
| 한화시스템 Beyond SW캠프 15기 2주차 회고 (2) | 2025.02.02 |
| 한화시스템 Beyond SW캠프 15기 1주차 회고 (1) | 2025.01.26 |