목록 보기
루다 서버에서 루다의 개인화 메시지를 처리하는 방법
백엔드

루다 서버에서 루다의 개인화 메시지를 처리하는 방법

스캐터랩 핑퐁
스캐터랩 핑퐁
2023년 10월 19일

두줄요약

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로 원본 엔티티를 얻은 뒤 어노테이션과 값 탐색

다음 읽기

#Kotlin 주제를 다룬 다른 회사 글

스포카에서 Kotlin으로 JPA Entity를 정의하는 방법

Kotlin에서 JPA Entity를 정의할 때 자주 보이는 안티 패턴을 정리했습니다. mutable property, data class, lateinit 사용 시 주의할 점을 설명했습니다.

spoqa
spoqa
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...