📜 제목으로 보기

캐싱 방법 정리

캐싱 도입 방법

  • 정팩메가 필요하다
  • static컬렉션(hashMap) CACHE (기존 생성자파라미터를 key, 객체를value로 하는 Type)를 필드초기화하고
    • 갯수가 정해져있으니 capacity를 기입해서 빈컬렉션 초기화
    • 만약, 기본생성자로 들어더온 데이터가 2개이상이면, 1개의 key로 만들기 위해 innter KeyClass도입 or string으로 연결한다.
  • static정팩메에서 if 없으면 생성해서 넣어주고 , 있으면 get을 요청한다
    • computeIfAbsent(key, 가상인자람다식으로 value생성(객체생성))
    • java라면 computeIfAbsent를 활용하되 Funtional이 기본이므로 객체생성자 호출시 ignored -> 를 활용한다
  • 미리 static블럭에서 static변수들(캐싱변수도)을 초기화해서 캐싱할 객체들을 미리 생성할 수 있음.
  • 여러쓰레드에서 입력할 가능성이 있다면, ConcurrentHashMap으로 캐싱static 변수를 초기화한다.

정팩메로 1개 input에 대한 캐싱객체 생성방법

  1. 정적팩토리메서드로 class를 객체찍는템플릿에서 능동적인 객체관리자로 승격시킨다.

    • new 생성자 : 100% 객체를 생성해야함(캐싱못함)
    • 정펙매
      • 캐싱(재사용) 가능해짐.ㅁ
  2. 인자의 갯수에 따라 .of or from으로 public static 메서드를 생성한다.

  3. 기존 생성자와 동일한 형으로 key / 재사용할 객체형을 value로 해서 HashMap을 만든다. / 캐싱할 인스턴스 객체수를 알고 있다면 capacity를 저적어준다.

    • 변수는 static변수로서 상수의 map으로서 jvm돌때 미리 생성된다.

    fdf430f0-78d6-456b-8886-a66b363b0560

    image-20220731113819787

  4. 캐싱의 핵심은, 존재하면 map에서 get으로 꺼내고, 없으면 생성이다

    • map의 초기화도 미리 이루어진다.

    96c640ce-9600-4c59-ba85-20f1efb9ea44

    image-20220731114201232

  5. 없으면 key-value 넣어주기, 있으면 꺼내기는 map.computeIfAbsent( key, 람다식으로 value생성식)을 넣어주면 된다.

    • 람다식은 가상인자로 작성해야해서, key값을 그대로 넣어주면 에러남.

    e487c03a-c2da-4ec3-953c-e059eca42fb2

    image-20220731114834750

  6. 정적팩토리메서드가 완성되었으면, 기본생성자는 private으로 막아두고 각종 검증방법은 정팩메로 이동시킨다.

    c5e8e02d-0fa3-4695-a519-216388391380

    image-20220731115302033

  7. 기존 new때려서 생성한 객체들을 of로 다 수정해준다.

    image-20220731115746576

  8. 캐싱의 테스트는 식별자 일치를 확인하는 .isSameAs를 사용해서 테스트한다.

    a33cf917-9f91-4f90-9e2b-68e797d53184

    image-20220731115026661

  9. 여러 쓰레드에서 접근한다면, 미리 모두 static생성 + ConcurrentHashMap으로 변경하고 getter만 하게 한다.

    • static 컬렉션 변수의 요소들은 staitc블록으로 요소들 미리 생성하게 할 수있다.
    • static블럭이 늘어나면, 해석하는데 힘이쓰여 좋지 않ㄴ다.

    1acaf790-305c-4d20-a617-d25f7cc2352b

    image-20220731120759176

정팩메로 2개 이상 input에 대한 캐싱객체 생성방법

  1. 컴퓨터내부에서 로직의 시작인 card 2개가 주어진다면, 정제된input이라 생각하고 카드부터 만든다.

    • 제한된 종류의 값 = 상수묶음은 enum으로 만들어서 카드를 만든다.
    • 테스트메서드명은 인자 -> 1case 가 결정한다.

    image-20220803141223263

  2. 4 x 13 종류의 객체는 캐싱이 가능하다.

    • 캐싱을 적용하려면 일단 생성자 인자 그대로 정팩메로 만들고, 기본생성자는 private해준다

    eb9d9669-3c47-4bc2-a036-e045e7bae549

    image-20220803141533284

  3. 원래는 기본생성자의 1개 인자에 대해 hashMap<생성자인자, 객체>형으로 static CACHE map을 만들어야하지만, 파라미터가 2개일경우, 1개로 합친 Key를 만들어야한다.

    • 2개이상의 정보를 묶은 class를 만들어도 되지만, string을 이용해서 합쳐 1개의 key로 만들어 <String, 객체>형을 많이 사용한다.
    • 캐쉬의 기본공식은 꺼내서 없으면 put해주고, return get을 반환이다.

    303bdea4-3f7f-401f-8ced-e537eb227a77

    image-20220803142249589

  4. 테스트메서드명도 함수를 from or of의 정펙메로 바꿔주고, isSameAs로 테스트한다.

    image-20220803142749590

  5. java의 기능으로서 없으면 key에 대한 value를 생성해주고 있으면 반환하는 computeIfAbsent를 사용해서 리팩토링한다.

    • 또한 캐싱될 객체의 수를 알고 있으면 미리 넣어줘도 된다.

    e488a62d-24bf-4ab9-8f50-1dc5ed300d1a

    image-20220803143606805

  6. CACHE대상객체는, 거의 값객체기 때문에, 값으로 비교하기 위해 eq/hC오버라이딩도 해준다.