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

현재 이력,써의 도메인과 엔티티 UML을 그려보았다. ( 노란색이 Entity이다.)
왜 분리하였을까 이유를 생각해보았다.
그러나 여전히 도메인이 엔티티를 알고 있는 상황이어서 이에 대해서 나라면 어떻게 분리할 수 있을까 고민하게 되었다.

먼저 방향을 바꿔야 겠다고 생각했다. 위와 같이 방향을 바꿔야 하는 것이다.
그래서 만약 모두의 텃밭 프로젝트에서 나는 어떻게 바꿀 수 있을까 고민하게 되었다.


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에 의존적이지만
도메인은 사용자의 요구사항에 따라 쉽게 바뀌는 비즈니스 로직을 수행하는 객체라는 점에서
객체지향적인 코드가 완성되었다.
또한 변경이 전파되지 않는다는 점에서 도메인과 엔티티의 분리하는 방법도 좋은 거 같다.
안녕하세요 별(byeol)님!
회사에서도 완전히 새로운 코드를 짤 일보다 진행중이던 프로젝트에 합류하게 될 일이 많아서
기존의 코드를 잘 읽고 이해하는 것도 중요한 능력이라고 생각하는데요. 이렇게 다른 프로젝트를 분석하고 더 나아가 진행중인 프로젝트에 적용까지 하신 것이 성장에 큰 도움이 될 것 같네요! 자극 받고 가요 ..ㅎㅎ
별건 아니지만 글 중간에 "그래서 만약 모두의 텃밭 프로젝트에서 나는 어떻게 바꿀 수 있을까 고민하게 되었다." 아랫부분 사진이 안떠서 이 부분 수정해주시면 더 많은 분들이 좋은 글 읽는데에 도움이 될 것 같아요!