나누고 싶은 개발 이야기

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

Language/Java 14

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

Proxy를 통한 Restful API 호출 by Java

최근에 방화벽으로 외부 인터넷과 연결이 되지 않은 서버의 데이터를 외부로 전송할 케이스가 생겼다. 그래서 특정 서버와의 연결만 허용하는 Proxy 서버를 하나 두어서 처리하고자 했다. 간단한 내용에 대해서 글로 정리한 이유는 Proxy 호출을 할 때 인증 방법과 Java에서 Proxy 설정을 어떻게 하는지 찾아본 내용을 기록하기 위함이다. 정리할 내용은 크게 2가지 이다. 1. Java Proxy 설정 2. Proxy 인증 1. Java Proxy 설정Proxy 설정을 시스템 전체 설정으로 하지 않고, Java Application 단위로 설정하려고 할 때 어떻게 하는지 찾았다. 오라클 자바 문서 중에 Java Networking and Proxies에 관련 내용이 기술되어 있다. 먼저 시스템 prope..

Language/Java 2019.12.09

[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

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

[Java8] 람다란 무엇인가?

Java8의 추가된 큰 기능 중 하나로 람다를 첫번째로 든다. 그러면 람다란 무엇일까? 정리해보자. 람다를 한마디로 표현하면 메서드로 전달할 수 있는 익명 클래스를 단순화한 표현식이다. 익명클래스(anonymous class)는 무엇인가? 익명클래스는 이름이 없는 로컬 클래스 입니다. 익명 클래스는 new 연산자를 사용하여 하나의 간결한 표현식으로 정의되고 인스턴스화된다. 로컬 클래스는 Java 코드 블럭이지만 익명클래스는 표현식이므로 메서드 호출과 같은 표현식의 일부로 포함될 수 있다. 아래 코드를 살펴보면 Thread를 생성할 때, 파마미터로 익명클래스를 생성해서 전달함을 볼 수 있다. public class ThreadTest { public static void main(String[] args)..

Language/Java 2017.08.09
반응형