JVM 85

JUnit

JUnit은 JVM 생태계에서 가장 널리 사용되는 테스트 프레임워크로, 주로 단위 테스트를 위한 도구를 제공하지만, 통합 테스트에도 활용할 수 있다.JUnit의 주요 특징은 어노테이션 기반 테스트 지원, 단정문(Assert)을 통한 테스트 결과 검증이 있다.통합 테스트여러 컴포넌트를 조합하여 전체 비즈니스 로직을 검증한다. @SpringBootTest를 주로 사용하지만, 대규모 프로젝트에서는 실행 시간이 길어질 수 있다.단위 테스트단위 테스트는 코드의 특정 모듈이 의도한 대로 동작하는지 각 함수와 메소드에 대한 개별 테스트 케이스를 작성하여 검증합니다.FIRST 원칙효과적인 단위 테스트를 위한 5가지 원칙을 FIRST 원칙이라고 한다.Fast: 테스트는 빠르게 실행되어야 한다.Independent: 각 ..

JVM 2024.07.28

테스트 커버리지와 JaCoCo

테스트 커버리지란 소프트웨어의 테스트 수준이 충분한지 표현할 수 있는 지표 중 하나이다.많은 코드 커버리지 도구가 있으며, 가장 보편적으로 사용되는 Jacoco에 대해 다루도록 한다. JaCoCo 개요JaCoCo(Java Code Coverage)는 Java 애플리케이션의 코드 커버리지를 측정하기 위한 도구이다. 코드 커버리지는 테스트된 코드의 비율을 나타내며, 소프트웨어 테스트의 효율성을 평가하는 중요한 지표이다.JaCoCo의 주요 기능커버리지 측정: 테스트 코드 실행 시 실행된 코드 라인, 분기, 메소드 등을 측정한다.리포트 생성: HTML, XML, CSV 형식으로 커버리지 리포트를 생성하여 시각화된 데이터를 제공한다.검증 규칙 설정: 특정 커버리지 목표를 설정하고 이를 충족하는지 확인할 수 있다...

JVM 2024.07.27

StringBuffer vs StringBuilder

StringBuffer와 StringBuilder는 둘 다 문자열을 다루기 위해 자바에서 제공하는 클래스이다. 하지만 몇 가지 중요한 차이점이 있다.공통점:가변성 (Mutability): 둘 다 문자열을 변경할 수 있다. String은 불변(immutable)이지만, StringBuffer와 StringBuilder는 변경 가능한 문자열을 다룬다.메서드: 대부분의 메서드가 동일하다. 예를 들어, append(), insert(), delete(), reverse() 등.차이점:동기화 (Synchronization):StringBuffer는 모든 메서드가 동기화(synchronized)되어 있다. 즉, 멀티쓰레드 환경에서 안전하다(thread-safe).StringBuilder는 동기화가 되어 있지 않다...

JVM 2024.07.22

java.security.invalidKeyException: Illegal Key Size

암호화와 Illega key size 에러AES-256 암호화 등과 같이 128bit를 초과하는 암호화를 사용하려 할 때, 이러한 문제를 마주칠 수 있다. 이 문제는 미국의 수출 규제에 따른 것으로 과거에는 미국의 수출 규제로 인해 강력한 암호화 키를 포함하는 암호화 소프트웨어를 수출하는 것에 제한이 있었다. Java는 기본적으로 JCE 정책을 제공하는데 이 정책은 128 bit로 키 길이가 제한되어 있어서 이를 초과하는 경우에 에러가 발생하는 것이다. 이 정책은 ${JAVA_HOME}/jre/lib/security/local_policy.jar의 default_local.policy 파일에서 확인할 수 있다.// Some countries have import limits on crypto streng..

JVM 2024.05.04

빈 스코프: 빈의 생명 주기와 활용

스프링 빈 스코프란 무엇일까?스프링 빈 스코프는 스프링 컨테이너에서 관리되는 빈의 생명 주기와 활용 범위를 정의하는 개념이다. 빈 스코프는 빈이 생성되는 시점, 빈이 사용되는 범위, 빈이 소멸되는 시점 등을 결정한다. 스프링 빈 스코프 종류싱글톤기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.프로토타입스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이..

JVM/SpringMVC 2024.03.09

CORS와 Preflight Request

CORS Corss-Origin Resource Sharing의 약자로 서로 다른 도메인 간 리소스 공유를 제어하는 메커니즘이다. 브라우저는 동일 출처 정책에 의해 다른 호스트로에 리소스 요청을 차단한다. cross origin의 예시 기준 URL http://kyoulho.com 프로토콜이 다른 경우 https://kyoulho.com 포트가 다른 경우 http://kyoulho.com:8080 도메인이 다른 경우 http://ulho.com 하위 도메인 http://sub.kyoulho.com maxAge 설정 maxAge를 설정하면 동일한 도메인에서 동일한 리소스에 대한 CORS 요청 시 매번 사전 검사 요청을 보내지 않고 캐시 된 결과를 사용할 수 있다. maxAge 값만큼 시간이 지나면 캐시가 ..

JVM/SpringMVC 2024.03.09

자바 내부 클래스(Inner Classes)

자바에서 내부 클래스는 다른 클래스 내에 정의된 클래스를 말한다. 내부 클래스는 특정 클래스에 종속되어 있으며, 외부 클래스의 멤버에 접근할 수 있다. 내부 클래스는 코드의 구조화, 은닉성, 캡슐화를 강화하는 데 사용될 수 있다. 장점 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다. 사용이 제한된 클래스를 내부에 둠으로써 코드의 복잡성을 줄일 수 있다. 종류 인스턴스 클래스(Instance Class) 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. public class OuterClass { private int outerField; public class InnerCl..

JVM 2024.03.01

쓰레드 동기화

쓰레드 동기화란?쓰레드 동기화는 여러 쓰레드가 공유 자원에 접근할 때 발생할 수 있는 데이터 불일치와 같은 문제를 해결하는 기술이다. 이를 통해 프로그램이 예측 가능하고 안전하게 실행될 수 있도록 한다. synchronized 키워드자바에서는 synchronized 키워드를 사용하여 메소드나 블록을 동기화할 수 있다. 이를 통해 특정 코드 영역에는 하나의 쓰레드만 접근할 수 있도록 보장할 수 있다.// 메소드 동기화public synchronized void synchronizedMethod() { // 동기화가 필요한 코드}// 블록 동기화public void someMethod() { // 비동기화 코드 synchronized (lockObject) { // 동기화가 필요..

JVM 2024.03.01

Google JIB

등장 배경 Jib 이전에 도커 이미지를 만들기 위해서는 dockerfile을 작성하고 dockerignore 파일을 작성하고 디펜던시들을 따로 분리해서 저장하고 분리된 의존성을 하나의 레이어로 관리하고 최대한 캐시를 활용해 다시 한번 dockerfile을 변경해야 했다. 이 모든 과정이 복잡하고 학습 난이도는 높으며 자주 하는 작업이 아니었기에 이전에 어떻게 했는지 다시 찾아보는 시간이 필요했다. 그래서 이 모든 과정을 단순하게 만들기 위해 Jib가 등장했다. Jib의 장점 로컬 Docker 의존성 제거 Jib는 Dockerfile 작성 없이도 빌드 환경에 Docker가 없이도 이미지를 빌드할 수 있다. 이는 Jib가 컨테이너 이미지를 생성할 때, 애플리케이션 파일과 의존성을 레이어로 나누어 구성하는 방..

JVM 2024.01.30

모니터링(Micrometer, Prometheus, Grafana)

Micrometer 애플리케이션의 메트릭 수집을 단순화하고, JVM 기반의 애플리케이션에서 사용하기 쉬운 메트릭 API를 제공하는 라이브러리이다. 특히 스프링 기반의 애플리케이션에서는 Micrometer가 스프링의 메트릭 제공에 통합되어 사용된다. 또한, 다양한 모니터링 시스템과의 통합을 지원하여 Prometheus, Grafana, InfluxDB, Datadog 등 다양한 백엔드로 메트릭을 전송할 수 있다. 여러 Micrometer의 기능 중 하나로 Timer가 있다. Timer는 특정 코드 블록이나 메서드의 실행 시간을 측정하고 해당 지표를 메트릭으로 수집한다. 호출 빈도와 지연 시간을 시계열로 기록하여 애플리케이션의 동작을 모니터링할 수 있다. @Timed 어노테이션은 Micrometer에서 제공..

JVM/SpringCloud 2024.01.03