JVM 85

[Java] 메서드와 필드 접근: 런타임과 컴파일 타임의 차이

Java에서는 클래스에서 정의한 필드(변수)와 메서드(함수)에 접근할 때 서로 다른 원칙을 따릅니다. 메서드는 객체의 실제 타입(런타임 타입)을 따르고, 필드는 선언된 타입(컴파일 시점)을 따라갑니다. 🔍 예제 코드 분석class Parent { String str = "Parent"; String getStr() { return str; }}class Child extends Parent { String str = "Child"; String getStr() { return str; }}public class Main { public static void main(String[] args) { Parent parent = ne..

JVM 2025.06.05

[Java] 제네릭과 오버로딩, 왜 예상과 다를까?

Java에서 흔히 사용하는 제네릭과 오버로딩은 각각 명확한 규칙을 가지고 있지만, 함께 사용할 때는 가끔 예상과 다른 결과가 발생합니다. 이번 글에서는 왜 이런 일이 발생하는지, Java 컴파일러의 동작 원리까지 함께 살펴보겠습니다.예제 코드 분석class Display { void show(String s) { System.out.println("String: " + s); } void show(Object o) { System.out.println("Object: " + o); }}public class GenericExample { public static void main(String[] args) { Holder holder = n..

JVM 2025.06.05

Spring 서버가 자체 서명 SSL 서버와 통신할 때 생기는 문제와 해결 방법

✅ 문제 배경Spring 서버가 자체 서명된(Self-signed) SSL 인증서를 사용하는 서버와 HTTPS 통신을 시도할 때 다음과 같은 SSL 오류가 발생합니다.javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: unable to find valid certification path to requested target ✅ 직접 생성한 인증서라면🚩 1단계: OpenSSL과 CNF 파일로 인증서 생성CNF 파일이란?OpenSSL 인증서 생성 시 사용하는 설정파일로, 인증서에 포함될 정보를 정의합니다. 특히 subjectAlt..

JVM 2025.05.29

[Java] 자바는 Call by Value

자바는 기본형(primitive이든, 참조형(reference type이든 무조건 "값"을 복사해서 함수에 전달합니다.차이점은 기본형은 실제 값, 참조형은 객체의 주소(참조값)가 복사된다는 점입니다.참조값 복사는 "Call by Reference 아니야?"라는 오해가 생길 수 있습니다.. 특히 객체나 배열을 다룰 때 원본이 바뀌는 것을 보고 더 혼란스러울 수 있죠.기본형: 값 자체가 복사됨void change(int x) { x = 10;}int a = 5;change(a);System.out.println(a); // 출력: 5a의 값이 x로 복사됩니다.함수 안에서 x를 변경해도 a는 영향을 받지 않습니다.참조형: 참조값(주소)이 복사됨void change(int[] arr) { arr[0..

JVM 2025.05.17

[JPA] fetch join과 카르테시안 곱

JPA와 Hibernate를 사용할 때, 연관된 엔티티를 효율적으로 가져오기 위해 흔히 Fetch Join을 사용합니다. 그러나 Fetch Join을 잘못 사용할 경우 예상치 못한 문제가 발생할 수 있습니다. 이번 글에서는 Hibernate 공식 문서를 기준으로 이러한 문제들을 명확히 분석하고 올바른 해결법을 제시합니다.🔥 Fetch Join과 카르테시안 곱다음과 같은 엔티티가 있다고 가정합시다.@Entitypublic class A { @Id private Long id; @OneToMany(mappedBy = "a", fetch = FetchType.LAZY) private List bList = new ArrayList(); @OneToMany(mappedBy = "a"..

JVM/JPA 2025.04.03

[JVM] JDBC 쿼리 및 메서드 실행 로깅

1. JDBC 쿼리 로그 활성화애플리케이션이 실행하는 SQL 쿼리와 그 실행 시간을 로그로 기록하려면, JVM 옵션에서 로그 레벨을 설정해야 한다. 아래는 이를 설정하는 방법이다:-Dlogging.level.jdbc.sqlonly=off # SQL 쿼리만 로깅하지 않음-Dlogging.level.jdbc.sqltiming=info # SQL 쿼리 실행 시간을 info 레벨로 로깅-Dlogging.level.jdbc.resultsettable=info # 쿼리 결과를 info 레벨로 로깅-Dlogging.level.jdbc.audit=off # JDBC audit 로그 비활성화-Dlogging.level.jdbc.resultset=info # JDBC 결과 셋을 로깅-..

JVM 2024.08.17

[JVM] Jackson의 ObjectMapper: 객체 생성 방식과 필드 바인딩

Jackson과 ObjectMapperJackson은 Java에서 가장 널리 사용되는 JSON 처리 라이브러리 중 하나이다.ObjectMapper는 Jackson 라이브러리의 핵심 클래스 중 하나로, JSON 데이터를 Java 객체로 변환하거나 Java 객체를 JSON으로 직렬화할 때 사용된다. ObjectMapper의 객체 생성 방식1. 기본 생성자의 필요성ObjectMapper는 JSON 데이터를 Java 객체로 변환할 때 기본 생성자를 사용하여 객체를 생성한다.기본 생성자가 없으면 ObjectMapper는 객체를 생성할 수 없으므로, 기본 생성자를 추가해야 한다.2. 매개변수가 있는 생성자 사용매개변수가 있는 생성자를 사용해 객체를 생성하고자 할 때는 @JsonCreator를 사용해 ObjectMa..

JVM 2024.08.10

[SpringMVC] 스프링 이벤트 시스템

스프링 이벤트 시스템은 애플리케이션 내부에서 이벤트를 발행하고, 이를 처리하는 리스너에게 비동기 또는 동기적으로 전달함으로써 결합도를 낮추고 유연한 아키텍처를 제공하는 메커니즘이다. 특정 이벤트가 발생했을 때 이를 감지하고, 적절한 리스너에게 알림을 보내는 방식으로 동작한다. 이벤트를 발행하는 컴포넌트와 이를 처리하는 리스너는 서로 독립적으로 동작한다.  스프링 이벤트의 장점 및 주의점느슨한 결합: 이벤트 발행자와 리스너 간의 의존성이 없기 때문에 모듈 간 결합도를 낮출 수 있다.확장성: 새로운 이벤트 리스너를 추가하는 것이 매우 쉽다.유연성: 필요에 따라 동기 또는 비동기 방식으로 이벤트를 처리할 수 있다.비동기 처리 시 주의: 비동기 처리를 사용할 때는 스레드 풀 설정이나 예외 처리 등에 신경 써야 ..

JVM/SpringMVC 2024.08.10

[JVM] MockServer

MockServer는 Java 애플리케이션에서 HTTP 서버를 모킹(Mocking)할 수 있는 도구이다. 이를 통해 테스트 시 외부 API 호출을 모킹 하여 일관된 응답을 제공하고, 테스트의 안정성과 재현성을 높일 수 있다MockServer 설정dependencies { implementation("org.springframework.boot:spring-boot-starter-web") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.mock-server:mockserver-netty:5.13.2") testImplementation("org.mock-serv..

JVM 2024.07.29

BDDMockito

BDDMockito는 Behavior-Driven Development (BDD) 스타일의 단위 테스트를 작성하기 위해 Mockito 프레임워크를 확장한 것이다. BDDMockito는 주로 Java 애플리케이션에서 사용되며, 테스트 코드가 더 읽기 쉽고 명확하게 작성되도록 도와준다.BDDMockito의 장점가독성 향상: BDD 스타일의 테스트는 테스트 코드의 가독성을 높여, 테스트 목적을 더 명확하게 표현할 수 있다.행동 중심: Given-When-Then 패턴을 통해, 테스트 케이스를 시스템의 동작과 일치시킬 수 있다.명확한 의도 표현: BDD 스타일의 테스트는 코드의 의도를 더 명확하게 표현하여, 테스트 케이스를 이해하고 유지보수하기 쉽게 만든다.BDDMockito의 주요 메서드given: 테스트 준..

JVM 2024.07.28