해결된 질문
작성
·
267
0
저는 @Query 어노테이션의 값을 아래와 같이 강의 내용대로 따라했을 때 오류가 발생해서
public interface LockRepository extends JpaRepository<Stock, Long> {
@Query(value = "select get_lock(:key, 3000)", nativeQuery = true)
void getLock(String key);
@Query(value = "select release_lock(:key)", nativeQuery = true)
void releaseLock(String key);
}
아래와 같이 정합성이 맞지 않아서 테스트를 통과하지 못했습니다.
그래서 구문을 아래와 같이 바꿔서 통과했는데 참고 하시길 바랍니다. ?1의 값은 key로의 값으로 고정되어 있는데 이럴 경우 문제가 없을지 궁금합니다.
@Query(value = "select get_lock(?1, 3000)", nativeQuery = true)
void getLock(String key);
@Query(value = "select release_lock(?1)", nativeQuery = true)
void releaseLock(String key);
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
알함님의 질문에 대해 답변드리겠습니다. @Query
어노테이션을 사용하여 네이티브 쿼리를 작성할 때, :key
를 사용한 파라미터 바인딩 대신 ?1
을 사용하여 파라미터의 위치 기반 바인딩으로 변경하신 것으로 이해됩니다. Spring Data JPA에서 네이티브 쿼리를 실행할 때 ?1
과 같은 방식을 사용하는 것은 완전히 유효하며, 많은 경우에 선호되는 방식입니다.
해당 방식은 첫 번째 파라미터의 값을 쿼리의 첫 번째 ?
에 바인딩하는 것을 의미하며, 이 방식을 사용함으로써 SQL 인젝션 공격과 같은 보안 취약점을 줄일 수 있습니다. 또한, 이런 방식은 테스트 통과 여부에 영향을 주지 않으며, 오히려 더 명확한 파라미터 바인딩으로 인해 오류를 줄이는 데 도움을 줄 수 있습니다.
참고하신 정보와 관련하여 @Query
어노테이션의 사용법에 대한 자세한 내용은 Spring Data JPA 공식 문서에서 확인하실 수 있습니다.
- 네이티브 쿼리를 정의하는 방법에 대한 내용은 여기에서 확인하실 수 있습니다.
따라서, ?1
을 사용한 파라미터 바인딩 방식으로 변경하여 테스트를 통과한 것은 적절한 해결 방식입니다. 이 방식으로 인해 발생할 수 있는 문제는 없으며, JPA 리포지토리의 네이티브 쿼리에서 널리 사용되는 접근 방식입니다.
추가적인 질문이나 궁금한 점이 있으시면 언제든지 질문해 주세요.
네 저는 아래의 방식으로 해결했습니다. 그런데 저렇게 할 경우 ?1의 parameter 값이 key로 고정되는데 이 경우 좋지 않은 방법인 거 같아서 다른 방식을 검색하는 키워드가 혹시 있을까요?