[Java] synchronized block 이해하고 사용하기
·
Java
글을 읽기 전 자바의 모니터에 대한 지식이 없다면 필자의 다른 글 자바 객체의 Lock 과 Monitor 이해하기를 먼저 읽는 것을 추천드립니다.synchronized 개요[synchronized 키워드란?]synchronized 키워드는 자바에서 멀티스레드 환경에서 동기화를 보장하기 위해 사용된다. 특정 블록이나 메서드를 임계영역(critical section)으로 설정하여 하나의 스레드만 접근할 수 있도록 만들어 데이터 불일치 문제(race condition)를 방지하고, 여러 스레드가 공유 리소스를 안전하게 사용할 수 있도록 하는 것이 목적이다. [synchronized 는 어떻게 적용하는가?]메서드 전체를 감쌀지, 문장만 감쌀지, static 을 붙일지 말지 선택해서 적용할 수 있다. 메서드에 s..
[Java] 자바 객체의 Lock 과 Monitor 이해하기
·
Java
Java 객체의 Lock 이해하기[Lock 은 무엇이며 왜 필요한가?]락은 쓰레드 동기화(synchronization) 를 위해 필요하다.쓰레드 동기화: 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것프로세스가 싱글쓰레드인 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티쓰레드인 경우 여러 쓰레드가 같은 프로세스 내 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다. 예를 들어 쓰레드A 가 작업하던 공유데이터를 쓰레드B가 임의로 변경했다면, 쓰레드 A가 다시 제어권을 받아 나머지 작업을 마쳤을 때 원래 의도했던 결과와 다른 결과를 얻는 동기화문제가 발생한다. 이러한 일이 발생하는 것을 방지하기 위해 한 ..
[Java] Blocking Queue 이해하고 사용해보기
·
Java
Blocking Queue 이해하기[Blocking Queue 란?]Blocking Queue는 Thread-safe(스레드 안전)한 큐를 구현하기 위한 인터페이스다. Java5에서 java.util.concurrent 패키지에 추가되었다. 큐의 기본 작업에 블로킹을 추가해 큐가 가득 찼을 때 항목을 추가하려는 스레드나, 큐가 비었을 때 항목을 제거하려는 스레드를 대기 상태로 만든다. 블록킹은 특정 조건이 충족될 때까지 쓰레드를 일시 중지시키는 것으로, 연산이 완료될 때까지 쓰레드를 대기 상태로 만든다.큐가 비어있으면: 요소를 꺼내려는(Thread가 take()를 호출) 스레드는 큐에 요소가 추가될 때까지 대기한다.큐가 가득 차면: 요소를 추가하려는(Thread가 put()을 호출) 스레드는 큐에 여유 ..
[Java] Callable, Feature 이해 및 사용예시
·
Java
Callable 이해하기[Callable 은 왜 등장했는가?]자바에서 멀티스레딩을 사용할 때 가장 기본적인 방법은 Runnable 인터페이스를 활용하는 것이다. 그러나 Runnable 인터페이스는 다음과 같은 한계를 가지고 있다.반환값을 가질 수 없음: Runnable의 run() 메서드는 반환값이 없는 void 타입이다. 따라서 실행 결과를 얻으려면 별도의 공유 변수 또는 콜백을 사용해야 한다.예외 처리가 어려움: Runnable은 checked exception을 명시적으로 던질 수 없다. run() 메서드는 throws 절을 가질 수 없으며, 내부에서 발생한 예외는 잡아서 처리해야 한다.이러한 문제를 해결하기 위해 Java 5에서 Callable 인터페이스가 도입되었다. java.util.concu..
[Intelij] Plain Java Project 에서 라이브러리 추가 방법
·
카테고리 없음
java 프로젝트에서 외부라이브러리 (.jar) 파일과 함께 실행하는 방법은 크게 3가지가 있다. IDE(IntelliJ IDEA) 에서 Dependencies에 추가jar 다운로드 후 CLASSPATH 에 포함해 실행 → java -cp "lib/*:."  Gradle, Maven → 의존성 추가Gradle, Maven을 사용하지 않는 Plain Java Project 에서 라이브러리를 추가하는 방법에 대한 글로 1번에 해당한다.     1. IntelliJ IDEA에서 File → Project Structure -> Modules → Library  2. NEW LIBRARY -> From Maven 을 선택한다. 3. 다운받을 라이브러리를 검색한 후 jar 파일을 다운로드받을 경로 저장해준다.4...
[Java] 열거형(Enum) 이해하고 사용하기
·
Java
enum 이란?enum은 JDK 1.5 부터 도입된 연관된 상수(Constant)들의 집합을 정의하는 특수한 클래스다. enum 에 미리 정의해둔 정해진 값만 사용하도록 강제함으로써 데이터 일관성이 확보되고 가독성,유지보수가 편리해진다. enum 은 싱글톤(Singleton)과 유사하게JVM에서 클래스 로딩 시 단 한번만 인스턴스되고 이후 동일한 객체를 재사용하므로 불필요한 인스턴스 생성이 일어나지 않는다. enum 을 사용하지 않는 방식의 문제점[문자열을 이용한 방식의 문제점]enum 을 사용하지 않고, 단순 문자열 비교를 이용해 회원등급에 따라 할인을 적용하는 메서드를 정의했다. public class MemberService { public int discount(String grade, in..
[Java] Thread, Runnable 이해하고 사용하기
·
Java
쓰레드와 멀티스레드 이해하기[단일쓰레드가 아닌 멀티쓰레드를 사용하는 이유]쓰레드는 프로세스(실행중인 프로그램)에서 하나의 실행 흐름으로 프로그램 실행의 가장 작은 단위다. Java 명령어를 사용해 클래스를 실행하면 JVM이 시작되며, 자바 프로세스가 생성된다. 이때, main() 메서드가 실행되면서 하나의 기본 스레드(메인 스레드)가 시작된다. 일반적으로 하나의 쓰레드만으로는 동시에 여러 작업을 하는데 제한이 있으므로, 긴 대기시간이 발생했을 때 기다리는 동안 다른 일을 처리할 수 없다. 따라서 이러한 문제를 해결하기 위해 하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 방식인  멀티쓰레드를 사용하해 CPU를 효율적으로 사용할 수 있다. 멀티쓰레드를 이용하면 쓰레드가 빠르게 번갈아가며 작업을 ..
[Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법
·
Spring
들어가며Swagger 는 RestDocs 에 비해 단순 적용은 간편하지만 기본적인 설정만으로 사용하기에는 아쉬운 부분이 있다. 이번 글에서는 Open API 3.0 Swagger 를 적용할때 필요한 개념과 조금 더 나은 문서를 만들기 위한 몇가지 노력들을 적어본다. Spring을 사용한다면 아래 2개의 라이브러리를 사용할 수 있다.Spring FoxSpring DocSpring Fox의 경우 마지막 업데이트일인 2020년 이후 업데이트가 없으므로, Spring Doc을 사용했다. Springdoc-openapi Modules SpringDoc OpenAPI는 Spring Boot 뿐만 아니라, WebFlux 도 지원하며 UI 레이어와 REST API 레이어로 구분되어 구성된다.UI 레이어는 API 문서를..
[Gradle] 통합 테스트 패키지 분리하기
·
Gradle
들어가며테스트를 작성할때 통합테스트, 단위테스트를 나눠서 관리하고 싶었다. 단위 테스트와 통합테스트는 테스트 소요 시간이 차이가 나고, 단위테스트에서 필요한 의존성과 통합 테스트에서 필요한 의존성이 다른 경우가 많다. Gradle 에서 통합테스트는 통합 테스트끼리, 단위 테스트는 단위 테스트끼리 실행하고 싶을 경우 별도 모듈로 나누거나, 별도 패키지로 나눠서 관리할 수 있다. 이 글은 패키지로 나누는 경우에 대한 글이다. 아이디어sourceSets는 Gradle에서 소스 코드와 리소스 파일의 경로, 클래스 경로 등을 정의하는 구조다. Gradle에서 java(또는 java-library) 플러그인을 추가하면 main, test  두 개의 sourceSet 들이 정의된다. main 에는 applicatio..
[Mysql] 데이터 Dump/Import
·
카테고리 없음
언제 사용하는가?MySQL 데이터를 다른 MySQL 인스턴스로 옮겨야 할 때가 있다.운영 환경 DB 데이터를 개발 환경의 DB로 옮길 때온-프레미스로 운영하던 DB를 AWS RDS 같은 클라우드 서비스로 옮길 때 데이터 백업, 아카이빙MySQL 재설치사이드프로젝트에서 기존에는 비용 문제로 인해 docker-compose 를 이용해 단일 EC2 애플리케이션과 mysql 을 띄워 실행시켰다.이번에 인프라 구성을 RDS 로 변경하게 되면서 RDS 로 기존 데이터를 옮기는 작업이 필요하므로, 2번 상황에 해당한다. 이 때 데이터 덤프, 임포트 작업이 필요하며 mysql 의 경우 mysql-client 를 이용한다. (Mysql Workbench 를 쓰더라도 내부적으로 mysql-client 의 mysqldump..