발생한 문제Spring Validation을 사용하는 도중 @NotBlank 어노테이션의 message 필드 값을 지정하면 'Attribute value must be constant' 에러를 내면서 컴파일이 되지 않는 문제를 맞닥뜨렸다.분명 위 사진처럼 Enum을 사용하지 않고 String 리터럴 값을 넣으면 문제 없이 컴파일이 된다. 원인어노테이션은 JDK 1.8 기준 JVM 실행 시 클래스 로더에 의해 클래스 로딩 시점에 Metaspace 영역에 저장된다.이 때 어노테이션의 속성 값에 저장되는 message(위 사진)는 Metaspace 영역의 어노테이션 메타 데이터 구조 내에 포함된다.Metaspace 영역 안에 있는 데이터들은 한번 메모리에 올라가면 불변 성격을 갖는다.따라서 어노테이션에 사용되..
Language
기본적으로 스레드 풀은 작업이 제출되면 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: 현재 운영체제..
안녕하세요. 이번 포스팅은 스마트 컨트랙트의 fallback, receivce 함수를 알아보겠습니다. fallback 함수 fallback은 '대비책'이라는 사전적 의미를 가집니다. 솔리디티에서도 fallback 함수는 '대비책' 함수라고 보시면 생각하시면 되는데요. 어떤 행동을 취하게 하는 함수라고 보시면 될 것 같습니다. fallback 함수를 사용하는 이유는 아래와 같습니다. 1. 스마트 컨트랙트가 이더를 받을 수 있다. 2. 이더를 받고 난 이후 어떠한 행동을 취할 수 있다. 3. call 함수로 없는 함수가 불려질 때, 어떠한 행동을 취하게 할 수 있다. fallback 함수는 솔리디티 0.6 이전과 이후로 의미가 다릅니다. 자세한 건 아래서 살펴보겠습니다. 우선 버전에 상관없이 공통적인 fal..
// SPDX-License-Identifier: GPL-3.0 pragma solidity >= 0.7.0 < 0.9.0; contract hello { address owner; constructor() payable { // payable 키워드는 컨트랙트를 생성할 때 이더를 보낼 수 있다는 의미 owner = msg.sender; } // 해당 스마트컨트랙은 컨트랙을 생성한 주소만 이더를 보낼 수 있다. modifier onlyOwner { require(msg.sender == owner, "Only Owner"); _; } event SendInfo(address _msgSender, uint256 _currentValue); event MyCurrentValue(address _msgSend..
// SPDX-License-Identifier: GPL-3.0 pragma solidity >= 0.7.0 < 0.9.0; contract hello { /** 1. payable: 이더/토큰과 상호작용 시 필요한 키워드 send, call, transfer를 이용하여 이더를 보낼 때 payable이라는 키워드가 필요하다. payable은 주로 함수, 주소, 생성자에 붙여서 사용된다. 2. msg.value: 송금보낸 코인의 값 **/ /** 이더를 보내는 3가지 방법 1. send: 2300gas 소비, 성공 여부를 true or false로 리턴받음. 에러메시지를 알 수 없다는 단점 존재. 2. call: 가변적인 gas 소비(gas값 지정가능), 성공 여부를 true or false로 리턴받음. ..
data type // SPDX-License-Identifier: GPL-3.0 pragma solidity >= 0.7.0 < 0.9.0; contract datatype { // boolean: true/false bool public b = false; // bytes bytes4 public bt1 = 0x12345678; // 4바이트를 넣을 수 있도록 타입을 지정할 수 있다. bytes public bt2 = "STRING"; // 솔리디티에서 자동으로 바이트화되어 저장된다. // address address public addr = 0xABC...... (총 20바이트) // int vs uint int8 public it = 4; // int8범위: -2^7 ~ 2^7 - 1 uint25..
정적 제네릭 메서드 아래 소스코드의 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번은 메서드 레벨에서 제네릭을 사용한다는 의미이며 클래스 제네릭 타입와 헷갈리므로 보통 겹치지..