티스토리

우주먼지
검색하기
블로그 홈

블로그 홈

우주먼지

iizz.tistory.com/m
신고

조용한 개발자

구독자
28
방명록 방문하기
구독하기

주요 글 목록

  • Spring Cloud Stream + RabbitMQ Binder 📚 Spring Cloud Stream + RabbitMQ Binder(시계열 데이터 집계 파이프라인 구현)사내에서 새로운 플랫폼 개발이 시작되기 전, 기존의 데이터 처리 로직은 아래와 같았습니다.기존 로직AI Raw Data 생성MQTT 프로토콜로 RabbitMQ에 만들어둔 Topic(Routing Key)기반 Quorum Queue로 데이터 적재Spring에서 Queue의 데이터를 Consume(DeliverCallBack을 이용한 Basic Consume 방식) 하여 전처리(집계 및 캐싱, 통계처리)구현할 로직BasicConsume 방식으로 Queue에서 받던 데이터를 StreamBridge 클래스 로 전환해 RabbitMQ Binder를 구현한 AggregationProcessor에 바로 전달A.. 공감수 5 댓글수 2 2025. 2. 3.
  • High Performance Blocking I/O - Virtual Thread 📚 Virtual Thread를 이용한 고성능 I/O가상 스레드(Virtual Thread)가 긴 시간이 걸리는 Blocking I/O 연산을 처리할 때, 캐리어 스레드(Carrier Thread, 플랫폼 스레드)와의 마운트(Mount) 및 마운트 해제(Unmount) 과정은 다음과 같이 동작합니다.캐리어 스레드란?캐리어 스레드는 OS 플랫폼 스레드를 의미하며, JVM이 관리하는 실제 물리적 스레드입니다.가상 스레드는 캐리어 스레드에 마운트되어 실행됩니다.한 번에 여러 가상 스레드가 캐리어 스레드에 스케줄링되어 실행됩니다.마운트와 마운트 해제 과정가상 스레드는 Blocking I/O 연산과 같은 작업이 발생할 때, 다음 단계를 거칩니다.Step 1: 마운트(Mount)가상 스레드가 시작되면 JVM은 해.. 공감수 5 댓글수 6 2025. 1. 20.
  • Apache Kafka 구현 (Spring Boot & Docker-Compose) 📚 Kafka이번에 Kafka를 공식문서를 보며 따라 구현해보고 있습니다.사내에서 진행하는 프로젝트들중 대부분은 RabbitMQ를 이용한 초당 데이터가 몇 안되는 작은 데이터 파이프라인을 사용 중 이었습니다.하지만 이번에 새로 개발하는 플랫폼에서는 수백군데의 고객사 데이터를 중앙서버 한곳에서 모든 데이터 스트림을 Consume 해야하는 요구사항이 있었고 RabbitMQ로는 데이터 처리량이 부족할 거 같아,실무 적용까지는 한참 공부해야 겠지만, 무작정 구현해보고자 우선 구현 후 글을 작성합니다.Kafka를 사용하려는 이유1. 귀찮음기존에 각각 다른 서버에 RabbitMQ를 개별적으로 설치하고, Queue 생성, Binding 설정, Exchange 관리 등 반복적인 작업이 많았음.프로젝트마다 새로운 서버.. 공감수 17 댓글수 8 2025. 1. 13.
  • Java Reflection - Dynamic Object Creation(Constructor<?>) 📚 ConstructorJava의 Constructor는 Java 리플렉션 API에서 제공하는 클래스 중 하나로, 클래스의 생성자(constructor)를 나타내는 객체입니다. Constructor는 java.lang.reflect 패키지의 일부이며, 특정 클래스의 생성자에 접근하거나 실행할 수 있도록 도와줍니다.클래스 로드 및 생성자 조회Class 객체를 사용하여 특정 클래스의 모든 Constructor 객체를 가져올 수 있고, 해당 생성자 파라미터를 알고 있다면 파라미터에 parameterTypes를 넣으면 특정 생성자를 가져올 수 있습니다.만약 가져온 Class에 생성자가 없다면 자동으로 기본 생성자를 포함한 단일 요소 배열로 반환됩니다.Public, Private 모든 생성자 로드getDecla.. 공감수 3 댓글수 1 2024. 12. 30.
  • Distributed Log Tracing (Zipkin + Spring Cloud Sleuth) 📚 Distributed Log Tracing (Zipkin + Spring Cloud Sleuth)Spring Cloud Sleuth 란?Spring Cloud Sleuth 공식 문서Spring Cloud Sleuth는 분산 로그 추적기로, Spring에서 Zipkin Client 모듈로 각 Request에 대한 ID를 자동으로 생성해 줍니다.이 ID 정보는 각 Protocal의 Header를 통해 전달되며, 정보를 수신한 서버는 다음 서버에게 동일한 정보를 제공하는 방식으로 History를 추적할 수 있습니다.Trace IdSpan Id전체 작업에 할당된 ID. 작업은 각각의 작은 단위들로 구성되어 있다고 한다면, 각각의 작은 단위들은 공통의 Trace ID 를 갖고 있습니다.각각의 작은 단위들이 .. 공감수 3 댓글수 4 2024. 12. 27.
  • Java Reflection & Reflection API Entrypoint 📚 Reflection이란?Java Reflection이란 짧게 요약하면 런타임 중, 어플리케이션의 클래스 및 객체에 관련된 정보에 액세스 할 수 있게 해주는 언어이자 JVM의 기능 입니다.보통의 프로그램은 실행 시 Input을 받아 Output을 반환합니다.반대로 Reflection으로 프로그램 작성 시 Input과 내부 소스 로직을 모두 입력값으로 간주해 그걸 분석하고 Output을 반환합니다.위 이유로 인해 Reflection을 이용하면 강력한 라이브러리,프레임워크,소프트웨어를 설계 할 수 있습니다.Java Reflection은 언어이자 JVM의 기능 중 하나이며, 런타임 시 classes와 objects를 추출할 수 있습니다.Reflection API를 통해 다양한 소프트웨어를 Flexible하.. 공감수 3 댓글수 4 2024. 11. 28.
  • CQRS(Command Query Responsibility Segregation) Pattern 📚 CQRS(Command Query Responsibility Segregation) PatternCQRS(Command Query Responsibility Segregation) 패턴은 DB로부터 읽기와 쓰기 작업을 분리하는 패턴입니다.이 패턴을 사용하면 어플리케이션의 성능,화장성,보안성을 극대화 시킬 수 있으며, 여러 요청으로부터 들어온 복수의 업데이트 명령에 대한 충돌을 방지할 수 있습니다.오늘은 프로젝트에 CQRS를 구현하기 전 CQRS가 무엇인지, 왜 사용해야 하는지, 사용하면 어떤 점이 개선되는지 먼저 공부해 보겠습니다.📚 CQRS 패턴을 사용하려는 이유CQRS를 채용하려는 이유는 현재 개발중인 로직중 RabbitMQ를 이용한 대규모 이벤트 데이터의 전처리 및 통계 처리와 RTSP St.. 공감수 2 댓글수 0 2024. 11. 26.
  • Virtual Thread 📚 Virtual ThreadJDK에 정식 도입된 Virtual 스레드는 기존의 KLT(kernel-level 스레드)와 ULT(user-level 스레드)를 1:1 매핑하여 사용하는 JVM의 스레드 모델을 개선한, 여러 개의 가상 스레드를 하나의 네이티브 스레드에 할당하여 사용하는 모델이며, 경량 스레드로, JDK 19에서 미리보기의 일부로 처음 공개 되었습니다. 가상 스레드는 OS 스레드에 비해 매우 적은 자원을 사용하여 수천 개의 스레드를 효율적으로 실행할 수 있도록 설계되었고,이를 통해 고성능 서버 애플리케이션이 더 높은 동시성을 쉽게 구현할 수 있으며, 전통적인 스레드 풀의 복잡한 설정 없이도 많은 작업을 동시에 처리할 수 있습니다.📚 Java Thread와 OS Thread와의 관계Java.. 공감수 1 댓글수 0 2024. 11. 22.
  • Redmine <-> NAS CIFS-Mount 📚 Redmine Synology NAS CIFS-Mount프로젝트 관리 툴로 Redmine을 써보고자 Redmine을 설치 후 Redmine 에서 사용하는 데이터들은 NAS에 저장하고 싶어 연동했던 기록을 작성합니다.현재 제 서버 환경은 별도의 서버에 Redmine을 NAS의 OS에 설치하는 것이 아닌 Docker-Compose로 올려뒀고, DB는 NAS 내부에 세팅 해두었습니다.원래 DB도 별도의 서버에 했었지만, Redmine 내부 앱의 파일과 Redmine 개별 프로젝트에 올리는 "파일" 탭의 파일의 저장 위치가 달랐고,1개는 앱 내부에서 DB로, 1개는 앱 외부에 특정 디렉터리로 저장이 되어 있었습니다.그래서 앱 내부에 저장되는 파일(DB)은 NAS 내부에 DB를 설치하여 그곳에 저장하게 해.. 공감수 4 댓글수 2 2024. 11. 20.
  • Thread-Per-Task Threading Model 📚 Blocking I/O블로킹 방식의 I/O를 사용하는 어플리케이션에서 응답 시간이 긴 블로킹 I/O 연산이 포함되어 있다면, 아무리 많은 스레드를 생성하더라도 근본적으로 성능 문제가 발생할 수 있습니다.긴 블로킹 연산으로 인해, 스레드가 I/O 작업이 완료될 때까지 대기하면서 사용 가능한 CPU 코어가 점차 유휴 상태가 됩니다. 결과적으로, 이러한 블로킹 호출이 계속 발생하면 서버의 전체 성능이 저하되고 모든 요청 처리에 영향을 미치게 됩니다.이번 글에서는 블로킹 I/O 연산이 있어도 어플리케이션의 전체 성능을 최적화하기 위해 CPU 자원을 더 효과적으로 활용할 수 있는 다양한 방법들을 알아보았습니다.📚 Thread-Per-Task Threading Model(작업 단위 스레딩 모델)위에서 말했듯.. 공감수 3 댓글수 0 2024. 11. 5.
  • AtomicReference<T>를 이용한 Lock-Free Stack 구현 📚 AtomicReference를 이용한 Lock-Free Stack 구현Lock-Free의 연장으로 멀티스레드 환경에서 Stack을 Lock-Free로 구현하는 방법을 작성합니다.구현 흐름은, 초기 데이터로 100,000개의 무작위 정수를 스택에 추가한 후, 여러 스레드가 동시에 push와 pop 작업을 수행합니다. 10초 후에 총 작업 수를 로그로 기록하여 스택의 동작 성능을 측정합니다. 이러한 과정을 통해 Lock을 사용하지 않고도 안전하게 멀티스레드 환경에서 동작하는 스택을 구현하는 방법을 배울 수 있습니다.StandardStack 클래스Lock을 사용하는 단일 스레드 환경에서 동작하는 스택으로, synchronized 키워드를 사용하여 push 메소드에 락을 걸어 안전한 접근을 보장합니다. 새.. 공감수 6 댓글수 2 2024. 11. 4.
  • Lock-Free Algorithm 📚 Lock-Free AlgorithmLock-Free 알고리즘은 여러개의 Thread에서 동시 호출 시 정해진 단위 시간마다 적어도 1개의 호출이 완료되는 알고리즘이며, 동시성 제어에서 중요한 개념중 하나입니다.간단히 요약하면 Lock을 사용하지 않고 Atomic 연산을 통해 구현하며, 하드웨어 레벨에서 연산의 원자성을 보장합니다.유의할 점CAS(Compare And Set)를 사용하는 Atomic 클래스는 Thread 간 경합이 있을 때 성능이 다소 낮아질 수 있십니다.하지만 여전히 Lock을 사용하지 않기 때문에 Lock과 비교해 더 빠르고 데드락이 없는 Lock-Free 구현이 가능합니다.물론 Lock을 사용 하는게 더 좋다거나 사용 안한다고 더 좋다기 보다 상황에 맞게 선택할 수 있는 선택지를.. 공감수 5 댓글수 0 2024. 10. 25.
  • Object를 이용한 Thread 간 통신 / 동기화 📚 Object를 이용한 Thread 간 통신 / 동기화지난 글에서 멀티스레딩 환경에서 여러 스레드 간 통신 및 동기화가 필요할 때 Semaphore / Binary Semaphore를 사용 했었습니다.Semaphore - Multi Threading 작업 순서 제어 & 동기화이번 글은 로직의 복잡성이 낮고 간단하며 직관적인 락 제어가 필요한 경우 Object 객체의 wait(), notify(), notifyAll() 을 이용한 동기화/통신 방법에 대한 글을 작성합니다.wait(), notify(), notifyAll() 함수를 사용하면 효율적으로 스레드를 제어할 수 있습니다.📚 wait(), notify(), notifyAll()wait(), notify(), notifyAll()은 Object .. 공감수 5 댓글수 5 2024. 10. 10.
  • Open API 3.0 Swagger + Export Rest API Docs 📚 Swagger API 적용사내에서 대부분 시스템쪽 개발을 맡다가 이번 프로젝트에서 맡은 서버들 중에 API쪽 서버가 있어 기억 속에서 잊혀져 가던 Swagger를 다시 복습할 겸 정리글을 작성합니다.Spring Doc 공식 페이지Spring을 사용한다면 아래 2개의 라이브러리를 사용할 수 있습니다.Spring FoxSpring DocSpring Fox의 경우 마지막 업데이트일인 2020년 이후 업데이트가 없으므로, Spring Doc을 이용하겠습니다.Spring Doc은 WebFlux를 통한 비동기 방식의 개발도 지원합니다.application.yml 설정해서 Path 설정을 안한다면 기본 Path는 {Server I{}:{Port}/swagger-ui/index.html입니다.저는 그냥 포트뒤에 .. 공감수 5 댓글수 1 2024. 10. 4.
  • Hexagonal Architecture 구현 - 1 (Multi-Module, Kotlin) 📚 헥사고날 아키텍처란?기본 구조 & API 구현 Repository헥사고날 아키텍처(Hexagonal Architecture)는 포트와 어댑터 아키텍처(Ports and Adapters Architecture) 라고도 불리며,어플리케이션의 핵심 비즈니스 로직을 외부 시스템(데이터베이스, 웹, 메시징 시스템 등)으로부터 완전히 분리하여 독립성을 높이는 클린 아키텍처 패턴 중 하나입니다.어플리케이션의 도메인 로직이 외부 의존성과 분리됨으로써, 유연성과 테스트 용이성을 크게 향상시킬 수 있습니다.아키텍처 구조이 구조는 도메인이 항상 중심에 위치하고, 외부 시스템과의 상호작용이 포트와 어댑터로 분리되는 형태로 동작합니다.도메인 중심 설계(Domain-Centric Design):어플리케이션의 핵심 비즈니스 .. 공감수 4 댓글수 3 2024. 9. 7.
  • Semaphore - Multi Threading 작업 순서 제어 & 동기화 📚 Semaphore - Multi Threading 작업 순서 제어 & 동기화멀티쓰레드 환경에서 여러 쓰레드가 협력하여 순차적으로 작업을 처리해야 할 때, 동기화(Synchronization)는 매우 중요합니다. 이번 글에서는 Semaphore와 Custom Barrier 클래스를 활용하여 모든 쓰레드들이 첫 번째 작업을 전부 완료할 떄 까지 Semaphore를 이용해 Blocking 시키고 이후 두 번째 작업을 수행하도록 동기화하는 방법을 작성 하겠습니다.예시로 구현할 로직은 아래와 같습니다.20개의 Thread로 진행작업 1과 2가 있고 20개의 Thread가 작업 1을 모두 완료한 상태가 아니면 작업 2로 넘어가지 않음각 작업 당 Thread들의 실행 순서는 중요하지 않고 20개의 Thread .. 공감수 6 댓글수 0 2024. 9. 6.
  • Github - 보안 취약점 알림(Dependabot Security Alert) 해결 Github - 보안 취약점 알림(Dependabot Security Alert) 해결메일로 내 Github의 특정 Repository의 React 패키지에서 보안 취약점이 발견되었다는 메일이 자꾸 와서 메일을 안오게 하려고 알아보았습니다.해결 방법제 경우는 React 프로젝트를 yarn으로 생성했기 때문에 yarn.lock 파일이 있을 것이고, 만약 npm으로 했다면 package-lock.json이 있을겁니다.이 두 경우에 해결방법이 다르므로 2가지 방법 다 작성 하겠습니다.패키지 취약점 검사# npm 인 경우npm audit# yarn 인 경우yarn audit명령어를 입력하면 아래 이미지 처럼 각 패키지의 취약점 개수와 내용이 나옵니다.패키지 업데이트npm의 경우 업데이트 가능한 패키지를 자동으로.. 공감수 4 댓글수 0 2024. 9. 5.
  • Binary Semaphore와 Mutex의 차이점 Binary Semaphore와 Mutex의 차이점평소에 개발 시 특정 공유 Resource에 대한 접근은 단일 스레드만 허용해야 하는 기능이 있어서,ReentrantLock으로 단일 Thread에게 중첩된 Lock을 허용해주는 Mutex 방식으로 개발 했었습니다.그런데 개발 도중 여러개의 Thread에 권한을 줘야하고 허용 가능한 개수 조절이 필요한 기능이 생겨 Semaphore를 공부 하다가, Binary Semaphore라는 Mutex와 아주 유사한 동기화 메커니즘을 발견했고 둘 다 단일 스레드만 허용하는 공통점이 있어서또 어떤 다른 차이가 있는지 궁금해 알아보게 되었습니다.Binary Semaphore와 Mutex의 공통점Mutex와 Binary Semaphore는 모두 동시성 제어를 위해 사용되.. 공감수 4 댓글수 2 2024. 8. 30.
  • HikariCP - Thread Starvation & Clock Leap Detection 📚 HikariCP - Thread Starvation & Clock LeapSpring Boot 서버에서 가끔 보이던 특정 문구가 있었는데, 일이 바빠서 무시하다가 이번에 여유가 좀 생겨서 알아보았습니다.이 경고 문구는 스레드가 기아상태가 되거나 시스템 시간이 실제 시간과 비동기화 되는 현상인 Clock Leap가 일어났을떄 발생합니다.어쩌다 1번씩 가끔 뜨고 가끔 API 호출도 안되는 현상이 있어 바로 알아보았습니다.master - Thread starvation or clock leap detected (housekeeper delta=20m34s90ms530µs700ns).정확한 원인은 아직도 잘 모르지만 검색 결과 유추할 수 있는 원인은 아래와 같습니다.House Keeping Thread 중.. 공감수 1 댓글수 4 2024. 8. 5.
  • Recording RTSP Stream 📚 Recording RTSP Stream to mp4AI Engine에서 RTSP Stream을 받아서 Export하는 Stream을 받아 그대로 녹화해서 주기적(지정한 시간대)으로 mp4 파일로 저장하는 기능을 개발 할 일이 생겼습니다.Spring의 application.yml 파일에서 녹화 주기 시간을 2개 받아 (ex: 11:00 ~ 12:00 / 13:00 ~ 15:00) 해당 시간에만 녹화를 하도록 구현하였습니다.📚 application.ymlThread Pool은 시간을 체크해 녹화를 할지 말지 결정하는 Thread 1개 + 실제 녹화를 수행하는 Thread를 고려해,최소 3개의 Thread가 필요하므로 넉넉하게 최소 5개로 잡아줍니다.# Thread Pool thread: cor.. 공감수 0 댓글수 0 2024. 7. 29.
  • Nginx Static Contents Server 📚 Nginx Static Contents Server이번에 구현해본 것은 Spring Rest API로 받는 MultiPart Form Data(이미지, 영상 파일)를 Nginx에 업로드/다운로드 할 수 있게 서버를 구축해 보았습니다.기본적으로 Docker Container를 사용하며, 기존에 다른 용도의 Nginx 컨테이너가 80포트로 떠있으므로, 이 글에서의 Nginx Container의 컨테이너 내부 Nginx 포트는 9001번을 사용합니다.📚 Nginx Container 설정Nginx Container를 9001번 포트로 포워딩 및 실행시켜 주면서 Local의 /data/nginx와 Container의 /data를 볼륨 마운팅 해줍니다.docker run -d --name nginx --re.. 공감수 2 댓글수 4 2024. 7. 23.
  • Spring AOP - API Verification 공통화, 로깅 📚 Spring AOP - API Verification 공통화이번에 코드 리팩터링 도중 이전에 구현 해두었던 API Filter에서 JWT만 검증하고, 나머지 Request를 요청하는 유저의 권한 등등을 컨트롤러 마다 검증 private method를 쓰거나, 공통 클래스에 넣어서 썼었습니다.Rest Controller 마다 다양한 검증 로직이 존재 하는 상태이고, 그 중 공통화를 할 수 있는 로직들만 묶고 싶어서 알아보다가 기존에 개념만 알고 있던 AOP를 한번 써보자 해서 구현 해보았습니다.검증 로직을 공통화 하기위해 Aspect 기능을 사용하여 검증할 값들을 Security Filter에서 Header로 넣고 API 호출 전, Aspect 클래스에서 검증하는 방향으로 잡았습니다.기본 흐름은 AP.. 공감수 4 댓글수 2 2024. 7. 11.
  • Producer-Consumer Pattern with RabbitMQ 📚 Producer Consumer Pattern기존에 RabbitMQ의 Queue에서 대량의 데이터를 받아서 동시성을 처리할 때 사용하던 방법은,ReentrantLock의 tryLock을 이용해 명시적 Lock을 걸고 임계영역을 보호하는 방법을 사용 중 이었습니다.근데 문제는 평소 AI Engine에서 받은 MQTT 데이터의 흐름이 평상시에는 일정한 개수(1초에 200개 정도) 나오다가AI Engine에 특정 조건이 트리거 되어 특정 모드로 바뀔때 수 없이 많은 데이터가 쏟아져 나올 떄가 있으며, 그 메시지들을 그대로 Consume 해버리게 됩니다.Thread들을 충분히 나누었음에도 부하가 심해 Spring Server가 일시적으로 멈춤, 오작동하거나 API 호출이 안 먹는다거나 이슈들이 많았습니다... 공감수 4 댓글수 0 2024. 6. 25.
  • Prometheus & Grafana - Metric Monitoring Prometheus & Grafana - Status Monitoring각 서버들의 상태 metric들을 수집하는 Prometheus와 그 metric 데이터들을 시각화 해주는 Grafana 구축 방법을 포스팅 합니다.저는 현재 메인 서버가 있고 메인 서버에서 Prometheus를 이용해,하위 서버들의 Metric을 받아 Grafana Dashboard를 통해 서버의 Resource들을 모니터링 할 예정이고,툴 선정하기 전 가볍게 써보고 정하자는 생각으로 일단 간단하게 만들어 보았습니다.Metric 수집 대상 서버 설정Linux ServerMain Server를 설정하기 전, 메트릭 수집을 원하는 서버에 node-exporter 컨테이너를 실행시켜 주면 Sub Server는 설정 완료입니다.Linux에서.. 공감수 0 댓글수 0 2024. 6. 21.
  • DataBufferLimitException - Webflux 버퍼 크기 제한 초과 DataBufferLimitException - Webflux 버퍼 크기 제한 초과WebClient로 Data를 받는 작업 중, WebClient에서 허용하는 Buffer를 초과한 데이터가 들어왔을떄 발생한 에러 해결 기록입니다.아래 API 요청 코드에서 return되는 데이터 중 1개 필드의 값이 Encoding된 Streaming Frame 데이터를 받도록 되어 있었습니다.public Mono getRtspStreamFrame(final String uri) { return webClient.get().uri(uri).retrieve().bodyToMono(String.class); }서버를 실행 시킨 후, 해당 API 요청을 해보니 아래와 같은 에러가 발생했습니다.DataBufferLim.. 공감수 0 댓글수 0 2024. 6. 18.
  • Jenkins CI & CD Jenkins CI & CD + Nginx Reverse Proxy예전에 Declaretive Pipeline 방식의 Blue/Green 무중단 배포와 FreeStyle 방식으로 구현을 했었고그 이후로 아예 안써서 거의 잊어버렸는데, 최근 다시 쓸일이 생겨 재 포스팅합니다.지난번 Nginx의 Reverse Proxy 용도는 Blue/Green 무중단 배포 시 Active/Standby Container의 트래픽 방향 전환용도 였다면이번에 Nginx를 Reverse Proxy로 사용한 이유는 Jenkins와 Product Server는 내부망에 있으므로,Proxy를 이용해 Public WebHook Trigger를 Jenkins 인스턴스에 접근시킬 목적으로 사용합니다.Docker Custom Bridge .. 공감수 0 댓글수 2 2024. 6. 13.
  • 비밀번호 찾기 & 재설정 구현(Google SMTP & Redis) 비밀번호 찾기 & 재설정 기능 구현(Google SMTP)사내 비밀번호 찾기/초기화 기능을 위해 Email 인증을 자체 SMTP 서버를 만들어서 하려다가, 귀찮아서 Google SMTP를 이용하기로 했습니다.우선 Google 계정 설정에 들어가서 아래 2개의 작업을 해줍니다.Multi Factor Authentication(2FA) 활성화App Password 생성그리고 Gmail 탭으로 들어가 Mail 설정의 Forwarding and POP/IMAP 탭에 들어가서 아래와 같이 설정합니다.Spring Boot Server 설정build.gradle 파일에 Mail 추가implementation 'org.springframework.boot:spring-boot-starter-mail'applicatio.. 공감수 1 댓글수 0 2024. 6. 3.
  • NVIDIA-SMI GPL-incompatible module Error NVIDIA-SMI GPL-incompatible module Error서버에서 Docker Container로 GPU를 사용하는 딥러닝 프로세스를 실행중에 강제적인 시스템 종료 시,NVIDIA Driver가 깨지는 현상이 있어서 해결한 기록을 포스팅합니다.이번에 서버 재기동이 필요하여 실수로 GPU를 사용하는 Docker Container를 내리지 않고 서버를 종료를 한건지Container 실행 시 NVIDIA Driver에 Crash가 났다는 에러가 떴습니다.그래서 dmesg | grep -i nvidia 명령을 입력해 시스템 커널 로그와 NVIDIA 에러 로그를 보니 아래와 같이,nvidia.ko 모듈이 GPL 전용 심볼을 사용하도록 되어 있었습니다.이는 NVIDIA Driver와 커널의 특정 심볼.. 공감수 3 댓글수 0 2024. 5. 29.
  • Pandas란? Numpy와의 차이점 & 행렬 히트맵 생성 PandasPandas는 파이썬에서 데이터 조작과 분석을 위한 고성능 라이브러리입니다. 주로 구조화된 데이터, 특히 표 형식의 데이터를 다루는 데 사용됩니다. Pandas는 데이터를 효율적으로 로드, 조작, 분석, 그리고 시각화할 수 있는 다양한 기능을 제공합니다.주요 기능데이터 구조Series: 1차원 배열 형태의 데이터 구조로, 인덱스를 가진다.DataFrame: 2차원 표 형태의 데이터 구조로, 여러 열을 포함하며 각 열은 Series 객체로 구성된다.데이터 입출력CSV, Excel, SQL, JSON 등 다양한 파일 형식에서 데이터를 읽고 쓸 수 있다.데이터 정제 및 조작결측치 처리: fillna(), dropna()데이터 필터링: 조건에 맞는 데이터 선택데이터 정렬: sort_values()데이.. 공감수 0 댓글수 0 2024. 5. 25.
  • CronTab - Application Health Check CronTab 사용법특정 IP:Port에 대한 HTTP Request가 Connection Refused가 뜰 때 Docker Container를 Kill 하고 재기동 하는 Cron을 예시로 작성해 보겠습니다.skw@skw:~$ curl -X GET http://localhost:3546/v1/core/instancescurl: (7) Failed to connect to localhost port 3546 after 0 ms: Connection refusedCronTab에 적용할 Shell Script를 먼저 작성해줍니다.로그 파일의 크기를 50MB로 제한50MB가 넘어갈 시 오래된 로그 삭제 및 새로운 로그로 대체특정 API에 GET 요청을 보냈을 때 Connection Refused가 아니라면 ".. 공감수 2 댓글수 0 2024. 5. 23.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.