2 분 소요

Modify Mode in React

ModifyMode를 찾은 이유

ERP 관련 프로젝트 진행 중 데이터 update가 필요한 부분이 있었다. update 방법을 찾던 중 수정 모드를 클릭 시 수정 모드가 활성화되어서 값을 변경할 수 있고 저장시 변경한 값이 저장되는 방식이였다. 해당 방법이 신기하여서 프로젝트 당시 그 방법을 적용하기 위해 원리를 찾아보고 적용했다.

ModifyMode란?

처음에는 ModifyMode란 React에서 공식적으로 제공하는 상태 변수나 Hooks의 종류 중 하나인줄 알았지만 그런것은 아니였다. 단지 커스텀 변수 이름으로 ModifyMode를 사용했던 것이였다.

그럼 여기서 이 수정 모드를 만들었던 방법은 일반적으로 React 애플리케이션에서 상태를 관리하는 ‘useState’를 사용하면된다. 여기서 ‘useState’는 함수형 컴포넌트에서 상태 변수를 선언하고 관리할 수 있도록 해준다.

‘useState’ 사용 시 첫 번째 요소는 상태(state)변수의 현재 값을 나타내고, 두 번째 요소는 상태 변수를 갱신할 수 있는 함수이다. 이 함수를 호출하면 첫 번째 요소의 값을 갱신할 수 있다.

먼저 코드로 보면

 function 수정 모드 실행할 함수명() {
    const [modifyMode, setModifyMode] = useState(false);        // 수정 모드 적용할 useState
    const [form, setForm] = useState(null);                     // 변경된 값 적용할 useState

다음 코드와 같이 useState를 수정 모드를 위한 modifyMode와 수정된 값을 데이터에 적용할 form을 각각 만들어줬다. 그리고 수정 모드 버튼을 누르면 수정모드가 되기위한 onClick이벤트 함수도 만들어준다.

  const onClickModifyModeHandler = () => {
        setModifyMode(true);                // 상태값을 true로 바꿔 수정 가능하게 만들어준다.
        setForm({
           변경된 값을 적용할 데이터들       // 적용할 값을 state에 저장하기 위해 설정해준다.
        });
    }

이후 새로 적용될 데이터를 정상적으로 update하기위한 onClick이벤트를 하나 더 만들어준다.

  const 수정적용할 버튼명 = () => {        
        dispatch(백단과 통신할 리듀서 함수명({	              // 리듀서 함수를 실행시키는 dispatch를 이용해 데이터 수정을 실행시킨다.
            form: form
        }));         
        alert('급여 수정이 완료되었습니다')                   // 확인 창
        navigate(`/hr-team2/salary`, { replace: true});      // 수정 후 이전 화면으로 돌아가기
    }    

이와같이 만들고 난 후 화면에 보여질 부분을 작성해주면

    return (
        <>
        { salary &&
            <div>
                <table>
                <colgroup>
                        <col width="5%" />
                        <col width="10%" />
                    </colgroup>
                    <tbody>            
                        <tr>
                            <th>남은 연차 일</th>
                            <td>
                                <input 
                                    name='vacationPay'
                                    readOnly={modifyMode ? false : true}                         // input으로 만들었기 때문에 수정모드가 아닐 때는 수정이 불가하게 readOnly를 사용해주었고
                                    style={ !modifyMode ? { backgroundColor: 'gray'} : null}     // 수정이 불가한 상태를 표시하기 위해 회색으로 표시를 해주었다.
                                    type='number'
                                    onChange={ onChangeHandler }                                 
                                    value={ form == null ? salary?.vacationPay : form?.vacationPay } // 값을 표시할 부분
                                />
                            </td>
                        </tr>
                    </tbody>                    
                </table>            
            </div>
            }
        </>

이와같이 작성을 해주면 화면상에는 수정모드가 아닐 때는 회색 처리가 되며 값 변경이 불가하지만 수정 모드를 눌렀을 때 색이 바뀌면서 값의 변경이 가능하게 된다. 이후 바꾼 값을 적용 시킬 클릭 이벤트를 활성화 시키면 설정해둔 함수가 실행되면서 백단과의 통신과 DB의 데이터가 변경될 수 있다.

지금까지 프로젝트에서 사용해봤던 수정 모드를 리뷰했었는데 결론적으로 말하자면 React에 있는 useState를 응용한 방식이며 똑같이 값을 변경해 사용이 가능하지만 어떤 방식으로 사용하냐에 따라 사용자가 좀 더 효율적으로 혹은 창의적으로 사용할 수 있을 것 같다.

업데이트: