
저번 글에서 AWS Elastic Beanstalk, RDS 환경 세팅 및 인스턴스 연결을 해주었다. 이번 글에서는 Github Action yml 파일에 배포 스크립트를 추가하고, Github Action을 통한 AWS Elastic Beanstalk 배포 작업을 마무리해보자. 글은 다음과 같은 순서로 진행된다. docker-compose 파일 작성 IAM 인증키 발급받기 Github Action yml에 배포 스크립트 추가 1. docker-compose 파일 작성 Elastic beanstalk 배포를 위해 필요한 설정 파일인 docker-compose 파일을 작성해보자. docker-compose 파일을 이용해 Docker hub에 빌드되어 있는 이미지를 가져오고, 포트 맵핑, 환경변수 세팅 등을..

Docker + Github Action + Elastic beanstalk을 사용한 CI/CD를 구축하다 알 수 없는 오류가 발생해서 처음부터 차근차근해보고자 이 글을 쓰게 되었다. 그럼 Spring boot 프로젝트를 Elastic beanstalk에 수동 배포해보자. 1. Spring boot 프로젝트 생성 Spring boot 3.0.5 사용 Spring web 의존성만 추가해 프로젝트를 생성했다. implementation 'org.springframework.boot:spring-boot-starter-web' 2. Controller 작성 간단히 hello world를 반환하는 api를 작성했다. @RestController public class HelloController { @GetMa..

이번 글에서는 AWS Elastic Beanstalk과 RDS 환경을 세팅하고, 두 인스턴스를 연결해보자. 먼저 AWS Elastic BeanStalk, VPC, Security Group의 개념부터 알아보자. [ Elastic BeanStalk ] Elastic Beanstalk은 EC2 인스턴스, 데이터베이스, 로드밸런서 등 여러 서비스를 포함한 환경을 구성하며 소프트웨어를 업데이트할 때마다 자동으로 환경을 관리해준다. [ VPC ] Amazon Virtual Private Cloud(VPC)는 AWS 클라우드에서 논리적으로 격리된 공간을 제공하는 것이다. VPC를 통해 고객이 정의한 가상 네트워크에서 AWS 리소스를 시작할 수 있다. 아래와 같이 ElasticBeanstalk 인스턴스나 RDS 등을..

Github Action을 통해 Docker 환경을 Elastic Beanstalk에 배포해보자. 이번 글에서는 Github Action으로 CI 환경을 구축하고, Docker hub에 docker 이미지를 올리는 것까지 해보려 한다. 전체적인 구조는 아래와 같다. [ 아키텍처 ] [ CI/CD 과정 ] 1. Github 에 코드를 push 2. Github Action job 수행 2-1. Spring boot 코드 build 2-2. Dockerfile 빌드 2-3. Docker Hub에 이미지 push 2-3. AWS EB에 docker-compose 업로드 5. AWS EB는 docker-compose를 실행해 배포 [ 구현 과정 ] 1. Spring Boot 프로젝트 세팅 2. Dockerfil..

Ubuntu 환경에서 Docker-compose 사용해 Nginx, Spring Boot 컨테이너 두 대를 실행시키고, Nginx를 Reverse Proxy 로 구성해보자. [ Reverse Proxy ] 1. Proxy Proxy는 번역하면 대리라는 의미를 가진다. Proxy 서버는 클라이언트와 서버 사이에서 클라이언트 또는 서버를 대신해 기능을 수행하거나, 중계하는 역할을 한다. 2. Reverse Proxy 리버스 프록시는 클라이언트로부터 오는 요청을 대신 받아 내부 서버로 전달해주는 역할을 한다. 로드 밸런싱: 많은 요청을 처리하기 위해 여러대의 서버에 부하 분산 수행 가능 캐싱: 미리 렌더링된 버전의 페이지를 캐시하여 페이지 로드 시간을 단축할 수 있다. 보안: 내부 WAS의 존재를 숨길 수 있..

Docker Image는 여러 개의 레이어로 되어 있다. 도커 이미지는 빌드시 Dockerfile의 각 명령어들에 대한 레이어를 생성한다. Docker는 매번 모든 Layer를 생성하면 속도가 매우 느려질 수 있다. 따라서, Docker는 Docker Image 빌드 속도를 높이기 위해 Docker Cache를 사용한다. 첫 번째 이미지 빌드에서는 각 레이어별 Cache를 생성하고, 이후 동일한 명령어가 실행되면 기존의 레이어를 재사용한다. 만약 변경되는 단계가 있다면 레이어는 다시 만들어진다. 하지만, COPY같은 경우 jar 파일의 내용이 바뀌었으면, 같은 명령어라도 Cache를 적용할 수 없다. 직접 어플리케이션 코드 변경 후 Dockerfile을 재빌드해 문제를 파악하고, 해결방안을 알아보자. D..

동시성 문제란? 공유 자원에 둘 이상의 스레드가 접근하여 생기는 경쟁 상황(race condition)을 동시성 문제라고 한다. 둘 이상의 스레드가 공유 데이터에 접근 가능한 상황에서 하나의 스레드가 공유 데이터를 수정 중일 때, 다른 스레드에서 수정 전의 데이터를 조회해 로직을 처리함으로써 데이터의 정합성이 깨지는 문제를 말한다. 자바 스프링 기반의 웹 애플리케이션은 기본적으로 멀티 스레드 환경에서 구동된다. 따라서 공유 자원에 대해 race condition이 발생하지 않도록 별도의 처리가 필요하다. 분산 락이란? 자바는 Synchronized 라는 키워드를 제공해 상호 배제 기능을 제공한다. 하지만 Sychronized는 하나의 프로세스 안에서만 상호 배제를 보장한다. 서버가 1대일 때는 문제가 없..

문제 상황 동아리 면접 중, 동시성 문제와 관련해서 내 로직에서는 연관 엔티티의 아이디가 중복 생성 가능해보인다. 어떻게 하면 중복 생성을 막을 수 있을까? 라는 질문을 받았다. 정확히는 모르겠지만, 낙관적 락을 사용하면 해결할 수 있을거 같다 답했다. 면접관은 낙관적 락을 사용해서도 해결할 수 있지만, UNIQUE 제약조건을 통해서도 해결할 수 있다고 했다. 그래서 UNIQUE 제약조건을 통해 직접 중복 생성을 막아보려 한다! 낙관적 락은 좀 더 공부한 뒤 추후 포스팅해 볼 예정이다. 문제 상황 재현 예를 들면, 아래와 같은 상황이다. userId와 articleId를 갖고 있는 Like 엔티티가 존재한다고 하자. @Entity @NoArgsConstructor @Table(name = "likes")..