목록전체 글 (29)
kym8821 님의 블로그
Docker CI/CD의 필요성기존 프로젝트에서는 각 마이크로서비스를 도커 이미지로 관리하고 있었다하지만, 각 서비스를 이미지화할 때 이 작업을 수작업으로 해야하는 문제점이 있었고 이는 번거로움으로 이어졌다. 따라서 이번 프로젝트에서는 master 브랜치에 작업 내용을 push했을 때, 이미지가 자동으로 Docker hub로 업로드되도록 CI/CD를 구축해볼 예정이다.CI/CD의 기초 개념그렇다면 CI/CD가 도대체 무엇일까?CI/CD를 구축하기 위해서 이 부분에 대해서 정확하게 알고 넘어갈 필요가 있다.CI 기본 개념CI는 지속적 통합의 약자로, 코드 변경 사항을 공유 분기(브랜치)로 빈번하게 병합하는 것을 용이하게 하는 프로세스이다.CI는 코드 변경 사항을 테스트, 빌드 등을 자동으로 하는 것을 의미..

굳이 JPA를 사용하려고 하는 이유사실 가장 편한 방법은 JPA가 아닌 R2DBC와 같은 반응형 드라이버를 제공하는 DB를 선택하는 것이 합리적이다. 하지만, 여기서 굳이 JPA를 사용하려는 이유가 있다.R2DBC와 Spring MVC는 동작 방식이 다르므로 함께 사용하는 것을 피해야 한다. R2DBC : 비동기/논블로킹 기반 기술Spring MVC : 서블릿 기반의 블로킹 웹 프레임워크즉, MVC에서 R2DBC의 결과를 바로 받아서 사용하기 어렵고, block을 걸거나 리액티브 체인을 만들어야 한다block은 전체적인 애플리케이션의 성능을 떨어뜨리기 때문에 지양해야 한다.현재 프로젝트에서 WebClient는 현재 마이크로 서비스 간 통신과 외부 API 호출에만 사용된다.따라서 통신을 위해 프로젝트 Sp..

발생한 문제우선 아래 코드에서는 트랜잭션이 정상적으로 작동하지 않는다.public class UserService { @Autowired private UserRepository userRepository; /* 사용자 토큰 저장 재귀 호출*/ public void saveUserInfo(UserDto userDto){ saveUserToken(userDto.getEmail()); } /* 토큰 저장 */ @Transactional public void saveUserToken(String email){ String token = email + "_token"; userRepository.saveToken(email, tok..

JPA로 개발하며 느낀 한계기존에 JPA를 활용하여 개발하면서 영속성 컨텍스트와 EntityManager에 대해서 알고는 있었다.하지만, 솔직히 자세히 알지는 못했기에 확신을 갖고 개발하지는 못했던 것 같다. 따라서 이번에는 영속성 컨텍스트에 대해서 알아보고, 이 영속성 컨텍스트의 역할에 대해서 알아볼 예정이다. 영속성 컨텍스트영속성 컨텍스트 개념 + 간단한 EntityManger 개념영속성 컨텍스트는 엔티티를 관리하는 1차 캐시이다. 영속성 컨텍스트는 특정 저장소에서 관리하는 엔티티들의 집합을 의미하고 엔티티의 생성, 영속화, 제거 범위를 결정한다.따라서 DB에서 가져온 엔티티를 보관하고, 변경 사항을 추적하는 역할을 수행한다. EntityManager는 이러한 영속성 컨텍스트와 통신하고 엔티티 상태를..

Spring Boot 설정 파일 관리프로젝트를 진행하며 기존에는 google drive 혹은 카카오톡을 통해 설정 파일을 관리했다.하지만, 설정 파일 버전 관리와 수동으로 공유하는 과정에서 어려움과 수고스러움이 있었다.이러한 문제를 해결하기 위해서 spring boot의 설정 파일 관리 방법에 대해서 알아보았다.github secrets vs github submodule설정 파일 저장 방식을 결정하기 위해 github sercrets와 git submodule을 비교했다. 보안 측면에서는 github secrets가 좋은 선택지였지만, 설정 정보의 버전 관리와 공유 측면에서 git submodule을 사용하기로 결정했다 git submodule을 활용한 설정 파일 관리git submodule 기초 개념..

Kafka와 Stomp를 활용한 비동기 작업 처리이전에 Stomp와 Kafka에 대해서 알아보았고, 이번에는 해당 내용을 바탕으로 실시간 작업 처리기를 만들어볼 예정이다.Stomp와 Kafka에 대한 내용은 아래 글에서 확인할 수 있다. https://kym8821.tistory.com/entry/Spring-Boot-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85-%EC%B2%98%EB%A6%AC%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90 [Spring Boot] 실시간 비동기 작업 처리기 만들기 - 기초 개념요구사항 분석이번에..

docker 서비스 restart서비스 재시작의 필요성서비스 A에 의존하고 있는 서비스 B에 대해서 생각해보자.서비스 B는 서비스 A가 실행되기 전에는 매번 실행에 실패하여 예상치 못하게 다운될 것이다. 물론 depends_on을 사용하는 것도 하나의 방법일 수는 있지만, depends_on에 서비스 이름만 등록하는 것은 서비스의 완전한 실행을 보장하지 않는다. 이러한 상황에서 우리는 서비스 실행을 위한 보험으로써 restart를 사용할 수 있다.docker-compose의 restart 속성docker-compose의 restart 정책은 컨테이너가 다운되었을 때의 재시작 규칙을 지정한다.정책설명예시no (기본값)컨테이너가 종료되어도 재시작하지 않음restart: noalways컨테이너가 종료되면 매번..

요구사항 분석이번에 실시간으로 사용자 입력을 받아서 이를 AI 서버에 전달하여 실시간으로 사용자에게 응답하는 기능을 개발하게 되었다. 따라서 아래와 같은 요소들을 고려해야할 조건으로 정했다.사용자의 입력 순서에 맞게 출력을 제공해야 한다.여러개의 서버가 존재할 때, 입력에 대한 한 번의 응답만 존재해야 한다.장기적인 연결이 가능해애 하고 데이터가 소실되면 안된다.이러한 상황에서 Kafka와 Stomp를 활용한 실시간 비동기 작업 처리가 적절한 방법이라 생각했다. Stomp 우선 Kafka에 대해서 알아보기 전에 Stomp 먼저 알아본다.Stomp 특징Stomp는 웹소켓 위에서 동작할 수 있는 프레임 기반 메세징 프로토콜로, 아래 특징들이 있다.Stomp는 웹소켓 기반으로 동작하므로 웹소켓 연결이 필요하다..

API Gateway : Spring Cloud GatewaySpring Cloud Gateway 선택 이유일단 아래와 같은 요구사항을 기반으로 Spring Cloud Gateway를 선택했다.Spring Boot 3 이상에서 동작해야함Spring에서 공식 지원해야함WebSocket와 같은 장기 연결을 지원해야함이러한 상황에서 Spring Boot에서 공식 지원을 중산했고, 장기 연결을 지원하지 않는 Zuul보다는 Spring Cloud Gateway가 적절하다고 판단했다.Spring Cloud Gateway의 기능Spring Cloud Gatway는 Spring Webflux 기반의 API Gateway이다.또한, Webflux 기반이기에 Netty(웹 서버) 기반의 비동기 처리를 지원한다. Sprin..

디플로이먼트파드 매니페스트 파일 문제점하나의 파드를 생성할 때는 파드 매니페스트 파일만을 사용해도 문제가 없다.하지만, 여러개의 파드를 생성해야하는 경우 파드 매니페스트 파일을 여러개 작성하는 것은 생산성과 관리 측면에서 좋지 않다.이러한 부분을 보완하기 위해서 디플로이먼트를 사용한다.디플로이먼트 기초 개념디플로이먼트는 임의의 수의 파드를 자동으로 생성해준다 (스케일링)또한, 파드가 죽어도 재시작을 통해 일정 수의 파드를 유지시켜준다. (셀프 힐링)여러개의 파드에 대한 일괄적인 관리가 가능하다.디플로이먼트 매니페스트 파일아래와 같이 매니페스트 파일을 작성할 수 있다.# version && kindapiVersion: apps/v1kind: Deployment# Deployment MetaDatametad..