파이썬 알고리즘 : 프로세스

2023년 10월 11일 알고리즘 문제풀이 문제 1 프로세스 문제 링크 1차 시도 나의 생각 프로세스가 담긴 배열에서 첫번째가 우리가 알고싶은 프로세스 인지 아닌지, 또 가장 높은 우선순위를 지녀 실행될 차례인지, 아닌지로 구분하였다. location은 현재 우리가 알고싶은 프로세스의 index이고, answer는 몇번째로 실행되었는지를 의미한다. 알고 싶은 프로세스 관심 없는 프로세스 최우선순위 answer 출력 popleft() 한다. 실행되었기 떄문에 answer 1 증가 차우선순위 popleft()하여 맨 뒤로 보낸다. location도 맨 뒤로 설정한다. popleft()후 맨 뒤로 보낸다. locaion 1 감소 결과 정답 ...

2023년 10월 11일 · 1 분 · 배준수

App Configuration

Testing Dotenv 터미널에서 npm install @nestjs/config dotenv 는 .env 파일과 일반적인 환경 변수파일을 참조하여 개체를 생성(겹칠시 환경변수 파일 우선)한다. .env 파일은 배포에 포함되선 안된다. (git 에선 gitignore로 commit되지 않도록 해야) 우리는 개발용(배포용) .env 파일과 테스트용 .env 파일 두 개를 만들것이다. root 디렉토리에 .env.tset 와 .env.development 파일 두개를 만들자. 1 2 // .env.development DB_NAME=db.sqlite 1 2 // .env.test DB_NAME=test.sqlite AppModule에 아래와 같이 설정해준다. ...

2023년 10월 10일 · 4 분 · 배준수

Association

Report 다루기 Report는 자동차를 판 사람이 자기가 판매한 가격과 정보를 보고하는 것. 이것을 바탕으로 자신의 중고차 가치를 추정받는 시스템의 정확도를 높일 수 있다. 리포트 Entity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // reports.entity.ts import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class Report { @PrimaryGeneratedColumn() id: number; @Column() price: number; @Column() make: string; @Column() model: string; @Column() year: number; @Column() // 판매지역 나타내는 경도 lng: number; @Column() // 판매지역 나타내는 위도 lat: number; @Column() mileage: number; } DTO 생성 컨트롤러를 수정하자 ...

2023년 10월 10일 · 7 분 · 배준수

end to end testing

Testing End to End test 유닛 테스트보다 넓은 범위를 테스트 전체 서비스의 복사본이나 인스턴스 생성 package.json 의 script를 보면 "test:e2e"가 있음. src 폴더 내의 파일 실행 X 서버를 끄고 터미널에서 npm run test:e2e를 입력해보자. 새로운 E2E 테스트 만들기 test 폴더에 auth.e2e-spec.ts 파일을 만들고 app.e2e-spec.ts의 내용을 복사 붙여넣자. 이 후 조금의 수정을 가한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // auth.e2e-spec.ts import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; import { AppModule } from './../src/app.module'; describe('Authentication System', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); await app.init(); }); it('handles a signup request', () => { // 알아보기 쉬운 주석 return request(app.getHttpServer()) .post('/auth/signup') // signup 경로 .send({ email: 'asgkege@akl.com', password: 'qownstn' }) // 무작위 body .expect(201) .then((res) => { // response id, email로 올 것 const { id, email } = res.body; expect(id).toBeDefined(); expect(email).toEqual(email); }); }); }); 터미널에서 npm run test:e2e를 실행하면 문제가 발생한다. 이유를 알아보자. ...

2023년 10월 10일 · 3 분 · 배준수

TypeORM으로 쿼리 작성

TypeORM 쿼리 TypeORM에는 create, save, find, findOne, createQueryBuilder 등 있다. 복잡한 우리의 알고리즘을 위해 createQueryBuilder를 사용하자. 쿼리 설치하기 컨트롤러로 간다. 1 2 3 4 5 // reports.controller.ts @Get() getEstimate(@Query() query: GetEstimateDto) { return this.reportsService.createEstimate(query); } 서비스에 메서드를 추가하자 1 2 3 4 5 6 // reports.service.ts import { GetEstimateDto } from './dtos/get-estimate.dto'; createEstimate(estimateDto: GetEstimateDto) { return this.repo.createQueryBuilder().select('*').getRawMany(); } 우선은 모든 속성을 받도록 쿼리를 작성했다. 서버를 실행하고 API Client에서 만들어 놓은 추정치를 받는 요청을 보내보자. 속성들이 잘 오면 성공. ...

2023년 10월 10일 · 2 분 · 배준수

승인 시스템

기초적인 승인 시스템 제출된 보고서 중 무의미한 데이터를 방지하기 위해 ‘관리자’와 관리자의 승인 개념을 도입한다. 우선은 관리자는 배제한체 승인에 관해서만 구현한다. 우선 report.entity 파일에 속성을 추가하자 1 2 3 // report.entity.ts @Column({ default: false }) approved: boolean; 이후 컨트롤러에 관련 메서드를 추가한다. 1 2 3 // reports.controller.ts @Patch('/:id') approveReport(@Param('id') id: string, @Body() body: ApprovedReportDto) {} reports의 dtos 디렉토리에 새로운 dto를 추가하자. report dto 에도 approved 속성을 추가해야한다. ...

2023년 10월 10일 · 5 분 · 배준수

클러스터링 인덱스

책너두 6기 26일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.267 ~ p.276 내용정리 08 인덱스 8.6.2 함수를 이용한 인덱스 다음과 같이 테이블의 구조를 변경하지 않고, 함수를 직접 사용하는 인덱스를 생성할 수 있다. 1 2 3 4 5 6 7 create table user( user_id BIGINT, first_name VARCHAR(10), last_name VARCHAR(10), PRIMARY KEY (user_id), INDEX ix_fullname ((concat(first_name,' ',last_name))) ); 함수를 직접 사용하는 인덱스는 테이블의 구조는 변경하지 않고, 검색을 빠르게 만들어준다. 제대로 활용하려면 반드시 조건절에 함수 기반 인덱스에 명시된 표현식이 그대로 사용돼야 한다. ...

2023년 10월 10일 · 2 분 · 배준수

Authentication, Cookie-session

Authentication Overview 인증 과정의 전체 흐름부터 살펴보자. 어떤 클라이언트가 애플리케이션에 요청하고 우리 서비스에 가입하려고 한다. 요청에는 eamil과 password가 들어있다. 서버는 이메일이 이미 이메일이 사용중인지 확인한다. 유저의 암호를 암호화한다. 새로운 유저 레코드를 저장한다. 요청에 대한 응답으로 유저의 id를 포함하는 쿠키를 되돌려보낸다. 브라우저는 자동적으로 쿠키를 저장하고 이후 클라이언트의 요청에 쿠키를 붙여준다. 유저는 reports를 보낸다. 여기엔 쿠키 포함 되어있고(쿠키 내에는 유저의 id가 포함되어 있다.) report를 위한 정보도 들어있다. 서버는 쿠키의 데이터가 임의로 조작되진 않았는지 확인한다. ...

2023년 10월 9일 · 7 분 · 배준수

Authentication와 Guard

Authentication Custom Decorator 만들기 handler에게 자동으로 현재 로그인한 유저를 알려주는 기능을 만들려고 한다. 우리는 기존의 @Session() 대신 새로운 우리만의 decorator를 만들 것이다. 우리가 만들 CurrentUser Decorator는 2가지가 필요할 것이다. Session Object : 요청한 유저의 id를 알아야 한다. UsersService Instance : 알아낸 id를 가진 사용자를 찾아야 하기 떄문이다. 우리는 Param decorators로 만들어야 한다. 하지만 Param decorators는 DI(종속성 주입) 시스템 외부에 있어서, UsersService 인스턴스를 받을 수 없다. 이 문제를 해결하기 위해 interceptor를 만든다. ...

2023년 10월 9일 · 3 분 · 배준수

단위 테스트

Unit Testing 유닛 테스트 과정 Fake UsersService를 만들어서 실행할 계획이다. 정상적으로 애플리케이션을 실행하면 DI 안에 많은 종속성을 넣어야 한다. 우린 새롭게 테스트를 위한 DI를 만드는데, 내부에는 Userss Service의 모든 메서드를 실행하는 클래스를 담는다. 이로서 어떤 단위(ex. Authentication, sign in 등)을 테스트하는데 종속성 주입에서 자유로워질 수 있다. Test 설정하기 users 디렉토리에 auth.service.spec.ts 파일을 만들자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // auth.service.spec.ts import { Test } from '@nestjs/testing'; import { AuthService } from './auth.service'; import { UsersService } from './users.service'; it('can create an instance of auth service', async () => { // 새 DI container 생성 // 하지만 AUthService를 위한 종속성을 제공하지 않았으니 실행하면 오류가 뜰것이다. constmudle = await Testing.createTestingModule({ providers:[AuthService] }).compile(); const service = module.get(AuthService); expect(service).toBeDefined(); }); 터미널에서 npm run test:watch를 입력한다. 3개가 failed라고 뜰텐데, p를 누르고 auth.service.spec 을 입력한다. 그럼 이 파일만 테스트하여 1 failed라고 뜬다. ...

2023년 10월 9일 · 5 분 · 배준수