목록Study/Spring (13)
DevYGwan

저희는 기본적으로 IoT 데이터의 경우 대용량 데이터이기 때문에 NoSQL 기반의 데이터베이스 인 ScyllaDB을 사용하여 데이터를 관리했습니다. 그러다보니 기본적인 데이터 (유저 데이터, 장비 Meta 데이터 등)도 ScyllaDB을 사용해서 개발을 진행했습니다. 하지만 NoSQL이다보니, 정형화 된 데이터와 트랜잭션 처리가 RDB보다 효율적이지 못해 이번에 추가적인 "승인" 도메인을 개발하면서 RDB을 반영하기로 결정했습니다. RDB을 반영하면서 고민한 사항은 크게 3가지 입니다.어떤 RDB을 사용할까?DB 서버가 다른데, 다른 서버 간의 트랜잭션을 관리 할 일이 있을까?백엔드 서버는 어떻게 처리할까? 하나로 가져갈까 DB 별로 분리해서 가져갈까? 이렇게 3가지를 고민했습니다. 고민하고 내린 결과는..

기본적으로 서버에서 IoT 기기들과 통신할 때, MQTT 프로토콜을 사용해서 통신합니다. 이 때 서버와 IoT 기기들끼리 1 : 1 통신을 하는 것이 아닌 중간 중개자인 MQTT Broker에 PUB / SUB 방식으로 통신을 진행합니다. 예를 들어, 서버가 특정 IoT 기기에게 메세지(신호)를 보내고 싶다면, IoT 기기가 구독하고 있는 토픽에 보낼 메세지를 추가하여 MQTT Broker에 Publish 합니다. 그러면, 해당 토픽을 구독하고 있는 IoT 기기가 해당 토픽을 Subscribe 한 후 메세지를 받습니다. 기본적으로 이러한 형식으로 서로 통신합니다. 결국, MQTT Pub-Sub 기반 IoT 제어 및 응답 흐름은,서버는 IoT 기기가 구독하는 특정 토픽에 요청 메시지를 담아 MQTT Bro..

회사에서 프로젝트를 진행하면서, 프로젝트 초기에 DB 관련 DDL 관리가 힘들다는 것을 느꼈습니다. 프로젝트 초기다보니 DDL 수정이 자주 발생하고, 환경 별로 DB 서버를 다르게 하다보니 DB의 변경사항이 발생했을 때, DB 동기화 작업을 매번 하는 것이 번거로워 개발 생산성 저하로 이어지는 문제가 발생했습니다. 그러다보니 자체적으로 초기에는 DB 환경을 하나로 만들어 개발하는 전략으로 진행했습니다... 하지만 이는 환경 별로 종속성이 생겨 협업에 취약하고 서비스 배포 이후에 큰 문제를 야기할 수 있습니다. 따라서 이러한 문제를 해결하기 위해 방법을 찾아보던 중 Flyway라는 DB 형상관리 툴을 알게 되었습니다. 따라서 이를 적용하려고 겪은 시행착오 경험과 결론적으로 Flyway 공식 레포에 기여를 ..

기본적으로 스프링에서 비동기 처리를 할때, 기본적으로 비동기 처리에 필요한 Executor를 등록하고 @Async 어노테이션과 @EnableAsync을 사용해서 비동기 처리를 진행합니다. 이때 이에 대한 원리를 제대로 알지 못해 제가 등록한 Executor와 @Async 어노테이션에서 사용하는 Executor가 다른 문제를 확인했고 이를 공유하려고 합니다. 간단하게 위에서 말한 개념들을 설명하자면,Executor : Java 표준 라이브러리에서 제공하는 인터페이스로, 비동기 작업을 실행하는 데 사용됩니다.구현체로 ThreadPoolExecutor, ForkJoinPool이 있습니다.쓰레드풀을 관리하고 작업을 실행하는 역할을 합니다.@Async : 메서드를 비동기적으로 실행하도록 만들어줍니다. 이를 통해 ..

Test 코드를 작성하면서, Controller로직 테스트 시 Mocking처리를 한 경험은 자주 있을 것입니다. Mocking을 처리하면서, 특정 메서드가 호출될 때 원하는 동작을 지정할 수 있게 하기 위해 when() 메서드를 사용할때 발생한 문제에 대해서 공유하고 이를 해결하기 위한 여러가지 방법에 대해서 설명드리려고 합니다. 간단하게 제가 겪은 문제는 인스턴스 간의 "동등성" 문제로 인해, when()에서 사용한 메서드의 파라미터로 들어온 dto 클래스를 같은 클래스라고 인식하지 못해 when()이 제대로 동작하지 않아 생기는 문제입니다. 좀 더 문제가 된 상황을 자세히 설명드리겠습니다. 문제 상황 저는 회원가입에 관한 controller로직 테스트를 진행하려고 했습니다. 테스트 코드는 다음과 같..