
현업에서 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) 도메인 모델과 구현 도메인이..
1) 다양한 타입 계층 구현 ● 클래스를 이용한 타입 계층 구현 타입을 구현할 수 있는 방법이 단 한가지 방법만 존재하는 경우 타입과 클래스를 동일하게 취급한다. 만약 Car라는 클래스와 인터페이스는 동일하지만 다른방식으로 구현해야 하는 객체가 필요하다면 즉, 구현은 다르지만 동일한 타입으로 분류되는 객체가 필요하면 상속을 이용하면 된다. 그러나, 자식클래스를 부모 클래스의 구현에 강하게 결합시키기 때문에 구체 클래스를 상속받는 것을 피하고 추상 클래스, 인터페이스를 이용해야한다. 그리고 대부분의 언어에서의 클래스의 다중 상속을 지원하지 않기 때문에 다양한 타입으로 사용이 불가능하다. ● 인터페이스를 이용한 타입계층 구현 위에서 발생하는 다중 상속 지원하지 않는 문제와, 결합도 문제를 피할 수 있는 방법..
1) 협력과 계약 계약에 의한 설계 라이브러리를 사용한다면 Contract.Requires(IsSatisfied(schedule)); 와 같이 제약조건을 명시적으로 표기할 수 있다. 이는 주석과 다르게 시간의 흐름에 따라 같이 움직이며, 실행중에도 체크할 수 있다. 계약은 일반적으로 다음과 같은 특성이 있다. ● 각 계약 당사는 계약으로부터 이익을 기대하고 이익을 얻기 위해 의무를 이행한다. ● 각 계약 당사자의 이익과 의무는 계약서에 문서화 된다. 이 계약 이라는 아이디어를 통해 객체 협력 방식에 적용한 아이디어가 있다. 다음 내용을 살펴보자. 2) 계약에 의한 설계 계약의 의한 설계 개념은 "인터페이스에 대해 프로그래밍하라"는 원칙을 확장한 것이다. 다음 자바코드를 보자 가시성 / 반환 타입 / 메서..
1) 디자인 패턴과 설계 재사용 패턴의 분류 ● 아키텍처 패턴: 미리 정의된 서브 시스템을 제공, 각 서브시스템 책임을 정의, 서브시스템간 조직화하는 규칙과 가이드라인을 포함한다. - 소프트웨어의 전체적인 구조 결정 ● 분석 패턴: 업무 모델링 시에 발견되는 공통적인 구조를 표현하는 개념들의 집합 - 도메인 내의 개념적인 문제 해결에 초점 ● 디자인 패턴: 협력하는 컴포넌들 사이에서 반복적으로 발생하는 구조를 서술 - 특정한 설계문제를 해결하는 것을 목적으로 한다. ● 이디엄 패턴: 특정 언어에만 국한된 패턴으로 주어진 언어의 기능을 사용해 컴포넌트, 혹은 컴포넌트 간의 특정 측면을 구현하는 방법을 서술 - 객체가 스스로 자신을 참조하는 객체들의 개수를 카운트해서 더이상 참조되지 않을 경우 스스로를 삭제..
1) 핸드폰 과금 시스템 변경하기 기본정책을 추가하기 위해 BasicRatePolicy를 추상화(슈퍼타입)하고 FixedFeePolicy(고정요금) TimeOfDayDiscountPolicy(시간대별 요금) DayOfWeekDiscountPolicy(요일별 요금) DurationDiscountPolicy(구간별 요금) 을 서브타입으로 구현화 한다. 이 후 통화기간을 일자별로 정리하는 전문가 DateTimeInterval 와 각 구현된 요금정책 Policy 그리고 각 요금규칙 Rule이 요금을 계산해준다. 이때, 생겨나는 Rule을 주의해야한다. 클라이언트가 요구하는 슈퍼타입과 별개로 사전조건이 계속 추가되고 있다. 시간대별, 요일별, 구간별 -> 고정요금을 제외한 사전 조건이 다르다. 결국, 클라이언트는..