왕초보일지

240223 TIL |

다시은 2024. 2. 23. 20:19

 

최종 전 마지막 프로젝트 끝...

ec2 서버 접속, 레디스 적용, 캐시전략, nGrinder 성능 테스트 등 짧은 프로젝트 기간 동안 많이 배웠다.

뭐든 기록하는 습관을 들여야 남는게 있을 것 같다.

그리고 무슨 기술이든 사용하는 이유, 근거가 충분해야지 의미가 있다.

 

 

최종 프젝 전 주말동안 밀린 강의 듣고 책 첫 장 한 번 보고 해야 할 일 정리해야지!!!!

 


properties 속성으로 중요 데이터 값 참조하기

~.yml 파일에 있는 값을 다음과 같이  Properties 클래스를 만들어 가져오고 Config 에서 명시해준다.

@ConfigurationProperties(prefix = "spring.data.redis")
class RedisProperties(
    val host: String,
    val port: Int
)
@Configuration
@EnableConfigurationProperties(JwtProperties::class, RedisProperties::class)
class PropertyConfig

 

 

CustomSliceImpl

class CustomSliceImpl<T> @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) constructor(
    @JsonProperty("content") content: List<T>?,
    @JsonProperty("size") size: Int,
    @JsonProperty("hasNext") hasNext: Boolean
) : SliceImpl<T>(content!!, PageRequest.of(0, size), hasNext) {
    @JsonIgnore
    override fun getPageable(): Pageable {
        return super.getPageable()
    }
}

 

@JsonIgnore

해당 메소드나 필드의 결과값이 JSON 으로 직렬화 되는 과정에서 무시된다.

 

잭슨은 제이슨 중첩문제?

바이너리형태로 해결

직렬화를 하려면 객체가 Serializer 상속

이게 안될 때 다른 해결책

 

 

 

 

 

 

 

 

 

REDIS 캐싱 결과

 

    @Cacheable(value = [GET_BUBBLES_BY_KEYWORD], condition = "#bubbleId == null")
    fun searchBubblesWithCaching(bubbleId: Long?, keyword: String, pageable: Pageable): CustomSliceImpl<BubbleResponse>? {
        return bubbleRepository.searchBubbles(bubbleId, keyword, pageable)
    }

키워드 검색 시 "KEYWORD" key로 캐싱

    @Cacheable(value = [GET_ALL_BUBBLES], condition = "#bubbleId == null")
    fun getBubblesWithCaching(bubbleId: Long?, pageable: Pageable): CustomSliceImpl<BubbleResponse>? {
        return bubbleRepository.getBubbles(bubbleId, pageable)
    }

전체 조회 시 "BUBBLES" key 로 캐싱

    @Transactional
    @CacheEvict(value = [GET_ALL_BUBBLES, GET_BUBBLES_BY_KEYWORD], allEntries = true)
    fun delete(bubbleId: Long, memberPrincipal: MemberPrincipal) {
        val bubble = getByIdOrNull(bubbleId)
        if (bubble.id != memberPrincipal.id) {
            throw HasNoPermissionException()
        }

        bubbleRepository.delete(bubble)
    }

bubble 삭제 시 키워드 검색, 전체 조회 캐시 삭제