-
Junit4, 5의 차이점Java 2025. 3. 21. 17:01
JUnit을 공부하고 나서 마지막으로 테스트하던 항목 가운데 Test Suites 부분에서 계속 오류가 발생해서 해결 방법을 찾다가 찾게 된 글입니다. JUnit Version 4와 Version 5의 차이점을 항목별로 비교해 놓았고, 제가 원하는 내용도 포함하고 있어서 읽어보다가 괜찮다는 생각이 들어 간단히 정리 겸 번역을 해두었습니다.JUnit 5는 Java8 스타일의 코딩을 적용하고 JUnit 4 보다 강력하고 유연하게 만드는 것을 목표로 합니다. 이 글은 JUnit 5와 JUnit 4의 주요 차이점을 설명하고 있습니다. 1. Annotations 차이점JUnit 4와 JUnit 5의 대부분의 Annotation은 동일하지만 몇 가지는 다릅니다.아래 표에 두 버전 간에 달라진 점을 비교하였습니다. ..
-
Collections.unmodifiableMap 메소드를 이용한 read-only 객체 만들기Java 2025. 2. 19. 10:11
웹 애플리케이션 기동 시 properties에 있는 설정 정보들을 컬렉션 객체에 저장하고 이를 가져다가 쓰는 경우가 많은데 이 객체에 변경을 막는 제약 조건을 걸고 싶을 때가 있다.즉, read-only 한 객체를 만들고 싶은 경우인데 이럴 때 다음의 메소드를 사용하면 좋을 것 같다. Collections.unmodifiableMapCollections.unmodifiableList해당 메소드는 파라미터로 전달 받은 컬렉션 객체에 어떠한 변경이라도 발생하면 예외를 return한다. 테스트 코드는 다음과 같다.package collection; import static org.hamcrest.CoreMatchers.*;import static org.junit.Assert.*; import java.uti..
-
CompletableFutre 사용 시, 생성되는 Thread의 개수 확인해보기Java 2025. 2. 2. 17:20
CompletableFutre 사용 시, 생성되는 Thread의 개수 확인해보기.1. CompletableFuture를 실행한다.public class Main { public static void main(String args[]) throws IOException { List list = new ArrayList(); for(int i = 0; i { System.out.println(Thread.currentThread() + " 실행"); try { Thread.sleep(1000); } catch (InterruptedException e) { ..
-
비동기 처리의 스레드와 일반 스레드Java 2024. 7. 23. 23:43
1. 개발을 하다가 아래와 같은 궁금증이 생겼다.CompletableFuture를 비동기 처리할 때는 ForkJoinPool의 스레드를 공유해서 사용한다는 특징이 있다. (물론, 스레드 미지정시 기본적으로 자바에서 제공해주는 ForkJoinPool을 사용)그렇다면, 클라이언트에서 요청을 보냈을 때 할당해주는 스레드와 ForkjoinPool은 무엇이 다를까? 2. 기본적으로 클라이언트에서 요청을 보냈을 때, 톰캣에서 생성하는 스레드 풀이 할당된다.아래의 그림과 같이 http-nio-8080-exec-4,5,main 라고 명시돼 있는 부분이 톰캣에서 생성하는 스레드 풀이다.별도의 설정값 없이 실행을 하니, 10개의 스레드 풀이 생성된 것을 확인할 수 있고 설정된 값보다 더 많은 스레드가 필요시 되면, MAX..
-
Caffeine Cache 적용기Java 2024. 7. 3. 22:24
Caffeine Cache 적용 방법 - 왜 사용할까?자주 빈번하게 조회되는 데이터를 DB에 접근하여 가져오게 되면 DB의 리소스가 낭비가 될 확률이 높다.그래서 자주 그리고 변경이 적은 데이터를 DB에서 계속 접근하여 가져오는 것이 아니라 캐시와 같은 저장소에 저장해두고 사용하여 성능의 이점을 위해 사용한다. 1. Dependencyimplementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '3.1.8'2. 캐시 사용하기 - 3가지 전략Manual Populating캐시에 수동으로 데이터를 적재하고, 사용하는 방법결과 ==> Person{name='테스트', age=33, weight='76kg', height='1..
-
메소드 레퍼런스(Method Reference)Java 2024. 4. 27. 17:30
1. 메소드 레퍼런스란?메서드 표현식을 조금 간결하게 사용하는 기술예시 : (Car car) -> car.getCarName() 이 표현식을 Car::getCarName로 표현할 수 있다. 2. 대표 유형1) ClassName :: static method 유형예시코드cryptoCurrencies.stream() .map(r -> StringUtils.uppercase(r)) .map(StringUtils::upperCase) 2) ClassName :: instance method 유형예시코드cryptoCurrencies.stream() .map(r -> r.uppercase(r)) .map(St..
-
Enum 활용방안Java 2023. 12. 1. 17:32
# 1. 특정 값으로써 활용할 때 키, 코드, 명칭과 같은 값을 공통코드로 사용하는 경우 활용한다. 아래의 예시 참고 @Getter @AllArgsConstructor public enum MemberGrantType { M("M", "마스터 권한") ,C("C", "회사 권한") ,S("S", "매장 권한") ,U("U", "회원 권한") ; private String code ; private String name ; } # 2. 메소드로 활용할 때 추상 메소드를 만들고 이를 구체화하여 활용할 수 있다. 아래의 예시 참고 public enum LeaveRequestState { Submitted { @Override public String responsiblePerson() { return "Emp..
-
Garbage CollectionJava 2023. 11. 9. 22:44
# Garbage Collection(GC) 란? JVM의 Runtime Data Area에는 Heap 영역이라는 곳이 있는데, 이 영역 내부에 참조되고 있지 않는(사용되고 있지 않는) 객체를 삭제해주는 것을 GC라고 한다. # GC를 왜 할까? 메모리의 자원은 한정돼 있는데, 사용하지 않는 데이터가 자리를 차지하고 있으면 당연히 비효율적이기 때문에. C와 C++은 개발자가 수동으로 메모리 할당과 해제를 일일이 해줘야한다. 하지만 Java는 JVM의 GC가 일괄적으로 관리해주기 때문에 개발자는 비즈니스 로직 구현에만 집중할 수 있다. # GC의 단점 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들다. 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제..
-
자바의 Reflection 활용하기Java 2023. 11. 8. 10:59
# Relfection 이란? JVM Runtime Data Area 내의 Method Area에 Class, Mehtod, Variable와 같은 클레스의 정보가 저장되는데 클레스 정보를 활용할 수 있도록 도와주는 Library이다. # 활용 사례 개발을 하다보면 switch, if ~ else if ~ else 와 같이 코딩을 하는 경우가 있다. 개인적으로 이런 코드는 SOLID의 원칙 중 SRP(단일책임원칙)과 OCP(개방폐쇠원칙)을 위반할 확률이 있기 때문에 이런 경우에 상황에 맞게 유동적으로 사용할 수 있다. '그림1'은 kafkaMehtodList Class에 methodName과 일치하는 method를 실행시키는 로직이다. 위와 같은 구조로 설계를 하면 토픽이 늘어날 때 마다 해당 토픽에 상..
-
String Constant Pool 이란?Java 2023. 11. 8. 00:21
# String Constant Pool 이란? 리터럴("")로 구성된 문자열의 복사본을 Pool에 하나만 저장한 공간을 String Constant Pool이라고 한다. # 왜 사용 하는지? 결론적으로는, 메모리 공간 효율성을 위해서 사용한다. 똑같은 문자열을 사용할 때마다 생성해주면 메모리 측면에서 너무 비효율적이니까 같은 문자열을 가진 String들은 저 Pool에 있는 문자열을 바라보게끔 만든 것 이다. [예시] public class Main { public static void main(String[] args) { String test = "김성훈" ; String test2 = "김성훈" ; System.out.println(test.hashCode()) ; System.out.printl..