[트러블 슈팅] 도메인 클래스 중복 사용의 일관성을 어떻게 유지할까?

#트러블 슈팅

수업공유시스템의 스프링 배치 프로젝트는 학과 데이터를 직접 주입하는 프로젝트로, 도메인(Entity) 클래스를 기반으로 데이터베이스에 주입하는 Data Jpa 방식으로 write 하고 있었다. 하지만, 프로젝트가 서로 분리되어 개발되고나니 도메인 클래스를 변경하면 코드 불일치가 발생했다.

서로 독립된 프로젝트 단위로 가지고 있었고, 시스템의 중심이라고 할 수 있는 Domain이 가져야할 구조와 로직들을 동일하게 보장하기 위한 메커니즘이 없었다.

image

개발자가 동일한 Domain을 사용한다면 Batch 프로젝트들이 복붙을 진행하며 개발하게되는 상황이다.

멀티 모듈 프로젝트는 기존의 단일 프로젝트를 프로젝트 안의 모듈 구조로 가질 수 있도록 한다.

image

따라서 멀티 모듈 구조로 진행하게 된다면 위와 같이 애플리케이션 프로젝트에서 Domain을 분리시켜야 하는 것이다. 하지만, 애플리케이션 프로젝트에서 Domain 을 따로 분리할 만큼, Batch 프로젝트들과 구조를 가져가야할까? 라는 생각이 들었다. 왜냐하면 Domain 을 분리하게되면 그만큼 애플리케이션 프로젝트 내에 로직에서도 변경이 당장은 변경이 일어나 작업이 발생하기 때문이다. 또한, 현재 배치 프로젝트들마다 여러 Domain을 사용하는 것이 아니라 데이터와 연관있는 Domain을 최대 1-2개 정도만 사용하고 있다. 그래서 Domain 전체가 필요한 것이 아니었다. 그래서 중간의 타협점을 찾아 나섰다.

image

한 프로젝트 단위내에서 모듈간의 주입이 가능하니 gradle로 project 종속성을 주입하고, @EntityScan 을 통해서 직접 수동으로 스캔 하였다. 이렇게 진행하니 Batch 모듈내에 Domain을 따로 두지 않고 애플리케이션 프로젝트에서 필요한 Domain만 스캔해서 사용 하였다.

├── batch-lecture
├── batch-enrollment
├── batch-student
├── application

여러 프로젝트 모듈들을 하나의 프로젝트로 관리할 수 있게되니, 코드를 찾아가는데 시간도 줄어들고 중복해서 사용하는 로직들간의 관리도 수월해졌다. 이제 더이상 복붙을 하지 않아도된다.

Reference

https://techblog.woowahan.com/2637/

https://github.com/anandgaur22/MultiModuleTest