JAVA
-
Java의 Nested ClassesJAVA 2024. 8. 5. 23:37
자바 프로그래밍 언어에서는 클래스 안에 또 다른 클래스를 정의할 수 있는데, 이를 중첩 클래스라고 합니다. 중첩 클래스는 두 가지로 나뉩니다: 비정적 중첩 클래스(내부 클래스)와 정적 중첩 클래스입니다. 내부 클래스는 외부 클래스의 인스턴스와 관련되어 있으며, 외부 클래스의 멤버에 직접 접근할 수 있습니다. 반면에 정적 중첩 클래스는 외부 클래스의 인스턴스 멤버에 직접 접근할 수 없습니다.중첩 클래스를 사용하는 이유는 다음과 같습니다:특정 클래스에서만 사용되는 클래스들을 논리적으로 그룹화하여 코드의 가독성과 유지보수성을 높입니다.캡슐화를 증가시킵니다. 외부 클래스의 멤버를 private으로 선언하면서 내부 클래스에서는 접근할 수 있게 할 수 있습니다.코드의 가독성과 유지보수성을 높입니다.다음은 중첩 클래..
-
Java Virtual Thread 이론JAVA 2024. 4. 24. 00:56
Virtual Thread Virtual Thread는 가벼운(lightweight) Thread로, 고성능 동시성 애플리케이션을 작성, 유지 및 디버깅하는 데 드는 노력을 줄여줍니다. Virtual Thread에 대한 배경 정보는 JEP 444를 참조하세요. Thread는 스케줄링될 수 있는 가장 작은 처리 단위입니다. 이는 다른 단위들과 동시에 — 그리고 대부분 독립적으로 — 실행됩니다. 이것은 java.lang.Thread의 인스턴스입니다. 스레드에는 두 가지 종류가 있는데, 플랫폼 스레드와 가상 스레드가 그것입니다. 여기에서 "가상 스레드"는 자바의 새로운 기능 중 하나로, 기존의 플랫폼 스레드(heavyweight thread)에 비해 훨씬 가벼운 스레드를 말합니다. 이를 통해 동시성이 높은 애..
-
ObjectMapper와 MapStruct의 성능차이JAVA 2024. 4. 2. 18:43
문제 상황 복잡한 비즈니스 로직을 가지고 있는 Service 로직에서, 9천건의 데이터 조회시 5초~7초 정도 소요되는 성능 이슈 원인 분석 성능 이슈의 위치를 정확히 파악하기 위해, StopWatch를 성능 이슈가 있을만한 로직의 앞 뒤에 붙여줘서 확인했다. StopWatch를 붙인 곳 - List의 객체 변환 로직 - 조회 쿼리 StopWatch를 활용한 처리 시간 체크 코드 import org.springframework.util.StopWatch; // ... final StopWatch firstWatch = new StopWatch("firstWatch"); firstWatch.start(); final List userAddressList = userList.stream() .map(user..
-
Java volatile 키워드JAVA 2023. 1. 5. 09:40
Java에서 volatile에 대해 알아보겠습니다. volatile을 번역하면 휘발성이라는 단어가 많이 나옵니다. Java동시성에 대한 이야기에 자주 따라붙곤 합니다. 그러면, volatile이란 언제 사용하는 것이고, volatile 키워드를 사용하면 어떤일이 벌어질까요? synchronized 키워드는 변수와 클래스에 붙일 수 없고, 메서드와 블럭에만 사용할 수 있습니다. 단순한 Counter 예제를 통해서 확인해 보겠습니다. 예제 목록 instance 변수 volatile 변수 AtomicInteger synchronized block main 메서드 클래스 모든 코드는 다음코드로 실행해 보겠습니다. public class CounterApp { public static void main(Strin..
-
AsyncRestTemplate PATCH 메서드 유효하지 않은 요청JAVA 2022. 12. 30. 13:00
외부 API 연동 중 PATCH 메서드를 사용해서 통신해야 하는 일이 생겼다. 응답 결과가 중요하지 않았기 때문에, 응답을 기다리기 보다는,비동기 호출을 하기로 결정했다. 어떤 API를 활용할까 하다가 우리가 현재 쓰고 있는 버전이 Spring 4.x 버전이다보니, AsyncRestTemplate을 사용하기로 했다. 참고로, AsyncRestTemplate은 Spring5.0부터 Deprecated 되었다. https://docs.spring.io/spring-framework/docs/5.0.15.RELEASE/javadoc-api/deprecated-list.html https://docs.spring.io/spring-framework/docs/5.0.15.RELEASE/javadoc-api/org..
-
Memory leak - Thread dump 활용JAVA 2022. 7. 10. 02:22
서버 접속 장애 발생 터널링해서 top 명령을 실행했을 때 java 프로세스가 100% 이상 튀는 문제 발생 서버 로그를 통해서는 확인이 되지 않는 상황 이 때, 쓰레드 덤프, 힙 덤프를 뜨면 확인할 수 있을 것으로 판단함 우선 java 프로세스를 확인 $ ps -efc | grep java 그리고 gc를 확인할 수 있는 명령어 몇 개 실행 $ jstat -gc $ jstat -gc 10985 $ jstat -gcutil $ jstat -gcutil 11479 $ jstat -gcutil -h5 1000 10 $ jstat -gcutil -h5 11479 1000 10 위 명령으로는 정확한 확인이 어려워서 ThreadDump 생성 $ jstack > threadDump.txt $ jstack 10895 ..
-
TDD 요약 정리 - 테스트 주도 개발/테스팅 패턴, 빨간/초록 막대JAVA 2022. 7. 4. 08:53
25장. 테스트 주도 개발 패턴 테스트한다는 것은 무엇을 뜻하는가? 테스트를 언제 해야 하는가? 테스트할 로직을 어떻게 고를 것인가? 테스트할 데이터를 어떻게 고를 것인가? 테스트(명사) 테스트 - 자동화된 테스트 격리된 테스트 테스트를 격리하기 위한 작업 - 응집도가 높고 결합도는 낮은 객체의 모음 테스트 목록 구현해야 할 모든 목록 모든 오퍼레이션의 사용 예 해당 오퍼레이션의 널 버전 리팩토링 목록 테스트 우선 테스트를 먼저 하면 스트레스가 줄고 테스트를 더 많이 하게 된다 단언 우선 완료된 시스템이 어떨거라는 거부터 기능이 완료되면 통과할 수 있는 테스트 부터 완료될 때 통과해야 할 단언부터 테스트 데이터 테스트를 읽을 때 쉽고 따라가기 좋을 만한 데이터 사용 명백한 데이터 테스트 자체에 예상되는 ..
-
TDD - 2부 xUnit 간단 정리JAVA 2022. 6. 27. 01:38
2부 xUnit 예시 간단 정리 xUnit 페이지를 공부하면서 이 정도는 알아둬야 겠다 하는 내용에 대해 간단히 정리 TDD를 마스터하면 훨씬 큰 기능 단위로 작업할 수 있게 되지만 TDD를 마스터 하기 위해서는 필요할 때 작은 단계로 작업하는 법을 배워야 한다. AAA 패턴 준비(arrange) - 객체 생성 행동(act) - 어떤 자극을 준다 확인(assert) - 결과 검사 이전에 공부했을 때는 주로 .net 진영에서 많이 쓰는 패턴으로 보였다. Java 진영에서는 Given/When/Then 패턴을 많이 쓰는 것으로 보인다. 테스트를 위해 필요한 객체 생성 제약 성능 여러테스트에서 같은 객체 사용한다면 객체 하나만 생성 격리 다른 테스트에 영향을 주지 않기 위해 테스트 마다 각 객체 생성 테스트 ..