Integer 128 != Integer 128 ??앞서 String Pool에서 문자열의 동일비교에 대해 공부해보았는데,이번엔 흥미로운 숫자에 대해서도 동일비교가 문제가 되는 상황이 있다. Integer a1 = 1;Integer a2 = 1;Integer a3 = 128;Integer a4 = 128;Integer a5 = 256;Integer a6 = 256;System.out.println(a1 == a2); //trueSystem.out.println(a3 == a4); //falseSystem.out.println(a5 == a6); //false 왜 이러한 상황이 나오는 것일까? 아시다시피 Integer Class는 Object객체이다. 기본형타입과는 다른 비교가 필요하다.그렇다면 a1,a2..
Java Archive(JAR)은 메니페스트 파일로 설명할 수 있는데, JAR파일 형식은 Java클래스 파일과 리소스 및 메타데이터를 단일 파일로 패키지하는 데 사용되는 압축 파일 형식이다. 매니페스트 파일은 JAR파일 자체에 대한 메타 데이터를 제공하는데 사용된다. 매니페스트 파일은 다음과 같은 정보가 포함되어있다. 1. Main-class: JAR 파일 실행시 애플리케이션 진입 메인 클래스 지정 2.Class-Path: JAR파일에 대한 클래스 경로 종속성 지정 (애플리케이션에 필요한 클래스가 포함된 다른 JAR혹은 디렉토리를 포함할 수 있음) 3. Manifest-Version: 매니페스트 파일 형식의 버전 4. 작성자: JAR 파일을 생성하는데 사용된 도구, 버전, 작성자 , 시스템 식별 해당 파..
카프카 커넥트카프카 커넥트는 데이터 파이프라인 생성 시 반복 작업을 줄이고 효율적인 전송을 이루기 위한 애플리케이션이다.카프카 프로듀서-컨슈머 애플리케이션과 유사하지만 해당 애플리케이션은 세밀한 제어, 고유한 요구 사항의 경우 사용하고 커넥트의 경우 표준화된 접근방식에 대해 사용하게 된다. (템플릿) 파이프 라인 생성시 자주 반복되는 값(토픽 이름, 파일 이름, 테이블 이름)등을 파라미터로 받는 커넥터를 코드로 작성후에 파이프라인을 실행할 때는 코드 작성할 필요가 없기 때문이다. 카프카 커넥터는 프로듀서 역할을 하는 '소스 커넥터' 와 컨슈머 역할을 하는 '싱크 커넥터' 로 나뉜다.일정한 프로토콜을 가진 소스 애플리케이션이나 싱크 애플리케이션이 있다면 커넥터를 통해 카프카로 데이터를 보내거나데이터를 가져..
카프카 클라이언트 카프카 클러스터에 명령을 내리거나 데이터를 송수신 하기 위해 카프카 프로듀서, 컨슈머, 어드민 클라이언트를 제공하는 카프카 클라이언트를 사용하여 애플리케이션을 개발한다. 카프카 클라이언트는 라이브러리이기 때문에 자체 라이프사이클을 가진 프레임워크 혹은 애플리케이션 위에서 구현 및 실행해야 한다. 프로듀서 API 프로듀서 애플리케이션은 카프카에 필요한 데이터 선언 및 브로커 특정 토픽 파티션에 전송한다. 이때, 리더 파티션을 가지고 있는 카프카 브로커와 통신한다. 프로듀서는 데이터를 직렬화하여 카프카 브로커로 전송한다. 직렬화를 사용하면 자바 기본형, 참조형 뿐 아니라, 동영상 이미지 같은 바이너리 데이터도 전송가능하다. 카프카 공식 자바 라이브러리를 사용하여 프로듀서를 개발해본다. 의존..
현업에서 Java 17버전을 사용하게 되었는데, 주요 변경점들에 대해서 너무 모르고 있는 것이 많아 정리하려고 한다. Java 8 → Java 11 1. 모듈 시스템 자바 9부터 모듈 시스템이 도입되어 라이브러리와 애플리케이션을 모듈로 분리하는 기능을 제공한다. 2. 로우-레벨 프로파일러 (JMH) 자바 11에는 JMH를 지원하는 도구가 포함되어 있어 , 로우-레벨에서 성능 테스트를 수행하기가 더 쉬워졌다. ※ JMH: Java언어로 작성된 마이크로 벤치마킹 도구이다. Java코드의 작은 부분을 테스트하고 성능 특성을 분석하는데 쓰인다. Java 성능 튜닝과 최적화에 매우 유용한 도구로 인정받고 있다. 3. HTTP/2 지원 자바 9부터 HTTP/2 프로토콜을 지원한다. 이를 통해 네트워크 통신의 성능을..
자바애플리케이션에서 JVM을 모니터링하기 위해 가장 많이 쓰이는 VisualVM을 연동을 하여 어떠한 지표들을 보아야하는지, 트러블을 일으키고 해결하는 것을 실습해보도록 하자. 여기서 애플리케이션은 스프링 부트 웹 애플리케이션을 이용하도록 하겠다. 1. 설치 VisualVM: Download 이곳에 가서 각 운영체제 맞는 VisualVM을 설치하도록 하자. 필자는 Windows여서 Zip파일을 받아서 압축해제하였다. 2. 실행 압축해제를 진행하면 bin폴더에 visualvm.exe 파일이 존재한다. 실행시키고 라이센스에 동의한다. 실행에 성공하면 다음과 같은 화면이 나오게 된다. 현재 구동중인 자바 애플리케이션이 존재하지 않아서 Local밑에 나오는 자바애플리케이션이 VisualVM외에 존재하지 않는다...
개발을 진행하면서 설정을 위해 성능을 측정해보거나 사용자의 경험을 위해 좋은 성능의 서비스를 제공해야하는데, 이를 위해 모니터링을 해야하는 부분과 제공하는 프로그램(툴)들을 Chat-GPT와 함께 확인(공부)해보도록 하자. 1. 모니터링 목록 1) CPU 사용량 CPU 프로파일링: 가장 많은 CPU 시간을 소비(점유)하는 코드부분이나 메서드를 식별 2) 메모리사용량 힙 분석: Java 힙 메모리 사용량을 모니터링 하여 메모리 누수, 과도한 객체 생성, 불필요한 메모리 소비 식별 GC 분석: 가비지 수집(GC) 로그를 분석하여 가비지 수집 설정을 최적화하고 stop-the-world를 최소화한다. 3) 스레드 활동 스레드 덤프 분석: 스레드 덤프를 캡처하고 분석하여 스레드 경합, 교착 상태 또는 장기 실행..
프로그래머는 객체지향 프로그램을 작성하기 위해서 동적 모델과 정적 모델을 그려야 한다. 동적모델은 프로그램 실행 구조를 표현하는 움직이는 모델이며 객체와 협력 으로 구성되고 정적모델은 코드의 구조를 담는 고정 모델이며 타입과 관계로 구성된다. 동적모델을 토대 위에 정적 모델을 설계해서 변경에 유연한 코드를 만들어야 한다. 1) 동적 모델과 정적 모델 객체의 행동이 코드를 결정한다. 객체가 외부에 전달하는 행동이 중요하기 때문에 동적 모델이 정적모델을 결정하게 만들어야한다. 만약 정적 모델이 협력에 적합하지 않다면 정적 모델을 지속적으로 개선해야한다. 그러나, 객체가 제공하는 행동 측면에서 적절한 정적 모델을 고려하더라도 변경이 고려되지 않는다면 유지보수하기가 어려워진다. 2) 도메인 모델과 구현 도메인이..