Java
-
구독의 보너스 날짜 계산하기Java 2023. 9. 19. 00:01
개요 구독의 주기는 1달로 일어난다고 가정해 보겠습니다. 이때 만약 어떤 일로 인해서 미리 구독을 해지시키고 다시 1달짜리를 가입시켜 주어야 한다면 어떻게 될까요? 예를 들어 10월 15일에 어떤 사용자가 구독을 시작했는데 10월 21일에 구독 해지가 일어나고 다시 가입이 진행된다면 이 유저는 보너스 6일을 얻어야 합니다. 테스트 class BonusPeriodTest { @Test @DisplayName("현재 날짜가 10월15일이고, 구독일이 10월 1일이라면 해당 구독은 11월 1일에 만기되야하므로 보너스날짜는 17일이다") void test1(){ LocalDate currentDate = LocalDate.of(2023,10,15); LocalDate subscribedAt = LocalDate..
-
JVM Warm-up 이란Java/자바를 더 깊게 2023. 9. 9. 00:01
JVM Warm-up 이란?warm-up은 흔히 워밍업으로 우리가 알고 있으며 몸풀기 준비운동이라는 뜻입니다. 그렇다면 JVM의 준비운동은 어떤것을 의미할까요? 이를 이해하기 위해서는 자바언어의 컴파일 과정을 알아볼 필요가 있습니다. 자바 언어의 컴파일 과정JVM 실행 전1) 소스 코드인 .java 파일을 바이트 코드인 .class 파일로 변환합니다. JVM 실행 후2) 클래스를 사용하는 시점에 클래스 로더가 lazy loading을 수행합니다.3) 로딩된 클래스를 OS가 이해할 수 있는 기계어로 변환합니다. 즉, 클래스가 실제로 사용되는 시점에 기계어로 변환됩니다. 새로운 버전의 애플리케이션을 배포한 직후에는 대부분의 클래스들이 사용되지 않았기 때문에 메모리에 적재되지 않은 상태이며 응답지연이 발생하..
-
Throwable 클래스란?Java 2023. 6. 16. 00:01
개요 Exception에 대해 알아보던 중 CheckedException, UnCheckedException으로만 구분 짓곤 했었는데, Throwable이란 클래스가 종종 보이게 되어 확실하게 정리하고자 합니다. Throwable 클래스란? Throwable은 Java 언어의 모든 오류(Error Class) 및 예외(Exception Class)의 최상위(root) 클래스입니다. Error는 프로그램의 회복을 기대하지 않는 치명적인 예외입니다. 예를 들어 IOError, OutOfMemoryError 등이 있습니다. Exception은 프로그램 회복을 기대하는 예외입니다. IOException, RuntimeException 등이 있습니다. 참고자료 https://docs.oracle.com/javas..
-
Java Executors - ScheduledExecutorServiceJava/Executor Service 2023. 6. 15. 00:01
개요 Socket을 Connect 하고 5분 후 timeout을 발생시키기 위해 ScheduledExecutorService를 활용하게 되었고, 이에 대해 자세하게 알아보고자 합니다. Executor 인터페이스 동시에 여러 요청을 처리해야 하는 경우 매번 새로운 쓰레드를 만드는 것은 비효율적입니다. 따라서 쓰레드를 미리 만들어두고 재사용하는 Thread Pool이라는 개념이 등장하게 되었고 Executor는 쓰레드 풀의 구현을 위한 인터페이스입니다. public interface Executor { void execute(Runnable command); } 쓰레드는 크게 작업의 등록과 실행으로 나누어집니다. 이때 Executor는 등록된 작업(Runnable)을 실행하기 위한 인터페이스이며, 작업의 실..
-
Instant vs LocalDateTimeJava 2023. 5. 27. 00:01
LocalDateTime, Instant란? 공통적으로 시간을 관리하기 위해 사용하는 자바 클래스입니다. 개인 프로젝트를 진행하면서 Date 더 나아가 Java8의 LocalDate를 사용하곤 합니다. Instant란? Instant란 의미는 순간, 즉시를 의미합니다. (인스턴스 음식을 떠올리면 좋습니다) long 형태로 Unix Tiemstamp를 저장하기 때문에 연산이 빠릅니다. (인간보다는 기계친화적) Instant.now()로 현재 순간을 기준으로 클래스를 생성할 수 있으며 출력해 보면 다음과 같은 형태로 보이게 됩니다. 2023-04-11T11:35:11.301031Z 나노초까지 표현이 가능하며 뒤에 Z를 표현합니다. (Z는 UTC를 의미합니다.) 자세한 사항에 대해서는 날짜/시간과 관련된 국제..
-
컬렉션 API 개선Java/모던자바인액션요약 2022. 9. 6. 00:01
거의 모든 자바 애플리케이션에서 컬렉션을 사용합니다. 하지만 컬렉션을 에러를 유발하는 여러 단점들이 존재합니다. 자바 8,9에 추가되어 우리의 삶을 편리하게 만들어 줄 새로운 컬렉션 API 기능들을 배워보는 시간입니다. 리스트 만들기 List friends = new ArrayList(); friends.add("element1"); friends.add("element2"); friends.add("element3"); Arrays.asList() 팩토리 메서드를 이용하면 코드를 간결하게 줄일 수 있다. List friends = Arrays.asList("element1","element2","element3"); 마찬가지로 List.of 팩토리 메서드를 이용해서도 간단하게 리스트를 만들 수 있습니다..
-
병렬 데이터 처리와 성능Java/모던자바인액션요약 2022. 8. 29. 00:01
개요 자바 7 이전에는 데이터 컬렉션을 병렬로 처리하기 어려웠습니다. 자바 7은 포크/조인 프레임워크 기능을 제공하여 쉽게 병렬화를 수행하며 에러를 최소화할 수 있도록 합니다. 하지만 자바 8의 스트림을 사용하면 순차 스트림을 병렬 스트림으로 자연스럽게 바꿀 수 있습니다. (동기화 문제 , 쓰레드는 몇 개로 지정할지 등을 고민하지 않아도 됩니다.) 하지만 내부 처리과정이 어떻게 이루어지는지 알아야 스트림을 잘못 사용하는 상황을 피할 수 있습니다. 병렬 스트림 parallelStream을 호출하여 병렬 스트림을 만들 수 있습니다. 병렬 스트림이란 각각의 스레드에서 스트림을 처리할 수 있도록 여러 청크로 분할한 스트림입니다. 이때 sequential 메서드를 사용하면 병렬 스트림을 순차 스트림으로 바꿀 수도..
-
[Java] 날짜,시간과 관련된 LocalDateTime의 역사Java 2022. 8. 27. 00:01
Java 1.0 Date 클래스 자바 1.0부터 java.util.Date 클래스 하나로 날짜와 시간관련 기능을 제공했습니다. Date라는 클래스의 이름과 달리 특정 시점을 날짜가 아닌 밀리초 단위로 표현합니다. 또한 1900년을 기준으로 시작하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 유용성이 떨어집니다. 2017년 9월 21일 가리키는 Date 인스턴스를 만드는 코드 Date date = new Date(117,8,21); //출력 //Thu Sep 21 00:00:00 KST 2017 Java 1.1 Calendar 클래스 자바 1.1에서는 Date클래스의 여러 메서드를 deprecate시키고 Calendar 클래스를 대안으로 제공합니다. 1900년을 기준으로 시작하는 오프셋은 없앴지..