---
# System prepended metadata

title: 순수함수로 어떻게 만들까?
tags: [tech sharing]

---

# 순수함수로 어떻게 만들까?

```jsx=
const ImageInput = ({ uploadImages, setUploadImages }) => {
   const hiddenFileInput = React.useRef(null);

   const onImageInputButtonClicked = () => {
     hiddenFileInput.current.click();
   };
   
   const onFileInputChanged = (event) => {
     const fileUploaded = event.target.files[0];
     const fileReader = new window.FileReader(); 
     
     fileReader.onloadend = (onLoadEndEvent) => {
       const imageUrl = onLoadEndEvent.target.result;
       const newFileObj = { fileUploaded, imageUrl };
       setUploadImages([...uploadImages, newFileObj]);
     };
     fileReader.readAsDataURL(fileUploaded);
   };
  //...
  
  return (
      <input
         type="file"
         accept="image/*"
         ref={hiddenFileInput}
         style={{ display: 'none' }}
         onChange={onFileInputChanged}
       />
  )
```

위와 같은 코드를 작성했다. 그런데 `onFileInputChanged` 함수는 순수함수가 아니라서 `uploadImages`가 외부에서 변경이 되면 side-effect가 생길 수도 있을 것 같다는 리뷰를 남겨주셨다. 그런데 `uploadImgaes`는 반드시 함수 내에서 사용해야하는 값이었다. 순수함수로 만들기 위해서 `uploadImgaes`를 매개변수로 전달을 해줘야 했다.

하지만 `onFileInputChanged`는 이벤트 핸들러에서 호출이 되는 것이기 때문에 직접 매개변수로 `uploadImgaes`를 전달해 줄 수 없었다. 따라서 완전히 모두 다 순수 함수로 만드는 것은 불가능했다.

```javascript=
onChange={(event) => onFileInputChanged(event, uploadImages)}
```

결국 위와 같이 순수함수가 아닌 부분이 있을 수 밖에 없었는데 최대한 그 범위를 축소하는데 의미가 있는 것 같다. [함수형 자바스크립트](https://book.naver.com/bookdb/book_detail.nhn?bid=13242075)의 1~2장 부분에 최대한 이 범위를 축소하는 방법이 나와있다고 한석님께서 말씀해주셔서 나중에 읽어보면 좋을 것 같다.

###### tags: `tech sharing`