본문 바로가기

반응형

분류 전체보기

(133)
[시스템 설계] 사용자 수에 따른 규모 확장성 - 3 참고: 가상 면접 사례로 배우는 대규모 시스템 설계 기초, 알렉스 쉬 CDN 정적 컨텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 네트워크이다. (ex, AWS의 CloudFornt) 예를 들어, 내 서버는 서울에 있는데, 일본 유저가 내 서버에 접촉할 경우 거리가 멀어 응답속도가 느려지게 된다. 이때, 일본에 내 서울 서버를 본뜬 서버를 둔다면, 빠르게 응답할 수 있다. 즉, 거리가 매우 먼 지리적 상황을 극복하기 위한 일종의 캐시 서버와 비슷하다. CDN 서버에 캐시할 수 있는 종류 이미지, 비디오, CSS, HTML, JavaScript 등 정적 파일들을 저장할 수 있다. 예시 예시 1. 서울에만 서버가 있는 경우) 위 그림처럼, 서울에만 서버가 있다면, 응답속도가 느려질 것이다. 예시 2. 일본에..
[시스템 설계] 사용자 수에 따른 규모 확장성 - 2 참고: 가상 면접 사례로 배우는 대규모 시스템 설계 기초, 알렉스 쉬 캐시, Cache 매 요청마다 데이터베이스와 트랜잭션이 일어나면, 비효율적이고 자원 낭비가 발생한다. 이를 방지하기 위해 자주 사용되거나 비싼 연산 결과는 데이터베이스보다 가까운 캐시라는 저장소에 저장해두고, 사용할 수 있다. 캐시 계층, Cache tier 서버와 데이터베이스 중간 위치에 캐시 계층을 둘 수 있다. 또한, 서비스의 규모에 따라 캐시 계층을 확장할 수 있다. 캐시 계층을 두게 되면 아래와 같은 이점을 얻을 수 있다. 성능 개선 데이터베이스 부하 감소 캐시의 동작 순서(읽기 주도형 캐시 전략, read-through caching strategy) 웹 서버 ➡️ 캐시 : 클라이언트 요청에 대한 데이터 요청 캐시 ➡️ 웹 ..
[시스템 설계] 사용자 수에 따른 규모 확장성 - 1 참고: 가상 면접 사례로 배우는 대규모 시스템 설계 기초, 알렉스 쉬 단일 서버 웹 앱, 데이터베이스, 캐시 등 모든 요소들이 단 한 대의 서버에서 실행되는 형태이다. 단일 서버의 사용자 요청 흐름 사용자 단말 ➡️ DNS : 사용자가 도메인(ex, www.naver.com)을 DNS에 질의 DNS ➡️ 사용자 단말 : DNS에서 도메인을 IP 주소(ex, 223.130.200.236)로 변환해 응답 사용자 단말 ➡️ 서버 : 사용자 단말에서 IP 주소를 통해 서버로 필요한 데이터 요청(ex, HTTP 요청) 서버 ➡️ 사용자 단말 : 서버에서 요청한 데이터를 사용자 단말에 전송 데이터베이스 추가(웹 서버+DB서버) 사용자 수가 증가하게 되면, 위 단일 서버에 데이터베이스 서버를 추가할 수 있다. 데이터..
[Spring]IoC(Inversion of Control)와 DI 참고: 김영한, 스프링 핵심 원리, https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8 IoC, Inversion of Control, 제어의 역전 프로그램의 제어를 직접 제어하는 것이 아닌 외부에서 관리하는 것을 말한다. IoC를 적용하지 않은 기존의 프로그램들은 구현체가 필요한 객체들을 직접 생성, 연결, 실행한다. 즉, 구현체가 제어의 흐름을 관제한다. 하지만 IoC 개념이 적용된 프로그램에서 제어의 흐름은 다른 객체(혹은 프레임워크)가 관제한다. 각 객체들은 내부의 필요한 구현체들이 어떤 구현..
[Spring] 생성자 주입을 통해 SOLID의 OCP, DIP를 개선하기 이전 OCP, DIP의 문제점 이전 글의 OCP와 DIP는 생성자 주입을 통해 조금 더 세세한 분리를 통해 개선할 수 있다. 아래는 OCP와 DIP의 개선 코드이다. OCP 예를 들어, 아래의 코드의 경우, OCP를 준수하기 위해선 변경에는 닫혀 있어야 한다. 하지만, 'SimpleCaculatorV1'에서 'SimpleCaculatorV2'로 변경할 때 '공학계산기' class 안에서 코드의 변경이 발생한다. interface SimpleCaculator { public void 더하기(); } class SimpleCaculatorV1 implements SimpleCaculator{ public void 더하기(){} } class SimpleCaculatorV2 implements SimpleCa..
[Spring] 객체 지향 설계 SOLID 개념과 적용 예시 참고 1. 스프링 핵심 원리 강의(김영한) 2. https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-ISP-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B6%84%EB%A6%AC-%EC%9B%90%EC%B9%99?category=967430 SOLID 클린 코드의 저자(로버트 마틴)의 객체 지향 설계 원칙 5가지 SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open-Closed Principle): 개방-폐쇄 원칙 LSP(Liskov Substitu..
[JAVA] - GC(Garbage Collection) 가비지 컬렉션 정리 가비지 컬렉션(Garbage Collection)이란 ? 자바의 메모리 관리 기법으로 동적으로 할당했던 메모리 영역(=heap) 중 더 이상 참조되지 않는 메모리 객체를 모아 제거 해주는 객체. -> Heap Area에서 더이상 사용하지 않는 메모리를 제거 Heap Area Heap Area Eden survivor 1 survivor 2 Old Generation Permanent Young Generation ※ Permanent 는 Java 7까지만 Heap에 존재. Java 8부터는 Native Method Stack으로 편입. Stack vs Heap Stack : 정적으로 할당한 메모리 영역 원시 타입의 데이터(int, double, boolean 등... )가 값과 함께 할당. Heap영역에..
[JPQL] 페치 조인 - Fetch Join! (JPA의 N+1 문제 해결법) 실무에서 정말 정말 중요한 Fetch Join...에 대해 학습하자! (복습하고 또 복습하기) Fetch Join 연관된 엔티티나 컬렉션을 한 번에 함께 조회하는 기능 ( = 즉시 로딩) ➡️ 성능 향상! 일반적인 SQL 조인 종류가 아니다! JPQL에서 제공하는 성능 최적화를 위한 Join 기능 join fetch Fetch Join 사용법 JOIN FETCH 명령어로 사용 #1. OUTER JOIN (OUTER은 생략 가능!) LEFT [OUTER] JOIN FETCH + 조인 경로 #2. INNER JOIN (INNER 생략 가능!) [INNER] JOIN FETCH + 조인 경로 예시 상황) 회원(다) - 팀(일) 의 연관관계를 맺은 두 엔티티가 있다. 페치 조인을 통해, 회원 엔티티를 조회 시,..