1. Record 클래스의 개념과 도입 배경[ 개발 트렌드의 변화 ]21세기는 두말 할 필요 없이 데이터가 중심인 세상이다. 많은 데이터들이 기록되고 수치화되며, 데이터를 분석하여 얻은 결과는 수 많은 의사결정의 근거가 된다. 또한 MSA의 시대가 도래함에 따라 데이터의 교환이 점점 더 중요해지고 있다. 자바는 객체 지향 프로그래밍(OOP, Object-Oriented Programming) 언어로서, 객체를 중심으로 설계되고 개발되어 왔다. 그러나 최근 몇 년간 프로그래밍 패러다임이 변화하면서 OOP의 한계가 드러나고 있다. 특히 과거에는 장점이라고 평가받았던 객체지향 프로그래밍의 복잡한 엔티티(Entity)나 바운더리(Boundary) 등이 점점 덜 중요해지고, 순수한 데이터의 교환이 더욱 중요해지는..

1. 네이티브 메서드와 블로킹 I/O로 대기중인 자바 스레드의 상태(Java Thread State on Blocking I/O with Native Method)[ 문제에 대한 이해 ]오늘날 대부분의 서비스들은 서버-클라이언트 모델을 기반으로 하고 있고, 스프링과 같은 애플리케이션의 내부 역시 다음과 같은 서버 소켓을 통한 연결, 그리고 통신이 기반을 이루게 된다.그렇다면 다음과 같이 원시적인 형태의 ServerSocket 생성하고, 요청에 대한 수립을 기다리는 accept()를 호출중인 코드가 존재한다고 하자.fun main(args: Array) { val serverSocket = ServerSocket(13232) val socket = serverSocket.accept() s..

1. 프로젝트 발할라(Project Valhalla)를 통해 알아보는 자바 언어의 진화 [ 프로젝트 발할라(Project Valhalla) 란? ]프로젝트 발할라는 객체 지향 프로그래밍의 추상화와 원시 타입의 뛰어난 성능 특성을 결합한 값 객체(value objects)의 도입과 제네릭(generic)에 대한 원시 타입의 지원을 강화하는 등의 작업을 통해 많은 개선을 이뤄내고자 하고 있다. 대표적으로 다음과 같은 기능들이 여러 배포에 걸쳐 추가될 것이다.Value Classes and Objects: 객체에 identity를 부여하지 않음으로써 최적화된 인코딩을 가능하게 하는 값 클래스와 객체를 도입함Null-Restricted and Nullable Types: 널-인지 타입에 대한 언어적 지원과 널-..

1. HashMap의 내부 동작 깊게 들여다보기(HashMap Internals with Separate Chaining & Treeify, Capacity & LoadFactor 등)[ HashMap의 해시 버킷 Separate Chaining과 Treeify ]HahsMap은 내부적으로 노드 배열로 저장되는데, 이때 각 노드 배열의 요소를 해시 버킷이라고 한다. HashMap을 생성할 때 별도의 해시 버킷 배열의 capacity를 지정하지 않는다면 기본값 16으로 할당된다. 이러한 부분을 그림으로 표현하면 다음과 같다. HashMap은 데이터를 저장할 키에 대한 해시코드(hashcode)를 계산하고 해당 값을 배열의 크기로 나누어, 데이터를 저장할 해시 버킷의 인덱스를 구하고, 해당 해시 버킷에 ..

1. 스템의 성능과 volatile 키워드를 통한 메모리 가시성에 대한 이해(Memory Visiblilty)[ 시스템의 성능에 대한 이해, 성능은 어디에서 오는가? ]무어의 법칙(Moore's law)과 컴퓨터 구조(Computer Architecture)무어의 법칙(Moore's law)은 인텔의 창업자 중 한명인 고든 무어(Gorden Moore)가 명명한 것으로, 경제적으로 생산 가능한 칩 위의 트랜지스터 수는 대략 2년마다 거의 2배로 증가함을 뜻한다.무어의 법칙이 성능이 아닌 트랜지스터 수를 기준으로 한다는 것은, 소프트웨어 엔지니어가 하드웨어 엔지니어로부터 얻어낼 수 있는 성능이 2배가 아님을 의미한다.성능에는 여러 가지 복합작인 요소가 작용하는데, 그럼에도 불구하고 성능에 가장 결정적인 요..