banner image

전체 글 86

[Docker] Dockerfile에서 yarn install 에러 해결( .cache / unplugged 가 없다? )

상황저는 Github Actions를 이용해 CI/CD를 구축하고 있습니다. 이때 내 어플리케이션을 도커 이미지로 빌드해서 관리하려고 하는데요. 이때 사용한 Dockerfile은 다음과 같습니다.FROM node:18.20.4WORKDIR /usr/src/appCOPY . .RUN yarn installEXPOSE 3000CMD ["yarn", "start"]이때 이상한 건 분명 Github Actions에 yarn install 관련 로그가 찍히긴 하는데, 해당 도커 이미지를 도커 컨테이너로 실행했을 때 .yarn 하위에 있어야 할 .cache 폴더나 unplugged 폴더가 존재하지 않았습니다.  해결저는 .yarnrc.yml 파일에 정확한 설정을 추가해서 이를 해결했습니다.# .yarnrc.yml ..

데브옵스/Docker 2025.01.20

[Docker Compose] 도커 컴포즈로 설정한 네트워크, 볼륨 옵션이 제대로 적용이 안될 때 확인할 것들

해당 글을 docker-compose.yml 파일 경로를 수정했을 때 발생할 수 있는 문제점에 대해 공유하기 위해 작성하였습니다.  상황먼저 제가 경험했던 에러 상황을 간단하게 공유하겠습니다.docker-compose.yml 파일을 통해 여러 도커 컨테이너를 실행하고 있었습니다. 이때 도커 컴포즈 파일에서는 각 컨테이너의 볼륨, 네트워크 설정 등이 포함되어 있었죠. 이때 파일 정리를 위해 해당 docker-compose.yml 파일을 다른 디렉토리에 옮겼습니다. 그리고 도커 컨테이너들을 모두 삭제하고 다시 docker-compose up -d 명령어를 이용해 도커 컴포즈를 이용해 도커 컨네이들을 시작했습니다. 이때 문제가 발생합니다.갑자기 도커 컨테이너 간 설정된 네트워크에 에러가 나서 도커 컨테이너 간..

데브옵스/Docker 2025.01.20

[Github Actions] 코드 수정,테스트,배포 자동화하는 방법

저는 간단한 웹 사이트를 개발하고 배포하면서 개발 공부를 진행중입니다. 이때 한 가지 불편한 점이 발생했는데요. 바로 코드의 수정이 일어날 때마다 배포를 하는 과정이 너무 귀찮다는 것입니다. 코드를 수정하고 이를 실제 배포 환경에 적용하는 과정은 반복 작업이기에 자동화를 할 수 있으면 자동화하는 것이 효율적이라고 생각합니다. 이런 과정은 보통 CI/CD(지속적인 통합 및 배포)라고 부릅니다. 오늘은 제가 간단하게 구성해본 Github Actions를 활용한 CI/CD 파이프라인에 대한 내용을 공유하겠습니다. Github Actions 개념 및 용어github actions는 github에서 무료로 제공하는 CI/CD 툴입니다. yaml 파일을 통해 CI/CD 관련 설정을 관리할 수 있습니다. 이때 yam..

데브옵스/CI,CD 2025.01.18

[보안] .env 무작위 노출 공격. 당신의 서버는 안전한가요?

저는 현재 AWS EC2에 간단한 애플리케이션을 배포해 개발 연습중입니다. 이때 NGINX를 웹 서버로 활용하고 있는데요. 이때 NGINX 로그에 의심스러운 요청 로그( GET /.env HTTP/1.1 ... )가 찍혀 있어 이에 대해 조사한 결과 이는 해커가 해킹을 시도한 것이라고 하네요. 이 공격에 대해 간단하게 요약하자면 하나만 걸려라 공격입니다.보통 개발자들이 개발하는 과정에서 사용하는 환경 변수, 비밀번호 등의 민감한 정보는 .env 혹은 credentials, secret 등의 이름의 파일로 저장되는 경우가 많습니다. 해커는 이런 점을 이용해서 서버에 .env 혹은 credentials, secret 같은 파일명에 대한 GET 요청을 무작위로 보냅니다. 만약 서버에서 이런 민감한 정보가 담긴..

CS 상식/보안 2025.01.11

[면접 단골 질문] 동시성과 병렬성 차이는 무엇인가요?

개발자 기술 면접에서 흔하게 나오는 질문 중 하나이죠. 동시성과 병렬성의 차이를 묻는 경우가 꽤 있습니다. 해당 질문은 컴퓨터가 2개 이상의 프로그램들을 모두 실행하려 할 때 각 프로그램이 동작하는 방식을 이해하고 있는지를 알기 위한 질문이라고 생각합니다. "동시에 실행", "병렬로 실행" 똑같은거 아니야?개인적으로 '동시에 실행하다' 혹은 '병렬로 실행하다'는 한글 그 자체로 해석했을 때 같다고 밖에 느껴지지 않았습니다. 많은 분들이 저와 공감하실 것이라고 생각합니다. 그래서 동시성과 병렬성 두 개념을 이해하는데 꽤 힘들죠. 동시성은 우리가 알고 있던 동시성이 아니야소프트웨어에서의 동시성은 일상적인 단어로 사용되는 동시성과 다르기 때문에 이해하기 어렵습니다. 우리는 일반적으로 A 사건과 B 사건이 동시..

HTTPS 사용을 위해 Nginx에서 certbot 활용하기

애플리케이션을 실제로 배포할 때는 보안을 위해 http 대신 https 사용을 무조건해야합니다. 이때 웹 서버로 많이 사용되는 nginx에서 certbot을 활용하면 간단하게 https 설정을 적용할 수 있습니다. Certbot은 Let's Encrypt의 공식 클라이언트로 SSL/TLS 인증서 발급과 관리 기능을 제공합니다. 이런 Certbot을 활용한 HTTPS 적용 방법에 대해 공유합니다. HTTPS 적용하는 방법Certbot 설정1. certbot 설치하기sudo apt-get updatesudo apt-get install certbotsudo apt-get install python3-certbot-nginx # nginx 플러그인 2. SSL/TLS 인증서 발급하기sudo certbot ce..

CS 상식/보안 2025.01.03

[GitHub] private 레퍼지토리 clone 하기

ubuntu@ip-xxx-xx-xx-xx:~$ git clone https://github.com/SHINDongHyeo/app.gitCloning into 'app'...Username for 'https://github.com': 내 깃허브 유저이름 입력Password for 'https://SHINDongHyeo@github.com': 내 깃허브 비밀번호 입력remote: Support for password authentication was removed on August 13, 2021.remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with..

데브옵스/CI,CD 2024.12.31

[AWS] 도메인 구매 및 등록

AWS를 이용해 배포하기 위해 가장 처음에 해야할 일은 도메인 구매일 것입니다. IP 주소를 직접 이용해 웹 사이트에 접속하는 일은 드물기 때문입니다. www.naver.com 혹은 www.google.com 같은 '도메인'을 구매하기 위해서 여러 사이트를 활용할 수 있습니다. 가비아, 카페24 등이 한국에서 흔히 사용하는 사이트라고 알고 있습니다. 하지만 AWS에서도 도메인 구매와 등록 서비스를 모두 제공하고 있습니다. 저는 이 서비스를 활용해 도메인을 구매 및 등록하는 방법을 공유해보려 합니다. 1. 도메인 구매 및 등록위와 같이 AWS 서비스 중에 Route 53라는 서비스가 존재합니다. 해당 서비스를 활용하면 도메인을 구매하고 등록할 수 있습니다. 해당 서비스를 클릭해주세요. 도메인 검색가운드 도..

[TypeORM] 내가 트랜잭션을 사용하는 이유와 조심해야할 부분

저는 개인적으로 트랜잭션이라는 개념을 원자성이라는 이유로 사용합니다. 데이터베이스 CRUD에 대한 여러 작업이 하나의 메서드에 존재할 때 해당 작업들이 부분적으로 성공 및 실패하지 않도록 하기 위함입니다. 즉 모든 데이터베이스 작업들이 성공하거나 모든 데이터베이스 작업들을 실패시키기 위해 트랜잭션이라는 개념을 사용합니다. 제가 직접 트랜잭션을 사용한 상황을 통해 관련 내용을 공유드리겠습니다. 문제 상황async subscribe(reqUser: JwtPayload, publisherUserId: number) { try { await this.userRepository.update(reqUser.id, { subscribeCount: () => 'subscribeCo..

[TypeORM] Join없이 외래키값만 간단히 활용하기 - @RelationId, @Column

저는 NestJS에서 TypeORM을 활용해 데이터베이스를 이용하고 있습니다. 이때 RDB는 다양한 연관관계를 맺는 것이 일반적으로 외래키를 설정하는 경우가 많은데요. 이때 외래키를 이용한 효율적인 로직을 작성하고 싶을 때가 많습니다. 예를 들어 유저와 포스트의 관계를 생각해 보겠습니다. 한 유저는 다양한 포스트를 작성할 수 있으므로 유저와 포스트는 1:N 관계를 가집니다. 그럼 포스트 데이터에는 유저 기본키에 대한 외래키 컬럼이 존재하게 됩니다. 이때 기본키 1에 해당하는 유저가 작성한 포스트를 조회하고 싶다면 어떻게 해야할까요? 혹은 특정 포스트에 대한 정보와 해당 포스트를 작성한 유저의 기본키만 필요하다면 어떻게 해야 할까요? 오늘은 이런 상황에서 제가 경험한 외래키 활용 사례에 대해 공유해보겠습니..

백엔드/NestJS 2024.12.12