일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백엔드
- iterable
- Lock
- Synchronized
- db
- 가비지 컬렉터
- 스프링
- 자바
- 데이터 타입
- MVCC
- Locking Read
- Di
- iterator
- MySQL
- text
- 동시성
- jpa
- 동시성 문제
- reflection
- Atomic Type
- foreach
- gc
- CAS
- java
- 가비지 컬렉션
- Varchar
- Today
- Total
목록Java (16)
과정을 즐기자
Java 21 LTS 버전부터 정식으로 Virtual Thread가 포함되었습니다.Virtual Thread 란 무엇일까요? 오라클 공식 문서에 있는 표현은 다음과 같습니다."Virtual threads are lightweight threads that reduce the effort of writing, maintaining, and debugging high-throughput concurrent applications." 간단하게 해석해보면 처리량이 높은 애플리케이션을 만들 때 유지 관리 및 디버깅의 노력을 줄여주는 경량 쓰레드입니다.경량 쓰레드라는 말을 처음 보았을 때 CPU 코어를 더 잘 활용하기 위해 쓰레드 개념이 나온 것처럼 경량 쓰레드가 나온 이유도뭔가 비슷한 이유가 아닐까 라는 생각만 ..
가장 기본적인 자료 구조 중 하나로 배열이 있습니다. 배열은 미리 일정 크기만큼 메모리를 할당한 후 데이터를 순차적으로 저장하는 자료구조입니다. Java 에서의 배열 Java에서는 다음과 같이 배열을 생성하고 사용할 수 있습니다. int[] array1 = new int[5]; 32 비트 정수형 데이터 타입인 int를 총 5개를 미리 메모리에 할당합니다. 물론 선언을 할 때 원소를 미리 저장할 수도 있습니다. int[] array2 = new int[]{1,2,3,4,5}; 그렇다면 이러한 배열과 내부 원소들은 메모리의 어디 부분에 할당되는 것일까요? 배열도 객체다 Java에서는 배열도 객체라고 할 수 있습니다. 배열을 생성할 때는 다른 객체 생성과 마찬가지로 new 키워드를 이용해서 배열을 생성합니다...
자바 빈 규약이란 자바에서 재사용 가능한 소프트웨어 컴포넌트를 만들기 위해 정한 규칙을 말합니다. 다음과 같은 자바 빈 규약이 있습니다. 1. 기본 생성자를 반드시 가져야 한다 2. 빈이 패키지화 되어 있어야 한다 3. 멤버 변수의 접근자는 private으로 선언한다 4. 멤버 변수에 접근하기 위한 public 접근자인 getter/setter 메소드가 존재해야 한다 여기서 자바 빈 규약의 4번 예시처럼 getter/setter를 사용하여 외부에서 데이터를 가져오고 변경할 수 있습니다. 하지만 setter의 경우 외부에서 객체의 필드를 마음대로 바꿀 수 있으며 setter라는 메소드가 어떠한 이유로 필드의 값을 변경했는 지를 파악하기 어렵습니다. 따라서 필드의 값을 변경해야 한다면 의미있는 메소드명을 사..
개발을 하다보면 직렬화라는 단어를 종종 듣게됩니다. JSON, XML, 프로토콜 버퍼, Java Serialization... 등등 그렇다면 이러한 직렬화는 정확히 무엇이고 왜 사용하는 것일까요? 이번 글에서는 직렬화에 대해 알아보겠습니다. 직렬화란? 직렬화는 현재 데이터 구조나 오브젝트 상태를 영속적으로 저장하거나 다른 환경으로 전달하기 위해 어떠한 정해진 포맷으로 변환하는 과정입니다. 반대로 역직렬화는 직렬화된 포맷을 원래의 데이터 구조나 오브젝트 상태로 복구하는 과정입니다. 그렇다면 이러한 직렬화는 왜 필요한 것일까요? 이를 알아보기 전에 먼저 스택, 힙과 관련된 메모리에 대한 이해가 필요합니다. 스택, 힙 자바를 예시로 들겠습니다. 정수형의 데이터 a, b가 있을 때 이 값들은 모두 스택에 저장되..
자바는 멀티 쓰레드 기반의 동시성 프로그래밍을 지원합니다. 따라서 CPU 코어가 많아질 수록 이를 잘 활용할 수 있습니다.하지만 멀티 쓰레드이기 때문에 반드시 동시성 문제가 따라옵니다.이번 글에서는 Java에서 동시성 문제를 해결하기 위해 사용하는 synchronized, Lock Stripping, Atomic Type에 대해 알아보겠습니다.synchronized자바에서 synchronized 키워드는 메소드 또는 블록을 동기화하는데 사용합니다.synchronized가 붙은 메소드나 블록은 멀티 쓰레드이더라도 동시에 하나의 쓰레드만 접근할 수 있도록 합니다.객체를 생성하면 각 객체마다 내부적으로 Lock을 가지고 있는데 synchronized를 사용하면 이러한 Lock을 획득하고Lock을 획득할 수 없..
자바의 for 문에는 일반 for 문과 foreach (향상된 for 문)이 있습니다. 일반 for 문 for (int i = 0; i < 10; i++) { System.out.println(members[i]); } foreach 문 for (Member member : members) { System.out.println(member); } 지금까지 foreach 문이 간결하고 가독성도 좋기 때문에 자주 사용했습니다. 하지만 foreach 문은 언제 사용할 수 있고 내부 동작 방식에 대해서 의문점이 생겼습니다. 이번 글에서는 foreach 문은 어떤 내부 동작 방식으로 인해 어떠한 조건일 때 사용할 수 있는 지에 대해 알아보겠습니다. 먼저 Iterator, Iterable 인터페이스에 대해 알아보겠..
스프링 프레임워크를 이용해서 개발을 하다보면 DI라는 말을 자주 듣게 됩니다. 제어의 역전인 IoC는 제어의 권한을 제 3자에게 넘겼다는 말입니다.DI는 IoC의 일종으로 의존관계 주입을 개발자가 직접하는 것이 아니라 프레임워크에게 넘겼다는 말입니다.이러한 사실을 알고 사용하고 있었지만 스프링이 어떻게 의존 관계 주입을 해주는지 그 내부 동작 방식을 알아보고 싶었습니다. 또한 JPA를 사용하다보면 기본 생성자를 필수로 생성해야 한다는 것도 알고 있었지만 어떤 원리로 동작하는지는 정확히 알지 못했습니다. 이 2가지의 공통점이 있는데 바로 Java Reflection을 사용한다는 사실입니다.이번 글에서는 Java Reflection에 대해 알아보고 지금까지 궁금증을 가지고 있었던 내부 동작 방식에 대해 알아..
프로그래밍 언어는 메모리 관리 주체에 따라 크게 2가지로 나눌 수 있습니다. 언어 자체적으로 메모리를 관리해주는 Managed 언어 (Java, C#)와 개발자가 직접 메모리를 관리하는 Unmanaged 언어 (C, C++)입니다. Managed 언어는 메모리에 할당된 객체를 개발자가 관리를 하지 않아도 되고 Garbage Collector가 대신해줍니다. 이번 글에서는 Garbage Collection에 대해 알아보겠습니다. JVM 메모리 구조 Garbage Collector가 메모리의 어떤 부분을 관리해주는 지 알아보기 위해 먼저 JVM의 메모리 구조에 대해 알아보겠습니다. JVM 메모리는 크게 5가지 영역으로 나뉩니다. 1. Method Area Method Area에는 자바 컴파일러에 의해 변환된..
이전 글에서 자바 쓰레드 관리의 시작에 대해 알아보았습니다. 자바 쓰레드 관리의 시작 OS 쓰레드와 유저 쓰레드 자바 쓰레드 관리에 대해 알아보기 전에 OS 쓰레드와 유저 쓰레드에 대해 먼저 알아보겠습니다. OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드로 CPU 에서 실제 320hwany.tistory.com 자바는 멀티 쓰레드를 이용해 동시성 프로그래밍을 가능하게 했습니다. 하지만 Thread, Runnable은 매번 쓰레드의 생성과 종료를 직접해야 하며 쓰레드 관리가 어려웠습니다. 또한 쓰레드를 실행만 할 수 있을 뿐 결과 값을 반환할 수는 없었습니다. Callable, Future의 등장 자바가 발전하면서 Callable, Future가 등장했습니다. @FunctionalInterfac..
OS 쓰레드와 유저 쓰레드자바 쓰레드 관리에 대해 알아보기 전에 OS 쓰레드와 유저 쓰레드에 대해 먼저 알아보겠습니다.OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드로 CPU 에서 실제로 실행되는 단위로 CPU 스케줄링의 단위입니다.OS 쓰레드의 컨텍스트 스위칭은 커널이 개입하고 비용이 발생하게 됩니다.유저 쓰레드는 OS 커널이 아닌 User Program과 관련되어 있는 쓰레드로 쓰레드 개념을 프로그래밍 레벨에서 추상화한 것입니다.이때 유저 쓰레드가 CPU에서 실행되려면 OS 쓰레드와 반드시 연결되어야 합니다. 유저 쓰레드와 OS 쓰레드를 연결하는 모델로는 One-to-One, Many-to-One, Many-to-Many 모델이 있습니다.자바의 초창기는 Many-to-One 모델이었습니다...