Java 35

[동시성 톺아보기] Java Thread 주요 관리 API (sleep(), join(), interrupt())

Java Thread의 주요 관리 API인 sleep(), join(), interrupt()는 스레드의 생명주기를 관리하고 동기화하는 데 중요한 역할을 합니다. 이번 글에서는 세 메서드의 특징과 동작방식에 대해 알아보도록 하겠습니다. sleep() - 현재 스레드를 지정된 시간 동안 일시 정지시킨 후, 그 시간이 경과하면 스레드를 실행 대기 상태(RUNNABLE)로 전환합니다. - JVM이 직접 처리할 수 없어 네이티브 메서드와 시스템 호출을 통해 커널 모드에서 수행되며 작업이 완료된 후에 유저 모드로 복귀합니다. - 모니터 락이나 다른 자원을 해제하지 않고 스레드의 실행만 중단시키므로, 이를 사용하는 동안 데드락이 발생할 위험이 있습니다. API 및 예외처리 public static native vo..

Java 2024.03.25

[동시성 톺아보기] Runnable 익명 클래스로 Thread 생성

동시성 톺아보기 시리즈 작성 목적 여러 Thread가 공유 메모리에 동시에 접근할 때 동기화 문제가 발생할 수 있습니다. 이를 깊이 이해하기 위해서, 가장 먼저 Thread 생성 코드를 작성 후 내부 메커니즘을 살펴볼 것입니다. timegate-commerce 선착순 상품 구매 프로젝트를 진행하면서 경험한 동시성 문제를 단순히 해결하는 것을 넘어, 운영체제의 프로세스와 스레드의 기초부터 시작해 동시성 문제를 해결해나가는 깊이있는 학습을 목표로 합니다. 이론 1. 스레드 생성 Thread는 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현함으로써 생성할 수 있습니다. 이 때, 익명 클래스나 람다 표현식을 활용하는 것도 가능합니다. 2. 스레드 실행 start() 메서드를 호출하면, 시스템 ..

Java 2024.03.17

[Java] instanceof 키워드 보단 다형성을 이용하자!

이번 포스팅에서는 instanceof 키워드란 무엇인지 그리고 해당 키워드 사용을 지양해야 하는 이유에 대해 알아보도록 하겠습니다. 핵심 정리 instanceof 키워드를 자주 사용하는 것은 캡슐화, 단일 책임 원칙, 개방-폐쇄 원칙을 위배할 수 있기 때문에 사용을 지양하고, 대신 다형성을 이용하는 것을 권장합니다. instanceof 란? object instanceof type은 객체가 특정 타입의 인스턴스인지를 확인하기 위한 연산자입니다. 이 연산자를 사용하면 런타임에 객체의 타입을 확인할 수 있습니다. 만약 어떤 타입에 대한 instanceof연산의 결과가 true라면 검사한 타입으로 형변환이 가능하다는 것을 뜻합니다. class Animal {} class Dog extends Animal {}..

Java 2023.12.04

[Java] equals()와 hashCode()를 같이 재정의 해야하는 이유

요즘 모의 면접 스터디를 진행하고 있습니다. 이번주 자바 관련 질문을 주고받을 때 객체의 동일성과 동등성에 대한 질문에 저는 이렇게 대답했습니다. 🤔 객체의 동일성과 동등성의 개념에 대해 아시나요? "동일성은 두 객체가 정말 동일한 객체인지, 즉 같은 메모리 주소를 가졌는지의 여부를 확인합니다. 동등성은 두 객체의 값이 같은지 비교합니다. 자바에서는 ==연산자를 통해서 두 객체의 동일성을 비교할 수 있고, equals()를 통해 두 객체의 동등성을 비교할 수 있습니다. 여기서 주의할 점은 equals()를 따로 오버라이드 하지 않으면 두 객체의 hashCode() 값을 비교하게 되므로 두 객체의 equals(), hashCode() 모두 오버라이드 해야 합니다." 그 당시에는 이렇게 답변을 하고 마무리를..

Java 2023.11.20

[Java] String을 초기화하는 방법 - 성능 비교

자바에서 String을 초기화하는 방법에는 두 가지가 있습니다. 1. String a = "Hello"; // 리터럴 사용 2. String a = new String("Hello"); // new키워드 사용 두 방식의 차이점은 무엇일까요? 둘 다 Hello라는 문자열이 생성되지만 방식에 따라 저장되는 위치가 다릅니다. 첫 번째 방법인 리터럴로 선언하면, Hello값을 StringConstantPool에 넣고 참조변수 a는 이를 가리킵니다. (a는 값이 아닌 참조형입니다.) 두 번째 방법으로 new키워드를 사용하면 Hello는 더 이상 StringConstantPool이 아닌 Heap영역에 생성되고 참조변수 a가 이를 가리키게됩니다. 🧐 [정리] 리터럴로 객체를 생성: StringConstantPool을..

Java 2023.11.13

[Java] 자바 변수 타입별 메모리 저장 위치 및 GC 동작원리

이번 포스팅을 통해 자바 변수 타입별 메모리 저장 위치 및 GC의 동작원리에 대해 살펴보겠습니다. 변수의 종류 변수란 하나의 값을 저장할 수 있는 메모리 공간입니다. 변수의 종류에는 primitive type과 reference type이 있으며 기본형 8개를 제외하면 모두 reference type입니다. primitive type (기본형 타입) boolean, char, byte, short, int, long, float, double 변수 저장 위치 primitive type과 reference type은 메모리 어느 영역에 저장이 될까요? primitive type 변수는 stack 영역, reference type변수는 heap 영역에 저장되는데, 그렇다면 여기서 추가적으로 드는 의문이 있습..

Java 2023.11.06

OSIV (Open-(Session)-In-View) 란?

OSIV Hibernate에서는 Open Session In View라 하고, JPA에서는 Open EntityManager In View라 합니다. 관례상 OSIV이라 칭합니다. Session 쿠키, 세션 할 때 그 세션인가요? 아닙니다. DB에 접근할 수 있는 세션입니다. application.yml spring: jpa: open-in-view: true #default open-in-view: true 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있습니다. API라면 클라이언트에게 응답될 때까지 View라면 랜더링 될 때까지 영속성 컨텍스트가 살아있습니다. open-in-view: false 트랜잭션을 종료할 때 영속성 컨텍스트가 닫히므로 Lazy loading 또한 할 수 없습니다. ..

Java/JPA 2022.12.14

연산자, 조건문과 반복문 (2/8)

참고한 repository : https://github.com/vividswan/The_Essence_of_Java_Book_Study 연산자 연산자 : 연산을 수행하는 기호(+, -, *, / 등) 피연산자 : 연산자의 작업 대상 연산자는 피연산자로 연산을 수행한 후 결괏값을 반환합니다. 연산자의 종류 산술 연산자 +, -, *, /, % 비교 연산자 , >=, 비교 > 논리 > 대입 우선순위 단항(1) > 이항(2) > 삼항(3) 우선순위 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽 산술 변환 연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것을 '산술 변환' 또는 '일반 산술 변환'이라 부름 두 피연산자의 타입을 같게 일치 시킴 보다 큰 타입으로 일치 피연산..

자바, 변수, 기본형과 참조형, 상수와 리터럴, 진법, 형변환 (1/8)

토이 프로젝트를 하면서 자바에 대해 중간중간 개념이 헷갈리는 부분이 보였습니다. 예전에 자바의 정석을 1독 한 적 있지만 다시 읽고 처음부터 정리하는 것이 너무 오래 걸릴 것 같아 항상 미뤄왔었습니다. 그러다 우연히 잘 정리된 GitHub repository가 있어 많은 도움을 받았습니다. 이번 시리즈는 하나하나 깊게 개념을 공부해서 정리한 것이 아닌 크게 크게 어떤 개념들이 있는지 마치 도서의 목차를 머릿속에 넣는다는 느낌으로 진행하고자 합니다. 참고한 repository : https://github.com/vividswan/The_Essence_of_Java_Book_Study 자바(Java Programming Language)란? 썬 마이크로시스템즈에서 개발 후 1996년 1월 공식 발표 운영체..

[API 개발 고급] 컬렉션 조회 최적화(페치 조인, 페이징)

앞의 예제에서는 toOne(OneToOne, ManyToOne) 관계만 있었습니다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고, 최적화하는 방법을 알아보는 시간을 가져보겠습니다. 요구사항 "주문내역에서 추가로 주문한 상품 정보를 추가로 조회하자." 그럼 Order 기준으로 컬렉션인 OrderItem와 Item 이 필요합니다. "엔티티 직접 노출"은 이전 시간에 공부했던 것처럼 많은 문제가 있으므로, 컬렉션 조회 최적화에서는 엔티티를 DTO로 변환 한 후 최적화하는 것에 초점을 맞추도록 하겠습니다. V2 : 엔티티를 DTO로 변환(fetch join 사용 X) V3 : 엔티티를 DTO로 변환(fetch join 사용 O) 주문 조회 V2: 엔티티를 DTO로 변환(fetch join 사용 ..

Java/JPA 2022.05.26