전체 글 24

대규모 서비스를 지탱하는 기술 1장

대용량 서비스? 서비스의 규모는 서버 대수 등으로 개략적으로 파악되는 경우가 많은데, 이런 관점에서 볼 때 백 대에서 수천 대 정도가 대규모 서비스라고 할 수 있다. 구글과 페이스북의 서버 대수는 수백만 대 규모이고, 처리하는 데이터는 테라바이트 ~ 페타바이트 급의 초대규모 서비스이다. 소규모 서비스와 대규모 서비스의 차이 확장성 확보, 부하분산 필요 Scale-out: 서버를 횡으로 전개, 즉 서버의 역할을 분담하거나 대수를 늘림으로써 시스템의 전체적인 처리능력을 높여서 부하를 분산하는 방법이다. 반면 Scale-up은 하드웨어의 성능을 높여 처리능력을 끌어올리는 방법이다. (하드웨어의 성능과 가격은 비례하지 않는다) 저가의 하드웨어를 횡으로 나열해서 확장성을 확보하는 것이 스케일 아웃 전략이다. 스케..

개발 2022.03.16

예제로 짧게 알아보는 SOLID

SOLID란 로버트 C. 마틴이 2000년대 초반 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙으로 제시한 것을 마이클 페더스가 두문자어로 소개한 것이다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Principle): 개방 폐쇄 원칙 LSP(Liskov Substitution Principle): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 응집도는 높이고 (High Cohension), 결합도는 낮추라는(Loose Coupling) 고전원칙을 객체 지향의 관점에서 재정의한 것 결합..

개발 2022.02.20

[Real MySQL 기록] - MVCC (Multi Version Concurrency Control)

일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이며, MVCC의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 데 있다. InnoDB는 언두 로그(Undo log)를 이용해 이 기능을 구현한다. 여기서 멀티 버전이라 함은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미다. CREATE TABLE member ( m_id INT NOT NULL, m_name VARCHAR(20) NOT NULL, m_area VARCHAR(100) NOT NULL, PRIMARY KEY (m_id), INDEX ix_area (m_area) ); INSERT INTO member (m_id, m_name, m_area) VALUES (12, '홍길동', '서울'); COM..

MySQL 2022.02.16

[Real MySQL 기록] 8장_Index

데이터 저장 매체는 컴퓨터에서 가장 느린 부분 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) SSD는 기존 하드 디스크 드라이브에서 데이터 저장용 플래터(원판)를 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 디스크 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있다. 플래시 메모리는 전원이 공급되지 않아도 데이터가 삭제되지 않는다. 컴퓨터의 D-Ram 보다는 느리지만 기계식 하드 디스크 드라이브보다는 훨씬 빠르다. 디스크의 헤더를 움직이지 않고 한 번에 많은 데이터를 읽는 순차 I/O 에서는 SSD가 하드 디스크 드라이브보다 조금 빠르거나 거의 비슷한 성능을 보이기도 한다. 하지..

MySQL 2022.02.16

Stream 연습 문제 2 - 심화

Java의 Stream 공부를 하다, 풀어볼 수 있는 연습문제가 있으면 좋겠다는 생각을 해서 포스팅 해봤습니다. 문제 난이도는 기본, 심화로 나눴습니다. 기본 문제는 모던 자바 인 액션 이라는 책의 Chapter5를 약간 변형해서 첨부하였고, 심화 문제는 알고리즘 문제를 풀면서 자주 사용할 것 같은 기법에 대해 직접 문제를 만들어 봤습니다. 혹시라도 더 효율적인 코드가 있거나 문제에 오류가 있으면 많은 피드백 부탁드립니다. 2022.01.12 - [자바 & 스프링] - Stream 연습 문제 1 - 기본 Stream 연습 문제 1 - 기본 Java의 Stream 공부를 하다, 풀어볼 수 있는 연습문제가 있으면 좋겠다는 생각을 해서 포스팅 해봤습니다. 문제 난이도는 기본, 심화로 나눴습니다. 기본 문제는 ..

자바 & 스프링 2022.01.12

Stream 연습 문제 1 - 기본

Java의 Stream 공부를 하다, 풀어볼 수 있는 연습문제가 있으면 좋겠다는 생각을 해서 포스팅 해봤습니다. 문제 난이도는 기본, 심화로 나눴습니다. 기본 문제는 모던 자바 인 액션 이라는 책의 Chapter5를 약간 변형해서 첨부하였고, 심화 문제는 알고리즘 문제를 풀면서 자주 사용할 것 같은 기법에 대해 직접 문제를 만들어 봤습니다. 혹시라도 더 효율적인 코드가 있거나 문제에 오류가 있으면 많은 피드백 부탁드립니다. 준비 코드 public class Trader { private final String name; private final String CITY; public Trader(String name, String CITY) { this.name = name; this.CITY = CITY;..

자바 & 스프링 2022.01.12

string관련 클래스 성능 비교

2021.12.08 - [자바 & 스프링] - java - String, StringBuilder, StringBuffer java - String, StringBuilder, StringBuffer String, StringBuilder, StringBuffer는 자바에서 문자열을 다루는 대표적인 클래스이다. String Java에서 String 객체를 생성하는 방법은 2가지가 있는데 하나는 "" 큰 따옴표를 사용하는 것이고, 두번째는 new.. p829911.tistory.com 이전에 문자열을 다루는 자바 클래스 String, StringBuilder, StringBuffer에 관한 포스팅을 한 적 이 있다. 이번 글에서는 위 클래스들의 속도와 힙 메모리를 얼마나 차지하는 지를 확인해서 성능비교를 ..

자바 & 스프링 2022.01.06

string concatenation compile optimization

전 포스팅에서 Java에서 String을 처리하는 데 사용하는 클래스들을 소개한적이 있다. 2021.12.08 - [자바 & 스프링] - java - String, StringBuilder, StringBuffer java - String, StringBuilder, StringBuffer String, StringBuilder, StringBuffer는 자바에서 문자열을 다루는 대표적인 클래스이다. String Java에서 String 객체를 생성하는 방법은 2가지가 있는데 하나는 "" 큰 따옴표를 사용하는 것이고, 두번째는 new.. p829911.tistory.com 이 포스팅에선 JDK에서 컴파일 시, 문자열 결합 연산을 어떻게 최적화 하는지 알아보자. String 연산은 1.4 버전까지 매우 비..

자바 & 스프링 2022.01.05

ThreadLocal의 활용 - 트랜잭션 동기화

2021.12.20 - [자바 & 스프링] - 트랜잭션 위 블로그 포스팅에서 트랜잭션 동기화와 트랜잭션 동기화를 사용한 트랜잭션 전파를 언급한 적이 있다. 지금 작성하는 포스트에선 java의 ThreadLocal이 트랜잭션 동기화에 사용되고 있는 것을 코드를 통해 확인해보겠다. Transaction 관리는 PlatformTransactionManager라는 인터페이스를 구현한 클래스들을 통해 사용된다. 정확히 말하면 AbstractPlatformTransactionManager가 PlatformTransactionManager 인터페이스를 구현하는데 AbstractPlatformTransactionManager를 각 persistence framework(JDBC, Hibernate, JPA, JTA)에..

자바 & 스프링 2021.12.22

ThreadLocal의 정의와 사용법

Synchronized 키워드와 더불어 자바에서 제공하는 멀티 쓰레드를 위한 도구로 ThreadLocal이 있다. ThreadLocal은 각 쓰레드가 자신만의 전역변수를 만들어 사용할 수 있는 기능을 제공해준다. 오직 한 쓰레드에 의해서 읽고 쓰여질 수 있는 변수라고 생각하면 된다. ThreadLocal 변수를 선언하면 멀티쓰레드 환경에서 각 쓰레드마다 독립적인 변수를 가지고 접근할 수 있다. 코드 public class ThreadLocalTest { public static class MyThread implements Runnable { @Override public void run() { System.out.println("thread name = " + Thread.currentThread()...

자바 & 스프링 2021.12.20