-
카카오클라우드 - 클라우드 개발자 교육 5주차 후기bootcamp 2025. 12. 12. 14:59
데이터베이스 인덱스(Index)의 이해와 트레이드오프
데이터베이스 성능과 직결되는 인덱스(Index)에 대해 깊이 있게 학습했다. 인덱스는 데이터베이스에서 특정 컬럼을 기준으로 데이터를 빠르게 조회하기 위한 자료구조로, 일반적으로 B-Tree 기반으로 구현된다. 인덱스를 적절히 사용하면 대량의 데이터 속에서도 원하는 값을 빠르게 찾을 수 있지만, 반대로 잘못 사용하면 오히려 성능 저하를 유발할 수 있다는 점이 핵심이었다.
인덱스의 가장 큰 장점은 SELECT 성능 향상이다. WHERE 조건, JOIN 조건, ORDER BY, GROUP BY 등에 사용되는 컬럼에 인덱스를 적용하면 풀 스캔을 피하고 빠른 탐색이 가능하다. 하지만 단점도 분명하다. 인덱스는 단순히 읽기 전용 구조가 아니라, 데이터가 변경될 때마다 함께 수정되어야 하는 구조이기 때문에 INSERT, UPDATE, DELETE 성능에 부담을 준다.
그래서 “모든 컬럼에 인덱스를 걸면 좋지 않을까?”라는 생각은 잘못된 접근이라는 점을 배웠다. 자주 조회되는 컬럼, 실제로 WHERE 조건에 자주 등장하는 컬럼만 선별해서 인덱스를 적용해야 한다는 원칙이 중요하다. 특히 값의 중복도가 높은 컬럼이나, 거의 조회되지 않는 컬럼에 인덱스를 거는 것은 오히려 낭비가 된다.
흥미로웠던 부분은 데이터가 자주 변하더라도 인덱스를 반드시 걸어야 하는 경우였다. 대표적으로 거래 내역, 로그성 데이터, 이력 테이블처럼 INSERT가 매우 빈번한 테이블이 있다. 이런 경우에도 “조회 성능이 더 중요하다면” INSERT 성능 저하를 감안하고 인덱스를 적용하는 것이 합리적인 선택이 될 수 있다. 결국 인덱스 설계는 단순한 기술 문제가 아니라, 비즈니스 요구사항과 트래픽 특성을 고려한 트레이드오프의 문제라는 점을 이해하게 되었다.

SQL 함수와 조인, 데이터 모델링 기초
SQL을 보다 실전적으로 다루기 위한 함수(Function)와 조인(JOIN), 그리고 데이터베이스 설계의 기초가 되는 ERD를 학습했다.
먼저 GROUP BY를 통해 데이터를 집계하는 방식과 함께, 다양한 내장 함수들을 배웠다.산술 함수로는 SQRT(), CEIL(), FLOOR()를 사용해 계산 결과를 가공하는 방법을 익혔고, 문자열 함수로는 CONCAT()을 통해 문자열을 합치고 SUBSTR()로 특정 구간의 문자열을 추출하는 방법을 실습했다. 특히 INSTR(컬럼명, 찾을 문자열) 함수는 문자열 내에서 특정 문자의 위치를 반환하며, 찾지 못할 경우 0을 반환한다는 점이 실무에서 조건 처리 시 유용하다는 것을 알게 되었다.
날짜 관련 함수도 중요한 포인트였다. MySQL의 CURDATE()와 CURTIME()은 결과가 문자열 타입으로 반환되지만, Oracle에서는 DATE 타입으로 처리되는 경우가 많다는 점에서 DBMS 간 차이를 이해해야 한다는 점을 배웠다. 또한 DATE_ADD(), DATEDIFF()를 통해 날짜 계산을 수행하며, 기간 계산 로직을 SQL 단에서 처리할 수 있다는 점도 실무적으로 유용하게 느껴졌다.
이와 함께 **PK(Primary Key)**와 FK(Foreign Key) 개념을 다시 정리하며, 테이블 간 관계를 기반으로 EQUI JOIN, SELF JOIN을 학습했다. SELF JOIN을 통해 하나의 테이블에서 상위·하위 관계를 표현하는 방식은 ERD 설계와 직접적으로 연결된 개념이었다. 단순히 쿼리를 작성하는 것을 넘어서, 데이터 구조를 먼저 설계하고 그 구조를 SQL로 표현하는 사고방식의 중요성을 느낀 하루였다.

ANSI SQL, 서브쿼리, 그리고 SQL 튜닝
ANSI SQL의 개념을 배우며, DB 벤더에 종속되지 않는 표준 SQL 문법의 필요성을 이해했다. 또한 서브쿼리에 대해 학습했는데, 대부분의 경우는 JOIN으로 해결 가능하지만, 특정 플래그 값처럼 조건이 복잡해질 때는 서브쿼리가 오히려 가독성과 유지보수 측면에서 더 적절할 수 있다는 점이 인상 깊었다.SQL 성능과 관련해서는 조건문의 순서가 실행 계획에 영향을 줄 수 있다는 점을 배웠다.
예를 들어, 조인 조건과 필터 조건이 함께 있을 때 카디널리티를 줄이는 조건을 먼저 처리하는 것이 성능상 유리하다. 다만 최신 DB 엔진에서는 옵티마이저가 이를 자동으로 판단해 실행 계획을 최적화한다는 점도 함께 이해했다. 결국 개발자는 “왜 빠른지”를 알고 작성해야 한다는 메시지가 강하게 남았다.또한 데이터 삭제 방식의 차이도 배웠다.
- DELETE: 데이터만 삭제, ROLLBACK 가능
- TRUNCATE: 스키마 유지 + 데이터 삭제, ROLLBACK 불가
- DROP: 스키마 자체 삭제, 복구 불가
이 차이는 실무에서 매우 치명적일 수 있기 때문에 반드시 구분해서 사용해야 한다는 점을 강조했다.

select d.department_name, count(e.employee_id) as cnt, sum(e.salary) as total, m.emp_name as top_name from DEPARTMENTS d join EMPLOYEES e on e.department_id = d.department_id left join EMPLOYEES m on d.manager_id = m.employee_id group by d.department_id, d.department_name, m.emp_name order by d.department_name; CREATE TABLE WORKER ( NAME VARCHAR(10) NOT NULL, DID INT ); INSERT INTO WORKER VALUES ('JONE',1); INSERT INTO WORKER VALUES ('JANE',2); INSERT INTO WORKER VALUES ('JASON',3); INSERT INTO WORKER VALUES ('JAMES',5); CREATE TABLE TEAM ( DID INT, NAME VARCHAR(10) NOT NULL ); INSERT INTO TEAM VALUES (1,'HR'); INSERT INTO TEAM VALUES (2,'DEV'); INSERT INTO TEAM VALUES (3,'FIN'); INSERT INTO TEAM VALUES (4,'ACC'); CREATE TABLE MENU ( ID INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(36) NOT NULL, PRICE INT UNSIGNED, CREATED TIMESTAMP DEFAULT NOW(), UPDATED TIMESTAMP DEFAULT NOW() )100만건 정도의 데이터를 가지고 실제 업무에서 사용하는 쿼리를 직접 작성했다.
여러 쿼리를 작성했고 이 쿼리들을 이용해 요구사항에 맞는 데이터를 뽑는데, 여러 쿼리 조합으로 데이터를 뽑아보았다.
Git의 개념과 협업에서 발생하는 문제, 그리고 Git의 역할
Git의 기본 사용법뿐만 아니라, 협업 환경에서 왜 Git이 필수적인지에 대해 집중적으로 배웠다. Git은 단순한 코드 저장 도구가 아니라, 여러 개발자가 동시에 작업할 때 발생하는 문제를 해결하기 위한 버전 관리 시스템이라는 점이 핵심이었다.협업 개발에서는 여러 사람이 동시에 같은 파일을 수정하거나, 서로 다른 기능을 병렬로 개발하면서 충돌(conflict)이 발생할 수 있다. 만약 버전 관리 시스템이 없다면, 누가 어떤 코드를 언제 수정했는지 추적할 수 없고, 잘못된 파일로 덮어쓰는 사고가 쉽게 발생한다. Git은 이러한 문제를 해결하기 위해 변경 이력을 commit 단위로 관리하고, branch를 통해 작업 공간을 분리할 수 있도록 해준다.
특히 branch 전략을 통해 각 개발자는 자신의 작업을 독립적으로 진행할 수 있고, 작업이 완료되면 main 또는 develop 브랜치로 병합한다. 이 과정에서 충돌이 발생하더라도 Git은 어떤 부분이 충돌났는지를 명확히 보여주기 때문에, 사람이 직접 판단하여 해결할 수 있다. 이는 협업에서 발생하는 가장 큰 리스크를 최소화해준다.
또한 Git을 사용하면 단순히 “현재 코드”만 보는 것이 아니라, 과거로 돌아가 특정 시점의 코드 상태를 확인하거나 복구할 수 있다. 이는 버그 추적, 기능 롤백, 코드 리뷰 과정에서 매우 중요한 역할을 한다. 이번 수업을 통해 Git은 선택이 아니라, 협업 개발의 전제 조건이라는 인식이 확실히 자리 잡았다.
TypeScript의 필요성과 타입 시스템
TypeScript를 배우며, JavaScript의 한계를 보완하는 정적 타입 언어의 필요성을 이해했다. TypeScript의 기본 자료형, 문법, 메서드를 학습했고, 특히 타입 체크를 통해 런타임 에러를 컴파일 단계에서 방지할 수 있다는 점이 가장 큰 장점으로 다가왔다.또한 캐스팅(Casting) 개념을 통해 명시적으로 타입을 변환하는 방법을 배웠고, 이는 대규모 프로젝트나 협업 환경에서 코드 안정성과 가독성을 크게 높여준다는 것을 알게 되었다. TypeScript는 단순히 문법이 추가된 언어가 아니라, 규모 있는 개발을 위한 안전장치라는 인식이 생긴 계기였다.
node.js express.js로 TS로 작성하는 예제까지 학습했다.
※ 공식문서 참고.
——————————————————————————
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 3기(B-log) 리뷰로 작성 되었습니다.'bootcamp' 카테고리의 다른 글
카카오클라우드 - 클라우드 개발자 교육 7주차 후기 (0) 2025.12.31 카카오클라우드 - 클라우드 개발자 교육 6주차 후기 (0) 2025.12.19 카카오클라우드 - 클라우드 개발자 교육 3주차 후기 (0) 2025.11.28 카카오클라우드 - 클라우드 개발자 교육 2주차 후기 (1) 2025.11.21 카카오클라우드 - 클라우드 개발자 교육 1주차 후기 (0) 2025.11.14