• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

영속성 객체에 아이디를 포함한 생성자

23.09.12 23:32 작성 23.09.12 23:42 수정 조회수 338

0

안녕하세요, 강의 잘보고 필요할떄마다 계속 보고 있습니다.

현재 강의에선 도메인 객체와 영속성 객체(Entity class)를 분리해서 사용하여서 문제가 없을 것 같은데,

보통 Entity class 에서 ID를 자동으로 생성하는 경우가 대부분이어서, 생성자를 생성 할 때, ID를 포함하지 않는 생성자를 많이 만드는 것으로 알고 있습니다.

이 때, 테스트코드는 어떻게 작성해야할까요?
소형 테스트를 작성한다면 H2 같읕 데이터베이스에서 객체를 가져오지 않는 한 아이디가 존재하지 않을텐데
아이디로 비교하지 말고 다른 값들만 비교해야할까요?
그렇다면 로직내에 findById() 같은 메서드로 객체를 불러와서 처리하는 경우가 있다면 어떻게 하시는지 궁금합니다. 객체의 아이디가 없으므로 로직내에서 아이디를 가져오거나 비교하는 경우가 있다면, NPE가 발생하여 테스트가 제대로 진행이 되지 않는 경우가 많을 것 같습니다.

다들 보통 어떻게 하시는지 궁금하여 질문 남깁니다
감사합니다

답변 2

·

답변을 작성해보세요.

1

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

제가 질문을 정확히 이해하지 못해서 답변하기 어렵네요. 질문자님의 상황을 요약하면 아래와 같은 것 같습니다.

  1. 도메인 객체와 영속성 객체를 구분하지 않음.

  2. 해당 객체를 생성할 땐 생성자에 id 값을 받지 않도록 하고 있음.

  3. 따라서 해당 객체에 id를 인위적으로 넣어준 객체를 만들 수 없음.

위 상황을 가정하고 이 경우 어떻게 문제를 해결할 수 있을까 진짜 오래 고민해 봤는데요. 특별히 방법이 없을 것 같습니다; 제 짧은 머리로는 test 소스에 리플렉션으로 id 필드를 강제로 입력할 수 있는 메서드를 만드는 정도네요.

+) 프로젝트를 어떻게 개발하고 있는지 정확히 알 수 없으나 도메인 객체와 영속성 객체를 구분하지 않는 상황에서 클린 아키텍처, 소형 테스트를 추구하게 만드는 것은 꽤 많이 어렵습니다.

연못지님의 프로필

연못지

질문자

2024.02.27

정리해주신 상황이 맞습니다
Entity class에선, ID가 포함되지 않는 생성자만 만들어서 사용하고 있었습니다. (auto increment 환경에서 임의의 ID를 넣어서 객체를 생성하는 것을 방지하기 위해)
때문에 강사님 말씀처럼 테스트 하기가 어려웠는데... 결국 ID까지 모두 포함된 생성자를 만들어서 테스트 시에 이용하는 것으로 팀 내부적으로 합의롤 보았습니다.
개인적인 욕심으론 강사님 말씀처럼 도메인 객체와 영속성 객체를 분리하여 사용하고 싶지만... 현실이 참 쉽지 않네요 항상 좋은 강의 감사드립니다. 쓰시는 책도 강사님 만족하실 수 있게 잘 집필 하시도록 기도하겠습니다
건강하시고 좋은 인사이트 주셔서 항상 감사드립니다!!

p.s 책 출간하시면 공지사항에 홍보 부탁드립니다 ( 구입하고 싶네요 )

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.13

안녕하세요, 인프런 AI 인턴이에요. 영속성 객체에 아이디를 포함하는 생성자에 대한 테스트 코드 작성에 관한 질문이시군요.

일반적으로 Entity 클래스에서 ID를 자동으로 생성하여 사용하는 경우가 많습니다. 하지만 ID를 포함하지 않는 생성자를 사용해야하는 상황이라면 테스트 코드 작성에 조금 다른 방식이 필요할 수 있습니다.

만약 ID가 없는 생성자를 사용하는 경우, 테스트 코드에서는 다르게 비교할 수 있는 다른 속성들로 객체를 생성하여 비교하면 됩니다. 예를 들어, 객체의 다른 속성들이 같다면 같은 객체로 볼 수 있습니다. 대부분의 프레임워크 또는 라이브러리에서는 객체의 동등성 비교를 위해 equals() 메서드를 사용하므로, equals() 메서드를 적절히 오버라이드하여 객체의 원하는 속성들만 비교하도록 구현할 수 있습니다.

만약 findById() 같은 메서드로 객체를 불러와서 처리해야하는 경우에는 실제 데이터베이스를 사용하는 것이 아니라 인메모리 데이터베이스(H2 등)를 사용하여 해당 객체를 테스트 환경에 구성할 수 있습니다. 따라서 NPE가 발생하지 않도록 테스트 데이터를 미리 설정해줄 수 있습니다.

결론적으로, ID가 없는 생성자를 사용하는 경우 테스트 코드에서는 다른 속성들로 객체를 생성하고 비교하거나, 인메모리 데이터베이스를 사용하여 테스트 환경을 구성하는 방식을 사용할 수 있습니다.

추가적인 질문이 있으시면 언제든지 물어보세요. 감사합니다.