전체 글 67

책<가상 면접 사례로 배우는 대규모 시스템 설계 기초> (읽는 중...)

가상 면접 사례로 배우는 대규모 시스템 설계 기초 : 알라딘16가지 실제 시스템 설계 면접 문제와 상세한 답안을 제시한다. 시스템 동작 원리를 시각적으로 보여 주는 188개의 도해로 설명하면서 4단계 접근법으로 면접 문제를 풀 수 있도록 돕는다. 이 책www.aladin.co.kr   1장. 사용자 수에 따른 규모 확장성어떤 데이터베이스를 선택할 것인가?관계형 vs 비관계형NoSQL : key-value, graph, document, column비관계형이 더 적절할 수도 있는 상황: 아주 낮은 응답 지연시간latency이 요구됨다루는 데이터가 비정형unstructured임데이터(json, yaml, xml 등)를 직렬화, 역직렬화 할 수 있기만 하면 됨아주 많은 양의 데이터를 저장해야 함수직적 규모 확..

Architecture 2025.04.06

책 <마이크로 서비스 패턴> (읽는 중...)

서비스 간 공유 라이브러리를 사용하고 싶은 유혹이 들겠지만, 변경 가능성이 조금이라도 있다면 별도의 서비스로 구현하는 것이 낫다. 서비스의 크기가 중요한 게 아니라 가장 짧은 시간에, 다른 팀과 협동하는 부분을 최소로 하여 개발 가능한 서비스를 설계해야 한다. 다른 서비스의 변경분 때문에 내가 맡은 서비스도 계속 바꾸어야 한다면 느슨하게 결합되지 않았다는 반증이다. 이건 distributed monolith다...1단계: 시스템의 작업을 식별한다."나는 음식점 주인으로서 주문을 접수해서 ~을 하고 싶다"고수준의 애플리케이션 도메인 모델을 대략적으로 그려본다. 도메인 명사를 분석하기. 핵심 클래스 생각해보기. (주문 접수: Consumer, Order, OrderLineItem, DeliveryInfo, ..

Architecture 2024.10.23

Validation

Validation, Data Binding, and Type Conversion :: Spring FrameworkThere are pros and cons for considering validation as business logic, and Spring offers a design for validation and data binding that does not exclude either one of them. Specifically, validation should not be tied to the web tier and should be easy to locdocs.spring.ioSpring 문서에서 말하는 Validation웹 계층에 국한되어서는 안 된다. 서비스 계층, 데이터 계층 등에서..

Application 2024.10.16

Http client

RestTemplatespring 3.0 ~synchronous, blocking1 thread per 1 requestthread safe여러 요청을 병렬로 처리하고 싶다면 connection pool을 사용한다. (수신 서버가 Keep-Alive를 지원해야 한다.)RestTemplate 생성 시 어떤 HttpClient, ClientHttpRequestFactory를 사용할 것인지 선택할 수 있다. (default: SimpleClientHttpRequestFactory, 그 외 Apache HttpComponents, Netty, OkHttp)https://docs.spring.io/spring-framework/reference/integration/rest-clients.html@Beanpubl..

Application 2024.09.24

Kotlin에서 SLF4J Logger 객체 생성하기

SLF4JSimple Logging Facade for Java로깅 인터페이스를 제공한다. (구현체 예: java.util.logging, logback, log4k)클라이언트는 SLF4J 추상화에 의존하면 실제 구현체를 몰라도 된다. (DIP) 스프링부트 web은 default로 logback를 쓴다." logging.level" 프로퍼티들을 통해 로깅 수준을 정할 수 있고, "classpath:logback.xml" 파일을 통해 구성을 할 수 있다. 롬복을 쓴다면 `@Slf4j`를 사용해 Logger 객체를 생성할 수 있다. @Slf4jpublic class someClass { public void someMethod() { log.info("test"); }} 위 코드는 아래와 ..

Kotlin 2024.09.20

책 <도메인 주도 개발 시작하기>

도메인 주도 개발 시작하기가장 쉽게 배우는 도메인 주도 설계 입문서. 도메인 주도 설계(DDD)를 처음 배우는 개발자를 위한 책이다. 실제 업무에 DDD를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학www.aladin.co.kr (책에 있는 문장이 아닐 수 있음... 편집 있을 수 있음...)        Chapter 1. 도메인도메인 = 해결하고자 하는 문제 영역전문가나 관련자가 요구한 내용이 항상 올바른 것은 아니며 때론 본인들이 실제로 원하는 것을 정확하게 표현하지 못할 때도 있다. 대화를 통해 진짜로 원하는 것을 찾아야 한다.도메인에 따라 용어 의미가 결정되므로 도메인마다 각각의 다이어그램에 모델링해야 한다.처음부터 완벽한 개념 모델을 만들기보다 전체 윤곽을 이해하는 ..

Principal 2024.09.10

Kotest로 테스트 코드 작성하기

내가 쓸 것 같은 부분 메모‪ ⸜( ˶'ᵕ'˶)⸝    Kotest | KotestFlexible, powerful and elegant kotlin test framework with multiplatform supportkotest.io  Kotest는 세 가지 부분으로 구성되어 있다. 필요한 것만 쓰면 된다.Test framework - 테스트 작성하고 실행하기Assertions library - 단언문 작성하기Property testing - 어떤 속성을 만족하는지 랜덤 입력값으로 확인하기 Kotest는 멀티플랫폼 프로젝트다. (다른 플랫폼에서 사용하기 위해 재작성할 필요 없단 말)JVM/Gradle(Groovy)에서 사용하려면 다음과 같은 의존성 설정을 해준다.testImplementation ..

Kotlin 2024.09.09

메모) 인프콘 2024

[지금 무료] 인프콘 2024 다시보기 강의 | 인프런 - 인프런인프런 | 성장하는 IT인들의 축제, 인프콘 2024에서 진행된 오프닝 및 발표 세션을 영상으로 다시 보실 수 있습니다., ✅ 확인해주세요이 콘텐츠는 2024년 8월 2일 금요일 진행된 인프콘 2024 발표 녹www.inflearn.com     # 혹시 당신은 데이터를 모르는 백엔드 개발자인가요?데이터 엔지니어는 데이터를 열 중심으로 본다. 데이터 카탈로그 - 데이터 맥락 공유 위해 사용 (문서, 코멘트, 검색), 데이터허브(오픈소스)대용량 트래픽... 대용량 데이터 - 분산 처리분석 환경은 분리 운영 - apache spark, hadoop (파일 단위 시스템), s3 적재애플리케이션을 거치지 않고 디비 데이터를 직접 조작하는 경우가 많..

Memo 2024.09.07

책 <아파치 카프카 애플리케이션 프로그래밍 with 자바> 1 ~ 3장

아파치 카프카 애플리케이션 프로그래밍 with 자바아파치 카프카로 새로운 개발 트렌드를 준비하는 분들을 위해 집대성한 아파치 카프카 최종 솔루션이다. 국내 서적 중 최초로 카프카의 핵심 기능인 미러메이커2(MirrorMaker2)에 대한 설명과 스프www.aladin.co.kr      [ ] : 나중에 체크하려고 하는 부분 Chapter 1. 들어가기탄생링크드인에서 파편화된 데이터 수집 및 분배 아키텍처 운영을 위한 문제를 해결하기 위해 개발소스 애플리케이션과 데이터가 최종 적재되는 타킷 애플리케이션의 연결각각의 애플리케이션끼리 연결하여 데이터를 처리하는 것이 아니라 데이터를 한 곳에 모아 처리하도록 중앙집중화데이터 포맷은 사실상 제한이 없다. 직렬화, 역직렬화를 통해 ByteArray로 통신하기 때문..

Data engineering 2024.09.04

Kotlin으로 JPA Entity 정의하기

JPA specJPA 엔티티와 프로퍼티의 제약 사항에 대해 먼저 알고 가야한다.https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1.pdf The entity class must be annotated with the Entity annotation.have a public or protected no-arg constructor.be a top-level class. (An enum or interface must not be designated as an entity.)not be final.implement the Serializable interface, if an entity instance is to be ..

Kotlin 2024.09.04

자바 직렬화와 JPA Entity, Spring

Serialization데이터 구조(객체, 리스트 등)을 바이트 스트림으로 변환하는 것시스템 간 데이터 전송, 저장을 위함typesstring: csv, xml, jsonbinary: java serialization, apache avro, protocol buffer  Java Serialization를 보면 이런 문장이 있다.“당신이 작성하는 새로운 시스템에서 자바 직렬화를 써야 할 이유는 전혀 없다.” 구현primitive type이거나 Serializable 인터페이스를 구현해야 한다.클래스의 모든 멤버가 직렬화 가능해야 한다. (trasient 멤버 제외)serialVersionUID: 객체의 버전. 미입력시 컴파일러가 자동으로 만들어준다. ObjectOutputStream의 writeObje..

Java 2024.08.30

책 <단위 테스트>

단위 테스트단위 테스트에 대한 오해를 바로잡고, 올바른 단위 테스트에 대한 원칙, 테스트를 작성하는 스타일과 효과적인 테스트를 위한 소프트웨어 아키텍처를 이해할 수 있다. 또한 단위 테스트를 통합www.aladin.co.kr    1. 단위 테스트의 목표코드 커버리지 지표(code coverage, 라인 수), 분기 커버리지 지표(branch coverage, if 또는 switch문 같은 제어 구조 수)테스트가 많으면 많을수록 좋은 게 아니다. 코드는 자산이 아니라 책임이고 부채다. 가능한 한 적은 코드로 문제를 해결한다. 가치 있는 테스트만 남기고 나머지는 모두 제거하라.100% 커버리지라고 해서 양질의 테스트를, 시스템의 모든 가능한 결과를 검증함을 보장하지 않는다. 커버리지 숫자는 쉽게 장난칠 수..

Application 2024.08.26

메모) 대규모 트랜잭션

단일 장애 포인트중앙 집중 DB의 장애가 전체 시스템으로 전파시스템 별로 도메인 설계, 각각의 저장소시스템간 메시지큐 기반 통신한 시스템이 장애 발생시 메시지큐의 지연 발생하지만 메시지 재소비 가능해 서비스 진행 가능대용량 데이터RDB 조인 연산으로 인한 조회 성능 하락주문내역 상세를 보여주기 위해선 여러 도메인 정보 필요(주문, 결제, 상품, ..) => 역정규화, 단일 도큐먼트주문 발생, command 모델 저장(rdb) => 주문 이벤트 발행 => 주문 이벤트 수신 => 주문 query 모델 저장(nosql)대규모 트랜잭션주문수 증가로 인한 저장소 쓰기 처리량 한계 도달샤드 클러스터를 구성해 쓰기 부하 분산어플리케이션단에서 구성 - AOP복잡한 이벤트 아키텍처규칙 없는 이벤트 발행으로 인한 서비스 ..

Architecture 2024.06.06

메모) CQRS 적용하기

적은 update & 많은 read인 경우, ux가 자주 변하는 경우, 데이터 관리와 뷰의 책임을 나눠야 할 때, 시스템의 확장성을 높이고 싶을 때모델 분리하기 - 명령 모델 / 조회 모델DTO 사용, 엔티티 일부만 사용정규화된 디비 스키마를 비정규화중간에 캐시명령 모델 데이터 변경 => 명령 모델 & 조회 모델 생성 및 저장 (비정규화된 데이터)조회 모델을 가져올 때는 join 등의 연산 작업을 자제, 가능한 디비값 그대로 표출NoSQL, 도메인 별 적절한 디비 선택두 저장소간의 일관성 유지 필요조회 모델 생성시 부담된다면, 역할 분리 by 이벤트 소싱명령 모델 데이터 변경 => publish event => consume event, 조회 모델 생성 및 저장이벤트 내용: 변경 대상 id, 변경 감지할..

Architecture 2024.06.05

메모) 분산 시스템에서 데이터를 전달하는 효율적인 방법

데이터 전달 보장 방법론네트워크는 신뢰할 수 없기에 항상 데이터 유실에 대비해야 한다.데이터 전달 보장 방법 (API를 사용하든 메시지큐를 사용하든, 추상화된 방법론을 말함)At most once간단한 구조, 간단한 개발메시지 유실 가능성 (by Producer에서의 예외, Consumer에서의 예외)At least onceProducer는 메시지 발송 보장 (Producer는 메시지 발송 상태를 관리해야 한다.)ACK 유실로 메시지 수신 여러 번 (Producer는 Consumer가 ACK 할 때까지 메시지를 재발송)멱등성을 보장하게 만들어야 한다. (순서 뒤바뀔 수도, 중복일 수도)Exactly once누락과 중복이 없다.Producer는 메시지 발송 보장 (Producer는 메시지 발송 상태를 관리..

Architecture 2024.05.22