낙서장이자 오답 노트이자 컨닝 페이퍼

패스트캠퍼스 환급챌린지 9일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기 본문

NestJS

패스트캠퍼스 환급챌린지 9일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기

NangIn 2025. 4. 9. 18:36

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

강의 내용 정리   

 

환경 변수

 

환경변수란?

  • 프로그램이 동작하는 외부 환경의 설정값이나 비밀 정보를 저장하는 변수
  • 예)
    • 데이터베이스 주소
    • API 키
    • 운영/개발 환경 설정 (NODE_ENV 등)
  • NestJS에서는 .env 파일에 정의된 값들을 자동으로 불러와 코드와 분리된 설정 관리가 가능하게 함

 

왜 환경변수를 써야 할까?

이유  설명
보안 민감한 정보(API 키, DB 비밀번호 등)를 코드에 하드코딩하지 않음
유연성 환경(dev, stage, prod)마다 값만 바꿔서 설정 가능
유지보수성 설정 변경 시 코드 수정 없이 .env 파일만 바꾸면 됨
배포 통일성 같은 코드라도 환경에 따라 다른 설정으로 실행 가능 (멀티 환경 지원)

 

기본 사용 흐름 (NestJS 기준)

  1. .env 파일 생성
    • PORT=3000
      DB_HOST=localhost
      NODE_ENV=development
      
  2. @nestjs/config 모듈 설치
    • pnpm add @nestjs/config
      
  3. AppModule에서 등록
    • import { ConfigModule } from '@nestjs/config';
      
      @Module({
        imports: [
          ConfigModule.forRoot({
            isGlobal: true, // 모든 모듈에서 접근 가능
          }),
        ],
      })
      export class AppModule {}
      
  4. ConfigService 주입 후 사용
    • import { ConfigService } from '@nestjs/config';
      
      constructor(private configService: ConfigService) {}
      
      getDbHost() {
        return this.configService.get('DB_HOST'); // 'localhost'
      }
      

 

환경변수 유효성 검사: Joi

  • .env 값들이 필수값인지, 포맷이 맞는지 검사하기 위해 사용
  • @nestjs/config에서 제공하는 validationSchema 옵션에 사용
  •   
  • import * as Joi from 'joi'; ConfigModule.forRoot({ isGlobal: true, validationSchema: Joi.object({ PORT: Joi.number().default(3000), DB_HOST: Joi.string().required(), NODE_ENV: Joi.string().valid('development', 'production').required(), }), });

SQL 이론

 

SQL이란?

  • Structured Query Language의 약자로, 관계형 데이터베이스(RDBS)를 다루기 위한 표준 언어
  • 주요 RDBMS: PostgreSQL, MySQL, Oracle, SQLite 등
  • CRUD(Create, Read, Update, Delete) 작업을 중심으로 테이블 데이터를 관리함
  • 데이터베이스 스키마를 변경할 수 있는 DDL을 포함
  • BEGIN, COMMIT, ROLLACK 키워드를 통한 ACID Transaction을 지원함

 

SQL의 기본 구조

  • 테이블은 행(Row)과 열(Column)로 구성
  • 각 테이블에는 Primary Key(기본키)가 있어, 각 행을 고유하게 식별  
    id(PK) name  gender  group
    1 최지호 male CodeFactory
    2 민지 female NewJeans

 

자주 쓰는 SQL 문법

명령어  기능
SELECT 데이터 조회
INSERT 데이터 추가
UPDATE 데이터 수정
DELETE 데이터 삭제
WHERE 조건 필터링
ORDER BY 정렬
GROUP BY 그룹별 통계
HAVING 그룹 통계 필터링
JOIN 여러 테이블 연결
SUBQUERY 쿼리 안에 또 다른 쿼리

 

SELECT

  • SELECT문은 데이터베이스에서 데이터를 불러올 때 사용
  • // 문법
    SELECT column1, column2
    FROM table_name;
    
    // 예제
    SELECT name, age
    FROM students;
    

 

WHERE CLAUSE

  • WHERE CLAUSE는 데이터를 필터링할 때 사용
  • // 문법
    SELECT column1
    FROM table_name
    WHERE condition;
    
    // 예제
    SELECT name
    FROM students
    WHERE age > 18;
    

 

ORDER BY CLAUSE

  • ORDER BY CLAUSE는 데이터를 정렬할 때 사용함
  • // 문법
    SELECT column1
    FROM table_name
    ORDER BY column1 ASC/DESC;
    
    // 예제
    SELECT name, age
    FROM students
    ORDER BY age DESC;
    

 

AGGREGATE FUNCTION

  • AGGREGATE FUNCTION은 통계를 낼 때 사용
  • // 예제
    SELECT COUNT(*) // 학생들의 전체 ROW수를 알 수 있음
    FROM students;
    

 

GROUP BY

  • GROUP BY는 통계를 그룹으로 나눌 때 사용됨
  • // 문법
    SELECT column1, COUNT(*)
    FROM table_name
    GROUP BY column1;
    
    // 예제
    // age 별로 카운트함. 예를들어 12살 6명 이런식
    SELECT age, COUNT(*)
    FROM students
    GROUP BY age;

 

HAVING

  • HAVING은 AGGREGATE FUNCTION에 조건을 추가할 때 사용됨
  • // 문법
    SELECT column1, COUNT(*)
    FROM table_name
    GROUP BY column1;
    HAVING condition;
    
    // 예제
    SELECT age, COUNT(*)
    FROM students
    GROUP BY age;
    HAVING COUNT(*) > 10; // 10살 보다 적은 나이는 포함 X

 

JOIN

  • 여러 테이블을 합칠 때 사용
  • 예: user.gender_id(FK) 와 gender.id(PK)를 연결해 성별 이름을 가져올 수 있음
  • // 문법
    SELECT columns
    FROM table1
    INNER JOIN table2
    ON table1.column = table2.column;
    
    // 예제
    SELECT *
    FROM user
    INNER JOIN gender
    ON user.gender_id = gender.id;
    

INSERT

  • INSERT는 데이터를 생성할 때 사용
  • // 문법
    INSERT INTO table_name (column1, column2)
    VALUES (value1, value2);
    
    // 예제
    INSERT INTO students (name, age)
    VALUES ('John Doe', 22);
    

 

UPDATE

  • UPDATE는 데이터를 업데이트할 때 사용
  • // 문법
    UPDATE table_name
    SET column1 = value1, colum2 = value2
    WHERE condition;
    
    // 예제
    UPDATE students
    SET name = '코드팩토리'
    WHERE id = 2;

 

DELETE

  • DELETE는 데이터를 삭제할 때 사용
  • // 문법
    DELETE FROM table_name
    WHERE condition;
    
    // 예제
    DELETE FROM students
    WHERE name = 'John Doe';
    

 

Subqueries

  • 쿼리 내부에 또 다른 쿼리를 사용할 수도 있음
  • // 예제
    SELECT name
    FROM students
    WHERE age > (SELECT AVG(age) FROM students)
    

 

핵심 포인트

  • SQL은 간단한 문법으로도 강력한 데이터 처리가 가능
  • 직접 SQL을 깊게 다루진 않지만, NestJS의 ORM(TypedORM, Prisma, Mongoose 등)을 제대로 쓰려면 기초 개념은 필수
  • 쿼리 작성이 어려워도, ORM이 대신 처리해주므로 전체 흐름과 용도 위주로 이해하면 충분
    •  

                                                                  

학습 후기         

                                                                                                                           

환경 변수와 SQL 기본 이론을 함께 학습하면서, 개발 환경을 구성하고 데이터를 다루는 데 있어 왜 이 두 요소가 실무에서 필수적인지 보다 명확히 이해할 수 있었습니다. 특히 .env 파일을 통해 환경별 설정을 유연하게 관리할 수 있는 점은 실무에서 배포 환경이 다를 때 얼마나 유용하게 활용될 수 있는지를 체감하게 해주었습니다. 단순히 값을 따로 저장하는 것이 아닌, @nestjs/config 모듈을 통해 시스템 전반에 안전하게 주입하고, Joi를 통해 유효성까지 검사할 수 있다는 점에서 안정성과 확장성 측면에서도 큰 강점이 있다고 느꼈습니다.

 

SQL 이론은 이미 익숙하다고 생각했지만, 이번 강의를 통해 다시 한번 기본 문법들을 정리하면서 ORM이 내부적으로 어떤 식으로 동작하는지 감을 잡는 데 도움이 되었습니다. SELECT, WHERE, JOIN, GROUP BY와 같은 핵심 문법들이 실제로 TypeORM이나 Prisma에서 어떻게 추상화되는지 상상하며 공부하니, ORM이 단순히 편리함을 제공하는 도구를 넘어 SQL을 대체하는 구조임을 실감하게 되었습니다. 특히 JOIN이나 SUBQUERY처럼 복잡한 로직도 SQL에서 어떻게 표현되는지 알아두면, ORM을 사용할 때 문제 해결이 훨씬 수월해질 것 같습니다.

 

결국 이 강의를 통해 느낀 점은, 우리가 NestJS나 ORM을 쓸 때 겉으로는 간단해 보이더라도 그 기반이 되는 환경 설정과 SQL 이론을 제대로 이해하지 않으면 실무에서 치명적인 실수를 할 수 있다는 것입니다. 앞으로 복잡한 기능을 다루게 될수록 이 두 가지의 중요성은 더 커질 것이므로, 단순히 ‘설정’과 ‘쿼리’로 치부하지 않고 체계적으로 정리해두고자 합니다.

 

학습 인증샷       

                       

수강 인증 사진
학습 인증샷

 

공부 시작 시간

                                                                       

공부 종료 시간

https://abit.ly/lisbva

 

Abit.ly 다운받기

 

abit.ly