1. redis 에서 repository scan
2024-08-27T10:38:09.702+09:00 INFO [_] 46726 --- [ main] .RepositoryConfigurationExtensionSupport (320) : Spring Data Redis - Could not safely identify store assignment for repository candidate interface io.github.lahuman.domain.tip.ContentRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
Redis에서 리포지토리 스캔과 관련된 문제를 해결하기 위해 Spring Data Redis가 리포지토리 후보 인터페이스에 대한 저장소 할당을 안전하게 식별하지 못한다는 경고가 발생합니다. 이 경우,
@RedisHash
를 엔티티에 적용하거나, 리포지토리를 KeyValueRepository를 상속하도록 하면 이 경고를 해결할 수 있습니다.
하지만, RedisTemplate을 사용하고 리포지토리 스캔이 필요하지 않다면, application.yml에서 다음과 같이 설정할 수 있습니다:
spring:
data:
redis:
repositories:
enabled: false
위와 같이 설정시 redis Repository는 사용하지 않고 jpa Repository만 사용합니다.
2. jap open-in-view 설정 경고
2024-08-27T10:38:15.984+09:00 WARN [_] 46726 --- [ main] JpaBaseConfiguration$JpaWebConfiguration (232) : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
spring.jpa.open-in-view 설정은 Spring에서 영속성 컨텍스트가 클라이언트 요청의 모든 뷰 렌더링이 완료될 때까지 유지되도록 하는 옵션입니다. 이는 기본적으로 활성화되어 있으며, 뷰 렌더링 중에 데이터베이스 쿼리가 발생할 수 있습니다. 그러나 이 설정은 리소스를 많이 소모할 수 있고, 대규모 애플리케이션에서 성능 문제를 일으킬 수 있습니다.
특히 GraphQL과 같은 동적 데이터 구조에서 이 설정을 끄는 것은 데이터베이스 커넥션이 빠르게 해제되기 때문에 LazyInitializationException과 같은 문제가 발생할 수 있습니다. 따라서 spring.jpa.open-in-view를 false로 설정하는 것은 신중히 고려해야 합니다.
예를 들어, 대부분의 응답을 DTO로 변환하여 lazy loading이 필요 없는 경우에는 이 설정을 비활성화하는 것이 더 나을 수 있습니다.
저의 경우 대부분의 response를 DTO로 변환하기 때문에 해당 옵션을 false로 전환하였습니다.
spring:
jpa:
open-in-view: false
3. @AliasFor 사용 권장
2024-08-27T10:38:16.094+09:00 WARN [_] 46726 --- [ main] o.s.c.annotation.AnnotationTypeMapping (321) : Support for convention-based annotation attribute overrides is deprecated and will be removed in Spring Framework 6.2. Please annotate the following attributes in @io.lahuman.common.annotation.LoginUser with appropriate @AliasFor declarations: [name]
Spring Framework 6.2에서는 컨벤션 기반의 애노테이션 속성 재정의가 더 이상 지원되지 않으며, 이를 해결하기 위해서는 @AliasFor를 명시적으로 사용해야 합니다. 이를 통해 애노테이션 속성을 다른 애노테이션 속성과 연관시켜 보다 명확한 의미를 부여할 수 있습니다.
예를 들어, LoginUser 애노테이션의 name 속성을 @AliasFor로 Parameter 애노테이션의 name 속성과 연결하면, 애노테이션의 동작이 명확해지고, 의도하지 않은 동작을 방지할 수 있습니다.
package io.lahuman.common.annotation
import io.swagger.v3.oas.annotations.Parameter
import org.springframework.core.annotation.AliasFor
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Parameter(hidden = true)
annotation class LoginUser(
@get:AliasFor(annotation = Parameter::class)
val name: String = "userId"
)
위와 같이 @get:AliasFor(annotation = Parameter::class)
을 선언하여 주면 간단하게 처리 됩니다.