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

김병곤님의 프로필 이미지
김병곤

작성한 질문수

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

[실습] 데이터베이스 초기화

mutableListOf

해결된 질문

작성

·

96

0

강의를 들으면서 코틀린 문법도 같이 병행하면서 듣고있는데 이부분 질문을 하고 싶습니다!

image.png

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이 가변인자 방식으로 인자를 받는 것을 지원하지 않는 것으로 보이네요.

 

좀 더 자세한 내용은 '가변인자'를 키워드로 검색해보시면 좋을 것 같습니다.

 

감사합니다.

김병곤님의 프로필 이미지
김병곤

작성한 질문수

질문하기