우리는 보통 Java에서 JSON으로 직렬화를 많이하고, 이 때 사용하는 대표적인 라이브러리가 Jackson과 Gson입니다. Gson의 경우 사용법이 간단하지만, 개인적으로 커스텀하게 사용할 수 있는 부분이 적어 아쉬운 관계로 Jackson을 애용하는데요, Jackson에서 제공하는 다양한 직렬화 방법을 소개하고자 합니다. 직렬화란? 우리가 만든 자바 코드는 내부적으로 동작할 때는 문제가 없지만, 서버 외부와 통신하거나 엑셀 등의 출력을 위해 자바 코드를 외부와 소통할 수 있게 만드는 작업을 직렬화라고 합니다. 자바 진영에서의 직렬화는 보통 자바의 직렬화 방법과 JSON 직렬화가 대표적인데, 오늘 소개할 방법은 자바 직렬화보다 비교적 간단한 JSON 직렬화 방법입니다. JSON 직렬화는 자바 코드에 매..
Java 언어에서는 전역 변수를 제어하기 위한 다양한 키워드 및 메서드를 제공해줍니다. 대표적인 예로는 volatile, static 등이 있죠. Volatile의 경우, 스레드 간에 변수 값을 항상 "최신 상태로" 보게 보장해주는 키워드입니다.Volatile은 다음과 같은 특징을 가지고 있습니다.가시성 보장: 한 스레드에서 변경한 값을 다른 스레드가 즉시 볼 수 있게 함메모리 캐시 무시: CPU 캐시에 있는 값을 사용하지 않고, 메인 메모리에서 직접 읽고 씀보통 서버 내부적으로 다수의 스레드가 동작할 때, 변수 값의 일관성을 확보하기 위해 사용하는 방법입니다. 아니 근데.. 정적 키워드 static이 있지않나요..?? static 키워드의 경우, "같은 값을 공유"하지만, "최신 값"은 보장하지 않는..
작성 개요평소 개인적으로 사용하기도 하고 현업에서도 사용하고 있는 Spring을 충분히 이해하고 있는가?라는 생각을 가지고 동작 원리에 대해 다시 한 번 정리하게 되었습니다. 어디까지 분석할 것인가?어디까지 쓸 것인가를 가장 고민하게 되었는데, 본 글을 쓰게 된 목적이 MVC 과정을 어떻게 수행하는지가 목적이기 때문에, 그 과정에서 개별 어노테이션이 어떻게 동작하는지 까지 분석하는 것은 오버스펙일듯 하여 추후 세부적으로 접근 가능하게끔 하는 가이드 문서쯤 어딘가..? 라는 글을 적는게 좋을 것 같았습니다..ㅎㅎ SpringBoot의 시작SpringBoot는 어떻게 시작될까요? SpringBoot는 다음과 같이 다양한 실행 방식을 제공합니다.Intellij 사용 시, [Gradle > bootRun]co..
작성 계기우리는 자바를 배울 때 javac로 컴파일 하고 java 파일로 실행하는 단계를 먼저 배운다우리가 처음 배울 때 고생했던 Java 프로퍼티가 왜 사용되는거고, Java에서 이를 어떻게 인식해서 사용하는걸까?또한, Java라는 언어는 OS 독립적으로 사용될 수 있다고 하는데, 어떻게 그게 가능한걸까?이러한 근복적인 시스템 프로그래밍적인 질문이 문득 머릿속을 지나치게 되었고 어쩌면 다른 오픈소스 라이브러리들보다 먼저 분석했어야할 Open JDK 라이브러리 내에서 JVM이 어떻게 동작하는지에 대한 분석을 시작하게 되었다 방대한 JDK 중에 무엇을 알아볼 것인가?우리가 Java 파일을 실행할 때, JVM이 어떻게 이를 인식하는지 실행흐름을 대략적으로 살펴보려한다소제목에서 말했듯이 JDK 자체가 너무 방..
@DataJpaTest를 어떻게 작성하는지에 대한 기록 JPA 테스트를 위한 의존성 구성 dependencies { implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.mysql:mysql-connector-j") // test container를 위한 의존성 라이브러리 testImplementation("org.springframework.boot:spring-boot..
특징 인터페이스 기반으로 만들기 때문에 인터페이스가 필수 런타임에 동적으로 프록시 객체를 만들어줌 사용 예시 public static void main(String[] args) { TestInterface ref = (TestInterface) Proxy.newProxyInstance( TestInterface.class.getClassLoader(), new Class[]{TestInterface.class}, handler); ref.call(); } } Proxy.newProxyInstance 동적 프록시 생성 함수 인자 값 프록시 인터페이스의 클래스 로더 인터페이스 클래스에 대한 배열 입력 프록시 동작을 수행하기 위한 InvocationHandler 인터페이스만으로 프록시를 사용할 수 있을까? ..
서론 JDK 21이 발표됨에 따라 관련 업데이트 내용 정리 JDK 17 이후 최신 LTS 버전 주요 업데이트 내용 Record Patterns Pattern Matching for switch Virture Thread 표준화 Sequenced Collection Unnamed Classes and Instance Main Methods Unnamed Patterns and Variables Record Patterns Record 타입에 대한 destructed가 가능해졌다. 패턴 매칭 // As of Java 16 record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p...
[SimpleJpaRepository] findAll() 메서드에서 getQuery 호출을 통해 Query 객체를 가져온다. 이 객체는 Hibernate를 통해 객체를 쿼리 형식으로 만들어주는 역할을 한다. Query 객체를 가져오는 과정에 대해서는 따로 작성하는게 좋을 것 같아서 배제하게 되었다. Query 객체에서 getResultList()를 호출하여 타입에 해당하는 결과 목록을 조회한다. [Query] list() 함수를 통해 가져오게 되는데, 이는 Query를 구현한 AbstractSelectionQuery 클래스에 있다. [AbstractSelectionQuery] 메서드 내부에서 doList()를 조회하는데, 이는 AbstractSelectionQuery를 구현한 QuerySqmImpl 클래..