본문 바로가기

java

(15)
동시성 이슈 해결하기(feat. spring(java), MySQL, Redis(Redisson)) Single ThreadMulti-ThreadingTomcat - Spring framework분산 시스템(Distributed Systems)단일 DB에서의 처리NoSQL에서의 처리 - Redis(Redisson library) 이번 글에서는 좀 더 실용적으로 접근해볼 예정입니다. 그래서 실제 서비스 운영 환경에서 동시성 이슈를 어떻게 해결해야 할지에 대해 직접 코드를 작성하며 살펴보고자 합니다.앞으로 설명할 내용들은 이전 글들(동시성 처리 - intro와 동시성 처리 - Lock Algorithms(락 알고리즘))의 내용에 기반하고 있기 때문에 먼저 읽고 오시면 아래 내용을 더 잘 이해하실 수 있을겁니다!concurrency, blocking, non-blocking, sync, async, lock..
LocalDateTime, Instant, OffsetDateTime, ZonedDateTime 사용법 차이 WHY?최근 사내 근태 관리 시스템을 구축하면서 시간 정보를 어떻게 저장할까에 대한 이야기가 나왔습니다.결론은 서버가 사내에 위치해 있어 시간도 Asia/Seoul 기준으로 설정되어 있고, global 서비스를 하는 것도 아니므로 프로젝트를 같이 진행하는 사람들이 가장 다루기 쉬운 java LocalDateTime 클래스를 사용하자고 결론을 내렸습니다.그렇다면 다른 날짜/시간 관련 클래스는 어떤 상황에서 사용해야 할까요? 서버가 해외 region에 위치해있다면?//2024-05-19T17:21:46.011254LocalDateTime.now();현재를 24년 5월 19일 17시 21분이라고 해봅시다. 서버가 국내 region에 있다면 LocalDateTime으로 확인했을 때 동일 시간이 나올 것입니다./..
[Java] http 요청과 응답 구현하기 - 2(apache tomcat의 http 처리) 개요 지난 글에서 library를 이용하지 않고 Socket을 이용해 'http' 프로토콜 요청을 구현해보았다. 이 때 apache tomcat 기반의 타겟 서버가 http message 규칙에 맞는 요청을 적절히 처리하여 응답한 것을 확인할 수 있었다. 그렇다면 apache tomcat은 어떻게 http 요청을 해석할 수 있었을까? http 응답을 위한 call stack 뜯어보기 yourkit 이라는 툴을 활용해 health check 서버가 SocketClient의 요청을 어떻게 처리했는지 콜스택을 살펴보자. call stack 특성상 가장 하위의 메서드부터 실행되어 응답되는 구조다. Thread가 실행되고, NIO를 통해 socket 연결 수립 후 실행된다. 이후 AbstractProtocl의 s..
[Java] http 요청과 응답 구현하기 - 1(socket으로 http 요청하기) 네트워크 - 요청과 응답 네트워크를 이용하면 멀리 떨어진 대상과도 자료를 주고 받을 수 있다. 가령 이 블로그 글의 정보를 얻기 위해 사용자는 개인 PC 서버에서 웹브라우저를 통해 tistory 서버 어딘가에 저장된 글이라는 데이터를 받고 있다. 네트워크는 OSI 7계층이나 TCP/IP 4계층 등으로 분류되는 개념으로 동작한다. 전기 신호를 직접 전달하는 하드웨어가 위치한 계층에서부터 실제 데이터를 주고 받는 주체인 'application'까지 계층적으로 각 역할을 수행한다. 요청을 주고 받는 과정을 TCP/IP 4계층의 용어로 설명하면, 'Network Access Layer'의 하드웨어를 이용해 'Internet Layer'에서 통상 IP로 목적지 네트워크 주소를 판별한다. 이후 'Transport..
[Java] Reference Type(feat. strong, soft, weak) 하나의 프로세스에서 JVM heap memory는 할당량이 제한된다. 할당할 수 있는 데이터의 크기가 한정적이므로 사용하지 않을 데이터를 계속 메모리에 올려서 사용하는 것은 비효율적이고, 만약 데이터를 무한정 할당하게 된다면 메모리 공간이 부족해져 OOME가 발생할 것이다. 이를 관리해주는 것이 Garbage Collector다. 가비지컬렉터가 사용하지 않는 메모리 참조를 해제함으로써 메모리의 여유 공간을 확보하는 것이다. GC는 현재 참조하고 있지 않은 대상을 수집하여 메모리 공간을 확보하는데, 만약 크기가 큰 객체를 지속적으로 참조해야 상황이 생긴다면 어떻게 될까? 모두 GC 대상에서 제외될까? 만약 현재 참조하여 활용되고 있는 데이터는 모두 GC의 대상이 되지 못한다는 가설이 맞다면 다음의 문..
[Java] Dynamic Proxy란? n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까? 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. 서로 다른 클래스의 Proxy 클래스 구현을 추상화해야 한다. 마치며 이전 글 Proxy란?에서 Proxy를 만들어 구현 코드를 수정하지 않고 부가적인 기능을 추가시켰다. 부가적인 기능을 추가시키고 싶은 클래스의 Proxy 클래스를 직접 만들어 클라이언트가 proxy 클래스를 호출하도록 했다. 이 때 이런 문제가 있었다. 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 이 문제를 해결하기 위해 문제를 추상화해보자. 1. 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. (단순 Proxy 클래스 구현에서는 모든 Proxy 기능에 부가 기능 코드를 구현해야 했다) ..
[Java] Proxy란? Proxy와 @Transactional '구현 코드를 수정하지 않고 부가적인 기능을 어떻게 수행할 것인가?' 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 다음 글 - Dynamic Proxy Proxy란 개념을 공부하게 된 계기는 Spring에서 @Transactional annotation이 어떻게 동작하는가를 알기 위해서였다. @Transactional annotation이 붙은 코드를 열심히 디버깅하여 따라가보니 다음과 같은 흐름을 볼 수 있었다. 클래스와 메서드에 집중하기 위해 메서드 파라미터나 기타 시그니처 코드들은 생략하였다. package org.springframework.aop.framework; class CglibAopProxy implements AopPr..
[Java] JNI(Java Native Interface)란? JNI란? JNI는 native code(C, C++, assembly 등)의 상호 운용을 위해서 만들어진 인터페이스다. JNI를 이용하면 JVM 내에서 실행되는 Java 코드로 native code 기반 애플리케이션이나 라이브러리를 상호 호출하여 사용할 수 있다. JNI의 장점은 native code로 작성된 코드를 활용하고자 할 때, 기존 Java로 제한된 코드의 구현에 영향을 미치지 않는다는 것이다. 이미 작성된 native code가 있다면, JNI를 이용하여 JVM 내에서 해당 코드가 정상적으로 작동하는 것을 보장하는 것이다. JNI 장단점 장점 - 하드웨어에 대한 동작을 native code로 제어할 수 있다 - 이미 native code를 사용해 구현한 라이브러리가 있을 때 Java에서 사용..