루다 서버에서 루다의 개인화 메시지를 처리하는 방법
두줄요약
Kotlin Reflection과 커스텀 어노테이션으로 개인화 메시지 토큰을 치환하는 방식을 소개했습니다. use-site target과 Hibernate 프록시로 인한 누락 문제의 해결법을 설명합니다.
문제 상황
- 사용자 속성 토큰
[name],[age]등을 실제 값으로 치환하는 공통 로직 필요 - Kotlin/JPA 환경에서 어노테이션 기반 치환 대상 탐색 시 프로퍼티 누락과 프록시 객체 문제 발생
구조와 흐름
@Attribute에 토큰을 선언하고 Kotlin Reflection의members와findAnnotation으로 토큰-값 맵 생성- Relation과 LAZY 연관 User의 속성 맵을 결합해 개인화 메시지 구성
원인 분석
- 기본 생성자 프로퍼티의 어노테이션이 use-site target 우선순위에 따라 생성자 파라미터에 적용되어
members탐색에서 제외 - Hibernate LAZY 프록시가 엔티티를 상속한 별도 객체여서 부모 엔티티의 어노테이션 탐색 불일치
해결 방법
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION)으로 어노테이션 적용 위치 제한Hibernate.unproxy로 원본 엔티티를 얻은 뒤 어노테이션과 값 탐색

