해결된 질문
작성
·
96
0
강의를 들으면서 코틀린 문법도 같이 병행하면서 듣고있는데 이부분 질문을 하고 싶습니다!
mutableListOf 로 감싸줘서 넣어져야지 코드가 오류 없이 되는지 궁금합니다.
jpa 특성상 그런건가용?
답변 1
0
안녕하세요 정보근입니다:)
말씀하신 부분은 JPA 특성이라기보단 자바/코틀린 문법입니다.
saveAll() 메소드의 맥북 기준 cmd+B를 누르시면,
ListCrudRepository 인터페이스를 확인하실 수 있으실텐데요.
아래와 같이 파라미터로 Iterable을 받을 수 있게 되어있습니다.
즉 Iterable의 구현체들만 파라미터로 들어갈 수 있습니다.
<S extends T> List<S> saveAll(Iterable<S> entities);
원하시는 것은 파라미터로 넣기 위해 리스트 등 Iterable의 구현체를 따로 사용하지 않고,
각 요소 하나하나를 파라미터로 넣고 싶어하시는 것 같은데요.
이럴 경우 메소드 정의를 파라미터 1개, 파라미터 2개, 이런 식으로 전부 정의하면 사용성이 좋지 않겠죠.
그 때 사용하는 게 가변인자입니다.
아래 코드처럼 vararg 키워드를 사용하는 파라미터를 받는 saveAll() 메소드를 새로 정의해줬습니다.
interface AchievementRepository : JpaRepository<Achievement, Long> {
fun saveAll(vararg achievements: Achievement )
// select * from achievement where is_active = :isActive
fun findAllByIsActive(isActive: Boolean): List<Achievement>
}
위와 같이 새 메소드를 정의해줄 경우 아래 코드처럼 리스트를 받을 수도 있고, 개별 인자를 여러 개 받을 수도 있습니다.
achievementRepository.saveAll(mutableListOf(achievement1, achievement2))
achievementRepository.saveAll(achievement1, achievement2)
위의 메소드에서 cmd+B를 누르시면 ListCrudRepository로, 아래 메소드에서 누르시면 저희가 정의한 AchievementRepository로 이동하는 것을 확인하실 수 있으실 거에요.
이렇게 할 경우 코틀린 문법상 문제는 없습니다.
하지만 실행을 시켜보시면 No property 'saveAll' found for type 'Achievement'와 같이 오류가 뜹니다.
스프링 데이터 JPA에서 saveAll이 가변인자 방식으로 인자를 받는 것을 지원하지 않는 것으로 보이네요.
좀 더 자세한 내용은 '가변인자'를 키워드로 검색해보시면 좋을 것 같습니다.
감사합니다.