본문 바로가기

전체 글33

[Spring Integration] Spring에서 MQTT 통신하기 02 들어가기 전에지난 글에서 공식문서 예제에 다음과 같은 문제점이 있다고 생각을 했습니다. 단일 토픽설정 클래스에 너무 많은 로직 이번 글에서는 여러가지 고민 끝에 생각한 구조를 공유해보려고합니다. 나름대로 확장성과 성능을 고려해보려고 했지만, 아직 많이 부족하니 감안하고 봐주시면 감사하겠습니다. 모든 코드는 github에 올려두었으니 참고하시면 될 것 같습니다. 아키텍처먼저 어떤 방식으로 여러 토픽을 구독할 수 있는지 찾아보았습니다. 하지만 Spring Integration에 관련된 레퍼런스나 Spring에서 MQTT 통신하는 예제가 많이 없어서, 여러 토픽을 구독할 수 있는 아키텍처를 직접 생각을 해야했습니다. 그 중에서 StackOverflow에서 저와 비슷한 고민을 했던 질문이 있어서 해당 내용을 참.. 2024. 10. 13.
[Spring Integration] Spring에서 MQTT 통신하기 01 들어가기 전에MQTTMQTT란 Message Queuing Telemetry Transport의 약자로, 보통 스마트 센서나 사물 인터넷(IoT) 등 낮은 대역폭과 리소스가 제한된 환경에서 안정적으로 통신할 수 있는 경량 메시징 프로토콜입니다. MQTT는 최소한의 리소스와 적은 전력을 소비하기 때문에 IoT와 같은 제한된 환경에서 사용하기 적합합니다. MQTT는 AMQP와 같이 발행-구독 패턴을 사용하며, 메시지 브로커가 필요합니다. MQTT에 대한 이론적인 내용은 MQTT 공식 레퍼런스에서 가이드 받을 수 있으며, HiveMQ에서 무료 e-book을 배포하고 있으니 활용하시면 될 것 같습니다. Spring Integration스프링에서 MQTT 통신을 하기 위해서는 먼저 Spring Integratio.. 2024. 10. 12.
[DevOps] 도커와 컨테이너 (Docker and Container) 도커란?도커는 컨테이너를 생성하고 관리하는 도구입니다. 도커를 사용하는 이유표준화된 실행 환경을 구축 도커를 사용하면 운영체제에 관계없이 표준화된 실행 환경을 구축할 수 있습니다. 이는 개발환경과 실제 서비스 환경을 동일하게 만들어 서비스 환경과 개발 환경의 차이로 인한 문제를 줄일 수 있습니다. 또한 여러 개발자가 협업할 때 개발 환경을 통일시키는 데 큰 도움이 되고, 여러 프로젝트를 동시에 진행할 때 각 프로젝트의 환경을 분리할 수 있습니다. 가상머신과 도커 컨테이너의 차이 가상머신은 하이퍼바이저를 통해 게스트 OS를 생성하고, 각 게스트 OS에 애플리케이션을 실행합니다. 반면 도커는 호스트 OS 위에 도커 엔진을 설치하고, 컨테이너를 생성하여 애플리케이션을 실행합니다. 가상머신을 사용해도 도커를 사.. 2024. 9. 18.
[임베디드] SSD1306 OLED 모듈 제어 - I2C I2C I2C(Inter-Integrated Circut)는 SPI와 마찬가지로 IC 간의 단거리 통신을 위해 고안된 프로토콜입니다. Clock 신호를 사용하여 동기 방식으로 통신하기 때문에 사전에 데이터 전송 속도 등을 맞추지 않아도 된다는 특징이 있습니다. I2C에서는 풀업 저항을 사용하여 기본적으로 HIGH 상태입니다. 또한 SPI와 다르게 오직 2개의 핀만 사용한다는 것이 특징입니다. SPI는 전이중 통신이 가능하지만, 슬레이브가 추가될 때마다 슬레이브 선택을 위한 핀이 추가로 필요합니다. 반면 I2C는 주소 체계를 사용하기 때문에 2개의 핀만으로 여러 장치와 반이중 통신이 가능합니다. 데이터 형식위 데이터 프레임 형식은 마스터에서 슬레이브에 데이터를 송신(Master write / Slave r.. 2024. 9. 2.
[42GG] LocalDateTime과 Timezone 이전 글 요약첫 번째 문제는 대회 스케쥴에 대한 Custom Validator에서 NullPointerException이 발생했습니다. @NotNull보다 Custom Validator가 먼저 실행되기 때문에 올바른 필드 값이 들어오지 않으면 null을 참조하게 되는 것이 원인이었습니다. 두 번쨰 문제는 Null Check하는 로직을 추가하면서 날짜 형식에 대한 Validation(@JsonFormat)을 추가했는데 해당 부분에서 데이터가 바인딩 되지 않는 문제가 추가로 발생했습니다. 프론트에서는 "yyyy-MM-dd'T'HH:mm" 패턴 형식으로 보내고, 백엔드에서는 "yyyy-MM-dd HH:mm" 형식으로 설정했기 때문이었습니다.  두 번째 문제를 해결하면서 Timezone과 관련된 문제점을 발견했.. 2024. 8. 30.
[임베디드] 74HC595D FND 모듈 제어 - SPI SPISPI(Serial Peripheral Interface)는 주변 장치와 직렬로 통신하기 위한 인터페이스 입니다. 주로 근거리에서 칩(IC)과 칩 사이에 통신을 위해서 사용합니다. 클럭SPI는 지난 글에서 GPIO를 이용하여 FND 모듈을 제어한 것과 같이 클럭 주기에 맞춰서 데이터를 송수신합니다. UART와는 다르게 통신 속도를 지정하지 않고, 클럭을 사용하기 때문에 속도 제한이 없습니다.SPI의 클럭 위상(CPHA, Clock Phase)은 1 Edge와 2 Edge로 나뉩니다. 클럭의 극성(CPOL, Clock Polarity)이 HIGH인 경우 1 Edge에서는 클럭이 하강하는 시점의 MOSI/MISO 상태를 확인하고, 2 Edge에서는 클럭이 상승하는 시점에 MOSI/MISO 상태를 확인합.. 2024. 8. 10.
[임베디드] 74HC595D FND 모듈 제어 - GPIO FND 모듈7-SegmentFND란 Flexible Numeric Display(가변 숫자 표시기)의 약자로, 흔히 7-Segment라고 부릅니다. 7-Segment 표시 장치는 위와같이 7개의 선분으로 숫자 및 문자를 표현합니다. 또한 소수를 나타내기 위해서 숫자의 오른쪽 아래에 소수점(DP)이 붙는 경우도 있습니다.7-Segment는 8비트를 사용하여 A~G, DP 위치의 LED를 제어합니다. 위와 같이 각 자리에 매핑되는 비트를 0으로 설정하면 해당 LED가 켜지는 방식입니다. 4-Bits4Bits FND 모듈은 7-Segment 4개를 사용하여 4자리수를 표현하는 모듈입니다. 각 자리수는 하위 4비트를 사용하여 표현합니다. GPIO를 이용한 모듈 제어 FND 모듈을 제어하기 위해서는 SCLK, R.. 2024. 8. 7.
[42GG] Custom Validator 실행 순서 1편: Custom Validator 실행 순서2편: LocalDateTime과 Timezone 문제 상황NullPointerException 발생프론트에서 API 테스트 중에 NullPointerException이 발생한다는 상황을 전달받았습니다. 로그를 확인해보니 리펙토링을 진행하면서  추가한 Custom Validator에서 NullPointerException이 발생하고 있었습니다. @Getter@AgendaCapacityValid@AgendaScheduleValid@NoArgsConstructor(access = AccessLevel.PROTECTED)public class AgendaCreateReqDto { // ... @NotNull @Future(message = "마감일은 현재 시간 이.. 2024. 8. 4.
[C/C++] C 언어에서 상속과 다형성 구현하기 Ray Tracing in One Weekend는 레이 트레이싱에 대한 기초적인 개념을 설명하고 있습니다. 하지만 예제가 C++로 작성되어 있기 때문에 miniRT 과제를 위해서는 C++ 코드를 C 스타일로 변경해야합니다. 대부분의 내용은 그대로 사용할 수 있지만, 다수의 오브젝트를 처리할 때 상속과 다형성을 활용해서 Hittable와 Hittable_list 클래스를 구현하는 부분은 C에서 구현하기 까다롭습니다. 이 글에서는 Hittable와 Hittable_list 클래스를 위해 C언어에서 상속과 다형성을 활용했던 내용을 공유하려고 합니다. 상속과 다형성상속이란 객체 간의 계층 구조를 형성하는 것을 의미합니다. 상위 계층의 객체를 하위 계층에서 상속받으면, 따로 속성과 행동을 정의하지 않아도 상위 계.. 2024. 7. 29.