본문 바로가기

ScheduledThreadPoolExecutor에서 주의할 점. (ThreadPool의 배신, 동작 방법을 알지 못하고 쓴 사람의 삽질) ThreadPool을 조심해라? 이 글을 쓰게 된 이유는 나의 안일함 때문이었다. 주기적으로 장비의 데이터를 수집하고 메세지를 만들어서 상위 시스템으로 데이터를 전송해야 하는 업무를 하고 있어서 ScheduledThreadPoolExecutor를 사용하게 되었다. 이미 13개월전에 Timer를 비롯해서 정확한 주기로 작업을 실행해주는 것이라며 자랑스럽게(?) 올린 포스트가 있다. 그런데 ThreadPool 단어에 낚여 오해한 채 사용하고 있었다. 그래서 그 문제를 주의하고 정리하는 차원에서 글을 작성한다. ThreadPool하면 떠오는 것 자주 보이는 것 중 생각나는 것은 DBCP나 WAS의 ThreadPool이 떠오른다. 간단하게 설명하면, 각각의 Request에 대해서 각각의 쓰레드를 생성해서 수행하..
How does @Async work? @Async를 지금까지 잘 못 쓰고 있었습니다(@Async 사용할 때 주의해야 할 것, 사용법) @Async in Spring boot 스프링 부트에서 개발자에게 비동기 처리를 손쉽게 할 수 있도록 다양한 방법을 제공하고 있다. 대세는 Reactive stack, CompletableFuture를 쓰겠으나 역시 가장 쉬운 방법으로는 @Async annotation을 적용하는 것이다. 그래서 필자도 @Async를 비동기 작업이 필요한 메서드에 덕지덕지 발라놨으나 제대로 작동하지 않는 것을 알게 되었고 주의해야 할 내용과 잘 회피하는 방법(?)을 생각해봤다. @Async 사용법 많은 블로그에도 정리가 잘 나와있는 방법이다. 1. @EnableAsync로 @Async를 쓰겠다고 스프링에게 알린다. 2. 비동기로 수행되었으면 하는 메서드위에 @Async를 적용한다. 스프링 가이드에도 마찬가지로 설명해준다...
@Scheduled 사용법, 스케줄러 커스터마이징을 통한 제어(+스케줄러에 등록한 작업 중지하는 방법, 배치 효과, 정확한 주기 작업 사용법) @Scheduled 사용법 주기적인 작업이 있을 때 @Scheduled 애노테이션을 사용하면 쉽게 적용할 수 있다. ex) linux의 crontab 1. @EnableScheduling Annotation을 적어서 스케줄링을 사용한다는 것을 알린다. @EnableScheduling @SpringBootApplication public class SchedulerApplication { public static void main(String[] args) { SpringApplication.run(SchedulerApplication.class, args); } } 2. 하위 패키지의 클래스에서 주기적으로 수행해야할 메서드 위에 @Scheduled Annotation을 붙인다. @Scheduled(fix..
Stream foreach 성능 테스트 (stream을 사용하지 말아야할 때는 언제일까로 시작된 간단한 테스트) Stream foreach 반복문 테스트 자바 Stream을 이용한지 꽤 됐다. 필자가 개인적으로 Stream을 사용하는 이유는 가독성이 좋아지기 때문이다. (가장 큰 이유) 예전에 Stream이 막 등장했을 시기에는 Stream이 어색하고 전통적인 for loop에 익숙한 개발자와 같이 개발할 수 있기 때문에 Stream 도입을 유의하자고 많이 했다. 근데 요즘에는 고민 없이 사용할 만큼 Stream을 많이 사용한다. 필자 또한 Stream을 잘 이용하는데 문제는 적재적소에 사용하지 못하는 점이다. 여기서 적재적소라 함은 Stream이 더 유용할 때 사용하는 것이다. 보통 map(), flatMap()등을 이용해야할 때나 이용하면 더 작업이 간결하고 성능상에도 이득이 있을 때 사용하는 것을 권장하는 것..
spring boot yaml 파일에 쓰기! jackson-dataformat-yaml을 이용한 방법(snakeyaml? how to write to yaml file in spring boot) Spring boot에서 yaml 파일에 쓰기 Spring boot에서 보통 application.yml 파일이나 application.properties 파일에 설정값들을 적고 @ConfigurationProperties을 이용해서 Bean으로 등록해서 사용하는 게 일반적이다. 그래서 그런지 yaml 파일에 쓰는 것은 인터넷에 많이 안 나온다. 아래에서 아주 간단하게 써볼 예정이다. 필자가 yaml 파일에 쓰는 것을 생각하게된 이유는 서버 애플리케이션 운영 중에 설정 값을 변경하고 싶고, 서버 애플리케이션이 꺼졌다가 다시 실행되더라도 설정 값을 유지하고 싶었기 때문이다. 간단하게 데이터베이스에 설정 값을 저장하면 되지만...? 필자는 서버 애플리케이션을 개발하지만 DB를 내 마음대로 달 수가 없는 환경..
Springboot hystrix 사용기 (hystrix로 마이크로 서비스 간의 서비스 호출 실패를 방지해보자) Hystrix란? hystrix는 netflix에서 만든 라이브러리로 마이크로 서비스 아키텍처에서 분산된 서비스간 통신이 원활하지 않은 경우에 각 서비스가 장애 내성과 지연 내성을 갖게하도록 도와주는 라이브러리다. 결국 키워드는 통신 문제 극복이다. 라이브러리 적용 배경 기존의 모놀리틱 아키텍처에서는 A모듈의 A메서드에서 B모듈의 B메서드를 호출할 때, 이 메서드 호출에 실패하는 것은 아예 고려하지 않았다. 그럴 일이 없었기 때문이다. 그런데 마이크로 서비스 아키텍처에서는 다르다. 주문 서비스가 배송 서비스의 API를 호출했을 때 실패할 수 있다는 것이다. 위와 같은 상황에서 별다른 처리를 안했다면 배송 서비스에 문제가 있다는 이유로 주문 서비스도 어디선가 문제가 생기게 될 것이고, 주문 서비스를 호출하..
Deploy Springboot on heroku (히로쿠에 스프링부트 애플리케이션 배포하는 방법, 그대로 따라하면 5분만에 배포 가능!) 스프링부트 히로쿠에 배포하기 Spring cloud config를 공부하던 중에 Git의 webhook 기능을 써보고 싶었다. webhook 기능을 사용하려면 로컬 서버가 아닌 원격에 서버를 띄워야 한다(?)는 글을 보고 급하게 배포하는 방법을 찾아보고 정리하기로 했다. 무조건 원격이어야 하는지는 아직 확실하지 않지만 겸사겸사 배포를 한다. 예전에 개인프로젝트를 할 때는 AWS에 무료 인스턴스를 생성해서 했었다. 1년간 무료로 제공해주는 것을 사용했었는데 AWS에 등록한 카드 결제가 한번 이루어진 이후로 무서워서 heroku의 무료 서버를 이용해본다. 히로쿠 배포 가이드 따라하기 1. 히로쿠(heroku) 사이트에 가입을 한다. 오른쪽 상단에 sign up을 누르면 나오는 화면인데 특별한 것 없이 간단한..
HTTP Header 정리, 각 Http Header가 갖는 의미를 알아야 Http를 배운 것이다. HTTP Header 정리를 하는 이유 KOCW의 "컴퓨터 네트워크 - 한양대학교 이석복 교수님" 강의 중에 이런 표현이 있다."TCP를 이해하려면 TCP Header를 이해하면 된다.""UDP를 이해하려면 UDP Header를 이해하면 된다."실제로 토씨 하나 안 틀리고 위와 같이 말씀하신 것은 아니지만 비슷한 문장(맥락)이었다.결국, 어떤 프로토콜을 이해하려면 프로토콜의 헤더만 알면 된다는 얘기었다.왜 그럴까?특정 프로토콜의 헤더의 내용은 특정 프로토콜의 기능을 제공하기 위해 담고 있는 최소한의 정보기 때문이다.헤더에 그 프로토콜에 불필요한 내용을 담으면 네트워크로 전송되는 데이터의 크기가 커져서 빠른 전송이 불가능하기 때문에 프로토콜을 설계할 때부터 꼭 필요한 내용만 담아야 하고, 모든 기능이 표현..