[Java] Gradle과 동작 원리(Build Lifecycle)
·
Programming/Java
Spring으로 개발을 하며 너무 당연하다고 사용하는 것들의 원리가 정확히 어떻게 동작하는지 이해하지 않고 사용하고 있었다. 이번에 정리할 주제가 바로 이해하지않고 사용했으며 이번에 글을 정리하면서 왜 해당 빌드 도구를 사용하는지 내부적으로 어떻게 동작하는지 파헤쳐보자 구글에 Gradle을 검색하면 나오는 정의다.'소스 코드를 실행 가능한 애플리케이션으로 만들어 주는 빌드 자동화 도구이다' 로 나와있다. 그렇다면 우리가 작성한 .java 코드를 실행 가능한 어플리케이션으로 어떻게 만들 수 있을까? 이때 나오는 키워드가 컴파일과 빌드이다. 컴파일.java 파일을 .class 파일로 번역하여 바이트 코드로 변환빌드의존성 준비, 컴파일, 리소스 처리, 테스트, 패키징까지 합친 것모든 .java로 작성된 파일은..
[Java] 가비지 컬렉션(GC) 동작 원리
·
Programming/Java
Java에서는 객체를 생성하면 heap에 할당된다고 알고 있다 하지만 heap에서 사용되지 않은 객체들을 회수해야 다른 객체가 저장이 될 수 있다 우리는 Java를 사용하며 C/C++ 처럼 free를 사용해서 할당한 메모리를 시스템에 반환하지 않는다 이는 Java의 특성으로 JVM 안의 가비지 컬렉터가 더 이상 사용되지 않는 객체를 찾아 그 메모리를 자동으로 회수해 주기 때문이다. 이렇게 사용하지 않는 메모리를 찾아 회수하는 과정을 가비지 컬렉션이라고 하고, 그 일을 실제로 수행하는 JVM의 구성 요소를 가비지 컬렉터라고 한다. GC 수집 알고리즘Mark객체가 계속해서 참조를 가지는지 아닌지 체크해 놓는 것으로 해당 객체가 가비지 컬렉션의 대상이 되는 참조가 없는 래퍼런스인지 확인하고, 참조가 ..
[Kafka] Spring에서는 Kafka가 실제로 어떻게 동작할까?
·
Backend/Kafka
Kafka를 사용하면서 나는 Kafka에 대한 설정 값들 세팅을 application.yaml 파일에 넣었다 하지만 다른 블로그들을 참고해보니 설정 파일들을 KafkaConfig.java 파일로 따로 관리를 하는것을 보았다. 해당 글들을 보며 궁금해진 의문증은 총 2개였다. consumer가 broaker에 연결을 맺어 메시지를 주고 소비할 수 있는데 이것이 어떻게 구현이 되어 있고 실제로 어떻게 동작할까?yaml 파일로도 관리할 수 있을것 같은데 .java 파일로 관리하는 이유가 뭘까? 먼저 첫번째 의문을 해결하기 위해 Kafka 외부 라이브러리를 설치하여 구현이 어떻게 되어있는지 확인해보았다. 제일 먼저 Consumer쪽에서 메시지를 consume 하기 위해 사용하는 어노테이션은 @KafkaListe..
[Kafka] acks, ack-mode란?
·
Backend/Kafka
Kafka를 사용할때는 대게 메시지를 발행하는 Producer, 메시지를 관리하는 Broker, 메시지를 처리하는 Consumer로 이루어져 있다. 이때 Producer가 Broker에 메시지를 발행할때 발행한 메시지를 실제로 잘 받았는지 알아야 신뢰성 있는 설계라고 할 수 있다 만약 메시지를 보냈는데 중간에 네트워크 유실로 인해 broker에서 메시지를 못받았다면? 그리고 유실된 메시지가 사용자 돈과 관련된 거라면? 서비스가 심각한 장애사항이 될 수 있을 것이다 마찬가지로 Broker가 가진 메시지를 Consumer가 consume해서 메시지를 처리할때 consumer에서는 어디까지 메시지를 읽었는지를 Broker에게 알려줘야하고 그 값을 받아서 저장하고 그 다음 메시지를 consume할 수 있도록 ..
[Java] Thread와 Runnable 이란?
·
Programming/Java
쓰레드란?스레드(thread)란 프로세스 안에서 작업을 실행하는 가장 최소 단위를 말하며 자바에서는 JVM(Java Virtual Machine)에 의해 관리가 된다. 즉 JVM 프로세스가 생기고 main은 그 안의 main 스레드가 실행한다. 이때 main 스레드만 실행되지 않고 여러 스레드가 같이 실행된다 public static void main(String[] args) throws IOException { System.out.println("PID: " + ProcessHandle.current().pid()); System.in.read(); }}jps -l // 현재 실행되고 있는 자바 프로세스 목록 + PIDjstack // 스레드 덤프 간단하게 콘..
[SpringBoot] 매칭 타이머를 Redis에서 DB로 옮긴 이유(멱등성)
·
Backend/SpringBoot
현재 내가 소마에서 진행하고 있는 프로젝트는 모여타라는 서비스로 목적지가 비슷한 사람들을 묶어 택시를 함께 타게 해주는 서비스이다. 승객이 먼저 모여 해당 방의 정원이 차면 매칭방에 지정한 출발지를 기준으로 3km 내의 기사를 호출하여 기사와 동승방이 매칭이 되어 함께 타서 비용을 절감할 수 있는 택시 모빌리티 서비스이다. 이때 매칭방과 관련해서 최대 3분동안 1km부터 시작해서 500m 씩 넓혀가며 최대 3km 인근의 기사를 찾아 호출한다. 그냥 간단하게 3km로 찾으면 되지 않나요? 라고 생각할 수 있지만 우리는 동승 택시 서비스이기에 혼자타는 것보다는 당연히 사람들이 인원이 다 모여야 하는 대기 시각 + 기사와 매칭방이 매칭이 되는 시각 까지 하면 사용자가 어느정도 시간을 투자해야 된다고 생각하여 ..