목록 Language/Java, Kotlin (20)
배경지난 글에서 논 블록킹을 구현하는 두 가지 방법을 확인했다.Netty는 커널의 I/O 멀티플렉싱 연산을 사용하고, DelayQueue는 커널 단의 스레드 제어 연산을 사용했다. 이번에는 CAS와 CountDownLatch가 궁금했다.사실 CAS와 CountDownLatch도 앞선 두 경우와 비슷할 것 같다는 생각에 파본 것인데 아니었다.CAS는 전혀 다른 방법으로 동작했고, CountDownLatch는 짬뽕이었다. 나는 컴퓨터공학을 전공했다. 부끄럽지만 컴퓨터구조와 운영체제 수업을 가장 재밌게 수강했다.앞선 멀티 플렉싱이라는 키워드도, 앞으로 얘기할 커널 모드와 시스템 콜도, 다 공부한 개념인데 참 낯설다.오랜만에 복습할 겸, 운영체제와 자바 개발을 스르륵 녹일 수 있는 글이 되었으면 좋겠다는 생각..
배경우리 회사는 IoT 기기를 다루고 있다. 보다 더 넓은 서비스를 제공하기 위해, 회사의 제품을 더 큰 국내 IoT 플랫폼에 연동이 가능하게 만드는 게 내 일이다. 외부 플랫폼에서 우리 회사 기기를 제어할 수 있는 Api를 개발하고, 반대로 외부 플랫폼으로 기기 이벤트를 전달해야 한다. 이번에 신규 기기를 연동시키면서 재밌는 요구 사항이 있었다. 특정 이벤트가 들어오면 외부 플랫폼 측으로 A를 전달하고, 1분 후에 B를 전달해야 했다. 이벤트 파이프라인은 바쁘기에 1분을 블록킹 대기할 수 없다. 옆자리 형이 Mono.delay를 사용한 논 블록킹으로 딜레이 로직을 구현하였고, 이를 리뷰하다가 Mono.delay의 동작 방식을 파보게 되었다. 이를 정리해보려고 한다. I/O Multiplexing을 사용..
GC와 Stop the world JVM의 가비지컬렉터는 힙 영역의 메모리에서 더 이상 사용되지 않는 자원을 정리하는 역할을 한다. 이때 사용되지 않는다란 다른 지역 변수, static 변수, 파라미터, JNI의 객체, 다른 힙 영역의 객체 등에서 더 이상 참조되지 않는 것을 말한다. 아래 그림에서 빨간색으로 표시된 Unreachable objects는 GC의 대상이 된다. 이때 자원을 정리하는 과정에서 새로운 객체가 할당되거나 객체 간 연결이 생길 경우를 방지하기 위해, GC를 위한 스레드를 제외한 모든 스레드의 작업이 중단된다. 이런 GC를 위한 애플리케이션 전체 중단 시간을 Stop the world라고 한다. ( 보다 자세한 STW가 필요한 이유 ) 두가지 GC와 처리 영역들 Stop the wo..
결과를 먼저 보면..원했던 결과부터 소개하고자 한다. 내 라이브러리를 만들어 사람들한테 소개하는 것. 딱 아래처럼 사용자들이 gradle이나 maven의 dependency로 내가 만든 모듈을 import 해 사용하도록 하고 싶었다. dependencies { ... implementation 'com.github.ecsimsw:fast-crud:0.0.1'} maven central repository는 절차가 까다로워, 좀 더 편하게 jitpack을 사용하기로 했고 Spring boot 모듈을 사용했기 때문에 생겼던 문제들과 해결 팁을 소개하고자 한다. (예시에서 나온 fast-crud가 이번에 만들어 배포한 것인데, Spring boot - JPA 프로젝트에서 Entity에 어노테이션 하..
Local Maven Repository에 Gradle project 라이브러리 배포 1. build.gradle 수정 - plugins : 'java' -> 'java-library' 수정 / id 'maven-publish' 추가 plugins { id 'java-library' id 'maven-publish' } - 라이브러리 정보 기입 publishing { publications { maven(MavenPublication) { groupId = 'com.ecsimsw.fastCrud' // groupId artifactId = 'library' // artifactId version = '0.0.1-SNAPSHOT' // version from components.java } } } 2. s..
Optional로 Null 을 알리는 습관 어떤 로직의 계산 결과가 없음을 알리는 방법으로 가장 쉬운 것은 역시 null을 반환해버리는 것이라고 생각한다. 그 계산 결과를 받아서 처리하는 다음 로직에서 null을 어떻게 처리할지를 전혀 신경쓰지 않는다면 말이다. 그렇다면 반환된 결과가 null인지 매번 if문으로 체크를 해야할 것이다. null이 가능함을 생각하지 못하고 오류를 만들 여지가 있고, 처리한다고 하더라도 가독성이 좋지 못한 코드를 만들어야할 것이다. 자바에서도 직접적인 null 비교 (ex, car == null)를 피할 수 있도록 Objects 클래스에 isNull(), nonNull(), requireNonNull() 과 같은 메소드를 제공하고 있다. Optional을 사용하면 계산의 결..
HashSet의 출력이 고정된 것 같아(@조엘) 우아한테크코스에서 함께 공부하는 친구가 좋은 대화 주제를 찾아주었다. 어느날 찾아와서는 HashSet의 순서에도 뭔가 규칙이 있을 것 같다는 얘기를 하는 것이다. public class HashSetExample { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add("1"); hashSet.add("2"); hashSet.add("3"); hashSet.add("4"); hashSet.add("5"); hashSet.add("6"); hashSet.a..
0. '좋은 코드'을 먼저 정의하자. 성능이 우선시 되어야 하는 상황, 가독성이 우선시 되어야 하는 상황 꼼꼼한 예외처리와 테스트가 우선시 되어야하는 상황, 빠르게 구현이 먼저 필요한 상황 객체지향, 테스트 코드, 성능을 생각하다가 가독성이 떨어지는 상황을 만들고 싶진 않다. 1. 불변 객체를 만들자 객체를 신뢰할 수 있다. Thread-safe하다. 참조가 꼬이는 일이 없다. Collections.unmodifiableList 보다는 방어적 복사를 사용한다. (참조 자체를 끊는다) 2. 컨트롤러의 다이어트가 필요하다. 컨트롤러는 조립하는 역할로 생각한다. 컨트롤러에 속성를 두지 않는다. / 상태를 만들지 않는다. 컨트롤러가 더럽다면 로직을 추상화해서 관련 객체와 로직을 포함하는 도메인 객체 또는 서비스..