[Java] LocalDate.now()를 사용하면 안되는 이유
2023. 9. 1. 09:29
Java/Deep Java
최근에 개발한 배치 프로그램이 로컬에서 실행했을 때와 배포 환경에서 실행했을 때 조회하고 생성하는 데이터 간에 차이가 발생하는걸 확인했습니다. 동일한 설정으로 배포했는데 대체 어떻게 문제가 발생하는 건지... 원인을 찾아내기까지 오랜 시간이 걸렸습니다. 문제는 배치 프로그램에서 사용하는 LocalDate.now()였습니다. 이번 포스팅에서는 LocalDate.now()가 어떻게 문제를 유발했는지, 그리고 어떻게 해결했는지에 대해 공유하고자 합니다. 원인 분석 배치 프로그램은 05:30, 07:30, 09:30에 실행하도록 스케줄링 돼있습니다. 배치 프로그램에 date와 관련된 일자를 인자로 넘기지 않으면 해당 배치 프로그램은 LocalDate.now()를 기준으로 배치 실행 일자를 결정하게됩니다. 그런데..
[Java] Java 네트워크 Deep Dive
2023. 7. 30. 12:37
Java/Deep Java
백엔드 개발자의 중요한 소양 중 하나는 네트워크에 대한 이해입니다. 분산환경에 대한 경험을 요구하는 회사가 많아지면서 그에 따른 네트워크에 대한 이해도 그 어느 때보다 중요하게 됐습니다. 이번 포스팅에서는 Java NIO는 TCP를 어떻게 처리하는지 살펴보겠습니다. 포스팅에 첨부된 소스코드는 아래 github 링크에서 확인할 수 있습니다. GitHub - seonwoo960000/java-nio-practice Contribute to seonwoo960000/java-nio-practice development by creating an account on GitHub. github.com Java NIO(New I/O) Java NIO는 확장성 있는 Java 입출력(I/O) 기능을 구현할 수 있는 A..
[Java] Java 실행원리 Deep Dive
2023. 1. 23. 21:01
Java/Deep Java
HTML 삽입 미리보기할 수 없는 소스 Java Java는 다양한 운영체제에서 동일한 소스코드를 실행할 수 있는 "write once, run anywhere"의 철학을 지닌 프로그래밍 언어입니다. 국내에서 가장 활발히 사용되는 언어이며 제가 현업에서도 주로 사용하는 언어입니다. 이번 포스팅을 통해서 자바가 실행되는 원리에 대해 살펴보겠습니다. 프로그래밍 언어가 특정 운영체제 위에서 실행되기 위해서는 해당 운영체제가 이해할 수 있도록 코드가 작성돼야 합니다. 하지만 자바 개발을 하신 분들은 동일한. java 파일을 맥 OS, 윈도우 또는 Linux에서 실행한 경험이 있으실 겁니다. 정확히는 javac(자바 컴파일러)에 의해 컴파일된 .class 코드가 동일하더라도 해당 코드는 서로 다른 운영체제 위에서 ..
[Java] Java Thread Deep Dive
2022. 12. 17. 17:35
Java/Deep Java
Java thread는 OS thread에 1:1로 매핑된다는 특성 덕에 다른 언어에서 사용하는 thread에 비해 무겁다는 명성을 가지고 있습니다. OS thread의 크기는 기본적으로 MB 단위이므로 대규모로 thread를 생성해서 사용 시 메모리에 큰 부하를 줄 수 있습니다. 단, 곧 등장할 java의 virtual thread는 OS thread와 N:1 구조로 매핑되는 user level thread이므로 기존의 java thread와 비교하면 훨씬 가볍습니다. 하지만 아직 virtual thread가 프로덕션에서 활용된 사례가 많지 않기 때문에 당분간은 여전히 java thread를 자주 사용할 것이고, 그렇기 때문에 java thread와 OS thread의 관계에 대해 잘 이해해야 합니다...
[Java] System.out.println() 동작원리 native method까지 까보기
2022. 5. 3. 07:41
Java/Deep Java
System.out.println() 메서드는 Java 프로그램에서 console로 출력이 필요할 때 가장 많이 사용하는 메서드 중 하나입니다. 하지만 정작 내부원리를 이해하려 노력해본 결과가 없었기에... 이번 포스팅을 통해 자세히 알아보고자 합니다. System.out.println("hello")에 breakpoint를 걸고 디버깅하며 차근차근 내부를 들여다보겠습니다. public class Main { public static void main(String[] args) { System.out.println("hello"); } } System.out.println("hello")의 System.out은 PrintStream 클래스의 객체입니다. PrintStream은 다음과 같은 메서드를 통해서..
[Java] 처음 들어보는 java.beans.Introspector
2022. 5. 2. 22:38
Java/Deep Java
Docs에서 찾아본 Java의 Introspector의 기능은 .. 다음과 같습니다. The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean. Docs에 게제된 설명만으로는 확실히 이해하기 어려우니 관련된 용어부터 차근차근 알아가보겠습니다. Java Bean JavaBean은 Java 클래스를 어떻게 작성할지에 대한 표준 중 하나입니다. JavaBean의 특징은 다음과 같습니다. 모든 properties는 private 속성을 가집니다. (public getter, setter을 설정합니다) 인자가 없는 publ..