CS
-
[JPA] 영속성 컨텍스트CS 2024. 4. 3. 23:46
Spring 프레임워크에서는 데이터베이스와 연동되어 데이터가 바뀌는 비즈니스 로직을 처리합니다. 데이터베이스와 연동하는 방법은 JDBC를 설치하고 쿼리를 작성하면 됩니다. 이때 Mybatis를 사용할 수도 있고 JPA를 사용할 수도 있습니다. 오늘은 Spring DATA JPA를 이용한 데이터베이스 연동을 할 때 내부에서 동작하는 과정 및 이슈에 대해 알아보려 합니다. JPA는 데이터베이스의 테이블을 엔티티라는 객체로 자바 애플리케이션에서 관리합니다. 이때 엔티티를 영속하게 관리하는데 이를 영속성 컨텍스트가 관리합니다. 그리고 JPA에서 자동으로 SQL문을 생성하고 데이터베이스에 질의를 날립니다. 영속한 엔티티는 영속성 컨택스트에서 관리되는데 몇 가지 상태를 가집니다. 엔티티의 상태 비영속(New) 영속..
-
[CS] RabbitMQ 멀티리스너 설정 시 패키지 통일CS 2024. 4. 3. 23:45
RabbitMQ를 사용할 때 멀티리스너 설정 시 발생하는 에러를 해결한 경험과 의존성에 관한 글입니다. RabbitMQ를 사용하기 위해서 큐에 메시지를 쓰는 애플리케이션과 메시지를 가져와 읽는 애플리케이션을 구현해야 합니다. 물론 하나의 애플리케이션에서 구현할 수 있지만 두 개로 구분할 수도 있습니다. 흔히 PUB/SUB 패턴 또는 단순히 Producer와 Consumer라고 표현하는데 앞서 설명했듯이 exchange에 바인딩된 queue에 여러 가지 타입으로 메시지를 추가할 수 있었습니다. 이 말은 Producer가 여러개 존재할 수 있는 구조입니다. [CS] RabbitMQ 기본 RabbitMQ는 오픈소스 메시지 브로커 소프트웨어이고 Erlang으로 구현되어 있습니다. 기본 프로토콜을 AMQP(Adv..
-
[CS] RabbitMQ 기본CS 2024. 3. 20. 14:42
RabbitMQ는 오픈소스 메시지 브로커 소프트웨어이고 Erlang으로 구현되어 있습니다. 기본 프로토콜을 AMQP(Advanced Message Queue Protocol)을 사용하고 있으며 플러그인으로 STOMP, MQTT 등의 프로토콜로 확장할 수 있습니다. RabbitMQ는 위와 같은 기본 구조로 이루어져 있습니다. Sender를 통해 RabbitMQ에 메시지를 전달하고 Receiver에서 큐를 읽어 들이는 메커니즘입니다. 그렇다면 RabbitMQ 내부에서 어떤 방법으로 큐에 메시지를 Push 하고 Pop 하는지 알아봅시다. RabbitMQ로 보낼 때 Sender에서 exchange로 보내지게 됩니다. 이후 exchange와 관계된 큐에 메시지가 Push 됩니다. 이때 exchange와 큐간의 관..
-
[CS] Java HashMap의 동작 과정CS 2024. 3. 1. 22:59
Java에서는 HashMap, HashSet 등 Hash를 사용한 자료구조를 사용하는데 HashMap의 동작 과정에 대해 알아봅시다. 우선 HashMap은 Key라는 유일한 값에 대한 Value를 O(1)의 시간복잡도로 구할 수 있습니다. 자세히 알아보기 전에 HashMap의 전체 동작과정을 확인해 봅시다. HashMap에 값을 추가할 때 Key의 해시 함숫값으로 hashcode라는 Key에 대한 유일한 값이 나오게 됩니다. 자바의 hashcode()의 리턴은 int 형으로 2^32 수로 표현가능하지만 입력으로 주어지는 Key는 2^32개 이상일 수도 또는 모든 HashMap이 2^32개의 버킷을 가지고 있을 수 없으므로 hashcode가 중복되는 경우가 발생하는데 이것을 해쉬충돌이라고 합니다. 해시충돌..
-
[CS] 자바 Minor GC, Major GC(Full GC)CS 2024. 1. 26. 23:37
Heap 영역에서 GC가 발생하는데 Young 영역과 Old 영역으로 이루어져 있습니다. [CS] 자바 Gabage Collection Gabage Collection : GC라고 하며 Heap 영역에서 참조되지 않는 객체의 자원을 해제해서 메모리 공간을 효율적으로 사용할 수 있게 도와줍니다. 하지만 GC가 동작하는 동안 다른 동작이 멈추게 되는데 devlog-jul95.tistory.com 이글 참조. Young 영역에서 발생하는 GC를 Minor GC라고, Old 영역에서 발생하는 GC를 Major GC 또는 Full GC라 합니다. Eden 영역에는 new로 생성된 새로운 객체가 옮겨집니다. 만약 Eden 영역에 객체가 가득 차게 된다면 Minor GC가 발생합니다. 이때 Eden 영역에서 Reac..
-
[CS] 자바 Gabage CollectionCS 2024. 1. 18. 22:46
Gabage Collection : GC라고 하며 Heap 영역에서 참조되지 않는 객체의 자원을 해제해서 메모리 공간을 효율적으로 사용할 수 있게 도와줍니다. 하지만 GC가 동작하는 동안 다른 동작이 멈추게 되는데 이를 Stop - The - World라고 합니다. GC가 동작할 때 GC와 관련된 모든 쓰레드가 멈추기 때문에 GC가 동작하는 시간을 최대한 줄여야 합니다. GC는 어떤 기준으로 객체를 지울까요? 어딘가에 참조되어 있다면 Reachable, 참조되어 있지 않다면 Unreachable로 객체를 분류한 다음 Mark, Sweep, Compaction 알고리즘을 통해 Unreachable 객체를 제거합니다. Mark 동작은 GC ROOT로부터 그래프 구조로 저장된 객체 중 Reachable인 것들..
-
[CS] 자바 메모리 영역CS 2024. 1. 16. 17:57
클래스 파일을 실행시키면 class loader가 클래스 파일을 런타임 데이터 영역에 메모리를 올립니다. 런타임 데이터 영역은 5가지 입니다. Static(Method) 영역 Heap 영역 Stack 영역 PC register Native Method Stack 1번, 2번, 3번에 대해 알아보겠습니다. Static(Method) 영역 JVM이 실행되고, 클래스가 메모리에 올라갈 때 생성됩니다. Class 정보, Class 변수, 생성자, 메소드가 올라가 있습니다. 어디서든 Static 영역은 참조가 가능합니다. Stack 영역 기본 자료형, 지역 변수, 매개 변수가 저장됩니다. 메서드 내부의 기본 자료형에 해당하는 변수입니다. 클래스에서 정의되는 자료형은 다른 영역에 저장됩니다. Heap 영역 Stri..
-
[CS] Java의 JVM이란?CS 2023. 12. 25. 23:04
프로그래밍 언어가 실행되는 방법에 따라 컴파일러(Compiler) 언어와 인터프리터(Interpreter)언어로 나누어집니다. 컴파일러는 컴파일 + 실행, 인터프리터는 실행이라는 차이점으로 상황에 따라 장단점을 가지고 있습니다. 자바는 컴파일러 언어로 실행을 위해 단 한 번의 컴파일과 실행 과정을 거치게 됩니다. 자바 코드를 빌드하면 .class 파일이 만들어집니다. javac 명령어와 같습니다. 이후 class 파일을 실행시키면 CPU가 읽을 수 있는 기계어로 번역 되는 과정이 필요합니다. 이 역할을 수행 하는 것인 JVM입니다. 프로젝트의 규모가 커질 때 컴파일 되는 시간이 오래 걸릴 수 있다는 단점을 가지고 있습니다. 이러한 단점을 해결 하기 위해 JVM에는 JIT(Just-In-Time) 컴파일러..