분류 전체보기

· 🟩 NCP
큐시즘 밋업 프로젝트를 진행하며 AI 튜닝을 진행하게 되었다.튜닝(모델 훈련)을 하는 방법을 찾아봤지만 다 비슷한 글에다 네이버에서 올라온 홍보와 비슷한 글 밖에 없었다. 잘하는 분들은 다 문서를 찾아보며 하겠지만... 나에겐 헷갈리는 과정이 많았기에 포스트로 정리해보려 한다!(답답해서 내가 쓴다!) 학습 데이터 생성하기https://clovastudio.ncloud.com/tuning/api CLOVA Studio clovastudio.ncloud.com먼저 학습시킬 데이터를 만들어야 한다. 데이터의 경우 csv, json 파일로 만들어야 하는데, 우리 팀은 csv를 사용했다. 어떤 형식으로 AI를 사용할지에 따라 싱글턴인지 멀티턴인지가 결정된다.만약 한 번의 질문으로 답을 얻어오는 경우라면 싱글턴(우..
에러들...1. CI 도중 Redis 연결이 안됨2. CI 서버에서 배포 서버로 docker-compose.yml 파일 전송이 안됨.3. 배포서버의 deploy.sh 에서 에러가 발생함.문제를 해결하고 난 뒤 보니까 간단해보이지만... 새벽에 3시간넘게 붙잡고 있었다...(함께 에러 해결을 위해 정보를 찾아준 최고의 개발리드 성민아 고마워🥹)  시너지 프로젝트 작업 중 Redis를 사용하게 되었다. NCP를 지원받았지만 , Cloud for Redis 비용이 막대했기에 Redis는 컨테이너로 띄워서 배포하기로 결정했다.이때부터 CI/CD 에서 에러가 터지기 시작했다. 1. CI 도중 Redis 연결이 안됨일단 첫번째 에러는 CI 도중 Redis 연결이 안됐고, 의존성 주입이 되지 않았다. CI 도중 테..
· 🟩 NCP
큐시즘 밋업 프로젝트 중 네이버 클라우드의 지원을 받게 되었다.NCP(네이버 클라우드) 서버를 만들어보자.(신규회원의 경우 10만원의 크레딧을 준다. 나의 경우 지원을 받아 더 많은 크레딧이 있지만, 내가 적용한 서버는 8만원대의 금액이므로 초기회원에게 주는 크레딧으로 충분할 것이다.)https://www.ncloud.com/product/compute/server1. 콘솔 클릭 2. Services 클릭왜 인지 모르겠지만 현재 한국에선 classic 플랫폼이 지원되지 않는다. 네이버 클라우드를 찾아보면 classic도 지원이 된다고 나와있지만... 이유는 모르겠다. (classic이 더 저렴하다.)3. Services 클릭4. 서버 생성 5. 콘솔 선택 6. 원하는 이미지를 선택한 후 서버 생성 7. ..
문제상황개발자 유미님의 SpringSecurity 강의를 듣던 중 문제 발생. 컨트롤러import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class LoginController { @GetMapping("/login") public String loginP() { return "login"; }} 템플릿 엔진(mustache)login page  /login으로 접속을 하면 login 만 출력이 된다.문제해결@RestController -> @Controll..
현재 내가 속해있는 동아리 큐시즘에선 실제 기업들과 협업해 3주 동안 프로젝트를 진행한다. 내가 속한 팀은 렛츠커리어와 함께 프로젝트를 진행하고 있다. 렛츠커리어에선 현재 대표님이자 멘토님 한 분이 프로그램을 담당한다. 그러다보니 프로그램이 자주 업데이트 될 수 없는 환경이었기에 프로그램 목록을 보여주는 페이지에 캐싱을 적용하는 것이 조회 성능을 올려 줄 것이라고 생각했다. Redis를 선택한 이유캐싱을 하는 방법은 여러가지가 있다.인메모리에 구현하는 방법이 있고, 분산 캐시 시스템을 사용하는 방법도 있다. 인메모리 캐시를 사용하면 구현이 간단하고 빠르다. 렛츠커리어는 실제 제공되는 홈페이지니까 확장성을 고려해 Redis를 사용해 캐싱을 구현하기로 했다. 어떻게 적용했을까?캐싱 전략 중 Look Asid..
산악부 사이트를 배포했는데 문제가 생겼다. 현재 로직에서 로그인을 하면 accessToken과 accessToken의 만료시간을 프론트엔드에 전달하고, 쿠키에 refreshToken을 저장한다.accessToken의 만료시간이 현재 시간보다 과거가 되는 경우(accessToken이 만료된 경우) 쿠키의 refreshToken을 통해 백엔드에 토큰 재발급을 요청한다.문제는 백엔드 코드에서 프론트엔드의 refreshToken을 받지 못하는 것이었고, 브라우저의 쿠키를 보았을 때 refreshToken이 존재하지 않았다. 현재 백엔드 코드는 아래와 같다. @UseGuards(LocalAuthGuard) @Post('login') async login(@Request() req, @Res() res: Re..
현재 진행하고 있는 프로젝트의 CI/CD 스크립트를 작성했습니다. 나의 코드는 제대로 CI를 통과하는데, 함께 개발을 하던 친구의 코드가 CI를 통과하지 못했고, ApplicationTests > contextLoads() FAILED 에러를 마주했습니다. 해당 에러를 좀 더 자세히 보았습니다.LetscareerCApplicationTests > contextLoads() FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at Construct..
웹사이트를 운영하다보면 실시간으로 알림을 받아야하는 경우가 있습니다.(현재 개발중인 동아리 웹사이트를 예로들면 에러 , 암벽화 대여 등) 저는 이를 Slack과 Slack Webhook을 통해 구현했습니다.1. Slack에 앱 추가하기원하는 워크스페이스의 채널로 들어가 아래 사진 순서대로 클릭!     이렇게 슬랙에서 해야할 일은 전부 끝났습니다. 코드로 구현해볼게요. 2. Nest.js 앱에 추가하기@Slack/webhook 라이브러리를 사용하겠습니다. @slack/webhookOfficial library for using the Slack Platform's Incoming Webhooks. Latest version: 7.0.2, last published: 7 months ago. Start u..
1. 에러 필터 작성 import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus,} from '@nestjs/common';import { HttpAdapterHost } from '@nestjs/core';import { timestamp } from 'rxjs';@Catch()export class AllExceptionsFilter implements ExceptionFilter { constructor(private readonly httpAdapterHost: HttpAdapterHost) {} catch(exception: unknown, host: ArgumentsHost) { const { httpA..
본 글은 도커 교과서를 읽고 정리한 내용입니다. 도커 컴포즈 파일의 구조도커 컴포즈 파일은 애플리케이션의 '원하는 상태', 즉 모든 컴포넌트가 실행 중일 때 어떤 상태여야 하는지를 기술하는 파일.docker container run 명령으로 컨테이너를 실행할 때 지정하는 모든 옵션을 한데 모아 놓은 단순한 형식의 파일.도커 컴포즈 파일을 작성하고 나면 도커 컴포즈 도구를 사용해 애플리케이션을 실행한다.그러면 도커 컴포즈가 컨테이너, 네트워크, 볼륨 등 필요한 모든 도커 객체를 만들도록 도커 API에 명령을 내린다. 위 스크립트는 도커 컴포즈 파일 스크립트 중 하나이다.version: '3.7'services: todo-web: image: diamol/ch06-todo-list ports..
프로젝트를 구현할 때 db에 초기 데이터가 필요한 경우들이 있습니다.초기 관리자 계정, 테스트를 위한 더미 데이터 등..이렇게 db에 더미 데이터를 미리 삽입하는 것을 seeding이라 합니다.매번 다른 분들의 블로그 글을 참고하며 seeding을 했었는데, 이번 기회에 직접 정리해보려 합니다. 저는 seeding을 위해 typeorm-extension 라이브러리를 사용하겠습니다.(seeder 라이브러리로 typeorm-seeding, nestjs-seeder 라이브러리가 있었지만, 두 라이브러리 모두 현재 업데이트가 되고있지 않으며, 주간 사용자도 typeorm-extension에 비해 적기에 typeorm-extension을 선택했습니다.) typeorm-extensionA library to cr..
본 글은 도커 교과서를 읽고 정리한 내용입니다. 이번 장에선 도커 볼륨과 마운트에 대해 배우고 컨테이너 파일 시스템이 어떻게 동작하는지 공부할 예정.컨테이너 속 데이터가 사라지는 이유도커 컨테이너에도 단일 드라이브로 된 파일 시스템이 존재한다.파일 시스템의 내용은 이미지 속 파일에서 생성된다.Dockerfile 스크립트에 COPY 인스트럭션으로 파일을 이미지로 복사하면 이 이미지로 실행한 컨테이너의 경우 같은 경로에 복사한 파일이 생성된다.도커 이미지가 여러 개의 레이어 형태로 저장되는 거서럼 컨테이너 디스크 역시 이 이미지 레이어를 순서대로 합쳐 만든 가상 파일 시스템이다. 모든 컨테이너는 독립된 파일 시스템을 갖는다.즉, 같은 이미지에서 실행한 여러 개의 컨테이너는 서로 영향을 미치지 않음. 이를 확..
본 글은 도커 교과서를 읽고 정리한 내용입니다.5장은 공유에 대해 공부할 예정.도커에서 공유란 로컬 컴퓨터에서 빌드한 이미지를 다른 사람이 사용할 수 있게 하는 것.레지스트리, 레포지터리, 이미지 태그 다루기도커 플랫폼은 SW 배포 기능을 내장하고 있음.로컬에 이미지가 없다면 도커는 자동으로 이미지를 내려받음. -> 이 이미지는 도커 레지스트리라 불리는 서버에 저장됨.도커 허브는 도커 레지스트리 중 가장 유명한 레지스트리. 도커 이미지엔 이름이 부여되는데, 이 이름에 해당 이미지를 내려받기 위해 필요한 모든 정보가 있음.이미지 전체 이름은 4개의 요소로 구성됨.예를 들어 diamol/golang은 다음과 같이 구성됨.이미지 참조 시 이미지의 첫 부분(위 사진에선 docker.io)에 인하우스 레지스트리의..
활동게시글은 동아리 활동에 대한 글입니다.매 활동마다 활동시 찍은 사진 몇장과 그에 대한 간략한 내용을 업로드 할 예정인데요,어떤 경우엔 활동게시글을 수정해야할 수 있습니다.사진을 잘못 올렸다던가... 내용에 오타가 있다던가... 이미 업로드한 사진은 그대로 두고, 다른 내용을 수정하려할 때 에러가 발생했습니다. 문제상황 위와 같이 content에 값만 수정을 하려할 때, 에러가 발생했습니다.게시글을 수정하는 로직은 아래와 같습니다. async updateActivity( userId: number, activityId: number, dto: EditActivityDto, images?: string[], ) { const { content, date } = dto; ..
본 글은 도커 교과서를 읽고 정리한 내용입니다.애플리케이션을 패키징할 때 필요한 일이 있는데 바로 Dockerfile 스크립트 안에서 명령을 실행하는 것.이번 장에선 소스 코드로부터 애플리케이션을 패키징하는 방법을 알아볼 예정. 빌드 툴체인을 한번에 패키징해서 공유할 수 있다면 매우 편리함.개발에 필요한 모든 도구를 배포하는 Dockerfile 스크립트를 작성한 다음 이를 이미지로 만들고 애플리케이션 패키징을 위한 Dockerfile 스크립트에서 이 이미지를 사용해 소스 코드를 컴파일함으로써 애플케이션을 패키징하면 됨. FROM diamol/base AS build-stageRUN echo 'Buiding...' > /build.txtFROM diamol/base AS test-stageCOPY --fr..
본 글은 도커 교과서를 읽고 정리한 내용입니다.이번 장에선 도커 이미지를 만드는 방법, Dockerfile 문법을 배울 예정 도커 허브에 공유된 이미지 사용하기docker image pull diamol/ch03-web-ping  도커는 위 이미지(diamol/ch03-web-ping)가 로컬에 존재하지 않으면 도커 허브에서 이미지를 갖고옴.(도커 허브 : 도커가 가장 먼저 이미지를 찾기 위해 접근하는 저장소) 이미지를 제공하는 저장소를 레지스트리(registry)라고 하는데, 도커 허브는 무료 공개 레지스트리 도커 이미지는 논리적으론 하나의 대상(애플리케이션 스택 전체가 하나의 파일로 압축된 압축 파일)! 이미지를 내려받는 과정을 보면 여러개 파일을 동시에 내려받음이 여러개의 파일을 이미지 레이어라 부..
본 글은 도커 교과서를 읽고 정리한 내용입니다.(본 장에선 컨테이너를 실행하는 다양한 방법을 알아볼 예정이며, 컨테이너그 정확히 무엇인지 살펴보고, 컨테이너가 애플리케이션을 경량으로 실행할 수 있는 이유를 알아볼 예정) docker container run diamol/ch02-hello-diamol docker container run 명령은 컨테이너로 애플리케이션을 실행하라는 도커 명령.여기서 애플리케이션은 미리 도커로 실행하도록 패키징돼 누구나 내려받을 수 있도록 공유된 것.-> 이 컨테이너 패키지(도커에선 '이미지'라 부름)의 이름은 diamol/ch02-hello-diamol = docker container run 명령어는 이미지를 이용해 컨테이너를 실행하는 명령. docker containe..
'도커 교과서'를 읽고 정리한 내용입니다.도커 - 컨테이너를 단위로 해 애플리케이션을 실행하는 기능을 제공하는 플랫폼. 클라우드 환경으로 이주하기1. PaaS(Platform as a Service)우리 애플리케이션의 각 컴포넌트를 하나씩 클라우드의 매니지드 서비스로 옮기는 작업을 해야함애플리케이션이 특정 클라우드에 종속되지만, 운영비를 절감할 수 있음.2. IaaS(Infra as a Service)애플리케이션의 각 컴포넌트를 가상 머신에서 동작시킴특정 클라우드에 종속되진 않지만, 운영비가 상승함.=3. 도커애플리케이션의 각 컴포넌트를 컨테이너로 이주한 뒤, Azure k8s service나 Amazon ECS 또는 직접 구축한 도커 클러스터에서 전체 애플리케이션을 실행할 수 있음.(분산 애플리케이션을..
무료 요금제에선 하나의 개인 저장소만 사용할 수 있음.Public ⇒ 누구나 다운로드 할 수 있음.(보안 관련 데이터나 개인정보가 유출되지 않도록 주의해야 함)  개인 저장소 생성 완료.아직 push 한 것이 없으므로, 비어있음. 터미널에 command를 입력하면 위와 같이 이미지가 로컬에 존재하지 않는 저장소를 참조하고 있다는 에러가 나온다. 위를 해결하기 위해선 이미지에 node-hello-world라고 이름을 지정해주면 된다. 즉, 우리가 업로드하려는 이미지를 도커 허브에 푸시하는 이미지로 바꾸면 된다.방법은 2가지인데, 1. 새로 빌드하기       docker build -t 도커 레포지토리 이름/node-hello-world .2. 존재하는 이미지를 재사용하기(이름 다시 붙이기!)       ..
async authenticateUser(user: LoginUserDto) { const existingUser = await this.usersRepository.findUserByEmail(user.email); if (!existingUser) { throw new UnauthorizedException('Email이 존재하지 않습니다.'); } const isMatch = await bcrypt.compare(user.password, existingUser.password); if (!isMatch) { throw new UnauthorizedException('비밀번호가 일치하지 않습니다.'); } return existingUser; ..
전호영
'분류 전체보기' 카테고리의 글 목록 (2 Page)