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

정성훈님의 프로필 이미지

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

도메인과 영속성 객체 구분하기

도메인 객체를 불변으로 만들어야 하는가가 궁금합니다.

23.07.15 00:31 작성

·

1.2K

2

Post를 수정한다면 새로 만들어지는 것이 아닌 존재하는 객체를 변경하는게 조금 더 잘 읽힐것 같은데 불변객체로 만드신 이유가 궁금합니다. 혹시 실무에서도 도메인 엔티티에 대해 불변으로 사용하나요?

답변 2

2

김우근님의 프로필 이미지
김우근
지식공유자

2023. 08. 22. 02:53

안녕하세요. 답변이 늦었습니다.

많은 분이 실무의 사용 사례를 물어보는 것을 보니 '약간 막막하니 정답을 원하시는 것 같다'는 생각이 듭니다. 그런데 애석하게도 실무자들이라고 항상 정답을 고르는 것이 아니라는 점을 먼저 이야기해 드립니다. 😭 실무자들도 많은 실수를 합니다.

그래서 답변을 하자면 도메인 모델을 불변으로 만들지, 아닐지 선택하는 것은 오롯이 프로젝트 설계자의 마음이라는 것을 알려 드립니다. 이 객체가 신뢰할 수 있는 객체가 되길 원한다면 불변으로 만드는 것이고, 그것이 아니라면 가변 객체로 만들어도 됩니다. 더 확실하게는 프로젝트의 성격을 따라가는 것이 맞습니다.

말씀하신 대로 토이 프로젝트 상황에서는 Post를 가변 객체로 두는 것이 더 나을 수 있습니다. 왜냐하면 토이 프로젝트는 너무나 간단해서 객체의 신뢰성이 의심 가는 상황이 존재하지 않기 때문입니다. 그럼에도 Post를 불변 객체로 만들어 예시를 보여드린 이유는 단순히 ‘이렇게도 할 수 있고 불변을 추구하는 상황에서는 이렇게 하면 된다’라는 것을 보여드리기 위함이었습니다.

불변을 추구하는 것은 시스템의 복잡도를 낮춰줍니다. 왜 불변이 시스템의 복잡도를 낮춰주는 이유는 소프트웨어 중 일부를 예측할 수 있고 신뢰할 수 있게 만들 수 있기 때문입니다. 예를 들어 병렬 프로그래밍 상황이라면 같은 객체를 참조하고 있더라도 내부에 변수가 있다면, 이 값이 언제 어떤 값으로 변경될지 예상할 수 없습니다. 그런데 그 값이 불변 값이라면 이야기가 다릅니다. 항상 같은 값이라고 믿을 수 있게 되니 결과적으로 프로그램의 동작도 예측할 수 있게 되는 겁니다. (기타 다른 불변의 장점에 대해선 AI가 잘 답변해 줬네요)

문득 개인적으로 불변을 추구할 때 얻을 수 있는 장점은 체감하시기 전까지 납득하기 어려울 수 있다는 생각도 듭니다. 저도 돌이켜보면 불변의 중요성을 체감하기 전까지 중요성을 설파하는 여러 자료를 봤었습니다. 그런데 크게 와 닿지 못했던 것 같습니다. 지식으로만 알고 있다가 이를 실제로 이해하기 시작한 것은 시스템이 발전하면서 규모가 커지면서부터였습니다. (맞아보고 정신 차렸다고 보시면 됩니다.)

그래서 정리해 드리면 아래와 같습니다.

  • 도메인 객체라서 불변으로 만든 것은 아닙니다.

  • 실무에서도 정답은 없습니다. 어느 조직은 도메인 객체를 불변으로 만들고 어느 조직은 가변으로 둡니다.

  • 불변이든 가변이든 원하시는 대로 개발하시면 됩니다.

잘 납득이 가질 않는다면 일단 가변으로 개발하시고 시스템의 규모가 커지면, 그때 가서 불변에 관해 다시 생각해 보시길 바랍니다.

좋은 하루 되시길 바랍니다! :)

정성훈님의 프로필 이미지
정성훈
질문자

2023. 08. 22. 03:27

역시 얻어 맞아보는게 정답이겠다라는 생각이 드네요 좋은 답변 감사합니다!

eomukeomukeomuk님의 프로필 이미지

2023. 09. 18. 19:57

늦더라도 이렇게 답변해주셔서 저 역시 많은 인사이트를 얻고 있습니다. 질문해주신 성훈님, 답변해주신 우근님 모두 감사드립니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 07. 16. 00:36

안녕하세요, 인프런 AI 인턴이에요. 도메인 객체를 불변으로 만들어야 하는 이유와 실무에서의 활용에 대해 알려드릴게요.

도메인 객체를 불변으로 만드는 이유는 다양한 이점이 있습니다.

첫째, 불변 객체는 선언 후 상태를 변경할 수 없기 때문에 객체의 일관성을 보장할 수 있습니다. 이로 인해 코드의 신뢰성과 안정성을 높일 수 있습니다.

둘째, 불변 객체는 스레드 안전(thread-safe)하게 동작할 수 있습니다. 여러 스레드에서 동시에 접근할 경우 상태가 변경되지 않기 때문에 동기화 처리를 할 필요가 없습니다.

셋째, 불변 객체는 복제나 공유 등의 문제를 방지할 수 있습니다. 다른 객체로부터 불변 객체를 복제해도 원본 객체에 영향을 주지 않으며, 객체를 공유할 때도 안전합니다.

실무에서도 도메인 엔티티를 불변으로 사용하는 경우가 많습니다. 도메인은 비지니스 로직을 담고 있는 핵심적인 부분으로 변하지 않는 것이 중요하기 때문입니다. 변경이 필요한 경우에는 새로운 객체를 생성하는 방식으로 처리하는 것이 일반적입니다.

하지만, 모든 상황에서 불변 객체가 적합한 것은 아닙니다. 상태를 변경하는 것이 필수적이거나 성능상 이슈가 있을 경우에는 가변 객체를 사용하는 경우도 있습니다. 도메인의 성격과 요구사항을 고려하여 적절한 선택이 필요합니다.

도움이 되셨길 바라며, 추가로 궁금한 점이 있으면 언제든지 문의해주세요. 좋은 하루 되세요!