낙서장이자 오답 노트이자 컨닝 페이퍼
패스트캠퍼스 환급챌린지 10일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기 본문
패스트캠퍼스 환급챌린지 10일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기
NangIn 2025. 4. 10. 18:21본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
강의 내용 정리
SQL 조회기능 사용해보기
기본 구조 이해
- Database: NestJS Netflix (직접 생성한 PostgreSQL DB)
- Schema: public (기본 제공 스키마)
- Table: movie 테이블 생성 및 활용
테이블 생성
-
CREATE TABLE movie ( id SERIAL PRIMARY KEY, title TEXT, genre TEXT ); - id: 자동 증가 정수, 프라이머리 키
- title, genre: 문자열 필드
- 실행 → Query Tool에서 실행 → movie 테이블 생성 확인
데이터 삽입 (INSERT)
-
INSERT INTO movie (title, genre) VALUES ('Inception', 'Sci-Fi'), ('The Godfather', 'Crime'), ('The Dark Knight', 'Action'), ('Pulp Fiction', 'Crime'), ('Forrest Gump', 'Drama'); - 실행 후 → SELECT * FROM movie; 로 데이터 확인
데이터 조회 (SELECT)
- 전체 조회
-
SELECT * FROM movie;
-
- 특정 컬럼만 조회
-
SELECT title, genre FROM movie;
-
- 조건 필터링 (WHERE)
-
SELECT * FROM movie WHERE genre = 'Crime';
-
정렬 (ORDER BY)
-
SELECT * FROM movie ORDER BY id DESC; -- 내림차순
집계 함수 (Aggregate Functions)
- 전체 개수
-
SELECT COUNT(*) FROM movie;
-
- 장르별 개수 (GROUP BY)
-
SELECT genre, COUNT(*) FROM movie GROUP BY genre;
-
- 조건 포함 집계 (HAVING)
-
SELECT genre, COUNT(*) FROM movie GROUP BY genre HAVING COUNT(*) > 1;
-
SQL 업데이트와 삭제 기능 사용해보기
주석(Comment) 작성
- SQL에서는 -로 주석 작성 가능
-
-- 이건 주석입니다. 실행되지 않아요 SELECT * FROM movie;
-
UPDATE: 데이터 수정
- 단일 조건 수정
-
UPDATE movie SET genre = 'Science Fiction' WHERE title = 'Inception'; - Inception의 장르를 'Sci-Fi' → 'Science Fiction'으로 변경
- WHERE 조건으로 특정 row만 타겟팅
-
- 다중 조건 수정
-
UPDATE movie SET genre = 'Drama' WHERE genre = 'Crime'; - 장르가 'Crime'인 영화 전체를 'Drama'로 변경
- WHERE에 해당하는 모든 row가 변경됨
- 주의: WHERE 조건 없이 실행 시 테이블 전체가 수정됨 → 주의 필요
-
DELETE: 데이터 삭제
- 단일 조건 삭제
- 타이틀이 Forrest Gump인 영화 한 편 삭제
-
DELETE FROM movie WHERE title = 'Forrest Gump';
- 다중 조건 삭제
- 장르가 'Drama'인 모든 영화 삭제
-
DELETE FROM movie WHERE genre = 'Drama';
팁
- 항상 WHERE 조건 신중하게 작성 (특히 UPDATE, DELETE)
- SELECT로 먼저 조건이 정확한지 확인해본 후 → UPDATE/DELETE 실행 추천
- SQL은 한 줄 실수로 전체 데이터 날리는 경우도 많음
SQL Join기능 사용해보기
목표
- 여러 테이블을 조인(join) 하여 하나의 결과로 조회
- 영화(movie)와 감독(director) 테이블 연결
영화 테이블 재설정
DROP TABLE IF EXISTS movie;
CREATE TABLE movie (
id SERIAL PRIMARY KEY,
title TEXT,
genre TEXT
);
INSERT INTO movie (title, genre) VALUES
('Inception', 'Sci-Fi'),
('The Godfather', 'Crime'),
('The Dark Knight', 'Action'),
('Pulp Fiction', 'Crime'),
('Forrest Gump', 'Drama');
감독 테이블 생성
CREATE TABLE director (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO director (name) VALUES
('Christopher Nolan'),
('Francis Ford Coppola'),
('Quentin Tarantino');
영화 테이블에 감독 ID 컬럼 추가 & 외래 키 연결
ALTER TABLE movie
ADD COLUMN director_id INTEGER,
ADD CONSTRAINT fk_director -- 제약 설정
FOREIGN KEY (director_id) REFERENCES director(id);
- 외래 키 제약조건을 통해, 존재하지 않는 감독 ID는 넣을 수 없도록 보호
감독 ID 업데이트 (서브쿼리 사용)
-- Nolan 감독의 영화들 업데이트
UPDATE movie
SET director_id = (
SELECT id FROM director WHERE name = 'Christopher Nolan'
)
WHERE title IN ('Inception', 'The Dark Knight');
-- 나머지도 같은 방식으로 업데이트
INNER JOIN 으로 영화 + 감독 같이 조회
SELECT
m.title,
m.genre,
d.name AS director_name
FROM movie m
JOIN director d ON m.director_id = d.id;
- JOIN은 기본적으로 INNER JOIN → 조건이 맞는 데이터만 매칭됨
JOIN의 종류
| JOIN 종류 | 설명 |
| INNER JOIN | 매칭되는 데이터만 가져옴 (기본) |
| LEFT JOIN | 왼쪽 테이블 기준 (movie), 없는 건 NULL |
| RIGHT JOIN | 오른쪽 기준 (director), 없는 건 NULL |
-- LEFT JOIN 예시
SELECT
m.title,
m.genre,
d.name AS director_name
FROM movie m
LEFT JOIN director d ON m.director_id = d.id;
- Forrest Gump처럼 감독이 없는 영화도 조회됨 (감독은 null)
요약
- JOIN은 테이블 간 관계를 연결해서 하나의 결과로 묶는 기능
- 실무에서 자주 사용하는 강력한 쿼리 기술
- 외래 키 설정 + 관계된 ID 컬럼 필요
- INNER, LEFT, RIGHT JOIN을 상황에 따라 사용
학습 후기
이번 강의를 통해 SQL의 조회, 수정, 삭제, 조인 기능까지 실습하며 SQL 문법이 단순한 이론을 넘어서 데이터베이스를 실제로 설계하고 조작하는 데 얼마나 중요한 역할을 하는지를 체감할 수 있었습니다. 특히 SELECT, WHERE, GROUP BY, HAVING과 같은 구문들은 단순 조회뿐만 아니라 통계 및 데이터 분석을 위한 기초로써 필수적이라는 점이 인상 깊었습니다. 조건을 기준으로 데이터를 그룹화하거나, 조건에 따라 특정 값들만 조회하는 로직은 실제 서비스에서 자주 쓰일 수밖에 없다고 느꼈습니다.
또한 UPDATE와 DELETE의 경우, 작은 실수로 전체 데이터가 손실될 수 있기 때문에 항상 WHERE 조건을 정확히 확인하고 사용하는 습관이 중요하다는 점을 다시금 인식하게 되었습니다. SELECT로 조건을 먼저 테스트한 후에 UPDATE나 DELETE를 실행하는 안전한 흐름은 앞으로 실무에서도 반드시 지켜야 할 원칙 중 하나라고 생각합니다. 실습을 통해 데이터를 수정하고, 삭제해보는 경험을 하면서 SQL의 위험성과 동시에 유용함을 동시에 느낄 수 있었습니다.
마지막으로 JOIN 기능을 학습하면서 관계형 데이터베이스의 진정한 강점을 경험했습니다. 단일 테이블로는 표현할 수 없는 현실 세계의 복잡한 관계를 두 개 이상의 테이블을 조인하여 효율적으로 조회할 수 있었고, 특히 LEFT JOIN을 통해 일부 데이터가 없는 경우에도 결과를 유연하게 처리할 수 있는 방식은 매우 실무적이라는 인상을 받았습니다. 단순히 문법만 외우는 것이 아니라, 실제로 어떻게 관계를 맺고, 데이터를 구성하고, 효율적으로 꺼내 쓸 수 있을지를 체계적으로 배울 수 있었던 유익한 시간이었습니다.
학습 인증샷




https://abit.ly/lisbva
Abit.ly 다운받기
abit.ly