2024/04 15

CQRS 개요

Command and Query Responsibility Segregation : Command(명령)과 Query(쿼리) 책임 분리 직역하여 명령이라는 것과 쿼리라는 것의 책임을 분리한다는 것으로, 가장 핵심이 되는 말이다. CQRS가 등장하기 이전에 많은 아키텍처에서 다음과 같은 문제점을 볼 수 있었다. DB에서 데이터 조회 및 업데이트에 같은 데이터 모델을 사용 : 복잡한 어플리케이션에서는 유지보수가 어렵다. 읽기와 쓰기의 부하가 다름 : 쓰기 작업이 복잡할 경우 응답이 느려짐, 같은 데이터 동시 작업 시 데이터 일관성 문제 정보 조회 시 복잡한 쿼리들이 성능에 부정적 영향을 준다. >> 이에 '읽기'와 '쓰기'를 각기 다른 모델로 분석하는 CQRS를 도입하게 되었다. 명령을 통해 데이터를 쓰고,..

리더-팔로워 구조

* 이 글을 읽기 전에 어느 정도 DCD(데이터 중심 구조)에 대해 이해하고 오길 바람. 복제 : 네트워크로 연결된 여러 장비에 동일한 데이터의 복사본을 유지한다는 의미 복제가 필요한 이유 지리적으로 가깝게 유지해 지연 시간을 줄임 장애가 발생해도 지속적으로 동작하여 가용성 높임 장비의 수를 확충하여 읽기 처리량을 늘림 복제를 위한 알고리즘 Single Leader (단일 리더) 이 알고리즘은 하나의 리더 노드가 전체 복제본의 주도권을 가지고 있다. 리더는 쓰기 작업을 처리하고, 이를 팔로워에게 복제한다. 팔로워는 리더의 상태를 동기화하여 일관성을 유지한다. 읽기 작업은 주로 팔로워에서 처리되며, 리더의 부하를 줄이고 응답 시간을 최적화한다. 주로 일관성과 가용성을 균형있게 제공하며, 복제 관리가 비교적..

[Git] Submodule 사용하기

서브모듈 명령 코드 1. 서브모듈 시작하기 # 메인모듈 로컬 상에 받아오기 > git clone # 서브모듈 생성 코드 > git submodule add # 서브모듈 생성한 것을 커밋하여 확정짓기 > git add . > git commit -m "feat: add submodules" 2. 서브모듈 포함된 깃 클론하기 # 메인모듈 클론 > git clone git@github.com:user/main-repo.git # 서브모듈 초기화 : 지정된 path에 모듈 등록 > git submodule init # 서브모듈 업데이트 > git submodule update # 위 3단계 한 번에 하고 싶다면? > git clone --recurse-submodules git@github.com:user/ma..

github 2024.04.17

[Spring] OOP와 비교하여 AOP 공부

OOP 복습 OOP(객체 지향 프로그래밍)은 객체를 중심으로 프로그래밍을 진행하는 것이다. 공통된 목적을 띈 데이터와 동작을 묶어 하나의 객체로 정의하는 것이 핵심으로, 특징으론 캡슐화(데이터와 그 데이터를 처리하는 메서드를 하나의 단위로 묶어), 은닉화(캡슐화의 목표. 내부 구조는 private하게 감춰두고 외부에서 조작할 수 있는 정보만 public으로 공개), 추상화(객체의 공통된 특성을 추출하여 모델링하는 과정), 상속(코드의 재사용성이 증가하고, 클래스 간의 계층 구조를 형성), 다형성( 동일한 메서드명이지만 다른 동작을 수행할 수 있도록 하는 기능), 동적 바인딩(다형성을 지원하는 매커니즘)이 있다. Spring에서도 역시 MVC 구조는 @Controller, @Service, @Reposit..

Framework/Spring 2024.04.17

[Spring] Security 설정 클래스 생성(세션 Stateless)

일반적으로 아래 파일은 config 패키지 안에 생성하여 관리한다. JWT 환경에서 스프링 시큐리티를 실습하기 위해 간단히 보안 config를 설정했다. @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf((auth) -> auth.disable()); http .formLogin((auth) -> au..

Framework/Spring 2024.04.17

[Spring] DTO

정의 Data Transfer Object 프로세스 간에 데이터를 전달하는 용도의 객체 주로 서로 다른 시스템 간에 데이터를 전송할 때 사용 비즈니스 로직을 포함하지 않는 데이터를 전달하기 위한 단순한 객체 DTO는 데이터를 캡슐화하여 전송 시에 데이터의 무결성을 유지 데이터 전송의 효율성을 높임 사용 이유 스프링 부트와 같은 MVC 패턴에서는, 보통 클라이언트와 컨트롤러 사이에서 DTO의 필요성이 생긴다. 아래 User 도메인은 위 그림과 같은 흐름으로 사용자와 DB 사이에서 이동하게 된다. public class User { private String id; private String name; private String email; private String password; public User(..

Framework/Spring 2024.04.17

[JAVA] 스레드

스레드란? 컴퓨터 프로그램에서 실행되는 작업의 가장 작은 단위 보통 하나의 프로그램은 여러 개의 스레드를 가질 수 있으며, 이러한 스레드들은 동시에 실행될 수 있음 스레드를 사용하면 프로그램이 여러 작업을 동시에 처리하거나, 여러 작업을 병렬로 실행할 수 있어서 전체적인 성능을 향상시킬 수 있음 스레드는 프로세스 안에서 메모리를 공유하므로, 데이터를 효율적으로 공유하고 통신할 수 있음 스레드를 사용할 때는 동기화와 관련된 문제에 유의해야 하고, 이를 효과적으로 관리하기 위해 동기화 기술을 활용함 그렇다면 자바에서의 스레드 특징은? 멀티스레드 지원: 자바는 멀티스레드 프로그래밍을 지원하며, 여러 스레드를 생성하고 관리할 수 있는 강력한 기능을 제공 쓰레드 생성과 관리: 자바에서는 스레드를 생성하기 위해 T..

언어/Java 2024.04.13

[Java] record

자바에서 record는 JDK 14부터 도입된 새로운 데이터 구조이다. Record는 불변(immutable)한 데이터를 표현하기 위한 간단하고 강력한 방법을 제공한다. Record는 주로 Entity, DTO 등의 데이터를 저장하고 접근하기 위한 목적으로 사용되며, 간결하게 작성할 수 있고 자동으로 생성자, 접근자 메서드, equals(), hashCode(), toString() 등을 제공한다. 이를 통해 코드의 가독성을 높이고 실수를 줄일 수 있다. 코드가 정말 간단하게 줄어듦을 아래와 같이 확인할 수 있다. public class Person { private final String name; private final int age; public Person(String name, int age)..

언어/Java 2024.04.12

[Java] JVM 개요

JVM은, 다른 프로그램을 실행시키는 것이 목적이다. 갖춘 기능으로는 크게 2가지로 말할 수 있다. 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하는 것(컴파일 언어 특징) 메모리 관리, 가비지 컬렉션, 스레드 관리 등과 같은 다양한 작업을 처리하여 프로그램의 안정성과 성능을 유지 개발자들이 말하는 JVM은 보통 어떤 기기상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭한다. 자바 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바 API와 함께 실행하는 역할. JAVA와 OS 사이에서 중개자 역할을 수행하여 OS에 구애받지 않고 재사용을 가능하게 해준다. JVM의 구성요소 클래스 로더(Class Loader) 실행 엔진(Execution E..

언어/Java 2024.04.11

[Spring] 회원가입 코드 통해 스프링 구조와 흐름 복습하기

복기하는 내용은 각 코드 주석에 상세히 달아보면서 복습 필요한 의존성을 추가하고 스프링 부트 애플리케이션을 설정해야 하므로, build.gradle 또는 pom.xml 파일에 아래와 같이 의존성을 추가 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-thymeleaf 회원 엔티티를 추가 import javax.persistence.Entity; import javax.persistence.Gene..

Framework/Spring 2024.04.11