CACHE 정해진 갯수의 인스턴스 캐싱 적용 정리
로또를 통해 캐싱을 적용하는 방법 정리
📜 제목으로 보기
캐싱 방법 정리
캐싱 도입 방법
- 정팩메가 필요하다
- 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에 대한 캐싱객체 생성방법
-
정적팩토리메서드로 class를
객체찍는템플릿
에서능동적인 객체관리자
로 승격시킨다.- new 생성자 : 100% 객체를 생성해야함(캐싱못함)
- 정펙매
- 캐싱(재사용) 가능해짐.ㅁ
-
인자의 갯수에 따라 .of or from으로 public static 메서드를 생성한다.
-
기존 생성자와 동일한 형으로 key / 재사용할 객체형을 value로 해서 HashMap을 만든다. / 캐싱할 인스턴스 객체수를 알고 있다면 capacity를 저적어준다.
- 변수는 static변수로서 상수의 map으로서 jvm돌때 미리 생성된다.
-
캐싱의 핵심은,
존재하면 map에서 get
으로 꺼내고,없으면 생성
이다- map의 초기화도 미리 이루어진다.
-
없으면 key-value 넣어주기, 있으면 꺼내기는
map.computeIfAbsent( key, 람다식으로 value생성식)
을 넣어주면 된다.- 람다식은 가상인자로 작성해야해서, key값을 그대로 넣어주면 에러남.
-
정적팩토리메서드가 완성되었으면,
기본생성자는 private으로 막아
두고각종 검증방법은 정팩메로 이동
시킨다. -
기존 new때려서 생성한 객체들을 of로 다 수정해준다.
-
캐싱의 테스트는 식별자 일치를 확인하는
.isSameAs
를 사용해서 테스트한다. -
여러 쓰레드에서 접근한다면,
미리 모두 static생성 + ConcurrentHashMap
으로 변경하고 getter만 하게 한다.static 컬렉션 변수
의 요소들은staitc블록으로 요소들 미리 생성
하게 할 수있다.- static블럭이 늘어나면, 해석하는데 힘이쓰여 좋지 않ㄴ다.
정팩메로 2개 이상 input에 대한 캐싱객체 생성방법
-
컴퓨터내부에서 로직의 시작인 card 2개가 주어진다면, 정제된input이라 생각하고 카드부터 만든다.
- 제한된 종류의 값 = 상수묶음은 enum으로 만들어서 카드를 만든다.
- 테스트메서드명은 인자 -> 1case 가 결정한다.
-
4 x 13 종류의 객체는 캐싱이 가능하다.
- 캐싱을 적용하려면 일단 생성자 인자 그대로
정팩메
로 만들고, 기본생성자는 private해준다
- 캐싱을 적용하려면 일단 생성자 인자 그대로
-
원래는
기본생성자의 1개 인자
에 대해 hashMap<생성자인자, 객체>
형으로 static CACHE map을 만들어야하지만,파라미터가 2개일경우, 1개로 합친 Key
를 만들어야한다.- 2개이상의 정보를 묶은 class를 만들어도 되지만, string을 이용해서 합쳐 1개의 key로 만들어
<String, 객체>
형을 많이 사용한다. - 캐쉬의 기본공식은 꺼내서 없으면 put해주고, return get을 반환이다.
- 2개이상의 정보를 묶은 class를 만들어도 되지만, string을 이용해서 합쳐 1개의 key로 만들어
-
테스트메서드명도 함수를 from or of의 정펙메로 바꿔주고, isSameAs로 테스트한다.
-
java의 기능으로서 없으면 key에 대한 value를 생성해주고 있으면 반환하는
computeIfAbsent
를 사용해서 리팩토링한다.- 또한 캐싱될 객체의 수를 알고 있으면 미리 넣어줘도 된다.
-
CACHE대상객체는, 거의 값객체기 때문에, 값으로 비교하기 위해 eq/hC오버라이딩도 해준다.