엔빵프로젝트

    API 속도가 이상하다..? CPU는 왜 점유율 99%..?

    API 속도가 이상하다..? CPU는 왜 점유율 99%..?

    Kafka? RabbitMQ? 어떤 것을 쓸까? 프로젝트를 시작할 때 MSA 아키텍쳐로 프로젝트를 진행해보자고 의사결정이 되었다. MSA 아키텍쳐는 서비스 간 의존성을 낮춘 만큼 서비스 간 이벤트 기반 메세지 전송 방식이 존재할 수밖에 없었다. 기술 스택을 확립해 가는 과정에서 우리는 RabbitMQ와 Kafka 중 하나를 선택해서 개발을 진행하자고 결정이 되었고 장, 단점을 하나씩 정리해보았다. RabbitMQ 프로듀서와 컨슈머 간 메세지 전달을 보장. 안정성 있는 전달을 토대로 관리적인 측면이나 다른 기능을 구현하는 것이 가능하다. 상대적으로 가볍다. 컨슈머에게로 메세지 전달이 되는 순간 (메세지 큐에서 메세지가 빠지는 순간) 삭제된다. 컨슈머가 성공적으로 메세지를 전달받았지만 예기치 못한 문제로 인..

    Repository 단위 테스트

    Repository 단위 테스트

    @DataJpaTest와 @AutoConfigureTestDatabase를 이용해 Repository 메서드를 단위 테스트해보자. @DataJpaTest 기본적으로 JPA 관련 설정들을 로드한다. 기본적으로 인메모리 테스트 데이터베이스를 이용해 실제 데이터베이스를 이용하지 않고 사용하는 것이 가능하다. 또한, @Tranasactional을 가지고 있기 때문에 테스트가 진행된 이후 자동으로 롤백하는 것이 가능하다. @AutoConfigureTestDatabase 애노테이션 뜻 그대로 테스트 데이터베이스의 구성정보를 자동으로 설정해주는 애노테이션이다. 이 또한, @DataJpaTest에 가지고 있다. 위에서 기본적으로 인메모리 테스트 데이터베이스를 이용한다고 한 부분이 @AutoConfigureTestDat..

    Converter를 이용해 URI에 Enum 타입 매핑하기

    Converter를 이용해 URI에 Enum 타입 매핑하기

    현재 프로젝트에서 사용자가 자신이 수신한 공지사항, 이벤트, QNA, 파티 매칭 관련한 알림을 필터링 해서 읽을 수 있는 기능을 구현하고 있다. 이 때, URI를 “/notify/{notifyType}” 으로 지정하고 String 타입이 아닌 정의한 Enum 타입으로 받는다면 Stirng 타입에서 Enum타입으로 변경하는 추가 로직을 구현없이 편하게 비즈니스 로직에 접근할 수 있다고 판단했다. 물론 URI의 의미 전달까지 제대로 전달할 수 있다고 생각했다. 그래서, URI 엔드포인트에 들어가는 PathVariable 값을 String 값으로 받는 것이 아닌 바로 정의한 Enum 타입으로 받아보는 방법을 정리하고자 한다. Converter? Spring에서 제공하는 Converter를 먼저 간단하게 확인해..

    Spring Cloud Config의 설정 파일 비대칭키로 암/복호화

    Spring Cloud Config의 설정 파일 비대칭키로 암/복호화

    이전에 필요한 환경변수 파일들을 Github에 Config Repository를 하나 생성해 관리했다. Spring Cloud Config Server는 실행 시 이 환경 설정파일들을 애플리케이션이 실행될 때 전파해주었다. 이런 환경설정 파일들을 Public Repository에서 관리하거나 Private Repository에서 관리하더라도 암/복호화를 통해 안전하게 관리해야한다. 일반적으로 암/복호화하는 방식은 크게 대칭키방식과 비대칭키 방식이 있다. 대칭키(Symmetric) : 암/복호화하는 키가 동일한 경우를 의미한다. 대표적으로 AES, SEED, ARIA와 같은 알고리즘이 있다. 비대칭키(Asymmetric) : 암/복호화 하는 키가 다른 경우를 의미한다. 모든 사람이 사용할 수 있는 공개키와..

    RestControllerAdvice, ExceptionHandler를 이용한 전역 예외 처리

    RestControllerAdvice, ExceptionHandler를 이용한 전역 예외 처리

    이전 포스팅에서 프로젝트 애플리케이션이 동작 시 발생하는 다양한 상황에 대해서 메세지를 클라이언트로 전달해주기 위해 Custom Exception을 이용한 사용자 예외 처리를 다뤘다. 이렇게 Custom Exception을 사용하다보니 Web Layer (Controller)에서 로직을 처리해 줄 때 발생하는 예외를 try-catch로 매 로직마다 처리해주어야 했다. try-catch문에 들어가는 로직은 status, message를 담아 보내주는 공통적인 로직인데 이를 한 군데서 전역 처리할 수 없을까? @RestControllerAdvice, @ControllerAdvice ControllerAdvice, RestControllerAdvice는 모든 Controller에서 발생한 예외를 한 곳에저 전..