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

doll님의 프로필 이미지
doll

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

12강. 도메인 계층을 Kotlin으로 변경하기 - Book.java

12강에서 영상과 다른 오류가 발생합니다.

작성

·

226

1

bookRepository.save(Book("이상한 나라의 엘리스"))
해당 코드에서 오류가 발생하는데요

java.lang.NoSuchMethodError: 'void com.group.libraryapp.domain.book.Book.<init>(java.lang.String)'
이런 메세지가 뜨면서 동작을 안하네요.

init 메서드 관련해서 이슈가 있어 보이는데 감이 안오네요...

답변 2

1

doll님의 프로필 이미지
doll
질문자

다시 빌드 후 실행하니깐 정상적으로 동작하네요

답변 감사합니다!

최태현님의 프로필 이미지
최태현
지식공유자

오~ 다행입니다 ㅎㅎㅎㅎ 언제든지 어려운 점 있으시면 편하게 질문 주세요~!!!

감사합니다!!!

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 프로그램님!!! 

java.lang.NoSuchMethodError: 'void com.group.libraryapp.domain.book.Book.<init>(java.lang.String)' 이라는 에러가 나오는군요 😭

12강에서 나셨다면 현재 도메인 객체인 Book만 코틀린으로 바뀐 상황인 것으로 추측됩니다!!

 

우선 예상되는 해결책은 다음과 같습니다!!

1. jpa 플러그인이 잘 적용되어 있는지 확인한다 

// build.gradle
plugins {
  id "org.jetbrains.kotlin.plugin.jpa" version "1.6.21"
}

 

2. reflect 의존성이 잘 적용되어 있는지 확인한다

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.21")
}

 

3. 혹시나 Book.kt가 아래 코드와 다른 점이 있는지 확인한다 <--- 아마 이 확률이 제일 높을 것 같습니다!! 그 이유는 아래서 설명드리겠습니다!

 

제가 3번의 확률이 제일 높을 것 같다고 생각하는 이유는, 해당 에러가 Book 클래스의 '기본 생성자'가 없을 때 나는 에러라는 검색 결과가 있기 때문입니다!!

(제 블로그는 아니지만 관련 blog를 찾았어요! https://soobindeveloper8.tistory.com/244)

 

조금 더 정확히는 현재 에러에서 <init>(java.lang.String) 이라고 되어 있는데요! 이는 아마 Book 클래스의 생성사 중에 String만을 가지는 생성자가 없다는 의미 같습니다!

즉, java로 치면 new Book(String name) 라고 타이핑 할 수 없다는 것이죠!

 

그리고 적어주신 bookRepository.save(Book("이상한 나라의 엘리스"))는 문법을 보았을 때 Kotlin 문법을 사용하신 것으로 추정됩니다!! (즉 테스트 코드인 것 같아요!!)

여기서 import 하고 있는 Book이 정말 Kotlin Class Book인지, 그렇다면 그 Kotiln Class Book의 생성자 중에 default parameter 등을 사용해 String만을 가질 수 있는 생성자가 있는지 확인해보시면 더욱 좋을 것 같습니다~!

이때 Book.kt 파일을 Java로 Decompile 해보시면 생성자를 조금 더 자세히 확인하실 수 있을 겁니다! 고생 너무너무 많으십니다!! 👍👍

 

질문 주셔서 감사합니다 ㅎㅎㅎㅎ 꼭 해결 되었으면 좋겠네요~!! 🔥

 

혹시나 계속해서 진행이 어려우시다면, 번거로우시겠지만 관련 코드를 스샷해주시거나 프로젝트 전체를 압축해주시면 제가 한 번 확인해보도록 하겠습니다!!!

 

감사합니다! 좋은 밤 되세요!!! 🙏🙇

doll님의 프로필 이미지
doll

작성한 질문수

질문하기