본문 바로가기

분류 전체보기

(126)
2022.03.1주차 회고 보호되어 있는 글입니다.
[이펙티브 코틀린] 추상화 설계 이펙티브 코틀린을 읽다가 객체지향을 다룬 부분에서 남기고 싶은 내용들이 있어 조금 발췌하여 가볍게 정리해보았다. 추상화란 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것이다. 대표적인 예로는 인터페이스가 있다. 클래스라는 복잡한 것에서 메서드와 프로퍼티만 추출해 간단하게 만들었기 때문이다. 프로그래밍에서의 추상화 추상화를 설계한다는 것은 단순히 모듈 또는 라이브러리로 분리한다는 의미가 아니다. 함수를 정의할 때, 그 구현을 함수의 시그니처 뒤에 숨기게 되는데 이가 바로 추상화이다. 만약 코틀린의 maxOf() 함수를 사용하지 않고 다음과 같이 사용한다고 해보자. val biggest = if (z > y) x else y 위 코드는 추상적인 것을..
Database Connection Pool (Database) Database Connection Pool이 등장 설명을 위해 JDBC에 대한 개념을 간단히 짚고 넘어가자. JDBC 웹 애플리케이션은 정보 저장이 필요할 때 주로 데이터베이스(Database, 이하 DB)를 이용한다. 이를 위해 WAS는 애플리케이션이 DB로 접근할 수 있는 통일된 방법을 제공해야 하는데, 자바에서는 이러한 통일된 DB 접근을 위해 만든 표준이 바로 JDBC(Java Database Connectivity) 표준이다. JDBC는 애플리케이션이 DB 커넥션을 사용하는 방법에 대해 기술하고 SQL 작업을 하기 위한 API를 제공한다. JDBC 실행 과정 DB 서버 접속을 위해 JDBC 드라이버를 로드한다. DB 접속 정보와 DriverManager.getConnection() Method..
2021년 12월 회고 보호되어 있는 글입니다.
[Real MySQL 8.0] 5장. 트랜잭션과 잠금 잠금(Lock)은 동시성을 제어하기 위한 기능 트랜잭션은 데이터의 정합성을 보장하기 위한 기능 격리 수준은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지 결정하는 레벨 트랜잭션 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 커밋되거나 롤백됨을 보장해주는 것 MySQL 엔진의 잠금 글로벌 락 FLUSH TABLES WITH READ LOCK 명령으로 획득 가능 다른 세션에서 SELECT를 제외한 대부분의 DDL 문장이나 DML 문장을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기 상태로 남음 실행과 동시에 MySQL 서버에 존재하는 모든 테이블을 닫고 잠금을 검 mysqldump같은 백업 ..
[대규모 시스템 설계 기초] 6장. 키-값 저장소 설계 문제 이해 및 설계 범위 확정 키-값 쌍의 크기는 10KB 이하 큰 데이터를 저장할 수 있어야 함 높은 가용성을 제공해야 함. 따라서 시스템은 설사 장애가 있더라도 빨리 응답해야 함 높은 규모 확장성을 제공해야 함. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야 함 데이터 일관성 수준은 조정이 가능해야 함 응답 지연시간(latency)이 짧아야 함 단일 서버 키-값 저장소 가장 직관적인 방법은 키-값 쌍 전부를 메모리에 해시 테이블로 저장하는 것 빠른 속도를 보장하긴 하지만 모든 데이터를 메모리 안에 두는 것이 불가능 할 수도 있다는 약점 개선책 데이터 압축(compression) 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장 분산 키-값 저장소 분산 해시 테이블 키-값 쌍..
[Kotlin In Action] 8장. 고차 함수: 파라미터와 반환 값으로 람다 사용 고차 함수 정의 다른 함수를 인자로 받거나 함수를 반환하는 함수 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있음 함수 타입 (Int, String) ‐> Unit (x: Int, y: String) ‐> Unit // 코드의 가독성 위해 파라미터에 이름 지정 가능 함수 파라미터의 타입을 괄호 안에 넣고, 화살표를 넣고, 반환 타입을 지정 반드시 반환 타입을 명시해야 함 Unit : 의미있는 값을 반환하지 않는 함수의 반환 타입 인자로 받은 함수 호출 fun twoAndThree(operation: (Int, Int) ‐> Int) { val result = operation(2, 3) // 함수 호출 println("The result is $result") } fun main(ar..
[대규모 시스템 설계 기초] 5장. 안정 해시 설계 수평적 규모 확장을 달성하기 위해 사용하는 기술 해시 키 재배치(rehash) 문제 N개의 캐시 서버 부하를 균등하게 나누는 보편적 방법은 serverIndex = hash(key) % N (N은 서버 개수) 해시 함수를 쓰는 것 서버 풀의 크기가 고정되어 있을 떄, 데이터 분포가 균등할 때는 잘 동작 하지만 서버가 추가되거나 기존 서버가 삭제되면 문제가 생김 안정 해시는 이 문제를 효과적으로 해결하는 기술 안정 해시 안정 해시는 해시 테이블 크기가 조정될 때 평균적으로 오직 k/n 개의 키만 재배치하는 해시 기술 k는 키의 개수, n은 슬롯(slot)의 개수 대부분 전통적 해시 테이블은 슬롯의 수가 바뀌면 거의 대부분의 키를 재배치했었음 해시 공간과 해시 링 해시 함수 f로는 SHA-1를 사용한다고 가..