Log/TIL

230929

재영(ReO) 2023. 9. 30. 22:50
due on or before today
short mode
not done

🍒 오늘 공부한 내용

역정규화

  • 정규화된 데이터베이스에서 쓰기 성능을 희생하고 읽기 성능 향상을 위해 사용되는 전략

  • 데이터를 중복으로 관리

  • 데이터의 일관성을 개발자가 맞춰야함

    데이터 10억개 쌓였을 때 계속 카운트 쿼리 날릴 수 없으니까 통계 테이블 같은 거 하나 만들어서 거기서 읽어오게 하기 등등

    select count(*) from post where user_id = ?;
    
```sql
select post_count from post_statistics where user_id = ?;

insert into post values (...);
update post_statistics set post_count = post_count + 1 where user_id = ?; -- 추가 작업

파티셔닝

대용량의 테이블을 물리적으로 여러 개의 소규모 테이블로 분산하는 목적으로 사용할 수 있는 기능
사용할 때는 하나의 테이블인 것처럼 사용하지만, 내부적으로 N개의 테이블로 나눠서 관리

  • 인덱스도 나눠서 관리
  • 데이터가 많은 테이블의 변경이 쉬울까? 적은 테이블의 변경이 쉬울까?
  • 데이터가 많은 테이블의 조회가 빠를까? 적은 테이블의 조회가 빠를까?

List Partitioning - 각 파티션에 어떤 데이터가 들어갈 지 명시해 놓음
Range Partitioning - 범위(구간)로 명시해놓음

title: 어떤 파티셔닝 방법을 사용해야 할까?
데이터가 균등하게 들어갈 수 있는 방법을 선택하면 됨

Hash Partitioning - 키 값을 해싱해서 나온 결과로 넣음 -> 고르게 분산될 가능성이 커짐

title: 언제 파티셔닝 방법을 사용해야 할까?
파티셔닝 된 테이블 각각에 대한 조회 빈도수가 비슷하다면?
매번 인덱스 올리고 내리고 해야하므로 별로 좋지 않음
[[파티션 프루닝]]: 옵티마이저가 다른 것 조회 안하도록 쳐내는 것
month로 파티셔닝 해놓고 memberID로 조회하면 다 뒤져야하므로 안 좋음
파티션 키가 유니크 키에 포함되어야한다 -> 이런 제약사항이 발생함

-> 3개월 내의 주문 목록 등 조회할 때 사용하면 좋음 혹은 월별 통계, 로그성 데이터

샤딩

대용량의 테이블을 물리적으로 여러 개의 소규모 테이블로 분산하는 목적으로 사용할 수 있는 기능
N대의 DBMS에 분산해서 데이터를 관리
트랜잭션으로 묶여 있을 수 없기 때문에 쿼리를 한번 더 날리거나 후보정 등을 해야함

커버링 인덱스

데이터를 조회할 때 데이터 파일까지 가지 않고 인덱스만 이용해서 데이터를 조회하는 것

캐시

local이 remote보다 더 빠름
서버 스케일 아웃되면 로컬 캐시 데이터 다를 수 있음
저장해야할 데이터의 양이 늘어난다면 어떤 캐시가 더 효율적인가?

무엇을 캐시할 것인가?
데이터가 얼마나 자주 사용되는가? -> 캐시 히트율이 얼마나 되는가
데이터가 얼마나 자주 갱신되는가?
전체 데이터를 캐시할 것인가? 일부 데이터를 캐시할 것인가? (ex. 지하철 노선, 쇼핑몰 상품)
그렇다면 캐시의 키는 무엇인가? (ex. 상품 카테고리 목록 vs 특정 상품 정보)
데이터 구성을 위한 메타데이터를 캐시할까? 화면에 그려지는 데이터를 캐시할까?

언제 캐시할 것인가?
데이터에 접근하는 시점에 캐시된 데이터가 없다면 저장할 것인가?
데이터를 수정하는 시점에 변경된 데이터를 캐시에 저장할 것인가?
서버를 띄울 때 자주 사용할 데이터를 캐시에 올리는 건 어떨까?

캐시를 사용할 때 문제될 수 있는 상황은?
메모리가 무한한가?

  • cache eviction algorithm
  • ttl
    캐시의 데이터가 최신 데이터라는 것을 어떻게 보장할까?

쇼핑몰 인프라 아키텍처 개선하기


상품 20개 고정으로 보여준다 -> 레디스 둠 -> 메인 페이지 캐시
매 시간마다 이므로, 스케줄 프로그램 or 배치 두고 여기서 메인 페이지 데이터 갱신
카테고리 이름 변하는 경우 -> 배치 프로그램 사용 (조금씩 조금씩 변경해나감) -> 이벤트 쏴줄 수 있는데 이 경우 전체 상품 데이터 관리하는 시스템에서 각 상품에 대한 카테고리 다 조회하고 상품 개수만큼 API 콜 해야하니까 다운 될 가능성 높음 -> 그러므로 실시간으로 안함
상품명 카테고리, 태그 기준 상품 검색 -> 검색엔진
상품명 바꿀 때마다 검색엔진도 변경해줘야함 -> 장애나서 갱신 안되는 경우도 있을테니 검색엔진 배치 둬서 후보정 함 -> 상품 카테고리 등등 변하면 이벤트 쏴줘서 검색엔진 갱신하고, 검색엔진 배치가 주기적으로 상품명 가져와서 갱신하고 이런 식으로 데이터 정합성 맞춤
상품 검색, 상세 페이지 빠른 성능 -> 검색 엔진과, 레디스에 상품 데이터 캐시 -> 상품 데이터 변경 됐을 때 검색 엔진말고 레디스에도 쏴줘야함 -> 상품 데이터 캐시 갱신 배치 둠
상세 페이지에서 고객이 남긴 별점 보여줘야함 -> 역정규화 써야함 -> 상품 개수 엄청 많기 때문에 실시간으로 쿼리 날릴 수 없으므로
주문 완료 후 이메일 전달 -> was가 이메일 발송 시스템에 이벤트 발송 -> 이거 하나 더 구독해서 판매자 출고, 재고 관리 시스템에도 쏨
판매자에게 상품 판매 알려주는 시스템 TPS 50 제한인데, 피크타임 주문 TPS가 100 만약 동기 방식이었다면 재고 관리 시스템에 문제 있었을 거임 -> 근데 비동기로 하니까 괜찮음
1일 주문량 평균 300만건, DBMS에서 관리할 수 있는 데이터 양 10억건 -> 1년 기준으로 주문 데이터 꽉 참 -> 그러므로 샤딩해야함
회원은 2000만명, 셀러 20만개, 상품 수 10억 개 -> 상품 파티셔닝이든 샤딩이든 하면 성능 잘 나옴
주문 데이터 샤딩해야할 때 5년 이상이라는 거 고려해서 해야함

🎶 느낀 점 & 배운 점

오늘 계획 한 것 :

  • 인프라 강의 듣기
  • 추석 계획 세우기 - 강의 다시 듣기, 노트 정리, 이력서, 포트폴리오, 우테코에서 배운 것 정리
  • 오픽 준비
  • 어제 못 푼 이분탐색 문제 다시
  • 이벤트 써야하는 거 => 감상 잇는 여행 삭제 안되는 거 해결
  • 쿼리 튜닝 마무리

오늘 한 것 :

  • 인프라 강의 듣기

공부할 것 :

펼치기
API versioning<br>

AsyncUncaughtExceptionHandler<br>

TaskDecorator<br>

ThreadPoolTaskExecutor<br>

@ConfigurationProperties<br>

톰캣 기본 8192개 어떻게 쓰이나?<br>

ngrinder<br>  
locust  <br>
jmeter  <br>
k6<br>

gradle로 빌드하면 q타입 읽는데 intellij로 하면 못읽는 문제  <br>
  
cqrs pattern  <br>
  
Modifier<br>

쓰레드 풀 설정 <- 테코블 글 써보기?  <br>
  

native thread, green thread  <br>
  
process lifecycle<br>

역정규화  <br>
  
파티션 프루닝  <br>
  
커버링 인덱스  <br>
  
스케쥴 프로그램, 배치 프로그램  <br>
  

  
TransactionTemplate  <br>
  
Event @Order  <br>
@RecordApplicationEvents<br>

HAProxy  <br>
  
DB 장애 대처  <br>
레플리카  <br>
Binary Log 기반  <br>
GTID 기반  <br>
  
virtual stored <br> 
-> stored는 왜 칼럼 따로 안하고 버츄얼에 있지?  <br>
  
enum 사용하면 reflection을 통한 생성도 방지<br>

싱크홀패턴<br>

JVM의 쓰레드와 운영체제의 쓰레드<br>

리플렉션 자세하게<br>

라운드로빈<br>

DNS<br>

WeakHashMap<br>

nslookup<br>

포스트모뎀<br>

NIO<br>

  
completable future  <br>
Spring Web Flux  <br>
  
자바의 Synchronized -> monitor lock<br>

@PostConstruct  <br>
@HandlebarsHelper<br>

WebContentInterceptor<br>

REST한 요청<br>

DNS<br>

CORS - Preflight <br>

CDN<br>

CAS (Compare and Swap) 알고리즘<br>

Configuration Property Scan<br>

static field 언제 올라감?<br>

Mozilla<br>

ClassLoader가 어떻게 읽음?  <br>
  
spring boot project build package 생기는 이유랑 왜 거기서 클래스패스 찾는지<br>

  
[https://velog.io/@ohzzi/F12%EC%9D%98-%EB%88%88%EB%AC%BC%EB%82%98%EB%8A%94-%EC%BF%BC%EB%A6%AC-%EA%B0%9C%EC%84%A0%EA%B8%B0-%EC%9D%B4%EB%A1%A0%ED%8E%B8](https://velog.io/@ohzzi/F12%EC%9D%98-%EB%88%88%EB%AC%BC%EB%82%98%EB%8A%94-%EC%BF%BC%EB%A6%AC-%EA%B0%9C%EC%84%A0%EA%B8%B0-%EC%9D%B4%EB%A1%A0%ED%8E%B8)오찌 쿼리 개선기<br>

오찌 로깅<br>

[https://velog.io/@saint6839/Controller%EC%97%90%EC%84%9C-HttpRequest-Body-%EA%B0%92%EC%9D%80-%EC%99%9C-%EB%B9%84%EC%9B%8C%EC%A0%B8-%EC%9E%88%EC%9D%84%EA%B9%8C](https://velog.io/@saint6839/Controller%EC%97%90%EC%84%9C-HttpRequest-Body-%EA%B0%92%EC%9D%80-%EC%99%9C-%EB%B9%84%EC%9B%8C%EC%A0%B8-%EC%9E%88%EC%9D%84%EA%B9%8C) getBody 왜 비워져있는지  <br>
  
필터 인터셉터 빈등록  <br>
  
StatementInspector<br>

  
쿼리카운터 -> ThreadLocal  <br>
  
로그인 -> 인터셉터 or 필터<br>

Join Column 공부  <br>
  
createdDate CreationTime  <br>
  
entity listener  <br>
MappedSuperClass  <br>
  
웹소켓  <br>
  
블루그린, 레드블랙, 롤링  <br>
flyway -> 롤백하는 경우 스키마 관리에 문제 생김<br>

@Retention -> [https://jeong-pro.tistory.com/234](https://jeong-pro.tistory.com/234)<br>

  
composite 패턴  <br>
decorate 패턴  <br>
  
검프 도커 테코톡 실습편  <br>
  
@Valid 에서 잡은 예외 허브가 해 놓은거 이해하기  <br>
  
ssh 설정  <br>
  
propagation, isolation 직접 설정 ([https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h](https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h)) -> 이거 보고 감 잡기  <br>
팬텀리드 예시 다시 보기  <br>
DB에서 B-Tree 쓰는 이유  <br>
복합키  <br>
Unique 동시에 걸기  <br>
인덱스 스킵 스캔  <br>
  
springfox, springdoc<br>

CQRS<br>

LAZY Loading (Transactional 사용하지 않으면 못 쓰는 이유)  <br>
Fetch Join  <br>
  
@ContextConfiguration(classes = TestSyncConfig.class)  <br>
  
나아가팀 배포 스크립트문제 -> 쉘 스크립트 프로세스 물고 있는 문제<br>

동욱님 JPA Exists 쿼리 성능 개선 블로그  <br>
동욱님 예외레벨 블로그<br>

나아가팀 AuthInterceptor에서 터지는 예외가 ControllerAdvice에서 처리도 되고, 콘솔에 에러라고 찍히기도 함 -> 해결못함<br>

CD 할 때 도커 허브  <br>
  
토큰 암호화  <br>
  
self-join  <br>
  
certbot   <br>
  
jpa bulk insert 할 때 auto increment 이면 안됨  <br>
  
토큰 세션 장단점  <br>
  
syncronized, 비관적 락 장단점  <br>
  
비동기와 트랜잭션  <br>
  
@AttributeOverride<br>

레디스  <br>
메세지 큐  <br>
R-Tree  <br>
  
커버링인덱스<br>

대칭키 암호화 비대칭키 암호화 복호화  <br>
  
모든 엔티티의 변수를 VO로<br>
</div>

🌸 감정회고

우울하고 답답하고 가족도 연휴에 못 봐서 슬프지만 앞에 보이는 하나하나 해나가면 돼