티스토리 뷰
지난 글은 https://ryumodrn.tistory.com/23 참고
한동안은 Redis @Cacheable에 대해 마음을 내려놓고 있었다
프로젝트 막바지에 적용해보다가 정 안 되면 List <Dto> 형태로 반환하던지
jwt token 인증을 하고 있고 token은 page 형태로 반환할 필요가 없으니
token service에만 적용시켜 봐야겠다하고 생각 중이었다
이후 HATEOAS에서의 EntityModel, PagedModel을 공부하고
PagedModel의 구현에서 Cache를 적용할 수 있는 영감을 얻었다
PagedModel은 EntityModel의 Page 형태 반환이다
PagedModel의 구현을 살펴보던 중 deprecate된 생성자 메서드를 대신하는 static method인 of를 살펴봤다
of에서는 Collection<T>를 받고,
Pageable의 구현체인 PageRequest 같은 형태의 static class, PageMetadata를 받아 Collection -> Page 로 변환시킨다
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를
함께 사용하는 예제를 찾지 못했는데 결국 구현해내 뿌듯하다!
'Spring > Spring Data' 카테고리의 다른 글
[Redis] HATEOAS와 @Cacheable - 3 (0) | 2021.12.25 |
---|---|
[Redis] HATEOAS와 @Cacheable - 2 (0) | 2021.12.22 |
[Redis] LocalDateTime Serialization / Deserialization 삽질기 - 2 (4) | 2021.12.22 |
[Redis] HATEOAS와 @Cacheable (0) | 2021.09.20 |
[Redis] LocalDateTime Serialization / Deserialization 삽질기 (0) | 2021.09.16 |