처음에 나는 도메인에 ID값을 넣지 않았다.
넣지 않은 이유로는 많은 크루들이 사용하는 ID값이 DB에서 auto increment되는 값이기 때문이다. 이러한 방식은 데이터베이스나 시스템에서 도메인 개체를 관리하고 구별하는 데 유용하긴하다.
물론 도메인을 식별하기 위한 수단은 필요하다. 다만 그 수단이 DB의 ID값이여야하는 것은 아니다 라고 생각한다. 그래서 나는 객체별 고유한 식별자를 사용하고자 하였다. 다만 이 과정속에서 코드가 조금 복잡해졌기에 고민을 하게 되었다.
도메인이 ID값을 갖는다는 것은
장점
- 고유한 값인 ID를 통해 개체를 식별하기에 매우 유용하다.
- DB에서 자동으로 ID값이 증가하므로 따로 관리를 해줄 필요가 없다.
단점
- 결국 도메인이 db에 대해서 알고 있다.
- 요청을 받아 도메인을 생성할 때 id값이 null 로 생성된다.
와 같은 이유로 기피 하였다.
public Section(Station startStation, Station endStation, Distance distance) {
this(null, startStation,endStation,distance);
}
도메인이 ID값을 갖지 않는 다는 것은
장점
- 객체지향적으로 순수한 도메인을 작성할 수 있다.
단점
- 특정한 어떤 식별자를 사용해서 식별을 해야한다.
- 데이터 삭제를 할 경우 불편하다.
- Section과 같은 경우에 특정 section id값을 삭제하면 될 것을 식별자(line, 출발역, 시작역) 을 모두 가지고 삭제를 해야한다.
- 특정 section 이 삭제되었을 경우 어떻게 삭제를 해야할지 모른다.
- 이 식별자가 결국 어떤 방식으로든 고유하다는 것을 나타내야한다.
- DB의 UNIQUE라던지
if (!stationDao.isExistStationByName(requestStartStation.getName())) {
stationDao.insert(new StationEntity(requestStartStation.getName()));
}
결국 나는 도메인이 ID값을 갖게 하였다.
나의 리뷰어 배럴이 이렇게 말하였다. 물론 배럴의 의견만 보고 도메인에 ID값을 넣은 것은 아니다.
기술적 필요성에 의해서 DB작업이 없을 때 처럼 도메인객체 구성을 하긴 쉽지 않을거에요. 도메인은 DB에 대해 알 필요는 없지만, 실제 작업에서는 영속화하는 과정도 필요합니다. 그렇다보면 DB로 인해 도메인에 들어가게 되는 내용들도 있다고 생각합니다. 또한 순수한 도메인 객체 구성이 답은 아니라고 생각합니다.
순수한 도메인 객체를 위해서 너무 힘을 쓰다보니 이를 위해 변환, 쿼리 문이 더 추가되는 경우가 발생하였다. 절대 DB에 대해 알면 안돼! 라고 생각할 순 있지만 현실적으로 영속화하는 과정에서 도메인에 DB에 대한 정보가 반영될 수 있다고 생각하게 되었다.
사실 외부 식별자(name)을 사용하는 경우도 있을 수는 있겠지만 복잡해질 수 있고 관리하기가 어렵다.
Section과 같은 경우에는 식별자로써 line, startStation, endStation 을 사용해야한다. 다만 ID값을 사용한다면 이를 단순하게 ID로써 판단할 수 있다.
그래서 DB의 Autoincrement되는 값을 ID로 사용하게 되었다.
기술적 필요성에 의해 DB를 고려할 수 도 있다고 생각하게 되었고, 나는 결국 DB가 ID값을 갖게 하였다.
'코코코딩공부 > Spring' 카테고리의 다른 글
orElse 에서 생긴 문제 해결 (0) | 2023.07.30 |
---|---|
Repository 사용기 (0) | 2023.06.07 |
[Spring] Argument Resolver 내부 구경 하기 (0) | 2023.04.30 |
[Spring] Dispatcher Servlet이란 ? & 미션 에서 찾아보기 (0) | 2023.04.30 |
[Spring] Servlet 이란 ? (0) | 2023.04.30 |