반응형

Java/일반 12

Java Virtual Thread

Virtual ThreadJava 21에서 정식으로 도입된 Virtual Thread는 기존의 Kernel-level thread와 User-level thread를 1:1 매핑하여 사용하는 JVM 스레드 모델을 개선한 여러 개의 가상 스레드를 하나의 네이티브 스레드에 할당하여 사용하는 방법입니다.Java ThreadJava thread는 ExecutorService를 두어 JVM 내부에서 스레드를 관리/실행합니다. 이렇게 ExecutorService를 통해 스케줄링되는 Thread는 JVM을 통해 커널 스레드를 만들어 실행합니다.Virtual Thread란Virtual Thread는 기존 Kernel thread(1) : User thread(1)의 구조가 아니라 Kernel thread(1): Use..

Java/일반 2025.07.12

Stream 사용시 주의사항

Stream 재사용 문제 IntStream stream = IntStream.of(1, 2, 3); stream.forEach(x -> System.out.println(x)); //첫번째 stream 사용 stream.forEach(x -> System.out.println(x)); //두번째 stream 사용 stream은 오직 한번만 소비할 수 있기 때문에 두 번째 사용할 경우 IllegalStateException이 발생할 수 있습니다. Stream의 동작 순서 Arrays.stream(new String[] {"c", "python", "java"}) .filter(word -> { System.out.println("filter method : " + word); return word.leng..

Java/일반 2023.07.05

JPA

JPA의 개념 JPA는 자바에서 ORM 기술 표준으로 사용되는 인터페이스의 모음입니다. 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크입니다. ORM(Object Relational Mapping) ORM이란 우리가 일반적으로 알고 있는 어플리케이션 Class와 RDB의 테이블을 매핑한단느 뜻이며 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화해주는 것입니다. ORM의 장점 SQL 문이 아닌 Method를 통해 DB를 조작할 수 있어 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중 Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임 객체지항적인 코드..

Java/일반 2023.01.22

Java Serialize

직렬화(Serialize)란 Serialize란 Java에서 사용되는 Object 혹은 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술을 의미합니다. 직렬화 하는 방법 java.io.ObjectOutputStream을 사용해서 직렬화를 진행합니다. 역직렬화(Deserialize)란 Deserialzie란 byte 형태로 변환된 데이터를 원래대로 Java의 Object나 데이터로 변환하는 기술을 의미합니다. 역직렬화 조건 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있음 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야함 직렬화 단점 직렬화하고 있는 시스템과 역직렬화를 진행하는 시스템의 모델에 차이가 있을 경우에 Exception이 ..

Java/일반 2022.11.27

String Pool

String의 생성방식 new 연산자를 이용한 방식 new를 통해 String을 생성하면 Heap Memory 영역에 존재하게 됩니다. 리터럴을 이용한 방식 String Pool이라는 영역에 존재하게 됩니다. String Pool의 개념 String Pool이란 Java Heap Memory에 있는 String 데이터 저장소입니다. 위의 그림을 통해 다음과 같은 사실을 알 수 있습니다. 리터럴로 생성한 String 객체는 String Pool에 들어갑니다. 리터럴로 생성한 객체의 값(ex. "Cat")이 이미 String Pool에 존재한다면, 해당 객체는 String Pool의 reference를 참조합니다. new 연산자로 생성한 String 객체는 같은 값이 String Pool에 존재하더라도 별개..

Java/일반 2022.07.22

Netty

Netty란 기존의 소켓 프로그래밍은 클라이언트가 접속하게 되면 스레드를 할당해야하는데, 많은 클라이언트가 접속을 하게 될 경우 그 숫자만큼 스레드를 생성해야해서 리소스가 낭비되고 문맥 교환이나 입출력 데이터에 관련한 무한 대기 현상이 발생하는 문제가 있었습니다. 이러한 네트워크 문제를 해결하기 위해 만들어진 방법이 NIO(Non-Blocking Input Output)입니다. 그리고 이러한 NIO 방식으로 동작하는 네트워크 프레임워크가 바로 Netty입니다. Selector는 시스템 이벤트 통지 API를 사용하여 하나의 스레드로 동시에 많은 IO를 담당할 수 있습니다. 즉, 적은 수의 스레드로 더 많은 Connection을 취할 수 있어서 메모리 관리에 이점이 생기고 컨텍스트 스위치에 대한 오버헤드가 ..

Java/일반 2022.05.26

JIT Compiler

JIT Compiler의 개념 JIT Compiler는 바이트 코트들 CPU로 직접 보낼 수 있는 명령어로 바꾸는 프로그램입니다. 일반적으로 컴파일러는 개발자와 최종 사용자를 위한 애플리케이션의 속도를 결정하는데 있어 핵심입니다. JIT Compiler는 성능 최적화를 위해 애플리케이션 런타임을 향상시킬 수 있습니다. JIT Compiler를 사용하는 이유 JIT Compiler는 같은 코드를 매번 해석하지 않고 실행할 때, 컴파일을 하면서 해당 코드를 캐싱합니다. 이후에는 변경된 부분만 컴파일하고 나머지는 캐싱된 코드를 사용하기 때문에 실행 능력이 크게 향상됩니다. 또한, JIT Compiler는 바이트 코드를 컴파일하는 과정에서 스택 연산을 레지스터 연산으로 변환하거나 레지스터 할당을 통한 메모리 접..

Java/일반 2021.10.08

Java Heap 메모리 구조

Java 8 이전까지의 Heap 메모리 구조 Young Young 영역은 Eden 영역과 Survivor 영역으로 구성됩니다. Eden 영역은 객체가 Heap에 최초로 할당되는 장소입니다. 만약 Eden 영역이 꽉 차게 되면 객체의 사용중 여부를 따져 만약 사용 중인 객체이면 Survivor 영역으로 넘기고, 사용 되지 않는 객체이면 그냥 남겨 둡니다. 사용 중인 모든 객체가 Survivor 영역으로 넘어가면 Eden 영역을 정리합니다. Survivor 영역은 Eden에서 살아남은 객체들이 잠시 머무르는 공간입니다. Survivor 영역은 두 개로 구성되는데 참조 중인 객체를 이동할 때는 하나의 Survivor 영역만 사용하게 됩니다. Old Young 영역에서 정리되지 않고 계속 사용중인 객체들은 Ol..

Java/일반 2021.08.23

Reactive Stream

Reactive Stream이란 계속적으로 들어오는 스트림 데이터를 효율적으로 처리하기 위해서는 비동기 시스템이 효과적입니다. 비동기 처리를 하면서 가장 중요한 문제는 데이터 처리가 목적지의 리소스 소비를 예측가능한 범위에서 신중하게 제어할 수 있어야 하는 것입니다. 비동기는 네트워크를 통한 서버간의 협업 또는 단일 서버에서 컴퓨팅 리소스를 동시에 사용할 때 주로 사용됩니다. Reactive Stream의 주된 목적은 비동기의 경계를 명확히 하여 스트림 데이터의 교환을 효과적으로 관리하는 것입니다. 즉, 비동기로 데이터를 처리하는 시스템에 어느 정도의 데이터가 들어올지 예측가능하도록 하는 것입니다. Reactive Stream에서는 BackPressure이 이를 달성할 수있게 해주는 중요한 부분입니다. ..

Java/일반 2020.09.09

Java Module

Moudle이 등장하게 된 배경 Java는 public, private와 같은 클래스 수준의 한정자가 있습니다. 그러나 이 한정자들은 클래스까지만 유효하고 패키지를 넘어서면 힘을 잃어버리게 됩니다. 이러한 캡슐화에 대한 지원 부족으로 인해 Java Module이 등장했습니다. 예를 들어, 우리는 JAR로 제공된 패키지의 클래스를 보면 어느 클래스를 써야할 지 알 수 가 없습니다. 대부분의 클래스가 public이고 접근이 가능합니다. 그 안에는 API 설계자가 내부 구현을 위해 만든 내부용 API 문서도 있습니다. 기존에는 내부용 API에 접근이 가능합니다. JAR로 제공되고 문서화가 잘 되더라도 클래스와 메소드가 public이면 API 설계자가 의도하지 않은 호출이 발생할 수 있습니다. Module이란 ..

Java/일반 2020.09.07
반응형