본문 바로가기

Java/JAVA

(45)
ThreadPoolTaskExecutor 설정 고민해보기 (feat. 외부 연동 서비스 API 비동기 호출) ThreadPoolTaskExecutor 설정 어떻게 하고 있었나 이 포스트를 읽는 독자들에게 질문 하나를 던져보고 싶다. “외부에 있는 다른 서비스, 예를들면 결제 시스템에 결제 API 요청을 하고 응답을 받아야 하는 상황에서 ThreadPoolTaskExecutor의 설정은 어떻게 하는 것이 적절할까?” 기본적으로 외부 API 요청은 비교적 시간이 오래 걸리는 작업으로 동기 처리를 하지 않을 것이고 동기 처리하지 않는다는 것은 다른 Thread에 작업을 위임할 것이고 그것은 곧 ThreadPool을 관리해야한다는 것이다. @EnableAsync @Configuration public class AsyncConfiguration implements AsyncConfigurer { @Override pu..
Java Stream Collector 반쪽짜리 스트림을 쓰던 그대에게. Advanced Stream! Java Stream "Collector" filter, map, reduce, ... 뭐 이 정도? 이번에 "모던 자바 인 액션"이라는 책을 다시 보면서 반쪽짜리 스트림을 쓰고 있었구나... 하는 생각이 들었습니다. 이전에는 filter, map, reduce, flatmap, ..등 대충 이 정도는 어떻게 동작하는지에 대해서 알고 있고, 실제 업무에서도 사용해봤기 때문에 속칭 "스트림 좀 쓴다!" 하고 있었습니다.( 자부심 ) 그러나 이번에 "Collector"쪽을 보면서 배울 게 아직 많구나 하는 느낌을 받았습니다. Collector를 보고 난 후, 제 코드에서 확인한 것은 스트림에서 대부분의 마무리를 .collect(Collectors.toList()) 로 끝내고 있었던 것입니다. 🐲화룡점정이라 ..
자바 동기화, 어설프게 아는 사람이 더 무섭다(java synchronized에 대한 착각, thread-safe) '동기화'문제로 고민한 썰 동기화 문제 이펙티브 자바를 읽던 중, 아이템 78에 있는 자바 동기화 문제로 다양한 상상(?)을 했던 썰을 풀려고 합니다. import java.util.concurrent.TimeUnit; public class Main { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException{ System.out.println("hello world!"); Thread backgroundThread = new Thread(() -> { int i=0; while(!stopRequested){ i++; } }); backgroundThread.start();..
자바 람다(Java Lambda) 단 하나의 abstract method를 구현하는 함수 자바 람다 입문 1. 람다란? 단 하나의 abstract method를 갖는 인터페이스를 구현한 익명 클래스 인스턴스를 표현하는 함수다. (필자가 생각한 정의다.) 만약, 익명 클래스를 축약 표현(syntactic sugar)한 거라고 생각하면 되냐?! 라고 한다면 그건 또 아니다. 익명클래스는 내부 변수를 가질 수 있으나 람다는 불가능하다. this가 가리키는 것도 다르고 내부 동작도 좀 다르다고 한다. (근데 람다를 쓰면 익명의 클래스가 생성됨) '람다식' 이라고도 표현하는데 대부분 람다를 쓸 때 표현식 즉, "코드 조각"으로 구현하기 때문에 그렇지 않을까한다. 2. 람다는 어떤 문제를 해결하기 위한 기술인가? 자바에서 람다는 함수형 프로그래밍 패러다임으로 전환하기 위한 하나의 '단계'다. 따라서 람..
ScheduledThreadPoolExecutor에서 주의할 점. (ThreadPool의 배신, 동작 방법을 알지 못하고 쓴 사람의 삽질) ThreadPool을 조심해라? 이 글을 쓰게 된 이유는 나의 안일함 때문이었다. 주기적으로 장비의 데이터를 수집하고 메세지를 만들어서 상위 시스템으로 데이터를 전송해야 하는 업무를 하고 있어서 ScheduledThreadPoolExecutor를 사용하게 되었다. 이미 13개월전에 Timer를 비롯해서 정확한 주기로 작업을 실행해주는 것이라며 자랑스럽게(?) 올린 포스트가 있다. 그런데 ThreadPool 단어에 낚여 오해한 채 사용하고 있었다. 그래서 그 문제를 주의하고 정리하는 차원에서 글을 작성한다. ThreadPool하면 떠오는 것 자주 보이는 것 중 생각나는 것은 DBCP나 WAS의 ThreadPool이 떠오른다. 간단하게 설명하면, 각각의 Request에 대해서 각각의 쓰레드를 생성해서 수행하..
Stream foreach 성능 테스트 (stream을 사용하지 말아야할 때는 언제일까로 시작된 간단한 테스트) Stream foreach 반복문 테스트 자바 Stream을 이용한지 꽤 됐다. 필자가 개인적으로 Stream을 사용하는 이유는 가독성이 좋아지기 때문이다. (가장 큰 이유) 예전에 Stream이 막 등장했을 시기에는 Stream이 어색하고 전통적인 for loop에 익숙한 개발자와 같이 개발할 수 있기 때문에 Stream 도입을 유의하자고 많이 했다. 근데 요즘에는 고민 없이 사용할 만큼 Stream을 많이 사용한다. 필자 또한 Stream을 잘 이용하는데 문제는 적재적소에 사용하지 못하는 점이다. 여기서 적재적소라 함은 Stream이 더 유용할 때 사용하는 것이다. 보통 map(), flatMap()등을 이용해야할 때나 이용하면 더 작업이 간결하고 성능상에도 이득이 있을 때 사용하는 것을 권장하는 것..
자바 메서드 '잘' 작성하는 방법, 알면서 못 지키는 것들(이펙티브 자바 스터디 - 메서드) 어떻게 해야 메서드 잘 만들었다고 소문이 날까? 개발을 하면서 가장 많이 하는 일이면서 가장 난해한 것이 메서드 작성이 아닐까 싶다."하나의 메서드에서는 하나의 작업만 한다!" 라는 기본 원칙을 지키려고 하면서도 잘 안된다.사소하게는 private으로 할지 public으로 해야 할지등 정해야할 것들이 너무도 많은 것이 메서드다.역시나 한 번에 제대로 작성하려고하면 어렵다. 대신 유념하면서 고치고 또 고치면서 배우는게 코딩아닐까 싶다.회사를 다닌다면 코드 리뷰를 하는 이유도 올바른, 좋은 메서드를 개발하기 위함이 아닐까 한다.결국 좋은 메서드를 만드려면 기본 원칙을 잘 알고 시도하고 리팩토링을 거쳐봐야 한다. 그래서 아래에 기본 원칙을 소개하려고 한다.메서드 작성 기본 원칙 - 파라미터가 유효한지 검사하라..
일반적인 프로그래밍 원칙(effective java 3판 스터디, 자바에서 경계해야할 것들 간단 정리) 일반적인 프로그래밍에서 하지 말아야할 것 먼저 일반적인 프로그래밍에서 하지 말아야할 것에 대해 말하기 전에 소개하고 싶은 것이 있다.이 글은 이펙티브 자바 3판을 읽으면서 처음쓰는 글이다.그런데 포스트의 내용은 첫 장에 나오는 내용이 아니라 중간에 나오는 내용이다.왜 이렇게 글을 쓰냐면 이 책은 스터디 방법이 좀 달라야한다고 생각하기 때문이다.이 책을 한 번 읽고 완전히 이해하고 적용하는 사람은 없다고 생각한다.그냥 쭉 읽고 이해한 부분을 정리하고 적용할 수 있는 건 해보면 그걸로 충분한 것 같다.이해하지 못한 부분은 또 읽으면 되니까. 좀 더 레벨업하고 와서 보면 또 다르게 이해가 되는 것도 있겠지 하는 마음의 스터디 방법이다. (추천합니다.)각설하고 간단하게 정리하며 한 번 더 공부해본다.1. 지역 ..