Closed ghkdqhrbals closed 5 months ago
GCP memcache 써볼려고 했지만 비용때문에 K8S 클러스터 내부 직접 로드해서 사용하겠습니다
현재 아래의 객체를 Redis 와 JPA 를 통해 저장합니다. @RedisHash(value=
로 인해 runningTest:
라는 prefix 가 붙어있는 key 로 생성이 됩니다.
@Getter
@ToString
@Builder
@RedisHash(value = "runningTest", timeToLive = 6000)
public class RunningTest {
@Id
private Integer templateId;
private String groupId;
private String testId;
}
그리고 이 엔티티를 extends CRUD 를 통해 find 하게된다면 아래의 에러가 발생합니다.
org.springframework.data.mapping.MappingException: Parameter org.springframework.data.mapping.Parameter@57ced0b5 does not have a name
...
따라서 이는 key 를 찾을 때 "runningTest:" 라는 prefix 가 자동으로 붙지 않은 상태에서 find 를 하기 때문에 발생한 에러로 보입니다.
그래서 해결책을 찾아보았는데, 단순히 @NoArgsConstructor 어노테이션을 엔티티 상단에 붙이게 되었을 때 정상적으로 동작한다고 하더라구요.
원래 Spring 6.1(Spring Boot 3.1.x) 이전에는 LocalVariableTableParameterNameDiscoverer
를 통해 어떤 객체 생성자 파라미터를 바이트코드에 붙여주었지만, 이제는 Spring 6.1(Spring Boot 3.2.0) 로 업그레이드 되면서 파라미터 이름을 앞에 안붙인다고 합니다. 즉, 생성자를 통해 인스턴스화 시킬 떄 RunningTest(Integer templateId, ...)
의 templateId 파라미터 이름이 식별되지 않는다는거죠. 그렇게 되면 뭐가 문제냐!
엔티티를 생성하고 인스턴스화 시키고 JPA 를 통해서 파라미터 이름(templateId)과 실제 DB 의 칼럼(template_id)을 mapping 할 텐데, 여기서 문제가 발생합니다! 이유는 파라미터 이름이 바이트 코드에서는 식별이 안되기 때문이죠ㅜㅜ. 그래서 Parameter doesn't have a name
이라는 에러가 뜬거에요.
즉, 이러한 MappingException 은 RedisHash 로 인해 발생한 문제가 아닌 엔티티의 생성자 파라미터 이름의 컴파일 유무에 따라 발생한 에러입니다.
두 가지 방법이 있습니다.
@NoArgsContstructor
를 붙여주면 1차 적으로 mapping exception 은 패싱할 수 있다고 합니다. 이 후 JPA 에서 잘 매핑하는 것 같습니다(이 부분 공부하려면 너무 깊어져서 여기까지만 하겠습니다).
저는 ConcurrentHashMap, Set 에 주로 현재 퍼포먼스 테스트 중인 정보들을 저장하는데요. 하지만 이를 실시간으로 로그를 확인하기 매우! 어렵다는 점이 존재했습니다. 확인할려면 일일이 디버깅(손버깅) 하는 방법밖에 없더라구요ㅜㅜ. 그리고 로그를 따로 DB 에 저장하는 작업도 추가적으로 필요하죠.
그래서 실시간 퍼포먼스 테스트 중인 로그들을 확인하기 위해서는 다른 기능이 필요했습니다. 해당 기능에 필요한 컨디션은 아래와 같습니다.
1. Race condition 해결 필요
2. 간단한 로깅로직 필요
3. 로그 유지보수 필요
4. 트랜젝션 통합관리 필요
그래서!
Redis 리모트 인메모리 DB 를 사용하려고 합니다. 귀찮은 것을 싫어하는 사람으로써 Redis 에 정보들을 기록하거나 관리하면 어떻게 편해질까요?