작성
·
208
0
코드 예시로 보여주신 DefaultTourBuilder를 보면
멤버 변수로 title, nights, days, startDate 등의 값을 가지고 있는데요.
만약 멀티 스레드 환경이라고 생각했을 때 사용자의 요청이 물려 들어왔을 경우,
사용자가 의도하지 않은 값을 출력하게 될 수도 있겠다고 생각 했습니다.
( getPlan() 을 하기 전에 같은 Builder로 다른 사용자가 멤버 변수를 바꾼 경우 )
그래서 이를 방지하기 위해서는
사용자 요청마다 Builder를 new 해서 별도의 인스턴스로 생성하는 것 밖에 없을 것 같은데
Builder가 인스턴스를 만들어 주는 역할을 하다보니
Builder 자체를 여러개 만든다는게 좀 의아하게 와닿습니다..
실제 현장에서 builder 패턴을 사용할 때는
Director를 사용하신 것과 같이 설정이 정형화된 인스턴스를 만드는 경우에만 주로 사용하는 편인가요???
혹시 Builder는 하나만 만드는 채로 멀티 스레드 환경에 대비해 코드를 작성하는 방법이 있을까요???
답변 1
1
안녕하세요. 제가 보여드린 빌더는 일반 클래스라서 말씀하신대로 멀티쓰레드 환경에서 공유해서 사용한다면 문제가 발생할 수 있습니다. 그래서 쓰레드마다 new로 빌더를 새로 만들어 씁니다 (이게 가장 일반적인 사용법일 겁니다.)
디렉터는 빌더 패턴에 꼭 필요한 건 아니고 빌더를 쓰다보니 자주 사용하는 코드가 발생했을 때 중복을 줄이는 용도로 사용하는 거라서 디렉터는 빌더 패턴을 보완하는 요소라 생각하셔도 좋을 것 같습니다.
글쎄요. 빌더 인스턴스 하나를 여러 쓰레드에서 공유하면서 쓰레드 안전하게 만들기는 어려울 것 같습니다. 빌더 자체가 가볍고, 만드는데 오래 걸리는 인스턴스도 아니기 때문에 각 스레드 만다 만들어 쓰는 것을 불편하게 생각하시지 않아도 될 것 같습니다.
답변 감사드립니다!