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

신동훈님의 프로필 이미지
신동훈

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

변경 감지와 병합(merge)

영속성 계층의 엔티티와 도메인 계층의 엔티티를 분리하였을 때의 변경 감지와 병합에 대하여 질문드립니다.

작성

·

1.1K

1

안녕하세요!

해당 글과 관련되어 의문이 생겨 질문을 남기고 싶습니다.

 

해당 글에서 처럼 영속성 계층의 엔티티와 도메인 계층의 엔티티를 나누어 사용하는 상황에서, 데이터 변경의 처리에 관해 질문드립니다.

우선 Layer를 다음과 같이 구분하였습니다.

  • Presentation

  • Application

  • Domain

  • Infrastructure(Persistence)

 

간단하게 Member(Domain Layer)와, MemberJpaEntity(Infrastructure Layer)로 예시를 들어 의문을 가지는 상황에 대해서 말씀드리려 합니다.

 

이때 규칙을 Application Layer에서 Domain Layer만을 의존한다고 하였을 때, 다음과 같이 Member를 update하는 코드를 작성해야 한다 했을 때 아래와 같이 변경 감지를 사용할 수 없어 save를 재호출해야만 할 것 같은데, 이러한 경우 다른 방법이 있을까요?

@Service
@Transactional
public MemberService {
    
    private final MemberRepository memberRepository;
    // 생성자 생략

    public void update(Long id. String name) {
       Member member = memberRepository.findById(id);
       member.update(name);
       // 변경 감지 X -> Member는 Jpa의 @Entity가 아니기 때문
       memberRepository.save(member); // 업데이트 하기 위해서는 필요함
    }
}
@Repository
@Transactional
public MemberRepositoryImpl implement MemberRepository {

    private final MemberJpaRepository memberJpaRepository;
    // 생성자 생략

    public Member findById(Long id) {
        MemberJpaEntity entity = memberJpaRepository.findById(id).orElse(null); 
        return Mapper.toDomainEntity(entity);
    }

    public void save(Member member) {
        MemberJpaEntity entity = Mapper.toPersistenceEntity(member);
        memberJpaRepository.save(entity);
    }
}

 

 

 

 

 

 

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 신동훈님

이런 부분이 트레이드 오프라고 보시면 됩니다.

이렇게 나누게 되면 서비스계층에서 변경감지를 사용하기 어렵습니다.

감사합니다.

신동훈님의 프로필 이미지
신동훈

작성한 질문수

질문하기