Java 27

[Java] Map.getOrDefault()가 예외를 던진다고?

Map.getOrDefault()를 사용하다가 Exception을 만난 경험이 있다면, 이 글이 도움이 될 수 있습니다.많은 사람들이 "getOrDefault는 키가 없을 때만 기본값을 사용한다"라고 생각하지만, 실제 동작은 다릅니다.이 글에서는 getOrDefault()의 진짜 동작 방식을 알아보고, 안전한 대안까지 정리해 보겠습니다. 👩🏻‍💻 예상 못한 예외, 어디서부터 잘못된 걸까?다음 코드에서 NumberFormatException이 발생했습니다.Long no = noMap.getOrDefault(update.getNo(), Long.valueOf(update.getNo()));에러 메시지는 아래와 같았습니다.java.lang.NumberFormatException: For input str..

Java 2025.04.16

JUnit4와 JUnit5의 차이

Java 애플리케이션의 단위 테스트에서 널리 사용되는 JUnit은 개발자에게 필수적인 도구입니다. 🛠️저는 평소 JUnit5를 사용해 왔지만, 최근에 JUnit4를 사용해 볼 기회가 생겼습니다.처음에는 익숙하지 않은 버전이라 조금 낯설었지만, 이를 통해 두 버전의 차이를 직접 체감하며 JUnit의 발전을 이해할 수 있었습니다.이 글에서는 JUnit4와 JUnit5의 차이점, 장단점, 그리고 제가 사용하면서 느낀 점을 정리해 보았습니다.👩🏻‍💻 JUnit4의 특징JUnit4는 간단하고 직관적인 테스트 프레임워크로, 다음과 같은 어노테이션을 제공합니다. @Test: 테스트 메서드 표시.@Before / @After: 테스트 전/후에 실행되는 메서드 지정.@Ignore: 특정 테스트를 비활성화.@Ru..

TestCode 2025.01.27

JDK 23: 자바 핵심 변경점 정리

JDK 23은 자바 언어와 플랫폼의 최신 개선 사항을 포함하여 개발자 생산성과 애플리케이션 성능을 향상시키는 다양한 기능을 도입했습니다. 주요 변경 사항에 대해 알아보겠습니다.👀  1. 프리미티브 타입에 대한 패턴 매칭 및 switch 문 확장 (JEP 455)1-1. 패턴 매칭의 확장기존에는 instanceof 연산자가 참조 타입에서만 동작했지만, JDK 23부터는 프리미티브 타입에서도 사용할 수 있습니다.int value = 10;if (value instanceof int i && i > 5) { System.out.println("Value는 5보다 큰 정수입니다: " + i);}위 코드는 instanceof 연산자로 프리미티브 타입 int를 확인하고, 조건을 추가적으로 결합하여 안전하고 ..

Java 2025.01.15

Jackson 커스텀 어노테이션: @JacksonAnnotationsInside

Jackson 관련하여 공통적인 코드를 분리하기 위해 커스텀 어노테이션을 만들어 사용하기로 결정했습니다.그 과정에서 Jackson이 커스텀 어노테이션을 인식하도록 하기 위해 @JacksonAnnotationsInside라는 어노테이션이 필요하다는 사실을 알게 되었고, 이를 정리해보았습니다. 👀 @JacksonAnnotationsInside란 무엇인가?`@JacksonAnnotationsInside`는 Jackson 라이브러리에서 제공하는 메타 어노테이션으로, 커스텀 어노테이션이 Jackson의 어노테이션처럼 동작하도록 정의할 때 사용됩니다. 즉, 이 어노테이션이 없으면 Jackson이 커스텀 어노테이션을 인식하지 못합니다.왜 필요한가?기본적으로 Jackson은 자신이 제공하는 어노테이션(@JsonNam..

Java 2024.12.21

[Java] JPA에서 발생하는 N+1 이슈: 원인부터 해결까지

JPA를 처음 사용할 때 많은 개발자들이 부딪히는 문제 중 하나가 바로 N+1 이슈입니다. 이번 글에서는 JPA 환경에서 N+1 이슈가 발생하는 원인을 알아보고, 이를 해결할 수 있는 방법을 정리해보겠습니다.   N+1 이슈란?N+1 이슈는 1개의 메인 쿼리로 데이터를 가져오려 했지만, 추가로 N개의 쿼리가 실행되는 문제를 뜻합니다.다음은 간단한 예제를 통해 이를 이해해보겠습니다. 엔티티 구조Member와 Order 간에 일대다 관계가 있다고 가정합니다.@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @One..

Java 2024.11.27

[Java] @SuperBuilder란?

상속 구조에서 @Builder를 어떻게 사용할 수 있을지 고민하던 중, 더 유연한 방식으로 객체 생성 패턴을 지원하는 @SuperBuilder 어노테이션을 알게 되었습니다.이 글에서는 @SuperBuilder의 개념, 사용 예시, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해 알아보도록 하겠습니다.🧐 @SuperBuilder란?@SuperBuilder는 Lombok 라이브러리에서 제공하는 어노테이션으로 상속 구조에서 빌더 패턴을 간편하게 사용할 수 있도록 도와줍니다. 기본적으로 Lombok의 @Builder는 상속 구조를 지원하지 않기 때문에 상속된 클래스들에서 객체를 생성할 때는 여러 문제점이 발생할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 @SuperBuilder입니다.@SuperB..

Java 2024.10.17

[Java] String.valueOf()와 toString() 차이점

Java에서 사용하고 있는 String.valueOf()와 toString()은 객체를 문자열로 변환하는 데 사용되지만 약간의 차이가 있습니다.각각의 특징과 차이를 알아보겠습니다. 😺 String.valueOf()String.valueOf() 메서드는 다양한 타입(기본 타입과 객체 모두)을 받아서 이를 문자열로 변환합니다.이 메서드는 null 처리를 포함한 안전한 변환을 제공합니다.null 안전String.valueOf()는 인자로 전달된 객체가 null일 경우 "null"이라는 문자열을 반환합니다.다양한 타입 지원boolean, char, int, long, float, double 등의 기본 타입과 객체 타입을 처리할 수 있습니다.Object obj1 = null;System.out.println(..

Java 2024.10.14

[Java] 람다 표현식(Lambda Expressions)

Java 람다 표현식은 Java 8에서 도입된 기능으로, 코드의 간결성과 가독성을 높여줍니다.람다 표현식을 사용하면 더 간단하고 읽기 쉬운 코드 작성이 가능해집니다.평소에 사용하던 람다 표현식과 기본 개념을 정리해 보겠습니다.👀 람다 표현식이란?람다 표현식은 익명 함수를 간단하게 표현할 수 있는 방법입니다.익명 함수란 이름이 없는 함수를 의미하며, 일반적으로 함수형 인터페이스를 구현하는 데 사용됩니다. 람다 표현식의 기본 형태는 다음과 같습니다.(parameters) -> expression여기서 parameters는 함수의 매개변수, expression은 함수의 본문입니다. 람다 표현식의 예시다음은 람다 표현식을 사용한 간단한 예시입니다.이 예시는 두 개의 숫자를 더하는 함수를 람다 표현식으로 정의합..

Java 2024.09.16

[Java] JPA의 @Lock 동시성 제어

데이터베이스와 관련된 애플리케이션을 개발하다 보면 동시성 문제를 다루어야 할 때가 많습니다.🤔JPA에서 여러 스레드 또는 트랜잭션이 동일한 데이터를 동시에 읽고 쓰려고 할 때 발생할 수 있는 문제를 해결하기 위해 다양한 잠금(Locking) 기법에 대해 살펴보겠습니다. @Lock 어노테이션이란?@Lock 어노테이션은 JPA에서 엔티티에 대한 동시성 제어를 위한 잠금 메커니즘을 정의할 때 사용됩니다.이 어노테이션은 주로 @Query 어노테이션과 함께 사용되어 쿼리 실행 시 특정 잠금 모드를 적용하도록 지시합니다.이를 통해 특정 엔티티에 대한 동시성 제어를 강화할 수 있습니다. 예를 들어, 특정 리포지토리 메서드에서 @Lock 어노테이션을 적용하여 비관적 잠금을 설정할 수 있습니다.public inter..

Java 2024.08.12

[Java] final 불변 객체를 사용해야하는 이유

불변 객체는 소프트웨어 설계에서 중요한 개념이라고 생각합니다.실수를 예방하고 로직 구현에 집중할 수 있는 장점을 가지고 있는 불변 객체에 대해 알아보겠습니다. 🤓  불변 객체(Immutable Object)란?불변 객체는 생성된 이후에는 상태가 변경되지 않는 객체를 의미합니다.즉, 객체의 상태가 한번 설정되면 수정할 수 없으며, 객체의 필드 값이 불변으로 유지됩니다.불변 객체는 설계와 구현에 있어서 중요한 원칙으로 다양한 장점으로 인해 많이 사용됩니다.불변 객체의 특징 상태 변경 불가능객체가 생성된 이후에는 내부 상태를 변경할 수 없습니다.스레드 안전성여러 스레드에서 동시에 접근해도 안전합니다.복잡성 감소상태를 변경하지 않기 때문에 코드가 단순해지고, 디버깅과 유지보수가 용이합니다.불변 객체를 사용하는..

Java 2024.08.10