본문 바로가기

분류 전체보기184

의식적으로 지금길 사용하기 지름길이란 고민없이 있는 그대로 코딩해 OOP와 스프링의 장점을 다 날려버리는 것을 의미한다. 이 책을 보는 사람들은 이 지름길이 옳은 것인지 또는 기술부채를 쌓아가는 것인지 확인해봐야 한다. 왜 지름길은 깨진 창문 같을까? 깨진창문이론이란 "어떤 것이 멈춘 것처럼 보이고, 망가져 보이고, [부정적인 형용자를 넣어보자], 혹은 관리되지 않는다고 여겨지면 인간의 뇌는 이를 더 멈추고, 망가뜨리고, [부정적인 형용사를 넣어보자]해도 된다고 생각하게 된다."는 것을 뜻한다. 기물 파손이 흔한 동네에서는 방치된 차를 도둑질하거나 망가뜨리는 일이 더 쉽게 일어난다. '좋은' 동네라도 차의 창문이 깨져있다면 차를 망가뜨리는 일이 쉽게 일어난다. 침실이 정돈돼 있지 않으면 옷을 옷장에 넣는 대신 바닥에 아무렇게나 던.. 2022. 7. 12.
아키텍처 경계 강화하기 경계와 의존성 경계를 강화한다는 것은 어떤 의미일까? 의존성을 항상 안쪽으로 흐르게 하는 것이다. 빨간선으로 되어 있는 잘못된 방향을 없애 경계를 강화해야 한다. 접근 제한자 package-private 제한자는 상당히 중요하다. 다른 패키지에서 접근하지 못하게 하며 모듈의 진입점만 public으로 하여 의존성 규칙을 위반할 위험을 줄어들게 만든다. buckpal |--- account |--- adapter | |--- in | | |--- web | | |--- o AccountController | |--- out | | |--- persistence | | | |--- o AccountPersistenceAdapter | | | |--- o SpringDataAccountRepository |--.. 2022. 7. 11.
애플리케이션 조립하기 왜 조립까지 신경 써야 할까? 코드의 의존성이 올바른 방향(도메인 방향)을 가르키기 위해서 유스케이스와 어댑터를 필요할 때 인스턴스화 하면 안된다. 유스케이스가 영속성 어댑터를 호출해야 하고 스스로 인스턴스화한다면 코드 의존성이 잘못된 방향으로 만들어진 것이다. 이것이 바로 아웃고잉 포트 인터페이스를 생성한 이유다. 유스케이스는 인터페이스만 알아야하고, 런타임에 이 인터페이스의 구현을 제공 받아야 한다. 그렇다면 객체 인스턴스를 생성할 책임은 누구에게 있을까? 그리고 어떻게 의존성 규칙을 어기지 않으면서 그렇게 할 수 있을까? 위 그림처럼 아키텍처에 대해 중립적이고 인스턴스 생성을 위해 모든 클래스에 대한 의존성을 가지는 설정 컴포넌트가 있어야 한다. 설정 컴포넌트의 역할 · 웹 어댑터 인스턴스 생성 ·.. 2022. 7. 10.
경계 간 매핑하기 매핑에 따른 의견 매핑에 찬성하는 개발자 두 계층 간에 매핑을 하지 않으면 양 계층에서 같은 모델을 사용해야 하는데 이렇게 하면 두 계층이 강하게 결합된다. 매핑에 반대하는 개발자 두 계층 간에 매핑을 하게 되면 보일러 플레이트 코드를 너무 많이 만들게 된다. 많은 유스케이스들이 오직 CRUD만 수행하고 계층에 걸쳐 같은 모델을 사용하기 때문에 계층 사이의 매핑은 너무 과하다. 매핑하지 않기 매핑하지 않는 전략을 사용하게 된다면 그림은 위 처럼 된다. 송금하기 위한 모든 클래스들이 Account 클래스를 참조하고 있다. 도메인과 어플리케이션 계층은 웹이나 영속성과 관련된 특수한 요구사항에 관심이 없음에도 불구하고 Account 도메인 모델 클래스는 모든 요구사항을 다뤄야 한다. Account클래스는 웹,.. 2022. 7. 9.
아키텍처 요소 테스트하기 테스트 피라미드 테스트의 기본 전제는 만드는 비용이 적고, 유지보수하기 쉽고, 빨리 실행되고, 안정적인 작은 크기의 테스트들에 대해 높은 커버리지를 유지해야 한다는 것이다. 이 테스트는 하나의 '단위'가 제대로 동작하는지 확인 할 수 있는 단위 테스트들이다. 테스트 피라미드가 위로 올라갈수록 비용이 더 비싸지고 실행이 느리며 깨기지 쉽다. 또, 새로운 기능을 만드는 것보다 테스트를 만드는 시간을 더 쓰게 된다. 테스트 피라미드는 테스트의 커버리지 목표를 낮게 잡아야 한다는 것을 의미한다. 맥락에 따라 테스트 피라미드에 포함되는 계층은 달라질 수 있다. '단위 테스트', '통합테스트', '시스템 테스트'의 정의는 맥락에 따라 다를 수 있다. 단위 테스트는 하나의 클래스를 인스턴스화하고 클래스의 인터페이스를.. 2022. 7. 5.
영속성 어댑터 구현하기 의존성 역전 영속성 어댑터는 아웃고잉 어댑터이다. 어플리케이션에 의해 호출될 뿐, 어플리케이션을 호출하지는 않는다. 영속성 어댑터의 책임 1. 입력을 받는다. 2. 입력을 데이터베이스 포맷으로 매핑한다. 3. 입력을 데이터베이스로 보낸다. 4. 데이터베이스 출력을 어플리케이션 포맷으로 매핑한다. 5. 출력을 반환한다. 영속성 어댑터의 핵심은 영속성 어댑터 내부에 있는 것이 아니라 커플리케이션 코어에 있기 때문에 영속성 어댑터 내부를 변경하는 것이 코어에 영향을 미치지 않는다. 영속성 어댑터는 데이터베이스에 쿼리를 날리고 쿼리 결과를 받아온다. 데이터베이스 응답을 포트에 정의된 출력 모델로 매핑해서 반환한다. 포트 인터페이스 나누기 데이터베이스 연산에 의존하는 각 서비스는 단 하나의 메서드만 사용하는 것이.. 2022. 7. 2.
웹 어댑터 구현하기 의존성 역전 웹 컨트롤러에서 외부로부터 청을 받아 어플리케이션 코어를 호출하고 무슨 일을 해야 할지 알려준다. 이 중간에 웹 어댑터와 어플리케이션 계층이 통신 할 수 있는 포트를 제공한다. 이 포트를 통해 외부와 어떤 통신이 일어나고 있는지 알 수 있다. 위 그림은 컨트롤러에서 service로 아웃고잉 어댑터를 만들 수 있다. 하지만 한 어댑터에서 둘다 수행해도 상관없다. 웹 어댑터의 책임 웹 어댑터는 URL경로, HTTP 메서드, 콘텐츠 타입과 같은 특정 기준을 만족하는 HTTP요청을 수신 후 역직렬화 한다. 1. HTTP 요청을 자바 객체로 매핑 2. 권한 검사 3. 입력 유효성 검증 4. 입력을 유스케이스의 입력 모델로 매핑 5. 유스케이스 호출 6. 유스케이스의 출력을 HTTP로 매핑 7. HTT.. 2022. 6. 29.
제네릭 제네릭과 가변인수를 함께 쓸 때는 신중하라. 제네릭과 가변인수는 생각보다 잘 어우러지지 않는다. 아래코드를 매개변수화 타입을 적용한다면 어떻게 될까? 제네릭은 실체화 불가 타입이기 때문에 타입 관련 정보를 적게 담고 있어 컴파일 타임에 에러를 못 낼 수 있다. 이처럼 타입 안전성이 깨지니 제네릭 varargs배열 매개변수에 저장하는 것은 안전하지 않다. static void dangerous(List... stringLists) { List intList = List.of(42); Object[] objects = stringLists; objects[0] = intList; // 힘오염 발생 String s = stringLists[0].get(0); // ClassCastException } 제네릭 .. 2022. 6. 26.
유스케이스 작성하기 육각형 아키텍처는 도메인 주임의 아키텍에 적합하기 때문에 도메인 엔티티를 만드는 것으로 시작한 후 해당 도메인 엔티티 중심으로 유스케이스를 구현하겠다. 도메인 모델 구현하기 송금하는 유스케이스를 구현해보자. OOP의 관점으로 Account라는 객체를 만들어 현재 잔고를 스냅샷을 하도록 한다. 계좌에 대한 모든 입금과 출금은 Activity 엔티티에 포착하고 모든 Activity에 대해 메모리를 올리는 것은 낭비이기 때문에 ActivityWindow를 통해 일정 기간만 보유한다. @AllArgsConstructor(access = AccessLevel.PRIVATE) public class Account { /** * The unique ID of the account. */ @Getter private .. 2022. 6. 21.
코드 작성하기 계층으로 구성하기 코드를 구조화하는 첫 번째 접근법으로 계층을 이용하는 것으로서, 다음과 같이 코드를 구성할 수 있다. buckpal |--- domain | |--- Account | |--- Activity | |--- AccountRepository | |--- AccountService |--- persistence | |--- AccountRepositoryImpl |--- web |--- AccountController 웹 계층, 도메인 계층, 영속성 계층 각각에 대해 전용 패키지인 web, domain, persistence를 뒀다. 의존성 역전 원칙을 적용해서 의존성이 domain 패키지에 있는 도메인 코드만을 향하도록 했다. domain에 AccountRepository 인터페이스를 추가.. 2022. 6. 20.
의존성 역전하기 단위 책임 원칙 단위 책임 원칙은 "하나의 컴포넌트는 오로지 한 가지 일만 해야하고, 그것을 올바르게 수행해야 한다."고 알고 있지만 실제 의도는 "컴포넌트를 변경하는 이유는 오직 하나뿐이어야한다."이다. 변경할 이유가 한가지라면 수행해야 하는 일도 한가지이다. 만약 컴포넌트를 변경할 이유가 한 가지라면 우리가 어떤 다른 이유로 소프트웨어를 변경하더라도 이 컴포넌트에 대해서는 전혀 신경 쓸 필요가 없다. E의 경우에는 의존하고 있는 컴포넌트가 없기 때문에 자기 자신이 변경할 이유가 있을 경우에만 수정하면 된다. 반면 A는 너무 많은 컴포넌트를 의존하고 있기 때문에 다른 어떤 컴포넌트가 바뀌든지 같이 바뀌어야 한다. 의존성 역전 원칙 의존성 역전 원칙이란 "코드상의 어떤 의존성이든 그 방향을 바꿀 수(역전.. 2022. 6. 19.
제네릭 이왕이면 제네릭 타입으로 만들라 Stack을 제네릭 타입으로 만들어 보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFALUT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFALUT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackException(); Object result = elemen.. 2022. 6. 19.
제네릭 로 타입은 사용하지 말라 로 타입을 쓰게 되면 컴파일 타임에 오류를 알기 힘들다. 문법적으로 막아놓지 않았지만 절대로 쓰면 안된다. 로 타입을 쓰면 제네릭이 안겨주는 안전성과 표현력을 모두 잃게 된다. 로 타입은 안되지만 List처럼 임의 객체를 허용하는 매개변수화 타입은 괜찮다. List에 List을 넘길 수 있지만 List는 안된다. List은 List의 하위타입이지만, List는 아니기 때문이다. 그렇다면 제네릭 타입을 쓰고 싶지만 매개변수 타입을 신경쓰고 싶지 않다면 어떻게 해야 할까? class를 사용하는 것이다. Collection에는 null이외에는 어떤 원소도 넣을 수 없다. 하지만, class 리터럴에는 로 타입을 사용해야 한다. List.class는 허용되지 않는다. 또, instanc.. 2022. 6. 18.
클래스와 인터페이스 멤버 클래스는 되도록 static으로 만들라. 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 중첩 클랫의 종류 외부 접근 쓰임 정적 멤버 클래스 가능 외부 클래스에게 도움을 줄 때 (비정적) 멤버 클래스 불가 어댑터로 정의 할 때 익명 클래스 비정적 문맥 정적 팩토리 메서드나 작은 함수를 구현 할 때 지역 클래스 비정적 문맥 정적 멤버 클래스 정적 멤버클래스는 public static class로 정의하고 private 멤버를 외부 클래스에서 접근할 수 있다는 점만 제외하고 모두 같다. 외부 클.. 2022. 6. 17.
클래스와 인터페이스 인터페이스는 구현하는 쪽을 생각해 설계하라. 자바 8이후부터는 인터페이스도 디폴트 메서드를 구현 할 수 있게 되었지만 생각 할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. removeIf의 예제를 보면 Predicate에서 true를 반환하는 것들을 제거한다. default boolean removeIf(Predicate 2022. 6. 17.
계층형 아키텍쳐의 문제는 문제일까? 계층형 아키텍쳐란? 계층으로 구성된 어플리케이션은 일반적인 3계층 아키텍처를 포함한다. 웹 계층에서는 요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 보낸다. 서비스에서는 필요한 비즈니스 로직을 수행하고, 도메인 엔티티의 현재 상태를 조회하거나 변경하기 위해 영속성 계층의 컴포넌트를 호출한다. 계층형 아키텍처의 문제는 무엇일까? 1. 계층형 아키텍처는 데이터베이스 주도 설계를 유도한다. 전통적인 계층형 아키텍처의 토대는 데이터베이스이다. 웹 계층은 도메인 계층에 의존하고, 도메인 계층은 영속성 계층에 의존하기 때문에 자연스레 데이터베이스에 의존하게 된다. 하지만 대부분의 어플리케이션의 목적은 규칙이나 정책을 반영한 모델을 만들어서 사용자가 이러한 규칙과 정책을 더욱 편리하게 활용 할 수 있.. 2022. 6. 16.
클래스와 인터페이스 추상 클래스보다는 인터페이스를 우선하라. 추상클래스는 정의 타입을 항상 하위 클래스로 하여야 한다. 하지만, 인터페이스같은 경우에는 어떤 클래스를 상속해도 같은 타입으로 취급한다. 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. 인터페이스가 요구하는 메서드를 추가하고, 클래스 선언에 implements 구문만 추가하면 끝이다. 반면 추상클래스는 확장하기 어렵다. 추상 클래스를 확장하기 원한다면 상속 받는 모든 클래스의 공통조사이여야 한다. 적절하지 않은 상황에도 강제로 해야만 하는 상황이 생긴다. 인터페이스는 믹스인(mixin)정의에 안성맞춤이다. 믹스인 정의는 클래스가 구현 할 수 있는 타입으로 부모클래스가 되지 않으면서 선택적 행위를 제공해준다. Comparable은 자신을 구현한 .. 2022. 6. 14.
클래스와 인터페이스 상속보다는 컴포지션을 사용하라 상속(클래스가 다른 클래스를 확장하는)은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 패키지 경계를 넘어 다른 클래스의 구체 클래스를 상속하는 일은 위험하다. 메서드 호출과 달리 상속은 캡슐화를 깨드린다. 상위클래스가 어떻게 구현되는냐에 따라서 하위 클래스 동작에 이상이 생길 수 있다. 상위 클래스는 릴리즈마다 구현이 바뀔 수 있어 문서화를 해두고 발맞춰 수정해야만 한다. 아래 예제에서 addAll()이 c.size()를 더하고 있는데 add()메서드에서 한번 더 더하기 때문에 2배가 된다. 그렇다고 addCount를 더하는 부분을 지운다고 안심할 수 없다. 나중에 상위클래스(HashSet) 어떻게 바뀔지 모르기 때문이다. public class Instrum.. 2022. 6. 14.
클래스와 인터페이스 변경 가능성을 최소화하라 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다. 불변 클래스는 장점이 많고, 단점은 특정 상황에서의 잠재적 성능 저하뿐이다. 이것을 불변 클래스라고 부르는데 인스턴스의 내부 값을 수정 할 수 없는 클래스이다. 생성된 시점의 상태를 파괴될때까지 가져간다. 불변 클래스의 규칙 1. 객채의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 2. 클래스를 확장 할 수 없도록 한다. - 하위 클래스에서 부주의하게 혹은 나쁜 의도로 객체의 상태를 만드는 사태를 막아준다. 3. 모든 필드를 final로 선언한다. 4. 모든 필드를 private으로 선언한다. - 외부에서 직접 접근하여 필드를 수정하는 것을 막아준다. public final로 사용한다면 다음 릴리즈때 내부 표현을 바꾸지.. 2022. 6. 12.
클래스와 인터페이스 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 클래스 내부 데이터와 구현 정보를 외부 컴포넌트에 얼마나 잘 숨겼느냐다. 정보를 은닉해서 구현부와 API를 분리시켜 오직 API로만 외부 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉의 장점 1. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발 할 수 있기 때문이다. 2. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅 할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 3. 정보 은닉가 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음, 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화 할 수 .. 2022. 6. 12.
Authentication 메커니즘 인증 ( Authentication ) Authetication은 인증된 결과만 저장하는 것이 아니고, 인증을 하기 위한 정보와 인증을 받기 위한 정보가 하나의 객체에 동시에 들어있다. 인증을 제공해 줄 제공자(AuthenticationProvider)가 어떤 인증에 대해서 허가를 내줄 것인지 판단하기 위해서는 직접 입력된 인증을 보고 허가된 인증을 내주는 방식이기 때문이다. AuthenticationProvider는 처리 가능한 Authentication에 대해 알려주는 support 메소드를 지원하고, authentication()에서 Authentication을 입력값과 출력밧으로도 사용한다. Credentials : 인증을 받기 위해 필요한 정보, 비번등 (input) Principal : 인증된.. 2022. 6. 11.
모든 객체의 공통 메서드 Comparable을 구현할지 고려하라 Comparable interface를 통해 인스턴스들에 작연적인 순서를 만들 수 있다. compareTo는 단순 동치성과 순서를 비교 할 수 있다. 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable interface를 구현하자. public interface Comparable { public int compareTo(T o); } compareTo 메서드의 일반 규약 이 객체와 주어진 객체의 순서를 비교한다. · 나보다 작은 객체 음의 정수 · 나보다 같은 객체 0 · 나보다 큰 객체 양의 정수 · 비교 할 수 없는 경우 ClassCastException 규약 1. sgn(x.compareTo(y)) == -sgn(y.x.. 2022. 6. 11.
모든 객체의 공통 메서드 toString을 항상 재정의하라. toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. 일반 규약 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환하라. 모든 하위 클래스에서 이 메서드를 재정의하라. 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. - 스스로를 완벽히 설명하는 문자열이어야 한다. eg. "맨해튼 거주자 전화번호부(총 1487536개)" 포맷을 명시하든 아니든 여러분의 의도는 명확히 밝혀야 한다. - 포맷을 명시하거나 주석을 작성하여 의도를 명백히 밝혀야 한다. /* * 이 전화번호의 문자열 표현을 반환한다. * 이 문자열은 "XXX-YYY-ZZZZ"형태의 12글자로 구성된다. * XXX는 지역코.. 2022. 6. 7.
모든 객체의 공통 메서드 equals를 재정의하려거든 hashCode도 재정의하라. equals를 재정의한 객체의 hashCode재정의 하지 않으면 HashMap, HashSet같은 컬렉션의 원소로 사용 할 때 문제를 일으킨다. hash 일반 규약 1. equals비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. (단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.) 2. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. 3. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할.. 2022. 6. 6.
모든 객체의 공통 메서드 INTRO Object는 객체를 만들 수 있는 구체 클래스지만 기본적으로는 상속해서 사용하도록 설계되었다. Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의를 염두에 두고 설계된 것이라 재정의 시 지켜야 하는 일반 규약이 명확히 정의되어 있다.일반 규약에 맞게 재정의 하지 않으면 규약을 준수한다고 가정하는 클래스(HashMap, HashSet 등)를 오작동하게 만들 수 있다. equals는 일반 규약을 지켜 재정의하라. equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어서 자칫하면 끔찍한 결과를 초래한다. 재정의 하지 않으면 클래스의 인스턴스는 오직 자기 자신과만 같게 된다. 재정의 하지 않는 상.. 2022. 6. 6.
기본 실습 설계 index.html에 접속해서 로그인 시도를 한다. user권한이 있을 경우 "/user-page"로 접속하고, admin권한이 있는 경우 "/admin-page"로 접속한다. 소스코드 Back-End Spring Security를 configuration하기 위해서는 WebSecurityConfigurerAdapter를 상속받고, configure를 overriding해준다. @EnableWebSecurity(debug = true) @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { private final CustomAuthDetails.. 2022. 6. 5.
Entity의 기본속성 @Entity @Entity 객체를 persistence상태로 만들어준다. @Id @Id 자바 필드를 pk로 만들어 준다. @GeneratedValue @GeneratedValue 자동적으로 생성할 번호를 붙여준다. public enum GenerationType { /** * Indicates that the persistence provider must assign * primary keys for the entity using an underlying * database table to ensure uniqueness. */ TABLE, /** * Indicates that the persistence provider must assign * primary keys for the entity usi.. 2022. 6. 5.
JPA Repository JPA Repository란? 데이터를 crud할 수 있도록 기본적인 interface를 제공한다. JPA 다이어그램 구조 Repository @Indexed 어노테이션만 있는 interface이다. Repository를 상속받은 class나 interface에 indexing을 해준다. CrudRepository 기본적인 crud에 관련된 메서드들이 정의되어 있는 interface이다. PagingAndSortingRepository Crud에 Page와 Sort기능을 추가한 interface이다. JpaRepository 상위 Interface의 모든 기능을 포함한다. 2022. 6. 5.
Spring Cloud란? Spring Cloud란? Spring Cloud란 분산시스템에서 환경이나 서비스 등.. 일반적인 패턴을 빠르게 빌드하는 툴이다. 분산시스템의 코디네이션은 boiler plate패턴을 리드하는 것이고 이 패턴을 구현함으로 서비스나 어플레이션을 빠르게 준비시키는 것이다. Features Distributed/versioned configuration Service registration and discovery Routing Service-to-service calls Load balancing Circuit Breakers Global locks Leadership election and cluster state Distributed messaging 웹서비스 확장 전략 실무 개발 유형 솔루션 개발 : .. 2022. 6. 5.
객체 생성과 파괴 finalizer와 cleaner 사용을 피하라. finalizer는 예측 할 수 없고, 상황에 따라 위험 할 수 있어 일반적으로는 불필요하다. cleaner는 finalizer보다 덜 위험하지만, 여전히 예측하기 어렵고 느리고 일반적으로는 불필요하다. 피해야 하는 이유 1. 언제 실행될지 알 수가 없어서 제때 실행되어야 하는 작업은 절대 할 수 없다. 2. 상태를 영구적으로 수정하는 작업에서는 절대 사용하면 안된다. DB lock해제를 finalizer나 cleaner에게 맡겨놓는다면 분산 시스템 전체가 서서히 멈출 것이다. 3. 심각한 성능 문제도 동반한다. 4. finalizer공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. 생성자나 직렬화 과정에서 예외가 발생하면, 이 생성되다 만 객체에서.. 2022. 6. 5.