문제 상황AWS 프리티어를 사용하기 위해 t2.micro 인스턴스를 사용해서 배포를 하고 있었다. 빠른 배포와 편의성을 위해 도커로 mysql과 redis, spring boot 컨테이너 2개를 띄우는데 자꾸 서버가 죽고 자꾸 연결성 실패가 떠서 서버에 접속할 수도 없었다.과제인스턴스를 재시작하면 연결성을 통과되는데 컨테이너가 자꾸 죽는게 문제였다. 이전 프로젝트에서도 매번 서버가 죽는 경우가 다분했는데, 이럴 때마다 그냥 인스턴스 재시작후 컨테이너를 다시 띄어주었다.이번에는 컨테이너를 띄울 때마다 서버가 죽는 근본적인 원인을 알아보고, 이를 해결해보기로 했다.문제 해결 과정원인 파악을 위해 아래 과정을 거쳤다.EC2 시스템 로그 확인하기시스템 로그에서 원인 분석하기원인 분석 후 해결하기EC2 시스템 로..
OOM.. 서비스 로직에서 만나보고 싶었던 녀석.... 드디어 만났다.OOM, 왜 발생했는가?결론부터 말하면 100만개의 row로 부하테스트를 진행하다가 만났다.교보 DTS 기업 협업으로 진행한 백오피스 프로젝트에서 각 기능마다 엑셀다운로드 하는 기능이 있었고, 해당 코드를 개선만했고, 부하 테스트는 진행해보지 않았었다. 이번 기회에 코드 리팩토링과 부하테스트를 진행보다가 100만개의 엑셀 row를 작성하면 기존 코드에서 OOM이 발생하는 상황을 마주했다. (기존코드에서 어떻게 리팩토링하고 성능 개선했는지는 추후에 작성 예정이다.)해결하기 위한 과제메모리 초과를 해결하는 게 과제이다. OOM을 보고 제일 먼저 떠오른게 GC 튜닝 이라는 단어였다. JVM 의 메모리가 꽉 차서 메모리 부족현상이 뜬 것일테..
문제 상황public class OAuth2LoginSecurityConfig { private final UserRepository userRepository; private final OAuthService oAuthService; //-> 여기서 ...}@Servicepublic interface OAuthService {} //GoogleOAuthService, KakaoOAuthService가 구현 오류 발생Parameter 1 of constructor in com.memo.login.oauth.CustomOAuthService required a bean of type 'com.memo.login.oauth.OAuthService' that could not be found.인터..
이전 포스팅에서 좋아요 동시 요청에서 데드락이 걸린 것에 대해 분석해 보았다.원인 요약좋아요를 저장하는 과정에서 like 테이블에 board 외래키가 있었고, 외래키로 인해 board의 레코드가 잠김(slock).정확히는 mysql에서는 인덱스 락인데 편의상 레코드 락이라고 하겠다.트랜잭션1: 좋아요 추가(board id = 1 레코드 slock)트랜잭션2: 좋아요 추가(board id = 1 레코드 slock)트랜잭션1: board id = 1 레코드 좋아요 수 update(xlock 획득하기 위해 대기)트랜잭션2: board id = 1 레코드 좋아요 수 update(xlock 획득하기 위해 대기)이 상황이라면 좋아요를 누르는 동시에 해당 게시물을 수정하는 일이 생긴다면 이때도 데드락 발생 가능Loc..
배경Mysql 8.0, Spring Boot 3, java 17 사용학교 게시판에 좋아요 기능이 있는데, 트래픽이 많아질 경우 좋아요 동시성 문제를 생각해 보게 되었다.유저 3개를 만들고 포스트맨의 collection을 활용해서 테스트를 해보았다.결과는 둘다 200 OK가 떳다.이는 포스트맨의 방식이 Delay가 아무리 줄어도 동기 방식이기 때문에 병렬로 동시에 보내는 요청이 아니고 순차적인 요청이었기 때문이었다. 그래서 원시적인 방법으로 curl로 테스트 해보기로 했다.터미널에 각 유저에 대한 요청 3개를 동시에 보냈다.curl --location --request POST 'http://localhost:9090/api/board/like?board_id=1' \--header 'Authorizati..
문제 상황study 엔티티에 studyStatus 속성에 디폴트 값으로 TODO 로 설정하려고 아래와 같이 설정해주었다 @ColumnDefault("TODO") @Enumerated(EnumType.STRING) private StudyStatus studyStatus = StudyStatus.TODO; //강의 상태 근데 아래와 같은 오류 발생Error executing DDL "create table study (likes integer default 0, progress integer default 0, study_id integer not null auto_increment, study_order integer, user_id integer, create_at datetime(6)..
상황Dockerfile의 base image가 다운이 안되는 상황에서 나온 에러이전에는 이런 에러가 뜨면 그냥 수동으로 `docker pull ubuntu:latest` 이미지를 pull 해서 해결했었다.근데 생각해보면 ubuntu:lastest는 docker hub에 있는 퍼블릭 이미지인데 base 이미지로 사용하면 에러가 난다는게 이상했다. 공식 문서에서도 docker Hub에 등록된 퍼블릭 이미지를 로컬 이미지에 없어도 base 이미지로 사용할 수 있다고 하는데 왜 안되는가.. 해서 구글링을 해봤다. 원인`~/.docker/config.json` 파일이 문제였다.credsStore -> credStore로 변경해주니 잘 해결되었다.참고자료https://stackoverflow.com/question..
문제Docker 이미지를 github action에서 생성 후 자동으로 Docker Hub에 올리도록 자동화를 하였다.그리고 Ec2에서 이미지를 pull하려니까 접근 권한 거부 에러가 떳다. 해결`/var/run/docker.sock` 에 권한을 부여해주면된다.sudo chmod 666 /var/run/docker.sock 이미지가 잘 받아와지는걸 확인할 수 있다.
충돌난 상황featrue/signup-test-api 브랜치에서 로컬에서 작업후 커밋remot에서 featrue/signup-test-api 브랜치의 내용이 변경이후 로컬에서 pull을 하려니까 위 사진과 같이 pull이 되지 않았다. 새로운 커밋을 남기지 않고 pull 할 수 있는 방법인 `rebase` 를 사용해서 문제 해결. 해결 과정git pull 에서 에러가 난 브랜치에서 아래 명령어 실행해서 원격에 수정된 최신 코드를 로컬의 `ref/remotes/origin/{branch_name}`에 받아온다.git fetch 아래 명령을 실행해서 원격 코드 위에 다시 로컬 코드들을 순서대로 쌓는다(커밋)git rebase origin/{branch_name}