발생한 문제Spring Validation을 사용하는 도중 @NotBlank 어노테이션의 message 필드 값을 지정하면 'Attribute value must be constant' 에러를 내면서 컴파일이 되지 않는 문제를 맞닥뜨렸다.분명 위 사진처럼 Enum을 사용하지 않고 String 리터럴 값을 넣으면 문제 없이 컴파일이 된다. 원인어노테이션은 JDK 1.8 기준 JVM 실행 시 클래스 로더에 의해 클래스 로딩 시점에 Metaspace 영역에 저장된다.이 때 어노테이션의 속성 값에 저장되는 message(위 사진)는 Metaspace 영역의 어노테이션 메타 데이터 구조 내에 포함된다.Metaspace 영역 안에 있는 데이터들은 한번 메모리에 올라가면 불변 성격을 갖는다.따라서 어노테이션에 사용되..
Language/Java
기본적으로 스레드 풀은 작업이 제출되면 corePoolSize의 새 스레드를 추가해서 작업을 할당하고 큐 작업을 바로 추가하지 않는다. corePoolSize를 초과해서 스레드가 실행 중이면 새 스레드를 추가해서 작업을 할당하는 대신 큐에 작업을 추가한다. 만약 큐가 가득차게 되면 스레드가 maxPoolSize 이상까지 늘어나게 되고 maxPoolSize 이상 실행 중이면 더 이상 작업은 추가되지 않고 거부된다. BlockingQueue 인터페이스를 구현한 구현체는 여러개가 있지만, ThreadPoolExecutor와 관련된 세 가지는 아래와 같다. SynchronousQueue LinkedBlockingQueue ArrayBlockingQueue SynchronousQueue BlockingQueue의..
VM OPTION에서 XMS와 XMX XMS: 자바 애플리케이션이 실행될 때의 JVM에 할당되는 초기 힙 크기(Initial Heap Size) XMX: JVM에 할당 가능한 최대 힙 크기(Max Heap Size) JVM이 실행될 때 메모리가 XMS에 설정된 값에서 시작하여 최대 XMX에 설정된 값까지 사용 가능하다는 의미이다. 만약 메모리가 XMX를 넘어서면 OutOfMemoryError가 발생하며 자바 애플리케이션이 셧다운된다. 물론 최소 힙 크기(Minimum Heap Size)도 존재한다. 만약 jar를 실행할 때 -xms와 -xmx를 설정하지 않는다면? 오라클 공식문서에 따르면 xms, xmx의 디폴트 값은 아래와 같다. xms: 현재 운영체제에 할당된 메모리의 1/64 xmx: 현재 운영체제..
정적 제네릭 메서드 아래 소스코드의 1,2 번의 정적 제네릭 메서드 중 어떤 것이 정상 작동할까요? public class Generics { public static void print(T t) {} // 1번 public static void print(T t) {} // 2번 } 1번은 컴파일 에러가 발생하고 2번은 정상작동 합니다. 1번은 클래스 레벨에서 제네릭을 사용한다는 의미입니다. 제네릭 메서드에 제네릭 메서드는 호출 시에 파라미터 타입을 지정하기 때문에 2번이 가능합니다. 주의해야 할 점은 Generics 클래스에 지정한 제네릭 타입와 2번 제네릭 메서드에서 지정한 제네릭 타입는 서로 다릅니다. 2번은 메서드 레벨에서 제네릭을 사용한다는 의미이며 클래스 제네릭 타입와 헷갈리므로 보통 겹치지..
Lombok의 @Builder 어노테이션 적용하지 않고 순수 빌더패턴을 사용하는 경우 @Data public class User { private String name; private String address; private int age; public User(Builder builder) { this.name = builder.name; this.address = builder.address; this.age = builder.age; } public static class Builder { private String name; private String address; private int age; public Builder name(String name) { this.name = name; re..
LocalDateTime @SpringBootTest @Slf4j public class DateTest { @Test public void localDateTime() { LocalDateTime now = LocalDateTime.now(); LocalDateTime localDateTime1 = LocalDateTime.of(2017, 1, 14, 10, 34); LocalDateTime localDateTime2 = LocalDateTime.of(2019, Month.MARCH, 28, 14, 33, 48, 0); DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter format..
https://www.blockchain.com/api/blockchain_api Blockchain.com Explorer | BTC | ETH | BCH The easiest and most trusted transaction search engine and block explorer. www.blockchain.com 위 홈페이지에서 특정 API를 호출하면 값이 아래처럼 넘어옵니다. { "addresses": [ { "address": "xpub address", "change_index": 1, "account_index": 91, "final_balance": 12693908, "n_tx": 19, "total_received": 12908908, "total_sent": 215000 } ] }..