React는 복잡한 UI 상태 관리와 데이터 흐름 문제를 해결하기 위해 등장했습니다. 특히 단방향 데이터 흐름과 대규모 애플리케이션의 상태 관리에 초점을 맞추었습니다.
React는 다음 두 가지 주요 문제를 해결했습니다:
기존의 UI 개발 방식은 다음과 같은 문제점이 있었습니다:
React는 다음과 같은 방식으로 이 문제를 해결했습니다:
Facebook의 채팅 기능을 예로 들어보겠습니다. 기존 방식에서는 여러 컴포넌트가 각자의 상태를 관리하고, 서로 복잡하게 얽혀 있었습니다.
// 채팅 목록 컴포넌트
function ChatList() {
let chats = [];
function updateChats(newChats) {
chats = newChats;
render();
}
function render() {
// DOM 직접 조작
document.getElementById('chat-list').innerHTML = chats.map(chat => `
<div class="chat-item">
<span>${chat.sender}</span>
<span>${chat.message}</span>
<span>${chat.timestamp}</span>
</div>
`).join('');
}
// 이벤트 리스너 등록
document.getElementById('new-message-form').addEventListener('submit', function(e) {
e.preventDefault();
const messageInput = document.getElementById('message-input');
const newMessage = { sender: 'Me', message: messageInput.value, timestamp: new Date() };
chats.push(newMessage);
updateChats(chats);
messageInput.value = '';
});
// 서버로부터 새 메시지 수신
socket.on('new-message', function(message) {
chats.push(message);
updateChats(chats);
});
}
// 사용자 목록 컴포넌트
function UserList() {
let users = [];
function updateUsers(newUsers) {
users = newUsers;
render();
}
function render() {
document.getElementById('user-list').innerHTML = users.map(user => `
<div class="user-item ${user.online ? 'online' : 'offline'}">
${user.name}
</div>
`).join('');
}
// 사용자 상태 변경 이벤트
socket.on('user-status-change', function(updatedUser) {
const userIndex = users.findIndex(u => u.id === updatedUser.id);
if (userIndex !== -1) {
users[userIndex] = updatedUser;
updateUsers(users);
}
});
}
// 앱 초기화
function initApp() {
ChatList();
UserList();
}