- 불변 객체 validationstarryeye불변 객체, lombok @Value 와 Java record 포스팅에서 이어진다. 개발을 하다보면 불변 객체는 Dto 로 사용되며 이는 Architecture 관점에서 각 layer 의 입력 모델과 출력 모델에 해당한다. 또한, 입력 모델과 출력 모델에 대한 검증 책임은 각 layer에 있기 때문에 불변 객체의 validation 은 항상 신경 써줘야 한다.. (생성 시점) 이번 포스팅에서는 불변 객체의 생성시점에서 자주 사용되는 검증 방법을 코드로 한번 알아보겠다. -> 선언적 유효성 검사 방법 -> 개발자가 모두 구현하는 방식은 제외 Lombok 을 사용한 방법 import lombok.Builder; import lombok.NonNull; import lombok.Value; @Value @Bu..
- 2023-05-07 06:32:38
- 불변 객체, lombok @Value 와 Java Recordstarryeyelombok 의 @Value 를 이용한 불변객체 만들기와 Java 14 ~ 16 부터 도입된 record 타입을 활용한 불변객체 만들기를 알아보자.. lombok @Value 롬복은 자바 개발을 단순화하고 가독성을 높이기 위한 라이브러리이다. (annotation 방식으로 boilerplate code 를 줄여준다.) 예를 들면 어떤 클래스에 @Getter 어노테이션을 적용하면 빌드 후 ".class 파일"을 까보면 해당 클래스의 모든 필드에 대한 getXXX 메서드가 만들어져 있다. 그러면 @Value는 개발자 대신 어떤 것을 해줄까.. 1. 모든 필드를 private final 로 만들어 준다. -> 이로써 필드의 값을 변경할 수 없게 되어 불변성이 보장된다. 2. 모든 인자를 받는 생성자를 만들어준..
- 2023-05-07 03:30:42
- [Java 정리] ThreadLocalstarryeyejava.lang.ThreadLocal 에 대해 알아보자. 쓰레드 로컬은.. 자바에서.. 싱글톤 객체의 필드를 사용하면서, 동시성 문제를 해결하는 방법이다. 각 쓰레드마다 별도의 내부 저장소를 제공하여, 동일한 인스턴스의 로컬 필드에 각 쓰레드가 접근해도 동시성 문제가 없다. 예시를 보며.. 알아보자. ThreadLocalService라는 클래스는 아래 ThreadLocalServiceTest 클래스에서 하나의 인스턴스로 두개의 쓰레드에서 사용된다. ThreadLocal의 String 타입으로 nameStore를 정의하였다. set메서드와 get 메서드 사이 간격은 1초간격이다. ThreadLocal 클래스는 다음과 같은 메서드를 제공한다... ThreadLocal.set(...) : 값 저장에 사용 T..
- 2022-10-19 20:22:47
- [Java 정리] Thread 6starryeye이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자. volatile 멀티 코어 프로세서 환경에서는 코어마다 별도의 캐시(레지스트리)를 가지고 있다. 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽을 때는 캐시에 존재하지 않을 경우에만 메모리에서 읽어 온다. 그러면.. A코어에 의해 메모리에 저장된 변수의 값이 변경 되었는데.. B코어의 캐시에 저장된 값이 갱신 되지 않았다면.. 데이터가 다르므로.. 프로그램은 예상치 못한 흐름으로 동작한다. 해결법은.. 변수 앞에 volatile 키워드를 붙이면 코어가 변수의 값을 읽을 때 항상 메모리에서 읽어오게 된다. 따라서.. 캐시와 메모리간의 값의 불일치가 해결된다. volatile은..
- 2022-08-22 03:07:37
- [Java 정리] Thread 5starryeye이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자. Lock과 Condition을 이용한 동기화 java.util.concurrent.locks 패키지가 제공하는 lock 클래스들을 이용한 동기화 방법에 대해 알아보자. (JDK1.5) ReentrantLock 클래스 재진입이 가능한 lock, 가장 일반적인 배타 lock이다. 앞서 wait(), notify() 메서드 처럼.. 특정 조건에서 lock을 풀고 나중에 다시 lock을 획득하여 이후의 임계영역 작업을 수행할 수 있다. ReentrantReadWriteLock 클래스 읽기를 위한 lock과 쓰기를 위한 lock을 제공한다. 읽기를 위한 lock이 이미 걸려있는데 다른 쓰레드가 읽고 싶으면 읽기 lock을 중복해서 ..
- 2022-08-22 02:20:02
- [Java 정리] Thread 4starryeye이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자. 쓰레드의 동기화 멀티쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게된다. 따라서, 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다. 그래서 도입된 개념이 임계 영역(Critical section)과 락(lock)이다. 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정해놓고, 공유 데이터(객체)가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있도록 한다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 lock을 반남해야만 다른 쓰레드가 반납된 lo..
- 2022-08-22 01:21:50
- [Java 정리] Thread 3starryeye이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자. 쓰레드의 실행 제어 메서드 쓰레드 상태를 다시 한번 보고 들어가자.. 상태 설명 NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 RUNNABLE 실행 중 또는 실행 가능한(실행 대기) 상태 BLOCKED 동기화 블럭에 의해 일시정지된 상태 (lock이 풀릴 때까지 기다리는 상태) WAITING 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지 상태이다. TIMED_WAITING WAITING와 동일하나 일시정지 시간이 지정된 경우의 일시정지 상태이다. TERMINATED 쓰레드의 작업이 종료된 상태 sleep() 일정 시간 동안 쓰레드를 멈추게 한다. public static native vo..
- 2022-08-19 23:20:31
- [Java 정리] Thread 2starryeye이미 알던 지식이지만, 기본으로 돌아가서.. Java의 관점에서 한번 정리해보자. 쓰레드 우선순위 쓰레드의 start() 메서드를 호출하기 전에 쓰레드의 우선순위를 정할 수 있다. void setPriority(int newPriority) int getPriority() public static final int MAX_PRIORITY = 10 public static final int MIN_PRIORITY = 1 public static final int NORM_PRIORITY = 5 main 쓰레드의 우선순위는 5 이며, 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드와 동일한 우선순위로 셋팅된다. 멀티 코어 환경에서 두개의 쓰레드로 각각 하나의 작업, 총 두개의 작업을 돌릴 경우엔 당연하게도 우선순..
- 2022-08-13 19:30:16
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)