키보드워리어

[원티드 프리온보딩 챌린지]1주차 어떤 내용 배웠니? 본문

개발 관련/Database

[원티드 프리온보딩 챌린지]1주차 어떤 내용 배웠니?

꽉 쥔 주먹속에 안경닦이 2023. 7. 26. 11:18
728x90

안녕하세요 블로그 방문자 여러분, 반갑습니다.

원티드 프리온보딩 챌린지에서 멘토로 활동하신 광광님 (어느 금융회사 4년 차 개발자님)이 내용 공유드립니다!!

원티드 프리온보딩 챌린지
원티드 프리온보딩 챌린지

1. 빠르게 효율적으로 성장하는 방법 고민하자

-참고해볼 영상
-Null패턴에 대한 정리 깃헙
-기계인간 블로그

[널 오브젝트 패턴 (Null Object Pattern)

인터페이스는 구현하지만 아무 일도 하지 않는 객체

johngrib.github.io](https://johngrib.github.io/wiki/pattern/null-object)

*추천도서
데이터중심 애플리케이션 설계

데이터중심애플리케이션 설계
데이터중심애플리케이션 설계

굉장히 추천 트랜잭션 (7장)을 많이 보았음.

데이터 중심 애플리케이션 책 정리

여기에 위 책에 대한 핵심 내용들을 정리하였다.

SQL 첫걸음

sql첫걸음
sql첫걸음

apache-kafka란?

대규모 데이터 파이프라인, 이벤트 처리 시스템, 로그 수집 및 분석등에 활용된다.
메시지 큐 시스템으로 작동한다. *멘토님은 msa환경이라면 kafka보다 redis를 사용해서 분산락 거는 걸 추천한다고 함

데이터 적합성이 중요한 로직은 2차 방어로직으로 낙관적 락까지 건다.

사용자 수가 100,200명이면 비관적 락을 사용하는걸 추천한다.

 


2. 기술 면접에서 시스템 설계 문제가 가지는 의미

1-1)시스템 설계 질문

설계에 정답은 없다고 생각한다.(멘토의견) 근거(장점과 단점)만 잘 제시하면 됨

서비스 사용자수에 따라 아키텍처를 생각하는 게 좋다.
오버 엔지니어링은 피하고 상황에 맞게 적재적소로 설계하는게 좋지 않을까?

1-2) 피해야할것

  • 설계의 순수성에 집착한 나머지 타협적 결정을 도외시하고 오버 엔지니어링함.
  • 오버에지니어링의 결과로 시스템 전반의 비용이 올라간다.

어떤 데이터베이스를 사용하지: RDBMS vs NoSQL - feat. cap이론

CAP이론이란? - 분산 데이터베이스 시스템은 분할이 생겼을 때 일관성과 가용성 중 하나를 희생해야 한다는 것을 의미한다. 분산 데이터베이스 시스템은 반드시 네트워크 장애나 여러 이유들로 인해 장애가 발생할 수 밖에 없습니다.

가용성 (Availability)

모든 노드가 모든 요청에 대하여 정상적인 응답을 한다.

일관성 (Consistecy)

모든 노드가 동일한 데이터를 가지고 있어야한다.

부분결함 (Partition Tolerance)

(1) The system continues to operate despite arbitrary message loss or failure of part of the system [Brewer 의 발표 자료]

(2) The network will be allowed to lose arbitrarily many messages sent from one node to another

[Gilbert & Lych 정리] * 진짜 참고만

⇒ 가용성과 일관성은 분산시스템의 특성이지만 부분결함은 네트워크의 특성

⇒ 하지만 CAP 이론은 세가지 요소가 모두 분산시스템의 특성인 것 처럼 서술한다.

3.사용자 수에 따른 규모를 확장하는 방법

1) 데이터 베이스 다중화

1.1 목적

대부분의 앱은 읽기 연산의 비중이 쓰기 연산보다 훨씬 높다.
따라서 더 나은 성능을 위하여 데이터 변경은 데이터베이스 서버들로 분산한다.

1.2 개념

분산 프로그램

  • 논리적으로는 하나이지만 물리적으로는 여러가지 데이터베이스를 갖는다.\
  • 참고로 정처기 1과목 분산프로그램에 나오는 개념이다.

2) 캐시

값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고 사용하도록 하는 저장소이다.

캐시의 장점은 데이터베이스에 직접 조회하는 것 보다 성능이 좋을 뿐만 아니라 데이터베이스 부하를 부하를 줄일 수 있다.

만약 아래 그림 처럼 공지사항과 같은 동일한 결과를 반본적으로 돌려주는 API 가 있다고 생각하자.

이 API는 요청을 받으면 매번 Controller --> Service --> Repository 를 거친다음 DB 조회 및 로직을 처리하는 과정을 반복적으로 진행한다.

즉, 동일한 결과를 보여주는 작업을 반복적으로 진행하기 때문에 비효율적이다.

장점

  • 네트워크 호출 x, 서버의 물리 메모리에 직접 접근하기 때문에 빠르다.

단점

  • 서버가 여러대인 경우 동기화 문제가 있다.
  • 인스턴스 물리 메모리 사이즈 제약이 있다.
  • 3) CDN정적 콘텐츠를 전송하는 데 쓰이는 분산된 서버

4) 트랜잭션

애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법

 


개념적으로 한 트랜잭션 내의 모든 읽기와 쓰기는 한 연산으로 실행된다.

트랜잭션은 전체가 성공(Commit) 하거나 실패(RollBack)한다.

현실에서 시스템은 아래와 같은 상항을 마주칠 수 있다.

  • 시스템은 쓰기 연산이 실행 중일 때를 포함해서 언제라도 실패할 수 있다.
  • 시스템은 언제든지 죽을 수 있다.
  • 시스템은 언제든지 네트워크 단절이 발생할 수 있다.
  • 여러 클라이언트가 동시에 데이터베이스에 쓰기 연산을 수행하여 데이터를 덮어쓸 수 있다.
  • 부분적으로 갱신된 비정상적인 데이터를 읽을 수 있다.
  • 클라이언트끼리 경합이 발생하여 예상치 못한 동작을 할 수 있다.

 

트랜잭션이 보장하는 안전성 보장은 원자성(Atiomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 의미하는 약어인 ACID 로 잘 알려져 있다. 사실 ACID 라는 용어는 매우 모호하다. ACID 를 준수하는 시스템이라고 할 때 그 시스템에서 실제로 어떤 것을 기대할 수 있는지 분명하지 않다.

https://github.com/JaeKang20/Study/blob/main/src/main/resources/templates/databases/ACID.md

 

예를들어 격리성 같은 경우 어떠한 종류의 격리성을 사용하는지에 따라 시스템이 동작하는 방식이 다르기 때문이다.

원자성, 격리성, 지속성은 데이터베이스의 속성인 반면에, 일관성은 애플리케이션 속성이다. 자세한 내용은 아래에서 더 살펴보자.

 

[원자성]

  • 원자적이란 ? 더 작은 부분으로 쪼갤 수 없는 의미를 가진다.
  • 멀티쓰레드 프로그래밍에서는 A쓰레드에서 원자적 연산을 수행한다면, B쓰레드에서는 중간에 알 수 없다.
  • 즉, 시스템은 연산을 실행하기 전/후 상태만 있을 수 있고 중간 상태는 있을 수 없다.

이 개념은 트랜잭션에 적용한다면, 하나의 트랜잭션이 원자성을 보장한다는 의미는 Commit 혹은 Rollback 만이 존재한다는 것이다.

Rollback의 원인은 비즈니스 로직 실패, 네트워크 단절 등의 이슈로 발생할 수 있다.

정리하자면, 트랜잭션을 Rollback 하고 기록한 모든 내용을 되돌리는 기능은 ACID 의 원자성의 특징이다.

 

[일관성]

일관성은 데이터 불변식을 보장하는 것을 의미한다.

예를들어 회계 시스템에서 모든 계좌에 걸친 대변과 차변은 항상 맞아 떨어져야한다.

하지만, 일관성을 유지하도록 트랜잭션을 정의하는 것을 애플리케이션의 책임이다.

데이터베이스는 불변식을 위반하는 잘못된 데이터를 쓰지 못하도록 막을 수 없다. (사용할 수 있는 방법은 외래 키 제약 조건 혹은 유일 성 제약 조건 뿐이다.)

일반적으로 애플리케이션에서 데이터가 유효한지 아닌지를 정의하고 데이터베이스는 단순히 데이터를 저장할 뿐이다.

 

 

 

이상 부족한 컨텐츠 읽어 주셔서 감사합니다.

728x90