Dev 88

Thread 를 알아보자 - Synchronized, Lock과 Condition, volatile (3/3)

예제 소스 링크 스레드의 동기화란? 멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다. 따라서 한 스레드가 특정 작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는 것이 필요하다. 그래서 도입된 개념이 바로 임계영역과 잠금이다. 공유 데이터를 사용하는 영역을 임계영역으로 지정하고, 공유데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다. 이렇게 한 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것이 쓰레드의 동기화, synchronization이라고 한다. 임계 영역은 락을 얻은 단 하나의 쓰레드만 출입이 가능하며, 객체 한개에 하나의 락이 할당된다...

Dev/Java 2024.04.15

Thread 를 알아보자 - mulit vs single, PrioirtyQueue, ThreadGroup, 실행제어( 2 / 3 )

예제 소스 링크 언제 싱글쓰레드가 멀티쓰레드보다 효율적일까? 이전 게시글에도 적었지만, 프로세스는 하나또는 그 이상의 쓰레드를 가질수 있으며 하나의 쓰레드는 하나의 코어에 의해 실행 된다. 어떤 작업을 하나의 쓰레드가 처리하는 것을 싱글 쓰레드, 여러개의 쓰레드가 처리하는 것을 멀티 쓰레드라고 한다. 하나의 일을 여러명이 나누어서 하면 빨리 끝나듯 쓰레드도 여러개면 작업이 빠르게 진행 될 것 같지만 그렇지는 않다. 그 이유는 작업 전환 시간(context switcing)에 시간이 걸리기 때문이다. 작업 전환 시간(context swtiching) 프로세스 또는 쓰레드 간의 작업 전환을 의미한다. 작업 전환을 할 때 현재 진행 중인 작업의 상태나 다음에 실행해야할 위치 같은 정보를 저장하고 읽어오는 시간..

Dev/Java 2024.04.01

Springboot + ElasticSearch 연동하기 ( feat. RDBMS 에서 Like 를 사용할 때 보다 검색 속도가 얼마나 향상 될까? )

이전 포스팅은 여기로 2024.03.13 - [개발/ELK] - MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X ) MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X ) Open API 통해서 데이터를 긁어온 뒤 검색 엔진에 ElasticSearch를 연동하는 토이 프로젝트를 해보고 싶어서 사용 방법을 익히기 위해 설치를 진행했다. 새로운 내용을 학습할 때 인프런을 통해 많이 zigo-autumn.tistory.com 개발환경 IDE : intelliJ FrameWork : springboot 3.2.3 Launguage java 17 DB : h2 ElasticSearch : 8.7.1 BuildTool: Gradle Plugin: spring..

Dev/ELK 2024.03.26

Thread 를 알아보자 - 프로세스와 쓰레드, 태스킹과 쓰레딩, start() vs run() ( 1 / 3 )

예제 소스 링크 프로세스와 스레드 프로세스 프로세스는 간단히 말해서 실행 중인 프로그램을 나타낸다. 프로그램을 실행하면, OS로부터 실행에 필요한 자원을 할당받아 프로세스가 된다. 프로세스는 데이터와 메모리등의 자원, 그리고 스레드로 구성되어 있다. 스레드 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 스레드이다. 그래서 모든 프로그램에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 '멀티 쓰레드 프로세스'라고 한다. 쉽게 말하면 프로세스는 회사, 스레드는 직원이라고 생각하면 된다. 하나의 프로세스가 가질 수 있는 쓰레드는 제한되어 있지 않지만 스레드가 작업을 수행하는데 개별적인 메모리공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 ..

Dev/Java 2024.03.25

열거형(enums) - 열거형을 통해 사용할 수 있는 방법들

열거형은 열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. 일반적으로 타입이 달라도 값이 같으면 조건식 결과가 true였으나, 자바의 열거형에서는 실제 값이 달라도 타입이 다르면 조건식의 결과가 false 가 된다. // 열거형을 쓰기전 class Card { static final int CLOVER = 0; static final int HEART 1; static final int DIAMOND =2; static final int SPADE = 3; static final int TWO = 0; static final int THREE = 1; static final int FOUR = 2; final int kind; final int num; } // ..

Dev/Java 2024.03.25

지네릭스(Generics) - 지네릭스를 알면 API 문서를 읽기 쉽다!

예제 소스 링크 지네릭스를 왜 사용해야 할까? 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입을 체크해 주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다. 즉, 지네릭스를 사용하면 타입의 안정성을 제공받을 수 있고, 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. T(Type), E(Element), K(Key), V(Value)가 의미하는 것은 무엇일까? 이들은 기호의 종류만 다를 뿐 '임의의 참조형 타입'을 의미한다. 기존에는 다양한 종류의 타입을 다루는 메서드의 매개변수나 리턴타입으로 Object 타입의 참조변수를 많이 사용했고, 그로 인해 형변환이 불가피했지만 지네릭을 사용하면 Obje..

Dev/Java 2024.03.25

Comparator 와 Comparable 의 차이 - 객체 내부 비교와 외부 비교 관점

예제 소스 링크 Comparator와 Comparable 이란 뭘까? 둘 다 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable Comparable 을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들을 의미하며 주로 Integer와 같은 wrapper 클래스와 String, Date, File과 같은 것들을 말한다. 기본적으로 오름차순으로 구현되어 있다. 아래 소스는 실제로 java.lang 라이브러리에 있는 Integer, String 같은 클래스를 확인해본 것이다. 각각 기준에 맞게 Comparable interface를 구현해서 사용하고 있다. // Integer public final class Integer extends Numbe..

Dev/Java 2024.03.25

Java Stream ( feat. Optional 과 collect )

이전 포스팅은 여기로 2024.03.11 - [개발/java] - 람다식 ( Lamda expression ) / @FunctionalInterface 예제 소스 링크 본 게시글의 예제 코드를 이해하기 위해서는 람다식과 메서드 참조 ( 더블 콜론 )에 대한 이해가 있어야 하므로, 해당 내용에 대해 모른다면 위에 있는 이전 포스팅을 읽어보는 것을 추천한다. 왜 스트림이 등장했을까? for, Iterator 를 이용해서 코드를 짜게 되면, 재사용성과 가독성이 떨어진다는 단점이 있다. Collection 이나 Iterator 만 봐도 같은 기능의 메서드들이 중복되어 있고, List와 배열 정렬 시에도 동일한 sort() 함수를 사용하지만 각각 Collections.sort(), Array.sort()를 사용해..

Dev/Java 2024.03.18

OSIV 를 통한 성능 최적화 ( Connection 관리 관점 )

OSIV 란 뭘까? OSIV는 Open Session In View의 약자로 spring.kpa.open-in-view 옵션을 통해 application.properties 또는 yml 파일에서 On / Off 설정을 할 수 있다. OSIV의 기본값은 true 이다. ( on 상태를 의미한다. ) 기본적으로, 트랜잭션을 시작할 때 JPA의 영속성 콘텍스트는 데이터베이스 커넥션을 가져온다. OSIV는 트랜잭션이 끝나도 사용자에게 Response 가 반환 될 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 끝까지 살려주는 역할을 한다. OSIV - On OSIV 가 On 이면 위 그림과 같이 요청에서 응답까지 이르는 모든 범위에서 영속성 콘텍스트와 데이터베이스 커넥션이 살아 있다. 이렇게 모든 범위에서 영속성..

Dev/JPA 2024.03.15

JPA 에서 Collection 조회시 주의점 및 성능 튜닝 방법

Entity -> Dto 변환 시 Collection 도 잊지 말고 변환해야 한다 Collection을 dto 로 변환하여 리턴할 경우에도 엔티티에 대한 의존도를 끊어야 한다. 예시 코드를 보자. 흐름도 Order 엔티티 정보 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 @JoinColumn(name = "member_id") private Me..

Dev/JPA 2024.03.15