프론트엔드와 백엔드의 역할 분담: 비즈니스 로직 처리 위치 결정하기

oversleep·2025년 2월 12일
0

Web

목록 보기
4/11
post-thumbnail

들어가며

실제 프로젝트를 진행하다 보면 "이 로직은 프론트엔드에서 처리해야 할까, 백엔드에서 처리해야 할까?" 하는 고민에 빠지곤 합니다.
오늘은 실제 사례를 통해 이러한 결정을 어떻게 내릴 수 있는지 알아보겠습니다.

사례: 매치 생성자의 참여 제한 기능

상황

  • 사용자가 생성한 매치에 본인이 다시 참여 신청하는 것을 제한해야 함
  • 참여하기 버튼의 활성화/비활성화 처리 필요

접근 방식 1: 프론트엔드에서 처리

// 프론트엔드에서 체크하는 방식
const MatchItem = ({ match, currentUser }) => {
  const isCreator = match.creatorId === currentUser.id;
  
  return (
    <Button 
      disabled={isCreator}
      onClick={handleParticipate}
    >
      참여하기
    </Button>
  );
};

문제점

  1. 보안 취약성

    • 브라우저 개발자 도구로 제한을 우회할 수 있음
    • 악의적인 API 요청이 가능
  2. 일관성 부족

    • 여러 클라이언트(웹, 모바일)에서 각각 구현 필요
    • 실수로 로직이 다르게 구현될 가능성
  3. 유지보수 어려움

    • 비즈니스 로직 변경 시 모든 클라이언트 수정 필요
    • 배포 과정이 복잡해짐

접근 방식 2: 백엔드에서 처리

// 백엔드 API 응답
{
  "matchId": "123",
  "title": "매치 제목",
  "location": "서울시 강남구",
  "isCreator": true,  // 또는
  "canParticipate": false
}
// 프론트엔드 구현
const MatchItem = ({ match }) => {
  return (
    <Button 
      disabled={!match.canParticipate}
      onClick={handleParticipate}
    >
      참여하기
    </Button>
  );
};

장점

  1. 보안성 향상

    • 서버에서 검증하므로 우회 불가능
    • 무결성 보장
  2. 일관성 유지

    • 모든 클라이언트에 동일한 규칙 적용
    • 중앙화된 로직 관리
  3. 유지보수 용이

    • 비즈니스 로직 변경 시 백엔드만 수정
    • 클라이언트 수정 불필요

결론: 비즈니스 로직 배치의 기준

백엔드에서 처리해야 할 경우

  1. 보안이 중요한 로직
  2. 데이터 무결성이 중요한 경우
  3. 여러 클라이언트에서 공통으로 사용되는 로직
  4. 비즈니스 규칙이 자주 변경될 수 있는 경우

프론트엔드에서 처리해도 되는 경우

  1. UI 관련 로직 (표시/숨김, 애니메이션 등)
  2. 사용자 입력 기본 검증 (실시간 유효성 검사 등)
  3. 데이터 포맷팅이나 표시 형식 변환
  4. 클라이언트 사이드 캐싱

마치며

비즈니스 로직의 위치를 결정하는 것은 단순히 기술적인 문제가 아닌, 보안, 유지보수, 일관성 등 다양한 측면을 고려해야 하는 아키텍처 결정입니다. 이러한 결정을 내릴 때는 항상 장기적인 관점에서 프로젝트의 확장성과 유지보수성을 고려해야 합니다.

profile
궁금한 것, 했던 것, 시행착오 그리고 기억하고 싶은 것들을 기록합니다.

0개의 댓글