Skip to content

[Chapter 2. 옵저버 패턴] push 방식과 pull 방식 #4

Description

@eunaJung01

Chapter 2. 옵저버 패턴에서 옵저버들이 데이터를 받아볼 수 있는 방식 두 가지에 대한 설명 중,
‘subject의 상태는 계속 바뀌는 것을 가정하기 때문에 해당 상태에 대한 getter 사용은 notify() 내부에서만 하는 것이 권장되며,
이러한 측면에서 볼 때 pull 방식이 아닌, data를 subject에서 push 하는 방식이 나을 수도 있다’고 작성하신 부분에서
제 의견을 공유하고, 정우님의 의견도 더 자세하게 들어보고 싶어서 이슈를 작성하게 되었습니다 🥰


notify()는 주제의 상태가 변경될 때마다 호출되는 것이므로, 두 방식은 다음과 같은 과정으로 진행한다고 이해했습니다.


만약 주제가 필드로 int status = 1라는 상태를 가지고 있고
notify()가 호출된다면 옵저버는 주제의 status을 곧바로 출력하는 상황을 가정해보면,


[ push 방식 ]

  1. status = 2로 변경되어 주제에서 notify()가 호출되어 status = 2가 옵저버에게 보내짐 (현재 status의 값은 2)
  2. 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우,
    다시 한번 notify()가 호출되어 status = 3가 옵저버에게 보내짐 (현재 status의 값은 3)
  3. 따라서 옵저버는 status = 2를 출력, 그 다음으로 status = 3도 출력

[ pull 방식 ]

  1. status = 2로 변경되어 주제에서 notify()가 호출됨 (현재 status의 값은 2)
  2. 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우, 다시 한번 notify()가 호출됨 (현재 status의 값은 3)
  3. 옵저버는 getter를 통해서 주제의 status 값을 받아오기 때문에 status = 3을 두 번 출력

따라서 ‘주제의 상태는 계속 바뀌는 것을 가정하기 때문에’ 주제의 갱신된 값을 올바르게 가져오기 위해서는 push 방식보단 pull 방식이 더 나을 것 같다는 생각을 하였습니다.

여기에 대해서는 어떤 의견을 갖고 계시는지 궁금하며, 이와 비슷한 멀티스레드 환경에서도 똑같을지 궁금합니다!

Activity

  1. changed the title [-][Chaper 2. 옵저버 패턴] push 방식과 pull 방식[/-] [+][Chapter 2. 옵저버 패턴] push 방식과 pull 방식[/+] on Jan 5, 2023
  2. jung-woo-kim commented on Jan 6, 2023

    @jung-woo-kim
    Contributor

    일단 위 예시는 멀티스레드 환경에서 말씀하신 것 같아 그 관점에서 공식문서를 보고 제 의견을 정리해보고자 합니다.

    자바 공식 문서를 보니, 위에 말씀해주신 것처럼 'Observable의 notify는 순서를 보장할 수 없으며, 상태 변경은 1:1로 일치하지 않는다.'는 말이 있었습니다.

    이 말은 즉슨, 위에 말씀해주신 것과 같은 문제가 발생할 수 있기 때문에 이를 방지하려면 멀티스레드 환경에서는 push 방법이 더 좋은 방법이 될 수 있을 것 같습니다.

    덕분에 더 시야를 확장해서 생각하게 될 수 있었습니다. 감사합니다 🙂

    혹시 추가적인 의견 있으시면 코멘트 남겨주시고 아니라면 close 부탁드려요!

  3. added
    documentationImprovements or additions to documentation
    questionFurther information is requested
    discussiondiscussion for topic
    on Jan 7, 2023
  4. eunaJung01 commented on Jan 10, 2023

    @eunaJung01
    MemberAuthor

    아앗 제가 싱글스레드와 멀티스레드에 대한 구분을 잘못하고 있었습니다 ㅎㅅㅎ..
    자바에서 Observable 인터페이스가 지원되었으나, 이 이유로 자바 9 이후로는 더 이상 사용되지 않는다는 것은 처음 알았네요 😮
    덕분에 더욱 많은 것들을 알아갈 수 있었습니다!! 답변 정말 감사합니다 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussiondiscussion for topicdocumentationImprovements or additions to documentationquestionFurther information is requested

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions