티스토리 뷰

지난 글은 https://ryumodrn.tistory.com/23 참고

 

 

한동안은 Redis @Cacheable에 대해 마음을 내려놓고 있었다

프로젝트 막바지에 적용해보다가 정 안 되면 List <Dto> 형태로 반환하던지

jwt token 인증을 하고 있고 token은 page 형태로 반환할 필요가 없으니

token service에만 적용시켜 봐야겠다하고 생각 중이었다

이후 HATEOAS에서의 EntityModel, PagedModel을 공부하고 

PagedModel의 구현에서 Cache를 적용할 수 있는 영감을 얻었다

PagedModel은 EntityModel의 Page 형태 반환이다

 

EntityModel의 Page 버전

 

 

 

PagedModel의 구현을 살펴보던 중 deprecate된 생성자 메서드를 대신하는 static method인 of를 살펴봤다

of에서는 Collection<T>를 받고,

Pageable의 구현체인 PageRequest 같은 형태의 static class, PageMetadata를 받아 Collection -> Page 로 변환시킨다

 

Collection, Pageable, Link를 받는다

 

Pageble 역할 수행

 

Page 형태로 반환하고 싶다면 Collection 인터페이스 구현체 중 하나인 List 형태의 데이터와 Pageable을 건네 받고

Page 구현체인 PageImpl의 생성자를 통해 List 형태의 데이터를 Page 형태로 변환 가능하다

따라서 Redis Cache를 적용시킬 Service 계층에서 Page 형태로 Controller를 넘겨주지 말고 List 형태로 주고

Controller 계층에서 넘겨 받은 데이터를 Page로 변환시켜 응답하면 된다

 

 

 

 

Service 계층에서의 메서드 모습은 이렇다

Spring Cache 추상화, @Cacheable을 사용했고 구현체는 RedisTemplate을 사용했다

keyGenerator는 일일이 key를 설정하지 않고 class, method 이름을 통해 key 값이 생기도록 자동화한 것이다

나는 Controller 계층에서는 Entity 존재 자체를 모르게 Service 계층에서 Dto 형태로 반환한다

repository에서 받아온 데이터를 MapStruct와 Java 8 이상에서 사용할 수 있는 Stream을 이용해 변환 과정을 거친다

stream을 돌리고 다시 Collectors.toList() 메서드를 통해 List 형태로 반환한다

 

 

 

Redis Cache를 적용시킨 Controller의 모습은 이렇다

Service로부터 List를 받고 Controller에서 Page 형태로 변환시켜준다

이렇게 해서 HATEOAS & Cache를 함께 쓸 수 있게 됐다!

검색 능력이 딸려서 못 찾은 건지 정말 자료가 부족했던 건지 hateoas, cache를

함께 사용하는 예제를 찾지 못했는데 결국 구현해내 뿌듯하다!

 

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday