
오늘은 자바의 예외에 대해서 다뤄보려고 한다. 오라클에서는 예외를 다음과 같이 정의하고 있다. 예외는 프로그램 실행 중에 발생하여 프로그램 명령의 정상적인 흐름을 방해하는 이벤트입니다. 자바에서 예외는 Throwable을 상속한 모든 하위 객체들로 구성할 수 있다. 그리고 Throwable을 상속받은 Exception 객체와 Error 객체로 나눌 수 있다. 또 Exception 객체를 상속받은 RuntimeException(UncheckedException)과 그 외의 Exception(CheckedException) 객체들로 나눌 수 있다. 위의 구성을 각 섹션으로 나누어 알아보자. Error와 Excpetion Java에서는 예외와 오류는 모두 "Throwable" 클래스의 서브 클래스이며 프로그램..

Spring boot에서 통합 테스트를 진행하다가 아래 코드에서 에러가 발생했다. Error while extracting response for type [class com.tistory.rjvv.learntest.exception.format.ErrorResponse] and content type [application/json] org.springframework.web.client.RestClientException: Error while extracting response for type [class com.tistory.rjvv.learntest.exception.format.ErrorResponse] and content type [application/json] 내가 만든 ErrorRes..

실무에서 API상 GET method를 사용하지만 list를 받아와야 했는데, Spring에선 일반적으로 RequestBody를 사용할 수 없었다. (HttpMessageNotReadableException) 물론, 조금 찾아본 바로는 2014년 후에 나온 RFC7230-7237 Spec을 확인해본 결과로 Request message framing is independent of method semantics, even if the method doesn't define any use for a message body 라는 문구가 추가됐는데, 이는 method 의미와 requestBody의 의미 체계는 독립적이라고 표현을 하는 것 같다. 평소처럼 List로 파라미터를 설정해서 값을 받았는데, 읽어오질 못..

JDK9 ~ 17의 featrue들을 간략히 정리한다. Java 9 (2018년 3월 지원 종료) 자바 모듈화(JDK 모듈 분리 기능) try-with-resource 구문 개선 관리하고자 하는 자원 객체를 try 구문 외부에서도 선언 가능 final Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt")) try (scanner;writer) { // omitted } interface private method 추가 default, static method에 대한 공통 로직을 공유하는 용도로 사용 Compact Strings (String 개선..

개발 환경 spring boot-2.6.6 jdk17 상황 JDK 17 버전업 후 다음과 같은 에러 발생 javax.validation.ConstraintDeclarationException: HV000170: No JSR-223 scripting engine could be bootstrapped for language "javascript". at com.sds.promise.workflow.model.request.WorkflowNodeRequestTest$progress.givenToDoAndProgress0(WorkflowNodeRequestTest.java:37) Caused by: org.hibernate.validator.spi.scripting.ScriptEvaluatorNotFoundE..

Thread 구현 자바 스레드를 구현하는 방법은 2가지가 있는데, 공통점은 단순히 run 메서드를 오버라이딩하거나 구현을 하면 되는 것이다. 하지만, 두 가지의 방법은 스레드를 시작하는 문법이 조금 다르다. 그 차이는 아래의 코드를 보며 확인해보자. Thread class 상속 public class SubThread extends Thread { @Override public void run() { IntStream.range(0, 5).forEach(idx -> System.out.println("subThread: " + idx)); } } Runnable Interface 구현 public class RunnableImpl implements Runnable { @Override public v..

프로세스 프로세스는 일반적으로 CPU에 의해 처리되는 프로그램을 의미한다. 또한, 이 프로세스는 단순히 한마디로 정의할 수 있는게 아니라 다양한 형태로 정의될 수 있다. 프로세스는 다음과 같이 여러 형태로 정의할 수 있다. PCB를 가진 프로그램 실기억장치에 저장된 프로그램 프로세서가 할당되는 실체로서, 디스패치가 가능한 단위 프로시저가 활동 중인 것 비동기적 행위를 일으키는 주체 지정된 결과를 얻기 위한 일련의 계통적 동작 목적 또는 결과에 따라 발생되는 사건들의 과정 운영체제가 관리하는 실행 단위 부가적으로 설명을 추가하자면, 메모리에 적재된 프로세스는 각각 독립된 메모리 영역(text, data, stack, heap의 구조)을 할당받는다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스..

Enum 정의 Enum(열거형)은 서로 관련된 상수를 편리하기 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. 해당 기능은 JDK1.5부터 새로 추가되었다. 특징 자바의 열거형은 'type-safe enum'이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 여기서 중요한 건, 보통 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일해야하는데, 열거형은 기존의 소스를 다시 컴파일하지 않아도 된다. equals()가 아닌 '=='으로 비교가 가능하다. 즉, 성능이 매우 빠르다. 사용 public class EnumPractice { public static void main(String[] args) { System.out.println(NUMBER.valueO..

Generic 정의 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 compile-type type check 해주는 기능이다. 장점 타입 안정성 타입 체크와 형변환 생략 Collection class가 대표적인 예시로서, 다양한 종류의 객체를 담을 수 있지만 컬렉션에 들어갈 타입을 미리 제네릭으로 명시하여 다른 타입의 객체를 포함하는 것을 컴파일 시점에 확인할 수 있다. 선언 generic은 class와 method에서 선언할 수 있다. 클래스 제네릭 클래스를 선언하기 위해선 클래스 명 옆에 를 붙이면 된다. 그리고 타입 변수로 사용될 변수들의 타입을 T 로 바꿔준다. public class GenericsPractice { public static void main(String[] args) ..

Set List와는 달리 저장 순서를 유지하지 않고 중복을 허용하지 않는다. 하지만, 순서를 유지하는 Set 구현체가 있긴 하다. (LinkedHashSet) hashSet HashSet은 내부적으로 HashMap을 이용해서 만들어졌고, 해싱을 통해 구현되어 이름이 HashSet add 연산 Set의 add 메서드는 새로운 요소를 추가하기 전 기존에 저장된 요소와 같은 것인지 판별하기 위해 요소의 equals()와 hashCode()를 호출한다. 그렇기 때문에 우리가 객체를 사용할 때 목적에 맞게 위 두 메서드를 오버라이딩을 해야 한다. class Person { String name; int age; public Person(String name, int age) { this.name = name; t..