나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Java 17

AtomicIntegerFieldUpdater

멀티 스레드 환경에서 원자성을 보장하는 Integer 변수가 필요하다면 대체로 AtomicInteger를 많이 사용한다. 그런데 AtomicInteger를 클래스 내부 변수에 추가해 사용하면 클래스 객체를 만들 때 마다 내부에 AtomicInteger 객체도 만들어지므로 이중으로 객체가 생성된다고 볼 수 있다. 예를 들면 아래와 같다. public class BaseClass { private final AtomicInteger counter = new AtomicInteger(); public add() { counter.getAndIncrement(); } } AtomicInteger는 getAndIncrement, getAndDecrement 같은 함수를 제공하며, 멀티 스레드 어플리케이션에서 카운..

Language/Java 2023.04.08

[NIO] WatchService

이번 글에서는 NIO에 포함된 class 중에서 WatchService에 대해서 정리하고자 한다. WatchService는 별도의 thread로 등록된 파일 혹은 디렉토리의 변경사항을 감지해서 이벤트로 리턴한다. 보안 모니터링 및 속성 파일 변경 등 여러 작업에 대한 알림 용도로 사용할 때 유용하다. 예제 코드를 통해서 자세히 살펴보자. WatchService는 FileSystem.newWatchService() 메서드를 통해 생성한다. 생성한 WatchSservice와 감지하고자 하는 종류(ENTRY_MODIFY - 수정)를 등록한다. 무한루프에서 감지를 한다. WathService의 take() 메서드로 변경사항이 발생한 WatchKey를 찾을 때까지 기다린다. WatchKey를 얻으면 WatchEv..

Language/Java 2020.07.28

[multi thread] CountDownLatch

지난 글에서는 Semaphore(이하 세마포어)를 알아봤다. 이번에는 Thread의 동시 실행과 관련된 기능을 하지만 차이가 있어 헷갈리는 CountDownLatch(이하 래치)를 정리한다. 세마포어는 동시에 실행할 수 있는 스레드 수를 조절해서 고정된 리소스의 사용을 제한할 수 있었다. 이해하기 쉽게 예를 들자면, 어떤 공연의 좌석이 정해져 있는데 입구에서 관리자가 좌석 만큼의 인원만 수용하도록 체크하는 것과 같다. 그에 비해 래치는 경마장에서 출발 선상에 있는 말들이 모두 오기를 기다리는 것과 같다. 모든 말이 출발 준비를 마치고 출발선에 오면 경주가 시작되듯 그 시점까지 기다리게 한다. 래치를 생성할 때 수행할 스레드 수를 지정한다. 그리고 await 메서드를 실행하는데, 이 지점에서 모든 스레드가..

Language/Java 2020.06.04

[multi thread] Semaphore

이전에 java.util.concurrent에 포함된 유용한 동기화 클래스들을 정리한 적이 있다. 해당 글은 다음 링크에서 확인할 수 있다. 동기화 클래스들이 더 있는데 이번 글에서는 Semaphore(이하 세마포어)에 대해서 정리한다. 세마포어는 특정 자원이나 특정 연산을 동시에 사용하거나 호출할 수 있는 스레드의 수를 제한하고자 할 때 사용한다. 자원 풀이나 컬렉션의 크기에 제한을 두고자 할 때 유용하다. 세마포어는 생성자에 퍼밋의 숫자를 받아서 해당 수 만큼 동시 사용을 허용한다. 더보기 permit을 사전에서 찾아보면 다음과 같은데 특정 수 만큼 허가증을 발급한다고 이해하자. [불][가]〔…의〕 인가(서), 허가(증), 면허(장) (※특히 여행·노동·수출 등 기한이 있는 것을 말함), 감찰〔for..

Language/Java 2020.06.02

[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류

최근에 yyyyMMddHHmmssSSS String 포멧으로 구성된 날짜형식을 LocalDateTime으로 바꾸는게 필요했다. 그런데 아래와 같이 LocalDateTime.parse 함수로 변환을 시도했는데 오류가 났다. LocalDateTime converted = LocalDateTime.parse(field, DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); 처음 들었던 생각은 pattern에 들어가는 값을 잘못 알고 있었나 의심했다. 그래서 DateTimeFormatter에 기술된 pattern 내용을 찾아보았다. 대문자 S 값이 아래와 같이 밀리세컨드를 의미함을 확인하였다. Symbol Meaning Presentation Examples S fracti..

Language/Java 2019.07.11

[Java9] CompletableFuture 지연 & 시간초과 개선

앞으로 Java 8 이후의 버전들의 추가된 기능들을 공부하면서 정리를 해볼 생각이다. 간단한 내용이라도 블로그에 정리를 하게 되면 머리 속에 남는 내용이 많고, 나중에 버전별로 찾아보기 쉬울 것 같아서다. Java 9에 추가된 기능부터 보게 될 텐데 다음 블로그에 Java 9 의 추가사항을 잘 정리해 주어서 그 내용을 바탕으로 하나씩 세부 내용을 정리해 보고자 한다. 순서대로 하지는 않을 것이고 궁금해서 보게 된 순으로 정리를 하게 될 것 같다. 예전 블로그 글을 통해서 비동기 처리를 위한 CompletableFuture를 소개한 적이 있다. Java 9 에서는 CompletableFuture의 기능을 보완한 부분이 있다. 가장 주요한 변화는 실행 시간의 지연과 타임아웃을 넣을 수 있는 부분이다. 먼저 ..

Language/Java 2019.01.28

[Java8] sorted groupBy

이번에는 간단한 주제로 글을 짧게 남겨보고자 한다. stream의 groupBy와 관련된 내용이다. 개발을 하다가 List에 있는 객체의 특정 값으로 groupBy를 했다. 문제는 groupBy된 결과가 group key로 사용한 값의 순서로 정렬이 되지 않은 부분이다. 데이터 가공의 결과로 group key 값으로 정렬을 해줘야 사용하는 측에서 용이했기 때문이다. 관련해서 java doc을 찾아보았더니 같은 groupBy 함수에서 argument가 다른 함수가 존재했다. public static Collector groupingBy( Function

Language/Java 2019.01.11

[multi thread] java.util.concurrent Part 1

Java에서는 멀티스레드 프로그램을 작성하는데 도움이 되는 많은 클래스들을 구현해 놓았다. java.util.concurrent 패키지 안에 포함되어 있는데 패키지 내용을 잘 설명한 IBM의 문서가 있어서 이해한 만큼 한글로 정리해 보고자 한다. 1. TimeUnitTimeUnit는 class가 아닌 Enum 타입이다. TimeUnit을 사용하면 코드를 읽기 쉽도록 만들어 준다. Java 개발자가 millisecond 단위의 숫자로 코드를 지저분하게 하는 대신 사용하면 좋다. MILLISECONDS, MICROSECONDS에서부터 DAY, HOURS에 이르기까지 개발자가 다루고자 하는 대부분의 범위의 시간을 표현할 수 있다. 또한 enum에 구현된 함수를 통해 시간 단위 변환을 쉽게 해준다. 2. Cop..

Language/Java 2019.01.04

[spring boot] spring boot configuration 이해

spring boot는 spring의 설정을 편리하게 하고 실행가능한 어플리케이션을 만들어주는 프레임웍이다. spring 사용을 간단하게 한 일등공신이다. 필자도 처음 spring을 접할 때 복잡한 설정 때문에 힘들다는 이야기를 많이 들었는데, spring boot가 나온 뒤로 너무 간편하게 어플리케이션이 실행되서 그 동작 방식에 궁금해 했었다. 그 동작방식을 분석한 글을 보았는데 이 블로그은 해당 내용을 정리하였다. spring boot 설정의 비밀은 @EnableAutoConfiguration에 있다. @EnableAutoConfiguration 어노테이션은 spring boot가 클래스 경로에서 찾은 바에 따라 애플리케이션이 필요로 하는 모든 bean을 자동으로 로드한다. @Enable* 어노테이션..

Framework/spring 2017.08.30

Dynamic Proxies

Java의 reflection을 사용하면 런타임시에 동적으로 인터페이스를 구현할 수 있다. java.lang.reflect.Proxy를 사용하게 되는데, 그래서 동적 인터페이스 구현을 동적프록시라고 부르는 이유이기도 하다. 동적 프록시는 다양한 용도로 사용할 수 있다. 예를들면, 데이터베이스 연결 및 트랜잭션 관리, 단위 테스트를 위한 동적 모의 객체 및 인터셉트 목적의 AOP와 유사한 메서드 생성 등에 사용한다. Proxy의 생성public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException Proxy.newProxyInstance()..

Language/Java 2017.08.29

[spring] lifecycle mechanisms

spring은 bean의 생명주기를 관리하는 3가지 방법이 있다. InitializingBean, DisposableBeaninit(), destroy()@PostConstruct, @PreDestroy 하나의 bean에 대해 여러 lifecycle이 구성되어 있을 경우, 아래와 같은 순서대로 실행이 된다. 초기화 순서@PostConstrct → InitializingBean에 정의된 afterPropertiesSet() 콜백 → 사용자 정의 init() 메서드 @PostConstrct @Sevice public class LifeCycleTest { @PostConstruct public void postConstruct() { System.out.println("postConstruct"); } } ..

Framework/spring 2017.08.29
반응형