[Server] 게시글 좋아요 수 조회 전략 : COUNT 쿼리 VS 반정규화
·
Server
시작하며게시글 목록을 불러올 때 각 게시글의 좋아요 수를 함께 보여주는 기능을 구현했습니다.좋아요 수를 보여줄 때 COUNT 쿼리를 통해 보여줄지, 테이블에 반정규화 컬럼을 집어넣어 보여줄지에 대한 저의 생각을 적은 글입니다.Redis나 Kafka 등의 기술 고려는 우선 제외했습니다. 서버 비용을 최대한 아끼고자 했고, 개발자 2명이서 시작한 프로젝트라 관리 비용을 최대한 줄이기 위해서입니다. 대규모 트래픽 상황에서의 대응 전략은 따로 글을 작성할 생각입니다.Post 도메인과 PostReaction 도메인전략을 설명하기 전에 프로젝트 도메인에 대해 간단하게 설명드리겠습니다.게시글(Post) 도메인과 게시글 리액션(PostReaction) 도메인이 존재합니다.@Builderpublic record Post..
[Server] 도메인 서비스(Domain Service)와 애플리케이션 서비스(Application Service)에 대한 고찰
·
Server
시작하며헥사고날 아키텍처를 기반으로 프로젝트를 진행하며, 도메인 서비스와 애플리케이션 서비스의 역할 분리에 대해 고민했습니다.이 글은 그 고민의 과정과 두 서비스를 분리하게 된 기준을 정리한 기록입니다. 개인적인 경험과 주관적인 견해가 포함되어 있어 정답이 아닙니다. 그저 저의 고민과 결론을 적어놓은 글입니다. 도메인 서비스 vs 애플리케이션 서비스도메인 서비스(Domain Service)는 도메인 로직을 수행하지만, 특정 엔티티에 넣기에 애매한 로직을 다룰 때 사용됩니다.반면, 애플리케이션 서비스(Application Service)는 도메인 영역을 바라보며 트랜잭션, 영속성 처리, 외부 통신 등을 담당하고 전체적인 흐름을 제어하는 역할을 합니다. 이 두 서비스의 가장 큰 차이점은 도메인 로직의 유무입..
[Network] ASCII Code, Unicode, UTF-8 간단히
·
CS/Network
ASCII Code아스키 코드는 미국 국립표준협회(ANSI)에서 제정한 정보 교환용 7비트 문자 인코딩 체계입니다.영문 알파벳 대소문자, 숫자, 특수문자를 포함한 총 128개의 문자에 고유한 숫자 값을 할당하여,컴퓨터가 문자를 인식하고 처리할 수 있도록 만든 규칙입니다. 이 방식은 이후 대부분의 문자 인코딩 방식의 기초가 되었습니다.하지만 아스키 코드는 영문을 기준으로 설계되었기 때문에,한글이나 일본어, 중국어 등 다른 언어의 문자를 표현할 수 없다는 한계가 있습니다.또한, 아스키 코드는 1바이트(8비트) 중 7비트만 문자 데이터로 사용하고,남은 1비트는 통신 오류 검출을 위한 패리티 비트로 사용하도록 설계되었습니다.Unicode유니코드는 전 세계 모든 문자를 일관되게 표현하고 다룰 수 있도록 만든 국제..
[AI] RAG란 무엇인가?? 아키텍처와 구성모듈 - 1
·
AI
기존 LLM의 한계LLM(Large Language Model)은 대규모 텍스트 데이터를 학습해 사람처럼 자연스러운 언어를 이해하고 생성할 수 있는 인공지능 모델입니다. 이러한 모델은 방대한 데이터로 학습되어 다양한 주제에 대해 유창하게 답변할 수 있지만, 몇 가지 한계가 존재합니다. 대표적인 문제 중 하나는 환각(Hallucination) 현상입니다. 이는 모델이 실제로 존재하지 않는 정보나 잘못된 사실을 그럴듯하게 생성하는 경우를 말합니다. 또한, 학습 시점 이후의 최신 정보에 대해서는 답변이 부정확하거나 오래된 데이터를 기반으로 대답 할 수 있습니다. 기업이나 개발자는 사용자의 요구사항에 맞춰 정확하고 최신의 답변을 제공해야합니다.이를 위해서 최신 데이터 반영, 도메인별 전문 지식 제공, 잘못된 정..
[데이터베이스] Replication
·
CS/데이터베이스
시작하며서비스가 성장하면서 데이터베이스에 가해지는 부하가 점점 늘어난다. 사용자가 늘어나고, 데이터가 쌓이고, 복잡한 쿼리들이 실행되면서 어느순간 단일 데이터베이스로는 한계를 느끼게 된다. 이때 자주 등장하는 해결책중 하나가 Replication이다. 이번 글에서는 Replication이 무엇이고 어떠한 상황에서 사용하는지 알아보고자 한다. Replication이 무엇인가?기본 개념은 하나의 데이터베이스 내용을 여러개의 데이터베이스에 복사하여 동기화 하는 기술이다.원본 데이터베이스를 Master(혹은 Primary), 복사본을 Slave(혹은 Replica, Secondary)라고 부른다. 주요 목적고 가용성 - 장애 발생시 빠른 복구데이터 백업 - 실시간 백업본 유지읽기 성능 향상 - 읽기 쿼리를 여러..
[JAVA] JVM이란?
·
JAVA
자바는 JVM(Java Virtual Machine)이라는 가상머신 위에서 실행되는 언어입니다. 자바 소스 파일(.java)는 자바 컴파일러(javac)에 의해 자바 바이트코드(.class) 파일로 변환됩니다이 클래스 파일을 Class Loader가 읽어들여 JVM의 Runtime Data Area에 로딩하면서 JVM 실행이 시작됩니다. JVM 구조Class Loader클래스 파일(.class)을 JVM에 로딩로딩된 클래스를 링크하고 초기화런타임 시 동적으로 클래스를 로드 동작 과정:Loading: 클래스 파일을 찾아서 JVM 메모리로 로드Linking:Verification: 바이트코드 검증Preparation: static 변수 메모리 할당 및 기본값 설정Resolution: 심볼릭 참조를 실제 참..
[OS] 여유 공간 관리
·
CS/OS
빈 공간은 다양한 크기의 작은 조각으로 분할되어 결국 단편화 된다. 빈 공간들의 전체 크기가 요청된것보다 크더라도 하나의 연속된 영역이 존재하지 않으면 요청은 실패할 수 있다. 이 경우 빈 공간의 전체 크기는 20바이트이다. 하지만, 10바이트 짜리 두조각으로 나누어져 있다. 결국은 20바이트의 빈 공간이 있지만 실제로는 11바이트 이상의 요청들은 실패하게된다. 이를 해결해보고자 한다.저수준 기법들분할과 병합빈 공간 리스트는 빈 공간들의 집합이다. 이 힙의 빈 공간 리스트에는 2개의 원소가 존재한다.하나는 10바이트 세그먼트 (바이트 0~9) 다른 하나는 (20~29)위의 그림에서 10바이트 이상의 요청이 온다면 모두 실패할것이다. 하지만 더 작은 요청이라면 어떻게 될까? 분할이 일어난다. 유일하게 변경..
[OS] 세그멘테이션
·
CS/OS
세그멘테이션에 대해 알아보기 전에 base/bound 동적 재배치의 단점에 대해 다시 상기해봅시다.동적 재배치는 프로세스 저장 공간 통째로 메모리에 올리는걸 가정했습니다. 그리하여 내부 단편화가 일어났습니다. 즉 메모리를 효율적으로 사용하지 못했습니다. 해당 문제를 해결하기 위해 세그멘테이션이라는 기법이 생겼습니다.세그멘테이션프로세스의 가상 주소 공간을 논리적인 단위(세그먼트로)로 나누어 관리하는 메모리 관리 기법입니다.우리가 기준으로 삼은 주소 공간에는 코드, 스택, 힙의 세 종류의 세그먼트가 존재합니다.가상 주소 100번지를 참조한다고 가정해보겠습니다.가상 주소 100번지는 코드 세그먼트에 속하게 됩니다. 물리주소로 변환화는 과정은 다음과 같습니다.코드 세그먼트 시작주소오프셋 = 100 - 0 = 1..
[MYSQL] 실행계획 - 2
·
CS/데이터베이스
코스트 모델MySQL 서버가 쿼리를 처리하려면 다음과 같은 다양한 작업을 필요로 한다.디스크로부터 데이터 페이지 읽기메모리(InnoDB 버퍼풀)로부터 데이터 페이지 읽기인덱스 키 비교레코드 평가메모리 임시 테이블 작업디스크 임시 테이블 작업전체 쿼리의 비용을 계산하는데 필요한 단위 작업들의 비용을 코스트 모델이라고 한다.MySQL 8.0 서버의 코스트 모델은 다음 2개 테이블에 저장돼 있는 설정값을 사용하는데, 두 테이블 모두 mysqlDB에 존재한다.server_cost : 인덱스를 찾고 레코드를 비교하고 임시 테이블 처리에 대한 비용관리engine_cost : 레코드를 가진 데이터 페이를 가져오는 데 필요한 비용 관리두 테이블은 5개의 공통 칼럼을 가지고 있다.cost_name: 코스트 모델의 각 단..
[MySQL] 실행계획 -1
·
CS/데이터베이스
대부분의 DBMS는 많은 데이터를 안전하게 저장 및 관리하고 사용자가 원하는 데이터를 빠르게 조회할 수 있게 해주는 것이 목적입니다. 이러한 목적을 달성하기 위해서는 옵티마이저가 사용자의 쿼리를 최적으로 처리될 수 있게 하는 실행계획을 수립할 수 있어야합니다. 사용자는 EXPLAIN 명령으로 옵티마이저가 수립한 실행계획을 확인할 수 있도록 합니다. 통계 정보MySQL 5.6 버전부터는 InnoDb 스토리지 엔진을 사용하는 테이블에 대한 통계 정보를 영구적으로 관리할 수 있게 개선되었습니다. 5.5버전까지는 메모리에만 관리도고, SHOW INDEX 명령어로만 테이블의 인덱스 칼럼의 분포도를 볼 수 있었습니다.하지만, 5.6버전에서는 각 테이블의 통계 정보를 mysql 데이터베이스의 innodb_index..