spring boot
-
[Spring Boot / FastAPI] 프로젝트 환경 분리프로젝트/뉴스타 2024. 6. 30. 22:34
프로젝트 환경 분리 왜 궁금했을까❓프로젝트를 할 때, Dev와 Prod 환경 설정들을 분리하지 않고 사용하다 보니 지속적으로 Config를 수정해야 한다는 문제점이 있었다. 이러한 부분에서 팀의 생산성을 향상시키고자 Dev와 Prod 환경을 분리하려고 한다. 또한, 분리를 통해 운영 서버의 데이터를 조작할 수 없게 하여 안전성을 향상시키고자 한다. 1. 기존의 환경 변수 관리법기존에는 각 어플리케이션의 환경 변수를 하나의 YAML 파일에 넣고 GitLab에 PUSH하여 팀원끼리 공유하는 식으로 진행이 되었다.위와 같은 방식으로 운영하다보니 환경 변수가 prod와 dev가 섞이게 되어 운영 서버에 데이터가 들어가거나 개발 서버의 환경 변수로 인해 작동이 안하는 장애가 발생했다.각 팀원들이 pull을 할 때..
-
[Spring Boot / React Native] FCM을 활용한 알람 서비스 구축프로젝트/당일 2024. 6. 5. 14:38
FCM을 활용한 알람 서비스 구축 왜 궁금했을까❓당일 서비스는 그림일기를 생성하는데 약 2~3분의 시간이 소요된다. 사용자의 요청이 많아지면 응답 시간이 더 늘어날 것이라 판단되어 그림일기 생성이 완료되면 알람을 전송하기로 했다. React Native Expo를 사용하고 있기에 FCM을 용하여 알람 기능을 구현하기로 했다. 1. FCM Push Alarm 통신 과정사용자가 당일 서비스를 가입하게 되면 알람을 위해 Expo Backend에 Expo Token 발급을 요청한다.Expo Backend는 디바이스에 고유한 Expo Token을 발급하여 사용자에게 전송한다.사용자는 이를 받아 API Server에 자신의 Expo Token을 보낸다.API Server는 사용자 DB에 Expo Token을 저장한..
-
[Infra] Kafka를 통한 Spring Boot - FastAPI 통신프로젝트/당일 2024. 6. 3. 00:40
Kafka를 통한 Spring Boot - FastAPI 통신 왜 궁금했을까❓STOMP를 이용하여 서버간의 통신을 구현하고 서비스를 테스트하다 보니 이미지 생성 요청을 처리하는 과정에서 장애가 발생하면 요청이 손실되는 문제점이 있었다. 또한, Spring Boot의 내부 Broker는 인메모리 방식의 메시지 큐로 동작하다 보니 CI/CD 과정에서 서버가 재기동되면 메시지가 유실될 가능성이 매우 높았다. 이를 해결하고자 외부 Broker인 Kafka를 도입하기로 결정했다. [Infra] Apache KafkaApache Kafka 왜 궁금했을까❓당일 서비스에서 WebSocket으로 서버 간의 통신을 지원했는데 안정성과 장애 복구 등에 취약하다는 것을 알고 Kafka로 전환하기로 결정했다. 어느 정도 개념은..
-
[Infra] STOMP를 통한 Spring Boot - FastAPI 통신프로젝트/당일 2024. 6. 2. 14:28
STOMP 통한 Spring Boot - FastAPI 통신 왜 궁금했을까❓당일 서비스는 Spring Boot를 API 서버로 두고 FastAPI를 GPU 서버를 두고 운영하고 있다. Spring Boot는 사용자가 작성한 일기를 받아 FastAPI에게 데이터를 넘겨 이미지 생성을 요청한다. 이후, 이미지 생성이 완료되면 Spring Boot에게 결과 값을 넘겨줘 사용자에게 최종적으로 전달하게 된다. 2개의 서버 사이의 통신을 하기 위해 STOMP를 활용해보려고 한다. [Network] Socket, WebSocket, SockJS, STOMPWebSocket, SockJS, STOMP 왜 궁금했을까❓당일 서비스에서 Socket을 이용하여 Spring Boot와 FastAPI 서버간의 통신을 지원했다. ..
-
[Spring boot] Spring Security + JWT + Redis (3/3)프로젝트/Share Your Trip 2024. 2. 7. 22:08
이번 포스팅에서는 유효한 RefreshToken을 활용하여 만료된 AccessToken을 갱신하고 MySQL에 RefreshToken을 저장하는 것이 아닌 Redis에 저장하여 효율적으로 토큰을 관리해보려고 한다. 또한, MySQL에서 refreshToken을 조회했을 때와 Redis를 통해서 refreshToken을 조회했을 때의 성능 차이를 비교해보려고 한다.MySQL에서 RefreshToken 관리@Overridepublic UserDto.UserInfoResponseDTO login(final UserDto.LoginRequestDTO requestDTO) { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePass..
-
[CI/CD] Jenkins / GitLab / Docker / EC2 연동 (2/2)프로젝트/아카이뷰 2024. 1. 31. 21:15
이번 포스팅에서는 Jenkins 세부 설정과 GitLab과의 연동, 배포까지 진행해보도록 하겠다. 1. GitLab 연동Jenkins 관리에서 System을 누르고 GitLab 설정쪽으로 가서 해당 필드를 채워준다. 2. Credential 등록GitLab과의 연동을 위해 GitLab에서 AccessToken을 발급하고 등록해준다.Kind를 GitLab API token으로 변경 후, API Token 부분에 Access Token을 삽입ID는 GitLab의 아이디를 적어주고 Add를 클릭다시 돌아가서 credential을 선택 3. Pipeline 작성new item을 누르고 pipeline을 선택push에 대해서만 build를 유발시킬 것이기 때문에 build Triggers에서 위의 그림과 같이 설..
-
[Docker] Spring boot 프로젝트 배포프로젝트/아카이뷰 2024. 1. 26. 08:52
Spring Boot 프로젝트 배포 왜 궁금했을까 ❓SSAFY 2학기 공통 프로젝트를 수행하는 과정에서 클라이언트와 통신하기 위해 백엔드 서버를 EC2에 띄워야 했다. NGINX 부분은 팀원분이 설정을 해놓은 상태여서 나는 .jar 파일로 빌드만 해서 넘겨주면 되는 상황이었다. DockerfileDocker compose를 이용해서 백엔드 API 서버를 배포하는 식으로 아키텍쳐가 구성되어 있어서 Dockerfile을 이용하여 백엔드 API를 빌드하고 이미지화 하는 식으로 진행하려고 한다.FROM openjdk:17ARG JAR_FILE=build/libs/*.jarCOPY ${JAR_FILE} app.jarEXPOSE 11443ENV TZ Asia/SeoulENTRYPOINT ["java","-jar"..
-
[Spring boot] 유저 인증 처리프로젝트/아카이뷰 2024. 1. 15. 20:37
유저 인증 처리 왜 궁금했을까❓SSAFY 1학기에 Share Your Trip에서 유저를 인증하기 위해 이메일 인증 방식을 사용했다. 하지만, 악의적인 사용자가 비밀번호 변경 API를 알아낸 뒤 다른 사용자의 비밀번호를 변경하면 취약점이 발생할 것이라 생각이 들었다. 이를 해결하기 위해, 유저 인증 처리에 대해서 학습해보려고 한다.기존 이메일 인증 로직클라이언트가 비밀번호 변경을 위해 이메일 인증 요청서버는 인증번호를 생성하고 해당 클라이언트의 이메일로 메일 전송메일 전송 완료 후, 서버는 생성된 인증번호를 클라이언트에게 전송클라이언트는 자체 저장소(Redux, Recoil 등)에 저장하고 사용자가 입력한 값을 검증일치한다면 패스워드 변경 진행// 아이디, 패스워드 찾기용 이메일 인증 요청@GetMapp..