Executor 프레임워크2 - Executor 프레임워크가 등장한 이유
·
언어/Java
앞선 글에서 직접 스레드를 사용하는 경우 발생할 수 있는 문제점에 대해서 살펴보았다. 이번 글에서는 그에 대한 해결책인 Executor 프레임워크에 대해서 알아보겠다.먼저 이전 글에서 확인해보았던 직접 스레드를 사용할 떄 발생하는 문제점을 확인해보자. 직접 스레드를 사용할 때의 문제점Java에서 병렬 작업을 위해 Thread 클래스를 직접 생성하고 실행하는 방식은 간단해 보이지만, 실제 서비스 환경에서는 몇 가지 심각한 문제들이 발생한다.스레드 재사용의 어려움Thread 인스턴스는 한 번만 실행할 수 있으며, 매번 새로운 스레드를 생성하는 것은 리소스 낭비다.스레드 관리의 복잡성스레드의 생명주기 관리, 예외 처리, 동기화 등은 개발자가 직접 처리해야 하며, 이는 오류를 유발할 수 있다.Runnable 인..
Executor 프레임워크1 - 스레드를 직접 사용할 때 문제점
·
언어/Java
스레드를 직접 사용할 때 문제점 실무에서 스레드를 직접 생성해서 사용하면 다음과 같은 3가지 문제를 가지고 있다. 스레드 생성 시간으로 인한 성능 문제스레드 관리 문제 Runnable 인터페이스의 불편함 스레드 생성 시간으로 인한 성능 문제스레드를 사용하려면 먼저 스레드를 생성해야 한다. 그런데 스레드는 다음과 같은 이유로 매우 무겁다.메모리 할당 : 각 스레드는 자신만의 호출 스택(call stack)을 가지고 있어야 한다. 이 호출 스택은 스레드가 실행되는 동안 사용하는 메모리 공간이다. 따라서 스레드를 생성할 때는 이 호출 스택을 위한 메모리를 할당해야 한다.운영체제 자원 사용 : 스레드를 생성하는 작업은 운영체제 커널 수준에서 이루어지며, 시스템 콜(system call)을 통해 처리된다. 이는 ..
synchronized 키워드 이해도 체크
·
언어/Java
1 - 40억까지 더하는 코드를 n 개의 스레드로 병렬로 돌아가도록 짜 보세요.각 스레드가 서로 다른 범위를 나눠서 합계를 구하고,main 스레드는 join()으로 모든 스레드가 끝날 때까지 기다리는 방식을 사용합니다. Thread t1 = new Thread(() -> { /* 1 ~ 10억 합 */ });Thread t2 = new Thread(() -> { /* 10억+1 ~ 20억 합 */ });...t1.start();t2.start();t1.join(); // main 스레드는 여기서 대기t2.join();join(): 스레드가 끝날 때까지 main 스레드가 대기하게 만듭니다.이렇게 하면 main 스레드가 모든 작업이 끝난 뒤 결과를 처리할 수 있어요.synchronized 메서드의 동기화 ..
Set은 왜 내부적으로 Map을 사용할까?
·
언어/Java
Java에서 HashSet, LinkedHashSet, TreeSet 같은 Set 컬렉션을 보면, 그 내부에 Map이 사용되고 있다.근데 왜 Set인데 Map을 쓸까?Set과 Map, 둘의 차이는?자료구조저장 방식Set값(Value)만 저장 (중복 ❌)MapKey → Value 쌍으로 저장 (Key 중복 ❌)Set: 그냥 값만 저장하고, 중복을 허용하지 않는 게 특징이다.Map: Key로 저장하고, Key 중복을 허용하지 않는다.→ 중복을 막는 핵심은 Key!Set이 Map을 쓰는 이유Set의 핵심은 중복 없는 값 저장이다.Map의 Key 구조를 활용하면, 중복 검사 + 저장 + 조회를 이미 검증된 Map 로직으로 효율적으로 재사용할 수 있다.덕분에 코드 중복을 줄이고 유지보수가 쉬워진다.Value 없이..
TreeSet은 왜 이진 탐색 트리 대신 레드-블랙 트리를 사용할까?
·
언어/Java
TreeSet 이란? 중복을 허용하지 않고,자동으로 정렬되는 Set 컬렉션입니다.내부적으로는 TreeMap을 사용하고,TreeMap의 핵심 자료구조가 바로 레드-블랙 트리(Red-Black Tree)이다!이진 탐색 트리란 어떤 문제가 있을까? 이진 탐색 트리는:왼쪽 삽입 순서에 따라 한쪽으로 쏠릴 수 있는 문제가 있다.예시: 오름차순으로 삽입1 → 2 → 3 → 4 → 5 [1] \ [2] \ [3] \ [4] \ [5]이 구조는 거의 LinkedList처럼 변형되어,검색/삽입 성능이 O(log n)에서 O(n)으로 퇴화할 수 있다.레드-블랙 트리(Red-Black Tree)는 어떻게 다른가?레드-블랙 트리는 트리의 균형을 자동으로 맞춰주는 이진 ..
제네릭 타입 소거
·
언어/Java
타입 소거 제네릭은 자바 컴파일 단계에서만 사용되고, 컴파일 이후에는 제네릭 정보가 삭제된다. 제네릭에 사용한 타입 매개변수가 모두 사라지는 것이다. 쉽게 이야기하면 컴파일 전인 .java 파일에는 제네릭 타입 매개변수가 존재하지만, 컴파일 이후인 .class 파일에는 제네릭 타입 매개변수가 존재하지 않을 것이다. 타입 매개변수 미제한의 경우 컴파일 전 public class GenericBox { private T value; public void set(T value) { this.value = value; } public T get() { return value; } }...void main() { ..
Git 브랜치 전략, Git-Flow, Github-Flow
·
프로젝트
Git 브랜치 전략 브랜치 전략이란 여러 개발자가 하나의 저장소를 사용하는 환경에서 저장소를 효과적으로 활용하기 위한 work-flow 이다.  브랜치 생성, 삭제, 병합 등 git 의 유연한 구조를 활용해서, 각 개발자들의 혼란을 최대한 줄이며 다양한 방식으로 소스를 관리하는 역할을 한다.  즉, 브랜치 생성에 규칙을 만들어서 협업을 유연하게 하는 방법론을 말한다 . 만약 브랜치 전략이 없다면? 브랜치 전략이 없을 때 단점은 다음과 같다. 어떤 브랜치가 최신 브랜치지?어떤 브랜치를 끌고와서 개발을 시작해야 하지? 어디에 push 해야하지? 핫픽스를 해야 하는데 어떤 브랜치를 기준으로 수정해야 할까? 배포 버전은 어떤 걸 골라야하지? 가장 널리 사용되는 브랜치 전략은 다음 2가지이다. git-flow 전..
Github Issue & PR 관리
·
프로젝트
이번 프로젝트를 시작하면서, Github Project 내 Issue 를 만들어 관리를 하고 있습니다. 그런데 회사에서는 SVN 을 사용하다보니, 사용방법이 익숙하지 않아 히스토리가 꼬여버리는 둥 .. 용도에 맞지 못하게 사용하고 있다는 생각이 들었는데요, 이참에 Github Issue & PR 관리에 대해서 한번 정리하는 시간을 갖고자 합니다.  Issue 란?이슈(Issue) 란 프로젝트에서 작업해야 할 단위라고 할 수 있습니다.  개발해야야 하는 기능, 수정해야할 버그, 리팩터링 해야 할 코드 등 프로젝트에서 발생되는 작업들을 이슈로 생성하여 관리합니다. 이슈를 생성해 관리한다면, 이슈에 대한 커밋 내역들을 하나의 이슈 페이지에서 관리가 가능하며, 이슈 관련 정보를 한 곳에서 묶어서 관리할 수 있다..