인프런 커뮤니티 질문&답변

알함님의 프로필 이미지

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Named Lock 활용해보기

네임드락 테스트 오류

해결된 질문

작성

·

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);
}

아래와 같이 정합성이 맞지 않아서 테스트를 통과하지 못했습니다.

스크린샷 2024-04-21 오후 4.47.33.png그래서 구문을 아래와 같이 바꿔서 통과했는데 참고 하시길 바랍니다. ?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

최상용님의 프로필 이미지
최상용
지식공유자

알함님 안녕하세요.
해결됨으로 표시되는데 해결 되신걸까요 ?

알함님의 프로필 이미지
알함
질문자

네 저는 아래의 방식으로 해결했습니다. 그런데 저렇게 할 경우 ?1의 parameter 값이 key로 고정되는데 이 경우 좋지 않은 방법인 거 같아서 다른 방식을 검색하는 키워드가 혹시 있을까요?

최상용님의 프로필 이미지
최상용
지식공유자

알함님 안녕하세요.
@Param 어노테이션을 사용할 수 있을것처럼 보입니다.

spring data jpa @Query @Param 이라고 검색해보시면 좋을것 같습니다.

알함님의 프로필 이미지
알함
질문자

해당 키워드를 통해서 더 알아보도록 하겠습니다. 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

알함님의 질문에 대해 답변드리겠습니다. @Query 어노테이션을 사용하여 네이티브 쿼리를 작성할 때, :key를 사용한 파라미터 바인딩 대신 ?1을 사용하여 파라미터의 위치 기반 바인딩으로 변경하신 것으로 이해됩니다. Spring Data JPA에서 네이티브 쿼리를 실행할 때 ?1과 같은 방식을 사용하는 것은 완전히 유효하며, 많은 경우에 선호되는 방식입니다.

해당 방식은 첫 번째 파라미터의 값을 쿼리의 첫 번째 ?에 바인딩하는 것을 의미하며, 이 방식을 사용함으로써 SQL 인젝션 공격과 같은 보안 취약점을 줄일 수 있습니다. 또한, 이런 방식은 테스트 통과 여부에 영향을 주지 않으며, 오히려 더 명확한 파라미터 바인딩으로 인해 오류를 줄이는 데 도움을 줄 수 있습니다.

참고하신 정보와 관련하여 @Query 어노테이션의 사용법에 대한 자세한 내용은 Spring Data JPA 공식 문서에서 확인하실 수 있습니다.
- 네이티브 쿼리를 정의하는 방법에 대한 내용은 여기에서 확인하실 수 있습니다.

따라서, ?1을 사용한 파라미터 바인딩 방식으로 변경하여 테스트를 통과한 것은 적절한 해결 방식입니다. 이 방식으로 인해 발생할 수 있는 문제는 없으며, JPA 리포지토리의 네이티브 쿼리에서 널리 사용되는 접근 방식입니다.

추가적인 질문이나 궁금한 점이 있으시면 언제든지 질문해 주세요.

알함님의 프로필 이미지

작성한 질문수

질문하기