# 서론 스프링 부트 프로젝트를 Github Actions + Docker + Docker Hub + AWS EC2로 CI/CD 파이프라인 구성하는 방법을 기록한다. 기본적인 흐름도는 다음과 같다. 1. 로컬에서 작업 -> 깃허브 푸쉬 2. Github Actions이 해당 프로젝트를 빌드하고, 도커 이미지로 생성 후 도커 허브에 Push 3. Github Actions이 AWS EC2에 접속하여 해당 이미지를 Pull 받고, 실행 사전 환경 - JDK 17 - AWS EC2 t2.micro (Ubuntu 20.04 LTS) - Docker Hub 무료 계정 먼저 AWS EC2를 생성하고, 해당 인스턴스에 JDK 17를 설치하는 과정은 생략한다. # 도커, 도커 허브 세팅 1. 도커 설치 인스턴스에 도커..
2024-11-28 updated# 서론CI/CD 파이프라인을 구축할 필요가 있어서 Github Actions로 파이프라인을 구축하던 도중 맞이했던 오류들과 해결법, 사용법 미숙으로 인한 시행착오, 삽질을 기록하기 위함이다. Github Actions 배포자동화 과정은 다음 블로그 글을 전적으로 참고했다.https://bcp0109.tistory.com/363 Github Actions CD: AWS EC2 에 Spring Boot 배포하기Overview 애플리케이션을 개발하면 외부에서도 접근 가능하도록 클라우드 환경에 배포합니다. 이전에 포스팅 했던 AWS 1편에서는 마지막에 scp 명령어로 로컬에 존재하는 빌드 파일을 EC2 인스턴스bcp0109.tistory.com # Codedeploy Agent..
# 프로젝트 소개 제목 : Project Flooming 분류 : 개인적인 여름방학 소규모 프로젝트 팀원 : 4명 (BE 1명, Deep learning 모델 학습 1명 FE(RN-Android) 1명, iOS 1명 기간 : 한 달 (서버 개발은 한 달, 서비스 출시는 진행 중) 간략소개 : 딥러닝 모델을 기반으로 한 꽃 사진을 분류하고, 해당 꽃으로 그림을 그려주는 모바일 앱 서비스 기획의도 : 딥러닝을 활용한 서비스 출시 경험을 쌓고자 기획하게 됨 주요기능 : 꽃 사진을 업로드 하면 어떤 꽃인지 분류하여 한명, 영문명, 꽃말을 알려주는 기능 (28개의 서로다른 꽃 클래스 탑재) 꽃 사진을 그림으로 변환하는 기능 갤러리 기능 (꽃 사진, 그림 공유 및 다운로드) 사용기술 # 내 역할 [백엔드 개발 및 ..
# 서론 EC2 내부 리눅스 파일 시스템에서 vim을 통해 무언가 작업을 하려고 할 때, 디스크 공간이 부족해서 저장이 안 되는 경우가 생길 수 있다. 기본적으로 EC2 프리티어 t2.micro 인스턴스를 기준으로 설명하며, 디폴트 디스크 크기는 8GiB이다. (30GiB까지 무료로 확장할 수 있다.) # 디스크 공간 사용량 확인 df 명령어를 통해서 현재 디스크 사용량을 파악할 수 있다. 공간 부족 에러가 발생했을경우 Use%가 100%인 디렉토리가 있을 것이다. 필자는 /dev/root 디렉토리가 8GiB로, 꽉 차 있었었다. # 용량이 큰 파일 찾기 sudo du -sh * | sort -hr 명령어를 입력하면 해당 디렉토리에 용량이 큰 파일을 순서대로 정렬해서 보여준다. 디렉토리를 이동하면서 불필..
# 서론 Bean Validation을 사용해서 DTO의 유효성을 검증할 때 적용할 수 있는 다양한 방법들을 정리한다. # V1 - 일반적인 처리 class UserDto { @NotBlank String username; @NotBlank String password; } @PostMapping("/join") public ResponseEntity join(@Valid @RequestBody UserDto userDto, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return ResponseEntity.badRequest().body("잘못된 요청"); } // 비즈니스 로직 } @Valid는 자바에서 제공하는 어노테이션, @Va..
# 서론 multipart/form-data 로 데이터를 서버로 전송할때, 스프링에서 제공하는 객체인 Multipart 객체를 활용해야한다. 이번 글에서는 해당 객체를 다룰때 알면 좋을 법한 것들을 정리한다. # Multipart 전송 메소드 multipart/form-data 는 POST 와 PUT 만 가능하니 유의한다. # 한개, 여러개 Multipart 받기 @PostMapping("/one") fun one(@RequestParam("file") file: MultipartFile) { } @PostMapping("/more") fun more(@RequestParam("files") file: List) { } 컨트롤러단에서는 이런식으로 받아서 처리하면 된다. 여기서 file과 files는 mu..
# 서론 JPA와 MySQL 디비를 사용하면서 궁금했던 hibernate_sequence 테이블에 대하여 정리한다. # hibernate_sequence 의 정체 이 테이블의 정체는 칼럼값으로 예측 가능하듯, 디비의 PK를 생성해주는 테이블이다. 엔티티 제작시 @GenerateValue를 그냥 아무 값을 넣지 않으면, 생성 전략이 AUTO 로 설정된다. 이러면 hibernate_sequence 테이블이 생기고, 여기서 값을 하나씩 읽어가면서 PK를 생성한다. MySQL은 디비 내부적으로 auto increment를 지원하므로, 순서 기록용 테이블을 사용할 필요가 없다. @GenerateValue 전략을 IDENTITY로 설정하면 된다. 이렇게 하면 전역적으로 통용되던 PK 순서도 테이블 독립적으로 변경된..
# 서론 현재 상황은 스프링 부트 서버용 PC1 과 리액트 개발 환경 PC2 에서 서로 통신테스트를 하는 상황이다. 리액트에서 스프링 부트 서버(PC1)로 요청을 보내면 CORS 이슈가 발생하여, 리소스 접근에 제한된다. 특히나 쿠키와 같은 헤더 정보가 저장되지 않는 이슈가 생기는데, 이와 비슷한 상황시 서버사이드에서 조치해볼 내용들을 정리한다. 기본적으로 리액트 내부에서 Proxy 설정과, withCredentials 설정을 해줘야 한다. # WebMvcConfigururer 설정 // CORS 설정 override fun addCorsMappings(registry: CorsRegistry) { registry.addMapping("/**") .allowedOrigins("http://127.0.0...