1. Join을 사용한 코루틴 순차 처리코루틴을 사용하다 보면 특정 코루틴이 완료된 후에 다음 코루틴을 실행해야 하는 상황이 발생한다. 이런 순차적인 실행을 위해 Job 객체의 join 함수를 사용할 수 있다.fun main() = runBlockint { val updateTokenJob = launch(Dispatchers.IO) { // 토큰 업데이트 작업 } updateTokenJob.join() // updateTokenJob이 완료될 때까지 대기 val networkCallJob = launch(Dispatchers.IO) { // 네트워크 호출 작업 }}위 예제에서 updateTokenJob.join()이 호출되면, runBlocking 코루틴은 updat..
Study
1. JVM 프로세스와 스레드코틀린 애플리케이션이 실행되면 JVM이 프로세스를 시작하고 메인 스레드를 생성하여 메인 함수의 코드를 수행한다. 메인 스레드는 프로세스의 생명주기와 밀접하게 연관되어 있어, 프로세스의 시작부터 종료까지 함께 실행된다. JVM 프로세스는 기본적으로 이 단일 메인 스레드로 동작하며, 메인 함수의 코드가 모두 실행되거나 메인 스레드가 비정상적으로 종료되면 프로세스도 함께 종료된다. 🤔 메인 스레드가 항상 프로세스의 끝을 함께할까?그렇지 않다. JVM의 프로세스는 모든 사용자 스레드가 종료될 때 종료되며, 메인 스레드는 여러 사용자 스레드 중 하나일 뿐이다. 따라서 멀티 스레드 환경에서는 메인 스레드에서 예외가 발생하더라도, 다른 사용자 스레드가 실행 중이라면 프로세스는 계속 실행..
1️⃣ 오픈소스 레포지토리 ForkFork를 통해 다른 사용자(또는 조직)의 레포지토리를 내 레포지토리로 복제한다.GitHub의 Fork와 Clone은 모두 레포지토리를 가져오지만 단순히 원격 저장소의 내용을 로컬 작업 환경으로 가져오는 Clone과는 달리 Fork는 변경사항을 원본 저장소에 반영할지 여부를 선택할 수 있어 주로 오픈 소스 프로젝트에 기여할 때 사용된다. 2️⃣Fork 한 레포지토리 Clone Fork를 통해 복사된 내 레포지토리를 IDE로 Clone 해 로컬 개발 환경에서 작업하기 위한 준비를 한다. 3️⃣ 소스코드 수정 및 commit, push오픈 소스에서 수정할 코드 및 문서를 찾아 수정한다. 나의 경우 Spring Boot 코드를 읽으며 수정할 내용을 찾았다.오픈 소스들은 보통 ..
이 글은 오라클의 공식문서의 다이어그램에서 온 의문으로부터 시작되었다. ✅ Method 영역(Perm Gen)은 Non-heap 영역이다오라클 공식 문서를 보면 Method 영역을 Non-heap 영역으로 구분한다는 것을 찾아볼 수 있다. 위 다이어그램은 JVM의 메모리 튜닝 인자를 설명하고 있는데 메모리 튜닝 인자 관점에서 볼 때 Perm Gen은 힙 영역의 일부가 아니라는 것을 확실하게 확인할 수 있다. 또, 힙 공간이 고갈되면 아래와 같은 메세지를 받지만java.lang.OutOfMemoryError: Heap space spacePerm Gen 영역이 고갈되면 다른 에러 메세지를 받는다.java.lang.OutOfMemoryError: PermGen space 그렇다면 왜 오라클의 공식문서에는 ..
런타임 데이터 영역(Runtime Data Area)은 실제 클래스 파일이 적재되는 곳으로 JVM이 OS로부터 자바 프로그램 실행을 위한 데이터와 명령어를 저장하기 위해 할당받는 메모리 공간이다. 런타임 데이터 영역은 크게 다섯 가지 영역으로 나뉜다.메서드 영역 (Method Area)힙 영역 (Heap Area)스택 영역 (Stack Area)PC 레지스터 (Program Counter Register)네이티브 메서드 스택 (Native Method Stack) 그리고 Java에서 Thread가 공유하는 영역과 공유하지 않는 영역은 다음과 같다.🫧 Thread가 공유하는 영역힙 영역메서드 영역🫧 Thread가 공유하지 않는 영역스택 영역PC 레지스터 영역네이티브 메서드 스택 🌱 PC 레지스터 (P..
🌱 지역 / 매개변수 위치 🫧 기본 자료형 (정수, 소수, boolean) public class Test { public static void main(String[] args) { // 지역변수 int intValue = 10; double doubleValue = 3.14; char charValue = 'A'; boolean booleanValue = true; // 매개변수 public static void printInt(int number) { System.out.println("Received int value: " + number); } } } 메서드 내에 생성되거나 전달된 지역/매개변수에 할당된 값이 기본 자료형일 경우 stack에 저장되고 메서드 종료 시 소멸된다. 🫧 참조 자료형 (..
🌱 트랜잭션 격리 수준(Transaction Isolation Level) 트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션 격리 수준은 격리(고립) 수준이 낮은 순서대로 READ UNCOMMITED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE가 존재한다. READ UNCOMMITED READ COMMITTED REPEATABLE READ SERIALIZABLE 참고로 아래의 예제들은 모두 자동 커밋(AUTO COMMIT)이 false인 상태에서만 발생한다. 1️⃣ READ UNCOMMITED (Level 0..
🌲 equals와 hashCode란?equals와 hashCode는 모든 Java 객체의 부모 객체인 Object 클래스에 정의되어 있다.따라서 Java의 모든 객체는 Object 클래스에 정의된 equals와 hashCode 함수를 상속받고 있다. 🌱 equals() 란?public boolean equals(Object obj) { return (this == obj);} 🫧 '==' 연산자와 동일성(identity)자바에서 '==' 연산자는 객체의 메모리 주소를 비교하기 때문에 두 객체가 서로 다른 메모리 주소에 할당되어 있다면 두 객체를 다른 것으로 판단한다. 따라서 '==' 연산자는 주로 기본 타입의 값이나 객체의 참조 자체를 비교할 때 사용된다.하지만 동등성을 올바르게 판단하지 못하..
인스턴스화를 막는 이유 1. 불필요한 인스턴스 생성 방지 어떤 클래스가 여러 번 인스턴스화되어도 동일한 객체를 반환해야 할 때가 있다. 이런 경우, 생성자를 직접 호출하지 못하게 하고 미리 생성된 인스턴스를 제공함으로써 불필요한 객체 생성을 방지해 메모리와 성능을 최적화할 수 있다. 2. 상태의 불변성 유지 비밀번호 해싱 라이브러리같이 해싱된 비밀번호를 변경하지 못하도록 하기 위해 인스턴스화를 막을 수 있다. 3. 싱글톤 패턴 싱글톤은 어떤 클래스의 인스턴스가 오직 하나만 존재해야 하는 경우 사용된다. 이 경우, 클래스의 생성자를 private로 만들어 외부에서 인스턴스를 생성하지 못하게 하고, 정적 메서드나 정적 변수를 사용하여 하나의 인스턴스를 관리한다. 4. 상속 제어 어떤 클래스를 다른 클래스에서..