
[spring-boot-starter-actor] Redis 없이 spring boot 채팅 애플리케이션 개발하기
2025. 5. 29. 22:26
Java/Spring Boot
프로젝트에 사용된 코드 GitHub - examples-seonwkim/spring-boot-chatContribute to examples-seonwkim/spring-boot-chat development by creating an account on GitHub.github.com 분산 시스템에서 채팅 애플리케이션을 개발하기 위해서는 서로 다른 서버에 접속한 유저에게 메시지를 송신할 수 있도록 Redis 등의 메시지 전송을 위한 미들웨어가 필요합니다. 다른 방법으로는 서버를 클러스터로 묶고 서로 통신할 수 있도록 하는 방법이 있는데요, 요 포스팅에서는 액터 클러스터링 기능을 활용해서 후자의 방법으로 채팅 애플리케이션을 개발해 보겠습니다. Java 진영의 대표적인 액터 라이브러리로는 Pekko가..

[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..