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

양치잘하기님의 프로필 이미지
양치잘하기

작성한 질문수

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

[실습] 리포지토리 테스트 코드 작성

테스트코드 실행중 오류와 경고에 관한 질문 입니다.

작성

·

85

·

수정됨

0

현재 강의는 ExperienceRepository코드를 테스트하는 코드인데


interface HttpInterfaceRepository : JpaRepository<HttpInterface, Long>{

    fun countAllByCreatedDateTimeBetween(start: LocalDateTime, end: LocalDateTime): Long

}

제가 이런식으로 HttpInterfaceRepoistory에 사용자 정의 메서드이름을 잘못 설정했어서

테스트 코드 실행중에 오류가 발생하여

image.png

이런식으로 실행이 안되었습니다.

HttpInterfaceRepository와 관려 없는 코드 같은데 왜 오류가 발생하는 건가요?

그리고 저 오류를 발견해서 HttpInterfaceRepository 를 수정하고 실행을 하니 정상적으로 실행은 되었는데

image.png

이 경고가 뜹니다 이건 어떤건가요?

프로젝트 리포지토리 테스트가 계속 실패하는데 왜 그런건가요?
https://drive.google.com/file/d/1s2JngsdGhN_iOUf6llkkcUwwISIuCTUp/view?usp=sharing

구글 드라이브에 소스코드 압축해서 업로드 했습니다

 

답변 2

0

정보근님의 프로필 이미지
정보근
지식공유자

안녕하세요 정보근입니다:)

 

질문 내용을 보면, 데이터베이스 테이블(엔티티)에는 컬럼명을 "createDateTime"으로 하고,

 

리포지토리 메소드 이름은 countAllBy"CreatedDateTime"Between으로 하셨는데요.

 

저희 프로젝트에서는 스프링 데이터 JPA를 사용하고 있고,

countAllByCreatedDateTime은 NamedQuery, 또는 QueryMethod라고 부릅니다.

 

구체적인 코드가 없는,

즉 클래스가 아닌 인터페이스임에도 해당 메소드가 기능을 수행하는 이유는

스프링 데이터 JPA에서 JpaRepository를 상속한 인터페이스를 찾아 정의된 메소드명을 분석하고,

규칙에 맞게 JPQL, 즉 실제로 데이터를 가져올 수 있는 쿼리를 작성해주기 때문입니다.

 

그런데 메소드명으로는 CreatedDateTime이란 컬럼이 있어야 하는데,

실제 테이블에는 CreateDateTime이 있고 CreatedDateTime이 없으니

정상적이지 못한 구문이라고 생각하고 오류가 발생합니다.

 

ExperienceRepository와 관련이 없음에도 오류가 발생하는 이유는

ExperienceRepositoryTest에서는 @DataJpaTest를 쓰고 있고,

이 때 JPA와 관련된 빈들은 모두 생성이 된 뒤 테스트가 실행이 됩니다.

그런데 마찬가지로 JPA 연관 빈인 HttpInterfaceRepository를 생성하는 중에 오류가 발생했으니

정상적으로 테스트 수행 단계까지 못하는 것입니다.

 

감사합니다.

앗 감사합니다

혹시 질문글 가장 아래있는 코드 확인해주실 수 있나요?

그리고 강의영상의 코드가 강의자료, 깃허브에 올라온 코드랑 약간 다른데 강의자료에 있는 코드로 강의 진행하면 되나요?

 

 

정보근님의 프로필 이미지
정보근
지식공유자

가장 아래 있는 코드가 Warning 말씀이실까요? 드라이브 말씀이실까요?
Warning은 다음 링크 답변이 참고가 될 것 같고요.
https://www.inflearn.com/community/questions/1165771/warning-a-java-agent-has-been-loaded-dynamically-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C?srsltid=AfmBOoouT4xPf8kAoS0ZH4S3rClzUI27LGKyjCJmLcFByuTEoJv2HZbD

 

ProjectRepository가 실패하는 것 말씀이시라면,

어떻게 실패하는지 자세한 설명을 주셔야 답변이 가능합니다.

다음 링크 질문처럼 cascadeType 관련 이슈는 아닌지 확인해주셔도 좋을 것 같아요.

https://www.inflearn.com/community/questions/1400352/projectrepository-assertion-%EC%98%A4%EB%A5%98-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

 

혹시 강의 영상 코드는 어떤 부분인지 말씀해주실 수 있을까요?

확인해보도록 하겠습니다.

진행 중 문제가 있다면 깃허브 코드를 참고해주시는 것이 좋습니다!

 

감사합니다.

정보근님의 프로필 이미지
정보근
지식공유자

두번째 링크와 비슷한 이유로 테스트가 실패한 것 같아

엔티티 개발 - 연관관계 있음 강의를 빠르게 살펴보니

강의 코드에 오류가 있었네요ㅠㅠ

 

Project 엔티티의 skills 필드가 다음과 같이 설정되어야 합니다.

@OneToMany(mappedBy = "project", fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST])
var skills: MutableList<ProjectSkill> = mutableListOf()

 

이 부분 말씀하신 게 맞죠?

강의 수정을 해야겠습니다.

 

제보해주셔서 감사합니다.

앗 넵넵 감사합니닷!

 

프로젝트의 skills필드의 어노테이션 설정에 따라서 테스트코드의 성공여부가 달라지는 이유가 있나요?
그리고 cascadeType은 어떤 기능인건가요?

정보근님의 프로필 이미지
정보근
지식공유자

답변이 늦어서 죄송합니다.

제가 섹션 3 엔티티 개발 - 연관관계 있음 강의에 추가한 내용 공유드릴게요.


안녕하세요:)

강의 영상 중 오류가 있어 보충 설명 남깁니다.

Project 엔티티의 skills 필드는 아래 코드처럼 설정되어야 합니다.

@OneToMany(mappedBy = "project", fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST])
var skills: MutableList<ProjectSkill> = mutableListOf()

여기서 cascade에 대해서 말씀드리자면 영속성의 '전이'와 관련된 설정입니다.

JPA 엔티티를 영속성 컨텍스트에 persist, detach 등 상태를 바꾸는 작업을 할 때

해당 엔티티와 연관관계를 갖는 엔티티 또한 동일하게 상태를 바꿀지 말지를 설정하는 것인데요.

예시로 설명을 드리겠습니다.

cascade를 별도로 지정하지 않을 경우,

Project 엔티티를 생성하고 save() 메소드를 호출해 영속성 컨텍스트에 persist 한다고 해도

엔티티에 포함된 skills, 즉 ProjectSkills 엔티티들은 persist 되지 않습니다.

별도로 projectSkillsRepoistory.save()를 호출한다거나 하는 식으로 처리해줘야 합니다.

하지만 CascadeType.PERSIST를 지정해주면,

Project 엔티티만 persist 해도, 거기 포함된 skills의 엔티티들이 모두 같이 persist가 됩니다.

PERSIST 외에도 DETACH, MERGE, REMOVE, REFRESH 등의 상태를 적용할 수 있습니다.

감사합니다.

0

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

양치잘하기님의 질문에 답해드리겠습니다.

사용자 정의 메서드 이름 오류

우선, 첫 번째 오류에 대한 설명을 드리겠습니다. HttpInterfaceRepository에서 countAllByCreatedDateTimeBetween 메서드를 정의하셨는데, 여기서 createdDateTime이라는 필드를 HttpInterface 엔티티에서 찾지 못해 발생한 오류입니다. 이 문제는 메서드 이름에 대응하는 필드가 엔티티에 존재하지 않을 때 흔히 발생합니다.

오류 메시지에서 No property 'createdDateTime' found for type 'HttpInterface'; Did you mean 'createDateTime'라는 안내가 있는데, 이 경우 엔티티의 해당 필드 이름을 다시 확인하는 것이 필요합니다. 필드 이름이 createDateTime인지 확인하시고, 맞다면 메서드 이름도 일치시켜야 합니다.

경고 메시지 관련

두 번째로, 경고 메시지에 대한 설명입니다. 대부분의 경우, 이러한 경고는 JVM에서 특정한 설정이 필요할 때 출력되는 메시지입니다. 예를 들어:

  • -XX:+EnableDynamicAgentLoading 옵션은 Java 에이전트를 동적으로 로드할 수 있게 하는 설정입니다.
  • -Djdk.instrument.traceUsage는 서비스 가능 도구 사용을 추적하는 데 사용되는 JVM 옵션입니다.
  • 이외에 Java 플랫폼 업그레이드 시 나오는 일반적인 정보 및 경고가 포함되어 있을 수 있습니다.

보통 경고 메시지는 개발에 치명적인 영향을 주지는 않기 때문에 무시할 수는 있지만, 필요에 따라 JVM 옵션을 추가하여 경고를 해소할 수 있습니다. 이는 프로젝트 환경 설정에 따라 상이할 수 있으니, 설정 관련 문서를 참조하거나, 개발 환경에서 필요한 경우에만 추가 조치를 고려하시면 됩니다.

이와 관련된 더 많은 정보를 원하시면, 아래의 유사 질문 답변 링크들을 참조하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

양치잘하기님의 프로필 이미지
양치잘하기

작성한 질문수

질문하기