
웹 애플리케이션에서 상태 관리는 매우 중요한 부분이다. 하지만 상태를 관리할 때 직접적인 객체 접근은 여러 문제를 일으킬 수 있다. 오늘은 더 안전하고 예측 가능한 코드를 작성하는 방법에 대해 알아보자
먼저 흔히 볼 수 있는 안티 패턴을 살펴보자
const model = {
isLogin: false,
isValidToken: false,
}
function login() {
model.isLogin = true;
model.isValidToken = true;
}
function logout() {
model.isLogin = false;
model.isValidToken = false;
}
someElement.addEventListener('click', login);
이 코드의 문제점을 무엇일까? 🤔
더 안전한 방식으로 리팩토링 해보자
const model = {
isLogin: false,
isValidToken: false,
}
// 접근자 함수를 통한 캡슐화
function setLogin(bool) {
model.isLogin = bool;
}
function setValidToken(bool) {
model.isValidToken = bool;
}
// 비즈니스 로직
function login() {
setLogin(true);
setValidToken(true);
}
function logout() {
setLogin(false);
setValidToken(false);
}
someElement.addEventListener('click', login);
🌟 개선된 패턴의 장점
이러한 패턴이 왜 중요한지 현대 상태 관리 라이브러리들의 관점에서 살펴보면 더 명확해진다. 예를 들어 Redux와 같은 라이브러리들은 상태 하나를 변경하는데도 여러 단계를 거치도록 설계되어 있다.
Action -> Reducer -> State 변화
이런 단계적 접근이 귀찮아 보일 수 있지만, 이는 애플리케이션의 상태를 예측 가능하고 안전하게 만드는 중요한 장치다.
클린코드는 단순히 "작동하는 코드"를 넘어 "예측 가능한 코드"를 지향한다. 객체의 상태를 직접 다루는 대신 적절한 추상화 계층을 두머 관리하면