CS
[DB] 트랜잭션의 격리성과 동시성에 대해(feat. 트랜잭션의 격리 수준)
트랜잭션을 공부하다 보면, 트랜잭션에 대한 격리 수준을 접하게 되는데 굉장히 당황스러웠던 기억이 난다. 당장 구글링을 통해 트랜잭션 격리 수준에 대해 검색해 보면, 마치 사다리타기 그림과 같은 도식을 흔하게 볼 수 있는데, 현실 세계에서 발생하는 보다 풍부한 예시가 없어 아쉬웠던 차에 멧돼지책에서 여러 좋은 예시들을 찾아보게 되어 해당 내용을 중심으로 포스팅을 해보고자 한다! 트랜잭션은 왜 쓸까?트랜잭션의 정의를 찾아보면 '데이터베이스에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위' 이다. 쉽게 말하면, DB 상태를 변경하는 작업의 단위 라고 이해하면 된다. 트랜잭션의 가장 큰 장점은 데이터의 정합성을 보장할 수 있다는 점이다.트랜잭션의 특성을 보장하기 위해 널리 알려진 ..
[Java] Garbage Collection(GC)의 동작 원리
가비지 컬렉션(GC)이란?가비지 컬렉션(GC)란 자바의 메모리 관리 방법이다. JVM 상의 Heap 영역에서 동적으로 할당했던 메모리 중 더 이상 사용하지 않는 메모리 객체(가비지)를 모아 주기적으로 제거하는 프로세스이다. 기본적으로 Heap 영역의 메모리는 객체 생성 시에 할당되므로, 더 이상 참조되지 않는 경우에 가비지로 판단되어 제거된다. 이러한 가비지가 제거되지 않는다면, 메모리가 해제되지 않아 사용할 수 있는 메모리가 점점 줄어드는 메모리 누수(Memory Leak)이 발생하게 되므로 중요하다. Stop -The-World란?Stop-The-World란, GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.GC를 수행하는 동안, GC 관련 쓰레드를 제외한 모든 쓰레드는 정지되므로..
Replication - 복제 지연 문제에 대해(일관성과 성능 이야기)
복제(replication)을 공부하면서 결국 가장 중요한 것은 각 노드 간의 동기화 문제를 잘 해소하는 것이 가장 중요하다고 생각이 든다. 리더 기반 복제를 이용함에 따라 쓰기 작업에 대한 혼선은 어느 정도 해결할 수 있지만 모든 노드에 대해 읽기 작업이 가능하기 때문에, 읽기 일관성과 성능 중에서 적절한 트레이드 오프가 이루어지는 것이 가장 큰 과제이다. 읽기 일관성이 보장되지 않는 경우는 언제인가?현대 애플리케이션에서는 성능 문제로 비동기 혹은 반동기 형태의 복제를 사용하고 있다. 이에 따라 각 팔로워 노드에게 최신본이 전파되기까지의 시간이 발생하고, 이 사이에 사용자가 읽기 작업을 시도하게 되었을 때 경우에 따라 서로 다른 결과를 조회할 수 있다는 점에서 발생하게 된다. 하지만, 이러한 불일치의 ..
Replication - 리더 기반 복제에 대해
동기식 복제 vs 비동기식 복제복제 시스템에서 중요한 사항은 복제가 동기식으로 이루어지는지, 비동기식으로 발생하는지의 여부이다. 그림 1에서 팔로워 1의 복제는 동기식이다.리더는 팔로워 1이 쓰기를 수신했는지 확인해 줄 때까지 기다린다. 팔로워 2의 복제는 비동기식이다.리더는 팔로워 2의 응답을 기다리지 않고 다음 작업을 처리한다. 동기식 복제의 장, 단점동기의 가장 큰 장점은 팔로워와 리더가 일관성 있게 최신 데이터 복사본을 가지는 것을 보장할 수 있다는 점이다. 이는 데이터의 정합성을 우선시할 경우, 동기식 복제가 사용된다. 가령 계좌 이체를 생각해 볼 수 있다. 하지만, follower가 어떠한 이유로 response가 어렵다면, 쓰기가 처리될 수 없다.이러한 경우 ,리더는 모든 쓰기를 차단하..
Java의 Collections Deep Dive - 1 : HashMap이란?
안녕하세요,오랜만에 블로그를 적어봅니다! 최근 Redis의 Hash 자료구조를 비롯해 여러 Hash계열 자료구조를 사용하면서 내부적인 구현에도 조금씩 차이가 있다는 점을 알게 되었습니다! 또한 평소 Stream이나 Lambda를 사용할 때 Collections이라는 인터페이스에 대해 다소 이해가 부족한 것 같아 여러 기술블로그를 참고하여 학습하고 정리한 것을 포스팅하고자 합니다. Map에 대해서우선 자바의 Collection이란, 데이터의 집합, 그룹을 의미한다. 이중 Map은 Interface이며, 엄연히 Collection 인터페이스를 상속받는 것은 아니다.이는 구조상의 차이 때문이지만, Map 인터페이스 역시 Collection의 구성원 중 하나이다. Map이란, key-value로 구성된 Ent..
[MYSQL] float, double 저장 시, 소수점이 깨지는 문제
배포된 서비스에서 점수를 소수점 입력이 가능하도록 변경해야 하는 이슈가 있었다. 현 서비스에서는 mysql + aws rds를 이용해서 운영을 하고, 로컬 테스트를 위해 h2 db에서 테스팅 하는 과정에서 문제가 발생했다. 분명 입력값으로 2.333을 넣었는데, 이런 식으로 소수부분이 깨지는 현상이 발생했다. Mysql decimal vs float(double) 결론적으로, float와 double 타입의 경우에는 부동 소수점 방식의 데이터 타입이다. 부동소수점(floating point) 방식은, 이진수에서 0과 1을 사용하여 소수를 근사해서 표현하는 방식을 말한다. 사실 부동이라는 단어에서 움직이지 않는다는 뜻이라고 유추했는데, 실제 뜻은 떠다니며 움직인다는 의미라고 한다. (뜰 부 + 움직일 동)..
[객체지향] 응집도와 결합도의 차이
객체지향의 관점에서 설계의 품질 척도를 결정하기 위해 다양한 평가 기준을 도입하였다. 그 중, 가장 대표적인 척도인 응집도(cohesion)과 결합도(coupling)의 차이를 알아보고자 한다. 응집도란(cohension)? 응집도란 모듈에 포함된 내부 요소들이 연관되어 있는 정도를 나타낸다. 다시 말해, 한 모듈 내에서 내부 요소들이 같은 목적을 추구하는지에 대한 척도이다. 모듈 내의 요소들이 동일 목적을 위해 긴밀하게 협력한다면, 높은 응집도를 가진다고 말한다. 일반적으로 응집도가 높을수록 좋은 설계라고 말할 수 있다. 결합도란(Coupling)? 결합도란 의존성의 정도를 말한다. 한 모듈이 다른 모듈에 대해 얼마나 많은 지식을 갖고 있는지를 나타내는 척도이다. 어떤 모듈이 다른 모듈에 대해 필요한 ..
[Spring] @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor의 차이점 간단 정리.
스프링 코드를 보다 보면 항상 엔티티 클래스 위에 저 세가지 어노테이션이 종종 붙어 있는 경우를 보았다. 지난 포스트에 DI의 세가지 방법에 관한 글을 정리하고 나니 아래의 세 어노테이션을 정리할 필요성이 느껴져 해당 어노테이션들도 공부해보려고 한다! @NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor @NoArgsConstructor @NoArgsConstructor는, 매개변수를 갖지 않는 기본 생성자를 생성해준다. @NoArgsConstructor는 주로 access = AccessLevel.PROTECTED 를 설정하여 무분별한 객체 생성을 막는 용도로 쓰인다. 해당 속성을 부여하면 기본 생성자에 접근 제어가 되므로, 결국 해당 클래스..