TIL

내일배움캠프 13주차 화요일 TIL

news0516 2025. 1. 21. 20:58

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

function solution(n, m) {

    let arr = [];
	// 유클리드 호제법을 통해 최대공약수를 구하는 함수
    function gcd (n, m) {
        if (m === 0) return n;
        return gcd(m, n % m);
    }

	// 두 수의 곱을 최대공약수로 나누면, 최소공배수를 구할 수 있음
    function lcm (n, m) {
        return (n * m) / gcd (n, m)
    }
	
	// 배열에 추가
    arr.push(gcd (n, m));
    arr.push(lcm (n, m));
	
	// 배열 리턴
    return arr;

}

 

유클리드 호제법 (gcd 함수):

  • 큰 수를 작은 수로 나누고, 나머지를 반복적으로 계산하여 GCD를 찾는 효율적인 알고리즘
1. 두수를 A % B 이렇게 나눠서 나머지(R1) 가 생겼다.

2. 이번에는 B % R1 을 나눠버린다. 그럼 또 나머지(R2) 가 생겼다.

3. 요번에는 R1 % R2 을 나눠버린다. 그럼 또 나머지(R3) 이 생겼다.

4. 여번에는 R2 % R3 을 나눠버렸다. 근데 이번에는 나머지가 0 이다. (즉, 없다.)

그럼 두수 A 와 B 의 최대공약수는 (나머지가 멸종되기전) 마지막 나머지였던 R3 이 된다.

출처: https://devbirdfeet.tistory.com/257 [새발개발자:티스토리]

최대공약수를 이미 구한 상태에서 두 수의 곱을 최대공약수로 나누면 최소공배수를 구할 수 있다.


Nest.js에서 데이터베이스 연동 > TypeORM 사용

ORM(Object-Relational Mapping)이란?

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어와 관계형 데이터베이스(Relational Database) 간의 데이터 매핑(Data Mapping)을 자동화해주는 기술입니다.
프로그래밍 언어에서 사용하는 객체와 데이터베이스의 테이블 간의 변환을 중개해주는 도구나 프레임워크를 의미합니다.

TypeORM: TypeScript에서 사용하는 ORM(Object-Relational Mapping)으로, 데이터베이스와 쉽게 연결해주는 도구



Node.js에서는 .env를 많이 사용 >. Nest.js에서는 @nestjs/config 사용

엔티티: DB의 특정 테이블을 대표하는 객체, ORM에서 사용

특징: 
엔티티는 데이터베이스 테이블의 각 행(row)을 객체로 표현합니다. 
엔티티의 속성(property)은 테이블의 컬럼(column)과 매핑됩니다. 
ex) User라는 엔티티는 데이터베이스의 users 테이블을 나타내며, name, email 등의 속성을 가질 수 있습니다.

리포지토리 : 엔티티와 DB간 중간계층을 형성하는 객체
프로그래머가 DB와의 통신과정을 직접 알지 못하더라도,
리포지토리의 함수를 사용해 DB에서 원하는 결과를 얻을 수 있다

import { IsNumber, IsString } from 'class-validator';
import {
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';

// @Entity: 클래스가 posts 테이블에 매핑됨을 나타냄
@Entity({
  name: 'posts',
})
export class Post {
  // @PrimaryGeneratedColumn: 기본 키(PK) 컬럼을 정의
  @PrimaryGeneratedColumn()
  id: number;
	
  @IsString()
  // @Column: 일반 컬럼을 정의
  @Column('varchar', { length: 50, nullable: false })
  title: string;

  @IsString()
  @Column('varchar', { length: 1000, nullable: false })
  content: string;

  @IsNumber()
  // select: false로 설정하여 일반 조회에서 비밀번호가 노출 X
  @Column('int', { select: false, nullable: false })
  password: number;
  
  // 레코드 생성 날짜 자동 기록
  @CreateDateColumn()
  createdAt: Date;
  // 레코드 수정 날짜 자동 기록
  @UpdateDateColumn()
  updatedAt: Date;
  // 레코드 삭제 날짜 자동 기록
  @DeleteDateColumn()
  deletedAt?: Date;
}


레코드 : DB에서 특정 테이블의 한 행

첫 번째 레코드: (1, Alice, alice@example.com), 두 번째 레코드: (2, Bob, bob@example.com) 게


게시판 프로젝트 인섬티아 테스트 전 유의사항
1.env 파일 구성

DB_HOST="여러분들이 사용하는 데이터베이스 주소"
DB_PORT=3306
DB_USERNAME="데이터베이스 계정"
DB_PASSWORD="데이터베이스 암호"
DB_NAME="board"
DB_SYNC=true


2. GET을 제외한 나머지 API에는 Headers에 Content-Type: application/json을 삽입

3. 서버 실행 전 db에 미리 board 데이터 베이스 생성

mysql> create database board;


4. npm run start로 서버 실행 후 테스트 완

Nest.js에서의 인증