spring (5) 썸네일형 리스트형 동시에 재고 감소 요청이 들어왔을 때의 문제와 해결 방법 문제 상황 가정: 재고가 100개 있는데 재고를 1개씩 줄이는 요청이 100개가 동시에 들어옴. 기대 결과: 모든 요청이 처리되어 재고가 0이 되어야 하지만, race condition으로 인해 0이 되지 않을 수 있음. Race Condition Race condition은 여러 스레드나 프로세스가 공유 자원에 동시에 접근하려고 할 때 발생하는 문제. 스레드 간 경합으로 인해 예상치 못한 결과가 발생할 수 있음. 예시: 동시에 재고 100개를 1씩 줄이는 요청이 들어오면 각각의 스레드가 100을 가져가서 재고 1개를 줄이는 작업을 수행하면 결과는 99가 됨. 해결 방법 Lock 사용 공유 자원에 대한 접근을 하나의 스레드만 허용하는 방법. Java에서는 synchronized 키워드를 사용하여 구현 가.. nestjs 맛보기 그리고 spring boot 내일 면접 보는 회사가 nestjs를 사용한다고 해서 https://nomadcoders.co/nestjs-fundamentals 이 강의를 통해 어떤 프레임워크인지 한 번 맛보았습니다. 강의를 들으면서 nestjs가 spring boot와 구조가 매우 흡사하다고 느꼈습니다. 이렇게 흡사한 패턴을 가진다면 spring boot 를 사용하는게 더 안정적이지 않은가? 라는 의문점이 들면서 nestjs 는 왜 사용하는지 그리고 이 두개의 프레임워크의 차이점을 정리해보겠습니다. 언어와 생태계 NestJS: TypeScript 기반으로 개발되어 JavaScript의 강력한 타입 시스템과 모듈 시스템을 활용할 수 있습니다. Node.js의 생태계와 함께 사용될 수 있으며, JavaScript 생태계에 비해 상대적으.. github action + s3 + code deploy + docker + nginx 사용해서 배포하기 cd git 특정 브랜치에 PR 이 머지 되었을 경우 github action으로 특정 서버에 자동으로 배포합니다. develop 브랜치에 머지됐을 경우 개발 전용 서버에 변경사항들이 배포되고, main 브랜치에 머지가 되면 production 전용 서버에 배포됩니다. 자동화 배포에 사용된 기술은 github action, code deploy, docker, ec2, s3 입니다. 과정 변경 사항 PR이 develop 브랜치에 머지됨. github action 동작 프로젝트 빌드 후 배포에 필요한 파일들을 모아서 하나의 파일로 압축. 압축파일을 s3로 업로드 code deploy 명령어 실행. code deploy 동작 appspec.yml 에 설정되어 있는 flow 실행 ApplicationStart.. 예외처리를 구조적이고 한 눈에 파악할 수 있게끔 커스텀 스프링 부트에서 예외 처리를 구조적이고 에러 메시지를 한 눈에 파악할 수 있게끔 에러 처리를 부분을 커스텀해보자. 통일된 Error Response 객체 에러 발생시 에러 코드 및 메시지를 API로 응답 받습니다. 이 때 일관된 구조 속에서 에러 정보들이 담겨져 있길 바라기 때문에 모든 에러는 하나의 ErrorResponse 객체에 담겨서 응답을 합니다. @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ErrorResponse { private String message; private String code; //에러에 할당되는 유니크한 코드값입니다. @JsonInclude(JsonInclude.Include.NON_NULL) .. Spring Boot gradle Spring Boot와 빌드 도구가 각각 존재하는 이유가 무엇일까? 빌드 도구를 사용하지 않고 빌드하려면 라이브러리를 다운 받고 컴파일하고 테스트하고 실행파일로 만들고 여러가지 일을 수동으로 해야한다고 합니다. 그래서 프로젝트를 빌드하기 까지의 일련의 과정을 자동화 해주는 도구를 사용하는 것입니다. 그리고 빌드 도구와 프레임워크는 서로 다른 책임과 목적을 가지기 때문입니다. 개발자는 Spring Boot를 사용하여 개발을 진행하고, 빌드 도구는 이를 더욱 효율적으로 빌드하고 관리하는 역할을 담당합니다. 이러한 역할 분담으로 인해 개발과 배포를 더욱 효율적으로 수행할 수 있게 됩니다. gradle의 역할 1. 빌드 자동화 Gradle은 빌드를 자동화하여 개발자가 수동으로 반복적인 빌드 작업을 수행할 필요 .. 이전 1 다음