전체 글
[회고] 대학생 미팅 서비스 - weave 프로젝트 회고
Intro.어느덧 3학년의 하반기가 모두 끝나고, 겨울방학이 되었을 시점에 나는 무척이나 성장이 간절했던 것 같다.학교 내에서의 우물 안 개구리로 남고 싶지 않아 무작정 사람들을 모아 팀을 만들고 향수 리뷰 서비스를 시작하게 되었다. PM, 디자이너, FE, BE까지 총 8명이서 팀을 꾸려 회의를 가졌는데, 아이디에이션 단계부터 삐걱댔다.각자가 프로젝트를 통해 얻고자 하는 것과 추구하는 방향성이 너무나도 달랐고, 온라인으로 쉽게 모인 사람들인 만큼 나가는 것도 쉬운 일이었다. 그러던 중 현직에 계신 대학교 동기 형님께서 사이드 프로젝트에 서버 팀원을 찾는다는 소식을 듣고2024년 2월 초, weave 팀에 중도 합류하게 되었다. 합류한 팀의 구성원분들은 디자이너 1분, AOS 1분, iOS 2분, 나를 ..
[DB] 트랜잭션의 격리성과 동시성에 대해(feat. 트랜잭션의 격리 수준)
트랜잭션을 공부하다 보면, 트랜잭션에 대한 격리 수준을 접하게 되는데 굉장히 당황스러웠던 기억이 난다. 당장 구글링을 통해 트랜잭션 격리 수준에 대해 검색해 보면, 마치 사다리타기 그림과 같은 도식을 흔하게 볼 수 있는데, 현실 세계에서 발생하는 보다 풍부한 예시가 없어 아쉬웠던 차에 멧돼지책에서 여러 좋은 예시들을 찾아보게 되어 해당 내용을 중심으로 포스팅을 해보고자 한다! 트랜잭션은 왜 쓸까?트랜잭션의 정의를 찾아보면 '데이터베이스에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위' 이다. 쉽게 말하면, DB 상태를 변경하는 작업의 단위 라고 이해하면 된다. 트랜잭션의 가장 큰 장점은 데이터의 정합성을 보장할 수 있다는 점이다.트랜잭션의 특성을 보장하기 위해 널리 알려진 ..
[Java] Garbage Collection(GC)의 알고리즘
JVM의 Garbage Collection의 경우, Stop-The-World가 발생하여 시스템 전체 성능에 영향을 줄 수 있다.특히, Major GC의 경우 Minor GC에 비해 오랜 시간이 걸리므로 이에 대한 최적화가 필요하다.이를 극복하기 위해, 다양한 GC 알고리즘이 지속적으로 개발되어 왔다. Serial GCCPU 코어가 1개일 때 사용하기 위한 GC 알고리즘GC를 처리하는 쓰레드가 1개이다. 따라서 멀티 코어 환경에서는 절대 사용하면 안된다.Minor GC에는 mark-and-sweep, Major GC에는 Mark-Sweep-Compact를 이용한다. Parallel GCJava 8에서 default GC로 채택되었다.Serial GC와 다르게 Minor GC를 멀티 스레드로 수행한다.(M..
[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..
Docker를 이용한 mysql + spring boot 연동
동아리 스프링 세션을 운영하면서 docker로 mysql 설치 및 spring boot 연결 방법을 여쭤보시는 분들이 많아서, 이번 포스팅에서는 도커를 이용하여 mysql 서버를 로컬에서 띄우고, Spring boot와 연동하는 과정을 소개합니다! 물론 Mysql을 직접 설치하는 방법도 있지만, 도커를 이용하여 관리하는 것이 설치(세팅)부터 형상관리까지 아주 편리하기 때문에 docker를 이용해 관리하는 것을 권장합니다. 현재 OS는 윈도우 11이며, docker 설치가 완료되었다는 전제 하에 진행합니다! 맥 유저분들은 터미널 이용하시면 됩니다! Spring boot의 경우 IntelliJ를 이용합니다. Window PowerShell 실행, docker 설치 확인 먼저 docker를 실행해 주신 후에..