전체 글 34

Setup Highly Available MySQL Cluster with ProxySQL

*단순 요약 번역한 글입니다. * proxySQL 을 사용하여 고가용성 Mysql 클러스터 설정 공식문서에 정의된것 처럼, ProxySQL 은 mysql과 forks(percona server 및 mariaDB)를 위한 high performance, high availablility, 프로토콜 인식 proxy 입니다. 이름에서 알수 있듯이 ProxySQL 은 백엔드 Mysql 클러스터로 들어오는 트래픽을 프록시 합니다. ProxySQL 은 DBA 를 위해, DBA 에 의해 개발되었으므로 들어오는 트래픽을 proxy 전달에만 국한하지는 않는다. ProxySQL 은 DBA 가 읽기/쓰기 분할, 멀티플랙싱, 쿼리 캐싱 등과 같은 다양한 기능을 통해 일상적인 문제를 쉽게 해결하여 Mysql 클러스터의 high..

읽어볼거리 2021.02.25

[Failover] max actives

상황 api 처리속도를 높이기 위해 parallel 처리를 50개 이상씩 한번에 처리하려고 수정중 3rd server 에서 에러가 발생함 내용 jta 를 사용중인데, transactions 갯수 제한이 default 로 되어있었다. 따라서 일시적으로 많은 요청이 들어왔을때 Max number of active transactions reached:50 이 발생했다. 해결 System.setProperty("com.atomikos.icatch.max_actives", "100"); max_actives 를 결정하는 property 를 system.setProperty 로 변경처리함 결과 before after

FAILOVER 2021.02.25

[GIT] Repositories and Branches

How to get a Git repository repository를 얻는 가장 좋은 방법은 git-clone를 사용해 기존 저장소의 사본을 다운로드 하는 것이다. $ git clone git://git.kernel.org/pub/scm/git/git.git 대규모 프로젝트의경우 시간이 많이 걸리지만 한번만 복제하면 된다. How to check out a different version of a project git 는 파일의 컬렉션 기록을 저장하는 최고의 도구라고 생각한다. 단일 git저장소는 여러 브랜치의 개발을 추적한다 각 브런치의 마지막 commit 을 head 의 리스트 목록을 유지합니다. git-branch 명령은 브런치 헤드의 리스트를 보여준다. $ git branch * master 대..

개발/GIT 2021.02.22

ITEM23 태그 달린 클래스보다는 클래스 계층구조를 활용하라.

정리 태그달린 클래스 : 두가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태크값으로 알려주는 클래스 태그달린 클래스는 장황하고 오류를 내기 쉽고, 비효율적이다. 태그달린 클래스는 클래스 걔층구조를 어셜프게 흉내낸 아류일 뿐이다. 핵심정리 태그 달린 클래스를 써야 하는 상황은 거의 없다. 새로운 클래스를 작성하는 데 태그필트가 등장한다면 태크를 없애고 계층구조를 대체하는 방법을 생각해보자. 기존 클래스가 태그 필드를 사용하고 있다면 계층구조로 리펙터링 하는 걸 고민해보자.

ITEM21 인터페이스는 구현하는 쪽을 생각해 설계하라.

정리 자바 8 전에는 기존 구현체를 깨뜨리지 않고 인터페이스에 메서드를 추가할 방법이 없었다. 하지만 위험이 완전히 사라진 것은 아니다. 자바 8 에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었다. 주로 람다를 사용하기 위해서다. 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운법이다. 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다. 핵싱은 명백하다. 디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야한다.

ITEM20 추상 클래스보다는 인터페이스를 우선하라.

정리 인터페이스와 추상클래스의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상클래스의 하위 클래스가 되어야한다는 점이다. 기존클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. 반면 새로운 추상클래스를 끼워넣는 것은 어려운게 일반적이다. 인터페이스는 mixin 정의에 안성맞춤이다. mixin : 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된타입' 외에도 특정 선택정 행위를 제공한다고 선언한다는 효과를 준다. 대상의 주된 기능에 선택적기능으로 혼합한다고 해서 mixin 이라고 한다. 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다. 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다. 타입을 추상클래스로 정의..

ITEM19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.

정리 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야한다. 재정의 가능이란 public protected 메서드중 final 이 아닌 모든 메서드를 뜻한다. 글래스의 내부 동작과정 중간에 끼어들수 있는 hook 을 잘 선별하여 proteced 메서드 형태로 공개해야 할 수도 있다. 상속용 클래스를 시험하는 방법은 직접 하위 클래스를 만들어보는 것이 유일하다. 상속용으로 설계한 클래스는 배포전에 반드시 하위 클래스를 검증해야 한다. 상속용 클래스의 생성자는 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안된다. 정리 상속용 클래스를 설계하기란 결코 만만치 않다. 클래스 내부에서 스스로를 어떻게 사용하는지 모두 문서로 남겨야하며, 일단 문서화한 것..

ITEM18 상속보다는 컴포지션을 사용하라

정리 상속 : 클래스가 다른 클래스를 확장하는 구현상속을 의미(인터페이스 상속과는 무관) 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 메서드호출과 달리 상속은 캡슐화를 깨뜨린다. 기존 클래스를 확장하는 대신, 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게하자 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻에서 이러한 설계를 컴포지션 이라한다. 새 클래스의 인스턴스 메서드들은 (private 필드를 참조하는 ) 기존 클래스의 대응하는 메서드를 호출해 그결과를 반환한다. 이 방식을 forwarding 이라 하며, 새 클래스이 메서드들을 forwarding method 라 부른다. // 래퍼 클래스 - 상속대신 컴포지션을 사용했다. public cla..