분류 전체보기
대규모 시스템 설계 기초 - 5장
대규모 시스템 설계 기초 - 5장
2024.02.04가상 면전 사례를 읽다보면 백엔드를 깊이있게 이해하고 있다는 느낌이 든다. 느낌만...? 바로 5장을 보기 시작해보자. 5장은 안정 해시 설계에 대한 퀘스천이다. 안정 해시란 키워드에 대한 정의부터 시작해보자. 주어진 입력에 대해 항상 동일한 해시 값을 생성하는 해시 함수를 의미한다. 파일이 변경되어 있지 않는 다면 항상 동일한 해시 값을 반환하여 파일이 변하지 않았음을 의미한다. 여기서 몇가지 고려해볼것이 있다. 바로 gogo ~ 해시 키 재배치 문제 N개의 캐시 서버에 부하를 균등하게 나누는 방법은 해시 함수를 사용하는 것이다. 예를 들어서 hah(key0) % 4 = 1 이면 서버 1에 접속하는 것이다. 서버 풀 크기가 고정되어 있을때만 효과가 있는 방법이다. 해시 값은 변하지 않지만 키가 줄어들어..
밀렸던 릿코드 풀기 (232, 150, 739, 2966, 1291)
밀렸던 릿코드 풀기 (232, 150, 739, 2966, 1291)
2024.02.03릿코드 문제가 영어라 접근하기 쉽지 않지만 그래도 풀어보면 자료구조에 대해 이해할 수 있어서 좋은점이 많다. 첫문제는 비교적 쉬운 문제이다. 232. Implement Queue using Stacks 처음에 접근할 때는 HashSet 을 사용해보려고 했는데 순서가 보장이 안되더라.. 왜냐하면 내부적으로 해시테이블을 구현하는데 해시함수에 의해서 순서가 달라진다. LinkedHashSet을 이용하면 풀 수 있을거 같다.(+ 정렬되어있다면 TreeSet을 이용할 수 있다. 추가, 삭제, 조회 작업시 O(logn) 으로 수행된다. ) 근데 접근하기 편한 ArrayList 를 써서 풀었다. 😎 Time Complexity push - O(1) pop - O(n) //비효율적 peek - O(1) empty - ..
대규모 시스템 설계 기초 - 4장
대규모 시스템 설계 기초 - 4장
2024.01.30오랜만에 책을 펼쳐보았는데 4장 부터 시작한다 1-3장은 내용은 좀 노멀한거 같아서 스킾.. 4장은 처리율 제한 장치의 설계이다. 처리율 시스템, 네트워크에서 얼만큼 처리할지 그 양을 의미한다. 그러니까 얼만큼 성능 좋은 시스템을 만들껏이냐의 얘기가 되겠다.. 책에서는 클라이언트가 보내는 트래픽의 처리율 (rate) 제어하기 위한 장치로 소개되어 있다. 예시를 하나 들어주는데 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 ip주소로 하루에 10개 이상 계정 생성 금지 같은 디바이스로 주 5회 이상 리워드 요청 금지 이런 제한으롤 처리율 제한 장치를 설계한다. 처리율 제한 장치를 설계할 때 이렇게 제한을 두는 까닭은 몇 가지 장점이 있는듯 하다. Dos 방지 - limit이 없다면 API Call..
1/23 개발 일기
1/23 개발 일기
2024.01.23늦은 새벽 시간즈음 아래 내용이 공부가 하고 싶어 작성하게 되었다. mongoDB Collection TTL 몽고 TTL 은 Time-To-Live 인덱스 즉, 특정 시간이 지나면 자동으로 데이터를 삭제하도록 설정하는 기능이다. 이걸 사용하는 가장 큰 목적은 데이터가 계속 쌓이는것을 방지하기 위함이다. 당연하겠지만 디비에 불필요한 데이터가 많이 쌓이면 쿼리의 성능이 떨어지게 된다. 그러면 TTL 인덱스를 잡을 때 고려해야할 점은 무엇일까? 몽고 디비에서 제공하는 특별한 데이터 유형으로 BSON 날짜 유형을 사용해야 한다. 예를들면, ISODate 함수 같은것들이다. 근데 이거까지 신경 안써도 될듯 하다. 왜냐하면 프로그래밍 언어에서 몽고 DB Driver 에 해당하는 날짜 유형을 BSON으로 자동으로 변..
1/21 개발일기 (clustered index, non-clusted index)
1/21 개발일기 (clustered index, non-clusted index)
2024.01.21non - clustered index 음... 어제는 clustered index에 대해서 봤는데 인덱스 키 값에 따라 배열하는것으로 물리적인 데이터 값을 정렬하는것으로 이해하고 넘어갔다. 오늘은 non - clustered index에 대해 보자. 이 내용은 테이블의 물리적 정렬 순서와는 별도의 구조를 갖는다. clustered index 처럼 인덱스 키값에 따라 정렬되지만, 테이블의 실제 데이터는 그 순서에 영향을 받지 않는다. 정렬된 인덱스 키에 대한 쿼리가 수행할 때 non - clustered index는 정렬된 키와 각 키에 해당하는 데이터 행의 위치에 가리키는 포인터를 이용해 결과를 찾아간다. non - clustered index 의 구조에 대해 살펴보자. 좋은 참고 지표가 있어서 가..
1/20 개발일기(thread-poo, resource관리, clustered index)
1/20 개발일기(thread-poo, resource관리, clustered index)
2024.01.20오늘 주말이여서 그간 못했던 내용들을 정리해보고자 한다. 사실 이전에 해야할것도 좀 밀려있는데 우선순위 높은것으로 추려냈다. 그래도 개발 일기 쓰자고 마음먹었는데 90일은 가야할거 같은 기분이다.. 스프링 큐 (스레드 대기풀) Thread Pool을 사용하면 Spring 내부에서 Queue 를 사용하는데 이거 어떻게 구현되어있는지 궁금해졌다. 한번 정리를 해볼 시간.. java.util.concurrnet.Executors 패키지는 스레드 풀과 관련된 유틸리티 메소드를 제공하고 이 클래스는 다양한 종류의 스레드 풀을 생성하고 관리하기 위한 편리한 방법을 제공하는 정적 메소드들로 구성되어 있다. 예를 들어 이 패키지를 뜯어보면 newFixedThreadPool은 고정된 수의 스레드를 가진 스레드 풀을 생성..
1/16 개발일기(이벤트처리, annotation 동작원리)
1/16 개발일기(이벤트처리, annotation 동작원리)
2024.01.16오늘 공부는 갑자기 Event 에 꽂혀서 보고 있다. 게임 이벤트 같지만... 사실은 이벤트 드리븐 아키텍처이다. 이벤트 드리븐 아키텍처는 왜 필요할까? 데이터 동기화가 필요한 시점이 있을것이다. 데이터 일관성을 맞춰야 할수도 있으니까? 원자성도 고려해야한다. 그럼 간단하게 생각해볼건 API Call을 이용해서 동기화 시키는건데 이건 좀 위험하다. 하나가 죽으면 이걸 참조하는 다른 서비스도 같이 죽어버릴 수 있다. 그러면 중간에 뭐 하나 두는게 가장 이상적일거 같다. kafka 같은... 사실은... https://www.youtube.com/watch?v=BnS6343GTkY 오늘은 이걸 좀 보고 리뷰를 해보고자 한다. kafka 구조를 보면 producer, consumer 구조라는것을 쉽게 파악할 ..
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
2024.01.14강의 하나를 완강해야 겠다고 생각이 들었는데 빠르게 보고 싶은 강의가 생겼다. 강의 들으면서 정리도 겸하고 싶어 주저리 주저리 이 페이지에 옮겨놓으려고 한다. 조금 길어지면 2편으로 .. 로그 추적기 프로젝트에 병목이 생긴다면 로그를 통해 확인해봐야 한다. 아래 요구사항으로 로그를 개선하는 작업이다. 시간 정상호출 과 예외호출 구분 메서드 호출 깊이 구분 실제로 소스를 보면 알겠지만 로그 추적기 수정이 일어날 때마다 피처들에 대한 버전을 계속 관리해야 한다. 이 말은 로그 추적기를 달아야할 피처가 많아지면 많이질수록 그만큼 소스양이 나온다는 뜻..! 아래 구조에서는 traceId를 넘겨줘야 하는 구조여서 새 클래스를 생성할 때마다 의존관계도 계속 추가되고 그러면 응집도가 떨어지고 결합성이 높아질 수 밖에..
패션 관련 프로젝트를 진행하며 ... 1 (feat. 500 maker)
패션 관련 프로젝트를 진행하며 ... 1 (feat. 500 maker)
2024.01.14요즘 패션 열풍이 불다보니 회사에서도 관련 프로젝트 업무를 담당하게 되었다. 여기서 내가 맡은 업무는 패션 스토어 조회, 최근본상품 조회, 찜하기 상품 조회 & 저장에 대한 API 생성 및 수정이었다. 근데 이것도 레거시, 최근 프로젝트 거의 n개 프로젝트를 왔다갔다 수정하다 보니 헷갈려.. 여러 논의가 있었지만 거기서도 가장 중요하게 고려되어야 할점은 성능 문제였다. 이 페이지에서 얼만큼의 tps가 나올지 모르는 상황에서 위 API를 여러번 찌르게 되면 문제가 발생할 수 밖에 없었기 때문에 ... 그러다 500 떨어질랴... 24년이 시작된 후부터 한주간은 계속 회의를 진행한듯 싶다. 특히, 협업하는 부서가 있어서 데이터는 얼만큼 내릴건지 이런거에 대한 협의가 필요했다. 대략적인 협의가 끝난 후에는 A..
Java 버전업 (11->17) 후기 켁;
Java 버전업 (11->17) 후기 켁;
2024.01.07팀내 admin 프로젝트에 Java 버전업을 담당하였다. 비교적 다른 프로젝트에 비해 규모가 작은터라 부담은 없었지만 ... 개인적으로 타팀에서 많이 조회되는 api를 가지고 있는지라 한편으로는 장애 날때마다 dev, alp 든 봐야한다는 부담감이 있어서 조심스러웠다. 자바 버전업 얘기가 나온것은 팀에서도 소개를 하긴 했지만 아래와 같은 이유에서 도입을 하게 되었다. 자바 버전업 도입 목적 Java 17은 2021.10 공개한 LTS 버전으로 2029년 9월까지 지원을 하게 됩니다. Java 11과 비교해서 70가지 이상의 JEP 가 추가되었습니다. (*JEP - JDK 개선 제안) Java Support 기간이 길다. LTS 버전의 장점은 기업과 개발자들이 안정적인 플랫폼에서 장기적인 개발 계획을 세울..
테스트 방법
테스트 방법
2023.03.18JUnit 이란? JUnit은 자바 언어용 단위 테스트 프레임워크입니다. 단위 테스트는 개발자가 자동화된 단위 테스트를 작성하게 도와줍니다. 이를 통해서 코드 품질을 향상시킬 수 있습니다. JUnit은 코드를 리팩토링 하거나 기능을 추가하거나 할때 이전에 작성된 테스트 코드가 작동하는지 확인함으로써 코드 일관성에도 도움을 주게 됩니다. JUnit 특징 사용이 쉽습니다. 개발자가 테스트 케이스를 작성하기 용이합니다. 자동화된 테스트가 가능합니다. 코드 커버리지를 보장할 수 있습니다. 테스트 코드 재사용성이 가능합니다. JUnit은 단위 테스트이기 때문에 독립적으로 실행할 수 있습니다. 그래서 코드를 재사용하기 용이합니다. 테스트 코드 가독성 : JUnit 테스트 결과 쉽게 이해하는데 도움이 됩니다. JUn..
캐시방법
캐시방법
2023.03.11ConcurrentHashMap ConcurrentHashMap은 Thread-Safe 합니다. 동시성 작업에 최적화된 Map 클래스이고, 이 자료구조를 이용해서 캐시를 구현할 수 있습니다. 캐시에서 값을 가져오는 경우 ConcurrentHashMap 에서 해당 키를 사용하여 값을 가져올 수 있습니다. 또, 각 항목에 만료 시간 필드를 추가하여 만료 시간을 추적할 수 있습니다. 만료시간이 5분이라면 아래와 같이 코드를 작성할 수 있습니다. ConcurrentHashMap map = new ConcurrentHashMap(); long expiryTime = System.currentTimeMillis() + (5 * 60 * 1000); // 5분 후 map.put("key1", new MyObject(..