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

궁금이님의 프로필 이미지

작성한 질문수

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

JPA와 DB 설정, 동작확인

커맨드성

해결된 질문

작성

·

318

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
선생님들.

8:20 이 때 쿼리랑 커맨드 성을 분리하라. 이 말이

트랜잭션 때문에 그런건가요?

 

그러니까 쿼리는 날리면 바로 flush가 되기 때문에 상관없는데, 말하시는 사이드이펙트라는게

그 영속성 컨텍스트 안에 있다가 트랜잭션 commit 시점에 모든 것이 다 DB로 날라가니까,

Member를 직접 주게 되면 주소를 주는 것 이기때문에, 영속성 컨텍스트에도 영향을 미쳐, 뭔가 저렇게 save 해놓고 그 member를 직접 다루게 되면 save하는 그 값에도 영향이 있을 수 있기 때문에 그런건가요?

답변 1

1

안녕하세요. 궁금이님, 공식 서포터즈 y2gcoder입니다.

저도 궁금이님의 질문을 보고 생각해봤습니다. 사이드 이펙트는 결국 의도와 다르게 동작하는 것을 의미하기 때문에 여기서는 개발자의 의도와 다르게 작동할 수도 있는 부분도 사이드 이펙트에 포함된다고 생각합니다.

그런 의미에서 만약 해당 save로 받은 Member 객체를 트랜잭션이 걸려있지 않은 서비스에서 사용했을 상황을 생각해봤습니다. 이 때 서비스 로직에서 저장해온 Member 객체의 상태값을 업데이트하려고 하면, 해당 객체의 상태는 업데이트되지만 DB에서는 반영되지 않을 것입니다. 반면에 객체 그대로가 아닌 식별자만 리턴으로 줬을 때는 개발자가 이를 인지하고 미리 상태값을 바꾼 Member 객체를 save하는 방향으로 로직을 수정할 수 있을 것 같습니다.

궁금이님께서 말씀하신 부분이랑 맥락이 비슷한 것 같습니다.

 

감사합니다.