월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
returnBookTest 질문드립니다.
안녕하세요 강사님! 테스트 코드를 작성하던 중 문제가 발생하여 문의드립니다. returnBookTest 상에서 UserLoanHistory가 DB에만 저장되고(90번째 줄), savedUser.userLoanHistories에는 추가가 안되어 user.returnBook을 호출하는 과정에서 NoSuchElementException이 발생하는 것 같습니다. @Test fun returnBookTest() { // given bookRepository.save(Book("이상한 나라의 엘리스")) val savedUser = userRepository.save(User("김", null)) userLoanHistoryRepository.save(UserLoanHistory(savedUser, "이상한 나라의 엘리스", false)) // 생성한 UserLoanHistory 객체가 DB에만 저장됨 val request = BookReturnRequest("김", "이상한 나라의 엘리스") // when bookService.returnBook(request) // 최종적으로 user.returnBook 호출 // then val results = userLoanHistoryRepository.findAll() assertThat(results).hasSize(1) assertThat(results[0].isReturn).isTrue } public void returnBook(String bookName) { UserLoanHistory targetHistory = this.userLoanHistories.stream() // userLoanHistories.size() == 0 .filter(history -> history.getBookName().equals(bookName)) .findFirst() .orElseThrow(); // 여기서 예외 발생 targetHistory.doReturn(); } 따라서 다음과 같이 수정해야 하지 않을까 싶은데 이 부분 확인 부탁드립니다!! @Test fun returnBookTest() { // given bookRepository.save(Book("이상한 나라의 엘리스")) userRepository.save(User("김", null)) val loanRequest = BookLoanRequest("김", "이상한 나라의 엘리스") bookService.loanBook(loanRequest) val returnRequest = BookReturnRequest("김", "이상한 나라의 엘리스") // when bookService.returnBook(returnRequest) // then val results = userLoanHistoryRepository.findAll() assertThat(results).hasSize(1) assertThat(results[0].isReturn).isTrue }
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
AssertionsForInterfaceTypes를 사용하는 이유가 궁금합니다
안녕하세요 강사님! 그동안 테스트 코드를 작성할 땐 Assertj의 Assertions 클래스를 사용해왔는데, 강사님께서는 AssertionsForInterfaceTypes를 사용하시더라구요..!! AssertionsForInterfaceTypes를 특별히 사용하신 이유가 있을까 하여 질문 남겨드립니다. 코드를 살펴보니 Assertions.assertThat이 내부적으로 AssertionsForInterfaceTypes.assertThat을 호출하는 것 같아 보이는데.. 사실 공식문서도 찾아봤는데 이해가 잘 되지 않네요ㅜㅜ 1) AssertionsForInterfaceTypes.assertThat 2) Assertions.assertThat
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
완성본 소스
선생님이 작성하신 실습이 완료된 소스 코드를 얻을 수 있을까요?
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
@RequestMapping 활용
안녕하세요 Controller의 경로를 보고 /user /book 부분이 중복된다고 생각하였습니다. 혹시 @RequestMapping을 활용해서 중복을 제거하지 않으신 이유가 있으신가요?
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
test run 방법
안녕하세요 저는 보통 전체 test를 진행할 때 test 디렉터리 우클릭 "Run test in project-name" 단축키 Ctrl + Shift + F10을 이용하는 편입니다. 이때 ./gradlew build와 우측 gradle을 하는것과 차이가 존재하나요? 이때 Settings에서 Run tests using은 Gradle이라고 가정하겠습니다.
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
constructor 필드 문의
안녕하세요 constructor 부분에 UserService뒤에 ,를 붙여주시는데 이렇게 작성하시는 특별한 이유가 있을까요? 혹시 추후에 필드가 추가될 수 있을때를 염두해두신건가요?
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
build.gradle과 패키징 관련 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 안녕하세요 build.gradle과 패키지 관련해서 궁금한점이 생겨서 문의드립니다. 첫번째로 plugins 부분과 compileKotlin, complieTestKotlin 부분은 코틀린의 공식문서 Tools -> Build tools -> Gradle에서 발견할 수 있었습니다. 하지만 dependencies 부분의 stdlib-jdk8 부분은 발견할 수 없었습니다. 찾아본 결과 jdk8 기능과 호환되는 코틀린 표준 라이브러리라고 알게되었는데 이부분은 어떤 레퍼런스를 참고하셨는지 궁금합니다. 두번째로 패키지구조를 자바와 코틀린을 동일하게 구성하였는데 만약 다르게 구성하는 경우도 가능한가요? 가능하다면 동일하게 구성한 이유는 그냥 관례상 하는건가요? 감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
12강에서 영상과 다른 오류가 발생합니다.
bookRepository.save(Book("이상한 나라의 엘리스"))해당 코드에서 오류가 발생하는데요java.lang.NoSuchMethodError: 'void com.group.libraryapp.domain.book.Book.<init>(java.lang.String)'이런 메세지가 뜨면서 동작을 안하네요.init 메서드 관련해서 이슈가 있어 보이는데 감이 안오네요...
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
빌드 툴 관련 궁금해요!
강사님 안녕하세요! 제가 원래 자바로 개발하다가 코틀린으로 강사님 강의 들으면서 열심히 배우고 있습니다. 항상 감사합니다! 제가 기존에 자바로 개발할 때는 습관적으로 IntelliJ IDEA에서 프로젝트 세팅할 때 빌드 툴을 Gradle -> IntelliJ로 설정하곤 했는데요. 강의 듣다가 중간에 그게 생각나서 IntelliJ로 바꿨더니 테스트 실행할 때 UserCreateRequest 생성자 호출 부분에서 ... too many arguments for public constructor ... 이라는 오류가 나더라구요! 다시 Gradle로 설정해서 실행한 뒤 IntelliJ로 바꿨더니 또 다시 되네요 ㅎㅎ (어리둥절합니다...) 사실 그래서 궁금한 점은 강사님께서는 어떤 빌드 툴 사용하시는지 궁금해서 질문 남겨봅니다! 감사합니다. 🙇🏻♂️