• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

비즈니스 로직의 처리 방식의 차이점 문의

22.01.15 18:47 작성 조회수 102

1

안녕하세요, 먼저 강의 잘 듣고 있습니다.

금일 진행중에...
뭔가 좀 정리가 안되는 부분이 있어서 한번 문의드립니다.

멤버가 가입하는 저장 처리를 할 경우,
강사님이 구현하신 코드는 서비스에서 도메인객체에서 처리하게끔 구현하셨는데...

- StudyService.java
public void addMember(Study study, Account account) {
    study.addMember(account);
}

- Study.java
public void addMember(Account account) {  
    this.getMembers().add(account);
}

저 같은 경우에는 StudyService 에서 바로 처리하도록 했는데...
public void join(Account account, Study study) { 
    Optional<Account> byId = accountRepository .findById(account.getId());
    byId.ifPresent(a -> study.getMembers().add(a)); 
}

의문 1) Account는 detach이기때문에 persistence상태로의 조회로 한번 더 안해도 되는건가요?

2) 심플하게 간다면 Service 코드에서 직접 study.getMembers().add(account); 로 해도 될텐데, 왜 도메인 객체로 넘겨서 가입(저장) 처리를 하셨는지가 궁금합니다.

3) 2번과 같은 연장선상의 질문이긴 합니다만 서비스에서 직접 처리한 (예: study.setPath(newPath);)와의 차이가 있는것인가요?

디자인 패턴의 이슈인지, 아님 다른 효율성 들을 위한 고려인지...궁금해서 문의드립니다.

답변 1

답변을 작성해보세요.

0

안녕하세요.

1) 컨트롤러로 코드가 들어오기 전부터 OSIV 필터 때문에 열려있던 영속성 컨텍스트에 컨트롤러에서 조회했던 study가 이미 persistent 상태로 들어가 있었고, 그걸 서비스쪽에서 그대로 전달 받았으니 여전히 study는 이미 Persistent 상태입니다. 그 상태에서 서비스에 걸려있는 트랜잭션 내부에서 study 객체에 변경이 있었으니 트랜잭션이 끝나면서 변경 사항을 DB에 반영해주고 끝납니다. 그래서 insert 쿼리도 볼 수 있는 것이죠.

2, 3) 이건 취향입니다만, 가능하면 캡슐화를 하고 메시지 체인을 길게 가져가지 않도록 노력한것이지 기능상 차이는 없습니다.