나누고 싶은 개발 이야기

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

Language 28

Scala의 Enum

scala의 enum은 java와 같이 enum 키워드로 존재하지 않았다. 이 문장은 scala 3이 도입되면서 거짓이 되었다. scala 3에서 새롭게 디자인되었는데 scala 2의 문제점은 무엇이었는지 궁금해서 찾아보게 됐다. 1. Enumeration scala 2에서는 앞서 말한 대로 enum 키워드가 존재하지 않는다. 대신 Enumeration 클래스를 상속해서 사용한다. scala API 문서에 올라온 코드를 예를 들면 아래와 같이 사용한다. object WeekDay extends Enumeration { type WeekDay = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } 별도로 지정한 이름으로 Enumeration을 생성하려면 Valu..

Language/scala 2023.12.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

[Scala] evaluation strategies in scala

이번 글에서는 scala의 evaluation strategy에 대해서 정리한다. 해당 글은 Evaluation strategies in scala 글의 내용을 토대로 샘플 코드를 달리해서 작성했다. 먼저 evaluation strategy의 개념부터 살펴보고 종류별로 구분해 보자. evaluation strategy evaluation strategy(이하 평가전략)이란 함수에 전달한 인자값을 함수가 실행될 때, 언제 어떻게 결정하는지 평가함을 말한다. Java에 익숙했던 필자로서는 당연히 함수에 값을 전달해 주는거 아닌가?라고 생각이 들었지만, 개념상 크게 2가지가 존재하며 큰 차이가 있다. 평가 전략의 2가지는 다음과 같다. Strict evaluation 함수에 인자값을 전달하기 전에 인자값을 평..

Language/scala 2020.04.03

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

[Scala] with 키워드 정리

기존 scala로 된 프로젝트를 파악하던 중 다음과 같은 코드를 보고 with 키워드가 헷갈리기 시작했다. val mapper = new ObjectMapper() with ScalaObjectMapper 그래서 필자와 같이 scala와 친숙해 지려고 노력하는 분들을 위해 짧게 with 키워드를 짧게 정리해 보고자 한다. scala 책을 살펴보면 with 키워드가 처음 나오는 부분은 trait가 아닐까 싶다. trait는 캡슐화된 메소드와 필드 정의를 재사용하는데 사용된다. 클래스 상속도 재사용이 가능하지만 하나의 부모 클래스만 가져야 한다는 부분이 다르다. trait는 믹스인을 통해 여러개의 trait를 조합할 수 있다. 믹스인을 할 때 사용하는 키워드가 with이다. 그럼 실제 사례를 들어보자. 먼저..

Language/scala 2019.04.26

[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
반응형