Skip to content

이호석 3주차 java was(2) 학습일지

이호석 edited this page Jul 22, 2024 · 4 revisions

BufferedOutputStream 사용 시 유의할 부분

HttpResponse에서 OutputStream으로 응답 데이터를 쏴줄 때 BufferedOutputStream을 사용하여 지속해서 systemctl을 호출하지 않고 버퍼링을 통해 한꺼번에 전송하는 방식을 사용했습니다.

BufferedOutputStream의 버퍼링 동작 방식이 궁금하여 내부코드를 살펴보던 중 다음과 같은 주석을 발견할 수 있었습니다!

스크린샷 2024-07-10 오전 11 27 37

지정된 바이트 배열에서 offset 값인 off 변수부터 시작해 len 크기의 바이트를 출력 스트림에 씁니다. 지정된 배열의 바이트를 BufferedOutputStream 버퍼에 저장하고 필요에 따라 버퍼를 기본 출력 스트림으로 플러시를 합니다. 또한 쓰기 요청을 한 바이트의 크기가 현재 스트림의 남은 버퍼보다 크다면 이때는 기존 버퍼를 플러시하고 인자로 받은 바이트들을 기본 출력 스트림에 직접 writing 합니다.

즉, 버퍼의 크기가 현재 바이트들을 담기에 공간이 충분하지 않을 경우 기존에 담겨있던 버퍼를 플러시하고, 지금 기본 출력 스트림(여기서는 SocketOutpuStream)에 직접 write를 하게 됩니다. 위 주석에서는 이렇게 동작하는 이유를 중복된 BufferedOutputStream이 불필요하게 데이터를 복사하지 않기 위한 동작이라고 설명하고 있습니다. 즉, A스트림 위에 BufferedOutputStream인 B스트림이 있을 때 B스트림의 버퍼보다 큰 데이터를 입력받으면 굳이 버퍼링 -> 플러시 작업을 하지 않고, A스트림에 직접 데이터를 write하겠다는 의미가 됩니다.

단순하게 BufferedOutputStream을 사용하면 버퍼를 이용하므로 훨씬 빠르겠다고 생각하고 사용했지만, 적절한 버퍼 크기를 설정해 주는 것도 중요한 고려 사항이 될 수 있다는 걸 조금은 알게 되었습니다!

✅ WAS, Web Server의 차이점

왜 멀티 프로세스보다 멀티 스레드가 더 적은 비용이 들고, 성능이 좋다고 말할까?

TODO!!

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally