[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..
[Spring Boot] Spring Batch Partitioning을 통해 Step을 분리해보자
2023. 7. 8. 14:21
Java/Spring Boot
Spring Batch 애플리케이션을 작업하다보면 이 애플리케이션이 처리해야하는 데이터가 많아졌을 때 다음과 같은 고민을 어떻게 해결할 수 있을지 궁금했습니다. 기존 코드 변경을 최소화하며 단일 서버의 처리량을 최대한 높이는 방법이 없을까? 동시성을 최소한으로 신경쓰고 처리량을 높일수는 없을까? 위 궁금증을 해소할 수 있는 방법을 찾던 중 spring batch의 partitioning 기능이 있다는 것을 알게됐습니다. 이번 포스팅에서는 위 궁금증을 spring batch에서 어떻게 해소해주는지 살펴보겠습니다. 코드는 아래 링크에서 확인해주세요. Main 브랜치에 partitioning을 적용하고 no-partitioning 브랜치는 일반적인 batch를 구현하였습니다. GitHub - seonwoo96..
[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의 관계에 대해 잘 이해해야 합니다...
[Spring Boot] CRUD Project Template
2022. 11. 17. 23:12
Java/Spring Boot
매번 스프링 부트를 활용해서 새로운 프로젝트를 진행할 때마다 기본 환경 구성이 너무 귀찮았습니다. 그래서 저는 제가 자주 사용하는 기술을 모아서 하나의 템플릿으로 만들어서 사용하고 있는데요, 이 프로젝트를 공유드리고자 합니다. https://github.com/seonwoo960000/spring-boot-all-in-one GitHub - seonwoo960000/spring-boot-all-in-one: A spring boot project with default dependencies A spring boot project with default dependencies . Contribute to seonwoo960000/spring-boot-all-in-one development by crea..
[Maven] 올인원 Maven
2022. 11. 10. 08:25
Java/Maven
이번 포스팅을 통해 Maven에 대해 더 자세히 이해해보도록 하겠습니다. 저 포함 많은 분들께서는 Maven을 단순히 의존성을 끌어와 라이브러리를 활용하는 정도로만 사용하고 있는데요, Maven의 동작원리를 안다면 이를 더 효과적으로 사용하고 의존성 문제가 생겼을 때 쉽게 해결할 수 있습니다. POM.xml 구조 POM(Project Object Model)은 Maven이 해당 프로젝트를 어떻게 빌드할 것인지 명시하기 위해 사용되는 XML 파일입니다. 개발자 입장에서 자주 보게 되는 속성(attributes) 위주로 설명드리겠습니다. relativePath 부모 pom.xml을 명시할 때(override) 사용하는 속성입니다. 한 단계 위에 있는 디렉터리가 기본 설정입니다. modelVersion XML..
[Spring Boot]Spring Boot JPA는 MySQL에서 어떤 쿼리를 실행시킬까?
2022. 10. 29. 09:53
Java/Spring Boot
Spring Boot JPA를 사용하던 중 실제로 어떤 쿼리가 실행되는지 문뜩 궁금해졌습니다. 그래서 MySQL에서 수행되는 실제 쿼리를 살펴봤는데요, 이번 포스팅을 통해 공유해보고자 합니다. MySql 쿼리 실행 기록 MySql은 쿼리의 실행 기록을 확인할 수 있는 방법이 있습니다. 아래와 같은 쿼리를 실행시키면 general_log 값을 알 수 있습니다. general_log가 OFF일 경우 쿼리 실행 기록이 남지 않습니다. 만약 general_log가 ON이라면 쿼리가 실행될 때마다 general_log_file에 쿼리 실행 이력이 저장됩니다. 그럼 general_log를 ON으로 설정하고 쿼리의 실행 이력이 어떻게 저장되는지 살펴보겠습니다. ※ 주의 ) general_log를 ON 값으로 설정하고..