[스파르타코딩클럽]/TIL 60

[240219] CI/CD 공부 (2) CD

CI/CD 공부 (1) CI https://jinjinjincode.tistory.com/256 [240110] CI/CD 공부 CI/CD란? Continuous Integration/Continuous Deployment(Delivery)의 약자로, 지속적인 통합과 지속적인 제공을 의미 기본 개념 지속적인 통합(Continuous Integration): 자동화된 빌드와 자동화된 테스트를 제공 지속적 jinjinjincode.tistory.com 수동 배포 https://jinjinjincode.tistory.com/259 [240114] AWS, docker로 수동 배포하기 CD를 구축하기 전에 먼저 배포 과정을 익히기 위해서 수동 배포를 해보려고 한다. 지난번에 AWS RDB와 EC2를 만들었고 그..

[240128] docker + nginx 무중단배포 구축하기

기존에는 코드가 수정되면 CI/CD를 통해 도커 이미지가 올라가게 되고, EC2 서버에서 해당 이미지를 컨테이너로 실행하여 배포를 진행해야 했다. 이 과정에서는 코드가 수정될 때마다 수정 내용을 반영하기 위해 중간에 서버를 멈추고 다시 시작해줘야 한다는 문제점이 발생한다. 사용자 테스트를 앞두고 서버가 중간에 멈추는 일을 방지하기 위해서 무중단 배포를 구축하고자 했다. Nginx - Nginx는 웹 서버로서의 역할을 하며, 백엔드 서버에 대한 요청을 받아 이를 처리하는 역할을 합니다. 무중단 배포를 위해 새로운 버전의 애플리케이션을 배포할 때 이전 버전과 새로운 버전을 함께 관리할 수 있으며, 요청이 들어오면 새로운 버전이 완전히 배포될 때까지 이전 버전으로 요청을 전달할 수 있습니다. - Reverse..

[240118] userDetails null 오류

프로젝트를 진행하던 중에 게시글 전체를 조회하는 api에서도 UserDetailsImpl을 통해 사용자 정보를 받아올 필요성이 생겼다. 하지만 해당 api에서 가져온 userDetails가 null값인 오류가 발생하였다. UserDetailsImpl을 추가하게 된 BoardController API 코드 // Best 게시글 조회 @GetMapping("/best") public String getBestBoards(Model model, @AuthenticationPrincipal UserDetailsImpl userDetails) { BoardBestListGetRes bestBoards = boardService.getBoardBestList(); model.addAttribute("bestBoar..

[240117] ec2 서버 실행

ec2 서버에서 ci/cd로 올린 docker 이미지를 pull 받아 제대로 실행되는지 확인해보고자 한다. 그 전에 ec2 서버에 docker와 redis를 설치하였다. 환경변수 설정 일단 첫 번째로 발생한 문제는 환경변수를 설정해줘야 한다는 것이었다. ci/cd에서는 깃허브의 secrets에 환경변수 값을 넣어둔 application-prod.yml 파일을 올려둔 후 prod 환경에서 프로그램을 실행하였다. 하지만 ec2에서 실행하니 다시 환경변수를 넣어주는 방법에 대해 고민하게 되었다. 그래서 해결한 방법은 환경변수를 저장한 [프로젝트명].env 파일을 ec2 서버에 저장하여 docker image를 실행할 때 설정해주는 것이었다. 1. ec2서버의 ./[프로젝트명].env 파일을 생성한다. 2. 해..

[240114] AWS, docker로 수동 배포하기

CD를 구축하기 전에 먼저 배포 과정을 익히기 위해서 수동 배포를 해보려고 한다. 지난번에 AWS RDB와 EC2를 만들었고 그 이후 과정부터 진행하고자 한다. gradle 빌드하여 jar 파일 생성 인텔리제이에서 스프링 부트 프로그램을 빌드하여 build > libs > [프로젝트명]-0.0.1-SANPSHOT.jar 파일을 생성한다. 터미널에서 해당 파일이 있는 곳으로 이동 후 java -jar [프로젝트명]-0.0.1-SNAPSHOT.jar으로 프로그램이 잘 실행되는지 확인한다. jar 파일로 이미지를 생성하여 도커허브에 push jar파일이 있는 위치에 Dockerfile을 생성한다. FROM openjdk:17 COPY Sappun-0.0.1-SNAPSHOT.jar app.jar ENTRYPOI..

[240113] MapStruct unmapped 오류 수정

이번 프로젝트에서 객체와 dto간의 변환을 위해 MapStruct를 사용하였다. 생성자를 이용하여 변환해주는 방법이 있지만 새로운 라이브러리를 활용하고 익숙해지는 연습을 하고, 코드를 더 깔끔하게 작성하여 가독성을 높이기 위해 적용해보았다. 그러던 중 게시글 관련 기능을 개발하던 중에 오류 메세지를 마주하게 되었다. 에러 메세지: nickname 필드를 매핑하지 못하고 있다. Unmapped target property: "nickname". Mapping from property "Board reportBoard.board" to "BoardGetRes reportBoardGetRes.board". Unmapped target property: "nickname". Mapping from Collect..

[240111] Docker image, Docker container

Docker Image 라이브러리, 종속성에 대한 정의, 코드가 포함되어 있는 실행되지 않은 OS 파일 컨테이너 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함 변경되는 상태값을 보유하지 않고 변하지 않음(stateless, immutable, read-only) 상태 저장 없음(Stateless): 다른 환경에서도 동일한 애플리케이션을 실행 가능 불변성(Immutable): 이미지가 한 번 생성되면 변경할 수 없음 필요한 파일만 포함하고 있어 용량이 작음 Docker Image 실습 docker pull [name:tag]: 도커 허브에서 이미지 내려받기 Private Registry 서버를 통해 이미지를 제공받거나 제공 가능 # docker [image] pull [options] nam..

[240110] CI/CD 공부 (1) CI

CI/CD란? Continuous Integration/Continuous Deployment(Delivery)의 약자로, 지속적인 통합과 지속적인 제공을 의미 기본 개념 지속적인 통합(Continuous Integration): 자동화된 빌드와 자동화된 테스트를 제공 지속적인 서비스 제공 (Continuous Delivery) 지속적인 배포(Continuous Deployment): 배포를 자동화하여 배포 시간을 단축하고 코드 결과물을 빠르게 지속적으로 제공 왜 Docker? 애플리케이션 개발과 배포가 편해짐 Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에 영향이 없음 CI 과정의 테스트에서 Docker를 활용 어떤 서버에 올려도 같은 환경으로 구성된 컨테이너로 동작하기..

[240108] Refresh Token 구현 전의 고려 사항

토큰 방식을 사용하는 이유 상태를 서버에 저장하지 않으므로 확장성이 좋음 서버 간의 데이터 동기화 문제를 해결하기 쉬움 -> 하지만 백엔드만 구현하는 프로젝트에서는 refresh token을 서버에서 저장함 RefreshToken을 사용하는 이유 만료기한이 짧은 access token만 사용하는 경우 사용자가 토큰이 만료될 때마다 로그인해야 하는 불편함을 겪게 됨 자동 로그인 구현으로 편의성 증가 Access token의 수명을 짧게 하여 accesstoken 노출되더라도 짧은 시간 내에 만료되게 함으로써 보안성을 높일 수 있음 백엔드 프로젝트에서의 Refresh Token 구현 Redis를 사용하는 이유 인메모리 DB로 빠른 응답이 가능 TTL을 지원하여 토큰의 만료시간을 지정하고 관리하는데 유용함 K..

[240106] permitAll()과 shouldNotFilter

프로젝트를 해오면서 사용자의 권한이 필요하지 않은 요청의 경우 WebSecurityConfig에서 permitAll()을 통해 허가해주었다. 하지만 이렇게 설정한 api에 대해서도 성공적으로 반환값이 돌아오지 않는 경우가 있었다. 바로 유효하지 않은 JWT 토큰이 헤더나 쿠키에 들어가 있는 경우이다. permitAll()을 설정해줬을 경우에는 잘못된 토큰이 들어있는 경우에도 요청을 허가해줘야 하는 것이 아닌가? 라는 생각이 들어서 이에 대해 공부해보았다. 문제 상황 WebSecurityConfig 일부 @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // CSRF 설정 http.csrf((c..