JAVA
-
Java Pattern.matches의 오남용으로 인한 성능 문제와 최적화 방법JAVA 2024. 12. 23. 12:14
Java에서는 Pattern.matches 메소드를 통해 정규표현식을 쉽게 사용할 수 있지만 내부 동작 원리를 제대로 이해하지 못하면 성능 문제가 발생할 수 있습니다. Pattern.matches의 동작 원리Pattern.matches(String regex, CharSequence input)는 아래와 같은 과정을 거쳐 입력 문자열을 매칭합니다.> 정규표현식 컴파일메소드 호출 시 입력받은 정규표현식(regex)을 NFA(비결정적 유한 오토마타, Non-deterministic Finite Automaton)에서 정규표현식에 따라 DFA(결정적 유한 오토마타, Deterministic Finite Automaton)로 변환하며 이 과정에서 정규표현식을 해석하고 효율적으로 실행될 수 있는 내부 구조를 생성..
-
[스레드 안전성을 위한 선택] synchronized, ReentrantLock, ReentrantReadWriteLock 비교JAVA 2024. 9. 24. 17:05
문제 발견레거시 프로젝트의 유지 보수를 맡게 되면서 모든 화면에서 로딩 시 약 170개의 쿼리가 실행되며 그중 약 60~70개의 변하지 않는 데이터를 반환하는 쿼리가 실행되고 있는 것을 확인했습니다.이로 인해 화면 로딩 시간이 길어지는 문제을 발견해서 처음에는 Redis를 도입하여 성능을 개선하려고 했으나 서버 확장이 불가능하다는 결론이 내려졌습니다.그래서 AOP를 이용한 인메모리 캐싱을 도입하기로 했고 메서드명과 매개변수를 조합하여 키를 생성하고 그에 따른 결과를 캐싱하는 방식으로 구현할 예정입니다.이 과정에서 동시성 문제를 해결해야 했고 synchronized, ReentrantLock, ReentrantReadWriteLock과 같은 다양한 동기화 방법에 대해 깊이 알아보았습니다.1. Synchro..
-
CPU-bound와 I/O-bound 작업의 병렬 처리JAVA 2024. 5. 23. 17:18
CPU - Bound 작업CPU-Bound 작업은 CPU 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 병렬 처리를 통해 성능을 향상시킬 수 있습니다.이유는 각 Thread는 독립적으로 CPU 자원을 사용하여 작업을 처리하기 때문입니다. 하지만 실제 CPU 코어 수를 초과하는 Thread 개수를 사용하는 경우 성능에 악영향을 초래할 수 있습니다.I/O - Bound 작업I/O-Bound 작업은 입출력 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 디스크 or 네트워크 속도에 의해 결정되기 때문에 Thread 수를 증가해도 성능 향상이 제한적입니다.또한 각 스레드가 I/O가 작업이 완료될 때까지 대기하는 병목현상이 발생하여 Thread 관리 오버헤드가 발생할 수 있습니다.성능 향상을 위해..
-
[Test Code] Mockito를 활용한 랜덤 값 포함 함수 유닛 테스트JAVA 2024. 5. 23. 14:54
이 글에서는 Mockito를 활용하여 Java 애플리케이션에서 랜덤 값을 포함하는 함수를 어떻게 효과적으로 테스트할 수 있는지에 대해 알아보겠습니다.MockitoMockito는 자바에서 Mock 객체를 생성하고 관리할 수 있는 강력한 도구이며, 특히 랜덤 값과 같이 예측하기 어려운 요소가 포함된 함수를 테스트할 때 사용할 수 있습니다.Mock 객체란 실제 객체를 대신하는 가짜 객체를 말합니다.Mock 객체는 외부 의존성이 많은 코드나 복잡한 비즈니스 로직을 가진 코드를 테스트하는 데 매우 유용합니다.간단한 예제:import java.util.Random;import lombok.AllArgsConstructor;@AllArgsConstructorpublic class Game { private Rando..
-
Java Stream이란? feat. 메모리 로드, 병렬 처리, 연산 흐름JAVA 2024. 5. 23. 10:11
Stream의 특징스트림(Stream)은 Java에서 일련의 데이터를 함수형 연산을 통해 효율적으로 처리할 수 있는 메커니즘입니다.기본적으로 스트림은 지연 평가를 사용하여 연산을 효율적으로 처리합니다.이를 통해 필요할 때만 연산을 실행하고 중간 연산 결과를 최적화할 수 있습니다.병렬 처리를 원할 경우, parallel() or parallelStream()를 사용하여 스트림을 병렬 처리 모드로 전환할 수 있습니다.병렬 Stream이 모든 상황에서 성능 향상을 보장하지 않습니다.이렇게 하면 멀티 코어 CPU를 활용하여 대량의 데이터를 빠르게 처리할 수 있고, 병렬 처리된 각 부분의 결과를 최종적으로 합치는 과정을 거칩니다.스트림의 이러한 특성 덕분에 Java에서는 복잡한 데이터 처리 작업을 보다 간편하게 ..
-
AOP - java.lang.ClassCastExceptionJAVA 2024. 2. 23. 13:58
발생 확인 @aoptest public List testMethod(){ List list = new ArrayList(); list.add(1); list.add(2); return list; } @Around("@annotaion(aoptest)") public ResponseEntity testAOP(ProceedingJoinPoint joinPoint) throws Trowable { try { Object obj = joinPoint.proceed(); return ResponseEntity.ok().body(obj); } catch (Throwable e) { e.printStack(); } } @Getter @AllArgsConstructor public class StatusCode{ Ob..
-
Type safety: Unchecked cast from ~JAVA 2024. 2. 16. 13:50
발생원인 Object 타입으로 받아온 값을 List로 형변환을 시도하던 중 발생하였다. 이는 타입 안전성(Type safety)은 컴파일 중에 타입 제약 조건을 강제하여 런타임 중에 타입 오류를 방지하는 것을 의미하여 예외가 아닌 경고이다. 해결방법 SuppressWarnings 어노테이션 붙이기 SuppressWarnings 관련 옵션은 링크에서 확인 가능합니다. @Getter public class Tistory{ Object data; } @SuppressWarnings("unchecked") List vo = (ArrayList) tistory.getData(); 개발자 답게 타입을 정확히 확인하고 형변환 하기 항상 타입을 정확히 하는 것이 좋아 보인다. @Getter public class Ti..
-
(객체 지향 설계) 순수 자바로 DIP 원칙 지키기JAVA 2023. 8. 19. 16:18
객체 지향 설계에서 DIP는 의존 관계 역전 원칙을 의미한다. 프로그래머는 추상화에 의존해야하며 구체화에 의존하면 안되는다는 말이다. public class Test{ TestInterface ti = new TestObject(); } 위와 같이 다형성을 이용하여 작성하면 DIP를 위반하는 행위가 된다. 현재 Test 클래스는 인터페이스와 구현체 두가지 모두에 의존하고 있는 상황이다. 이를 해결 하기 위해서는 Test클래스는 추상화만 의존하게 만들어줘야 한다. public class Test{ // 현재 Test 클래스는 추상화에만 의존하고 있다. TestInterface ti; Test(TestInterface ti){ this.ti = ti; } } public class AppConfig{ // ..