다른 사람의 코드를 통해 인사이트 확장하기 1

byeol·2024년 1월 6일

주기적으로 다른 사람의 잘 짜여진 코드를 보고 인사이트를 확장해야 겠다는 생각을 하며
이력,써라는 다른 분의 프로젝트를 분석해보려고 한다.

도메인과 Entity 분리


현재 이력,써의 도메인과 엔티티 UML을 그려보았다. ( 노란색이 Entity이다.)
왜 분리하였을까 이유를 생각해보았다.

  • DB에 의존적인 Entity와 비즈니스 로직을 구현하는 도메인을 분리하여 좀 더 순수 Java 코드에 가깝고 하나의 역할만 갖도록 분리하신 거 같았다.
  • 또한 RDBMS의 칼럼 변경은 잘 일어나지 않는다고 생각한다. 왜냐하면 RDBMS는 새로운 칼럼을 추가할 때 비용이 많이 발생하기 때문이다. 따라서 프로젝트에서 RDBMS를 사용한다고 결정했을 때는 이러한 점을 고려하였다고 생각한다.
    • 즉 잘 바뀌는 것과 바뀌지 않는 것을 분리하여 유지보수성을 좋게 만들기 위함이라고 생각한다. 사용자의 요구사항은 자주 바뀌지만 RDBMS의 칼럼은 자주 바뀌지 않는다.

그러나 여전히 도메인이 엔티티를 알고 있는 상황이어서 이에 대해서 나라면 어떻게 분리할 수 있을까 고민하게 되었다.

먼저 방향을 바꿔야 겠다고 생각했다. 위와 같이 방향을 바꿔야 하는 것이다.

그래서 만약 모두의 텃밭 프로젝트에서 나는 어떻게 바꿀 수 있을까 고민하게 되었다.

Domain에서 Entity로의 변환은 Entity의 toGarden이라는 mapper를 통해 일어나도록 하는 것이다. 그리고 이 mapper 함수를 Repository에서 호출하도록 하여 Domain이 Entity를 알지 못하도록 바꿔줄 수 있을 거 같다.

내 프로젝트에 적용해 본 결과

두 가지 불편한 점이 존재했다.

  • 변경 감지가 되지 않아서 save()를 호출해야 한다.
    save()의 경우 식별자가 null이 아닌 경우 select를 통해서 새로운 레코드인지 확인하고 새롭지 않으면 udpate가 발생한다.

  • 마지막으로 객체 참조인 경우인 경우 엔티티를 직접 저장해야 하기 때문에 RepositoryImpl에 객체 참조가 발생하는 엔티티의 Jpa Repository가 필요하다.

    @Repository
    public class GardenImageRepositoryImpl implements GardenImageRepository{
    
       private final GardenImageJpaRepository gardenImageJpaRepository;
       private final GardenJpaRepository gardenJpaRepository;
    
       public GardenImageRepositoryImpl(GardenImageJpaRepository gardenImageJpaRepository, GardenJpaRepository gardenJpaRepository) {
           this.gardenImageJpaRepository = gardenImageJpaRepository;
           this.gardenJpaRepository = gardenJpaRepository;
       }
    
       @Override
       public GardenImage save(GardenImage gardenImage) {
           return gardenImageJpaRepository.save(GardenImageEntity.from(gardenImage,
                   gardenJpaRepository.getById(gardenImage.getGarden().getGardenId()))).toModel();
       }

하지만
엔티티는 잘 바뀌지 않고 DB에 의존적이지만
도메인은 사용자의 요구사항에 따라 쉽게 바뀌는 비즈니스 로직을 수행하는 객체라는 점에서
객체지향적인 코드가 완성되었다.
또한 변경이 전파되지 않는다는 점에서 도메인과 엔티티의 분리하는 방법도 좋은 거 같다.

profile
꾸준하게 Ready, Set, Go!

4개의 댓글

comment-user-thumbnail
2024년 4월 15일

안녕하세요 별(byeol)님!
회사에서도 완전히 새로운 코드를 짤 일보다 진행중이던 프로젝트에 합류하게 될 일이 많아서
기존의 코드를 잘 읽고 이해하는 것도 중요한 능력이라고 생각하는데요. 이렇게 다른 프로젝트를 분석하고 더 나아가 진행중인 프로젝트에 적용까지 하신 것이 성장에 큰 도움이 될 것 같네요! 자극 받고 가요 ..ㅎㅎ

별건 아니지만 글 중간에 "그래서 만약 모두의 텃밭 프로젝트에서 나는 어떻게 바꿀 수 있을까 고민하게 되었다." 아랫부분 사진이 안떠서 이 부분 수정해주시면 더 많은 분들이 좋은 글 읽는데에 도움이 될 것 같아요!

1개의 답글