[JPA] @Embeddable 에서 모든 필드가 null 일 경우 NullPointerException 발생 케이스와 해결 방안
·
JPA
들어가며JPA 사용시 Entity 에서 관련된 데이터들을 하나로 묶을 때 VO 객체로 @Embeddable 을 사용할 수 있다. @Embeddable 사용 시 각각의 컬럼에 대해 null 값을 허용하도록 만들 수 있는데, 이 경우 NullPointerException 이 발생할 가능성이 있다. 이번 글은 해당 문제상황과 해결 방법에 대한 글이다. 문제가 발생한 환경고객 주소 엔티티에서 배달 정보에 대한 관련된 값들을 묶기 위해 아래 VO 를 만들어서 사용하고 있다. 각각 필드는 고객이 입력할 수도 있고, 입력하지 않을 수도 있기 때문에 optional 한 필드로 구성했다.@Column(nullable=false) 명시 X생성시 null 체크 X Repository 에서는 아래처럼 고객 주소 엔티티를 불..
[Java] Java16 에 추가된 Pattern Matching for instanceof
·
Java
Java16 에 추가된 Pattern Matching for instanceof 대한 공식문서 내용을 정리한 글이다.자바 16 이상을 사용할 경우 인텔레제이에서 pattern variable 을 자동으로 변환해주는데, 여기서 사용되는 문법이 Pattern Matching for instance of 다. equals 나, instanceof 로 변환이 필요한 예외클래스 처리에서 유용하게 사용할 수 있다. 기존 instanceof + 캐스팅 방식Java에서는 instanceof와 타입 변환(casting)을 함께 사용해 객체의 타입을 검사하고, 필요한 데이터를 추출해왔다.if (shape instanceof Rectangle) { Rectangle r = (Rectangle) shape; ....
[Hibernate] Hibernate6.2 부터 변경된 @Enumerated(EnumType.STRING) 매핑방식
·
JPA
MySQL 데이터베이스 (8.X) 기준 포스팅입니다. @Enumerated(EnumType.STRING) 매핑 방식enum을 사용할 때 데이터베이스 저장이 필요한 경우 대부분 @Enumerated(EnumType.STRING) 으로 매핑한다. EnumType.ORDINAL을 쓰면 enum의 순서(int)가 저장됨에 따른 중간삽입, 순서변경 등에 의해 잘못된 값 삽입 문제가 발생할 수 있기 때문에 저장공간을 더 차지하더라도 STRING 을 사용하게 된다. 기존 5.X 버전까지는 @Enumerated(EnumType.STRING) 으로 매핑할 경우 VARCHAR 자료형으로 저장되었지만,Hibernate 6.2 부터는 ENUM 데이터타입 매핑이 기본값으로 변경되었다.아래처럼 @Enumerated(EnumTyp..
[Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안
·
Spring
들어가며@TestConfiguration 내부에서 Testcontainers와 @DynamicPropertySource를 사용해 테스트 환경을 구성했으나, @DynamicPropertySource가 의도대로 동작하지 않아 문제가 발생했다. 이 글은 해당 문제의 원인과 해결 방법을 정리한 내용이다. 문제가 발생한 테스트 환경 테스트환경에서는 TestContainers 를 이용해 Redis 를 사용하고 있다. RedisConnectionFactory 설정부분은 다음과 같다.애플리케이션 코드의 RedisConfig 에서 생성자로 RedisProperties 를 주입받고 있고, 이 값을 바탕으로 Redis 서버와의 연결을 시도한다.package org.springframework.boot.autoconfigur..
[Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?
·
Spring
직접 정의한 Error code 란?직접 정의한 에러코드는 HTTP Status code 와 별개로 정의한 에러코드를 의미한다. HTTP 응답에는 HTTP 요청이 성공했는지 실패했는지 나타내주는 HTTP Status code 가 존재함에도, 대부분의 서비스에서는 아래처럼 HTTP Status code 뿐만 아니라 직접 정의한 Error code 도 함께 내려준다. [카카오 쇼핑 에러코드]응답 코드 및 에러 코드[카카오뱅크 에러코드]간편하고 다양한 인증이 필요할때 카카오뱅크 인증서[Naver Cloud Platform 에러코드]CLOVA eKYC 에러코드[NHN CLOUD]오류 코드 - NHN Cloud 사용자 가이드 이렇게 에러코드를 직접 정의하면 REST API의 에러 응답을 이해하기 위해 API 문서..
[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...