안녕하세요!
이번 과제를 진행하면서 왜 IOStream을 빈으로 등록하면 안되는지 조사해보라는 피드백을 받았습니다.

그래서 왜 IOStream을 빈으로 등록하면 안되는지에 대해 이해한 바를 바탕으로 작성해보겠습니다.
틀린 점, 추가할 점이 있다면 지적부탁드립니다!

IOStream을 빈으로 등록하면 안되는 이유
과제를 하면서 IOStream을 빈으로 등록하면서 했던 생각은, 나중에 인풋 아웃풋 스트림이 바뀔 수 있으니, 특정 IOStream에 의존하지 말고 주입받도록 하자! 라고 생각했습니다.
하지만 일반적으로 빈으로 등록한다는 것은,
- 싱글톤 스코프로 등록하여 IOStream을 싱글톤으로 관리한다.
- 즉, IOStream을 주입받는 객체가 여럿있다면, 하나의 IOStream 인스턴스를 공유하여 사용한다.
는 것입니다.
문제가 되는 부분은 IOStream을 공유하여 사용한다. 인 것 같습니다.
InputStream

IOStream은 그림과 같이 byte, 문자열, File 등 데이터를 입출력하는 통로라고 할 수 있습니다.
대표적으로
InputStream
을 통해 데이터를 읽을 수 있습니다.InputStream
은 공식문서에 따르면This abstract class is the superclass of all classes representing an input stream of bytes. Applications that need to define a subclass of InputStream must always provide a method that returns the next byte of input.
InputStream
은 representing an input stream of bytes이고, stream은 단방향으로 흘러간다는 뜻을 내포하고 있습니다.그리고 읽었던 데이터의 다음 byte를 제공하도록 되어있습니다.
그래서 일반적으로는 한번 읽은 데이터를 다시 읽을 수 없습니다. (mark(), reset()하는 방법은 제외합니다.)
그렇다면 만약에 저 InputStream 통로를 여러명이서 공유하고, 데이터를 각자 나눠가지게 된다면 어떻게 될까요?
예를 들어, InputStream에 Byte Stream {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}이 있고,
같은 통로인 InputStream을 공유하는 객체 A, B가 있습니다.
그리고 InputStream에 대해 번갈아가면서 read() 하면 A는 1,3,5,7,9 B는 2,4,6,8,10
이렇게 두 객체가 하나의 인풋스트림에 번갈아가면서 접근하게 되면 데이터는 깨지고 말겠죠?
비유하자면, 글자를 읽으면 사라지는 책이 있고, 그 책을 사람들이 돌아가면서 읽으면 아무도 책의 내용을 이해할 수 없는 것입니다.
OutputStream도 공유해서 사용한다면 비슷한 문제가 생길 것이라 생각합니다.
마찬가지로 1개의 IOStream을 multi-Thread환경에서 Concurrent로 공유하여 사용하게 되면 유사한 문제가 발생합니다.
추가할 내용) close()하면 시스템 자원을 반환하므로 IOStream을 재사용할 수 없다.
결론 - IOStream을 공유해서 사용하면 안 된다.
따라서, IOStream은 공유해서 사용하면 안 되고, 필요할 때 각자 생성해서 사용하고 닫는 것이 좋겠습니다.