노트

트랜잭션·트랜지션·뮤테이션 구분

Transaction vs Transition vs Mutation

프론트엔드#react#db · 연결된 개념 7개

쉽게 말하면

세 단어는 이삿날에 빗대면 구분돼요. 짐을 옮기는 일이 뮤테이션, 짐이 다 옮겨지거나 하나도 안 옮겨지게 묶는 약속이 트랜잭션, 그동안 TV는 계속 켜 두고 정리는 천천히 하는 요령이 트랜지션이에요.

비유의 한계 트랜지션은 정리 순서를 미룰 뿐 짐을 되돌려 주지 않아요. 서버 변경이 반쯤 실패해도 React가 되돌려 주지 않으니 원자성은 DB 트랜잭션이, 화면 우선순위는 트랜지션이 따로 맡아요.

세 단어는 이름이 비슷하지만 다루는 층이 다르다. 뮤테이션(mutation)은 데이터를 바꾸는 작업, 트랜잭션(transaction)은 여러 변경을 전부 반영하거나 전혀 반영하지 않게 묶는 단위, React의 트랜지션(transition)은 화면 업데이트의 우선순위를 낮추는 표시다.

용어층답하는 질문
뮤테이션데이터(서버·객체)무엇을 바꾸나
트랜잭션저장소(DB)여러 변경이 함께 성공·실패하나
트랜지션React 렌더링어떤 화면 갱신을 먼저 처리하나

뮤테이션

  • 서버 데이터 변경: 조회(query)와 짝을 이루는 생성·수정·삭제다. TanStack Query의 useMutation, SWR의 useSWRMutation, GraphQL의 mutation 연산이 이 뜻이다. 성공한 뒤에는 관련 조회 캐시를 무효화하거나 직접 고친다
  • 객체를 제자리에서 고치는 것: position.x = 5처럼 객체 내용을 직접 바꾸는 것도 뮤테이션이다. React state를 이렇게 바꾸면 React가 변화를 알지 못하므로, 새 객체로 교체한다(React 상태 갱신, 구조적 공유)

트랜잭션

출금과 입금처럼 함께 성공하거나 함께 실패해야 하는 작업 묶음이다. DB가 ACID 성질로 보장한다. 스프링에서는 @Transactional로 경계를 긋는다.

뮤테이션 여러 개를 보낸다고 트랜잭션이 되지는 않는다. GraphQL은 한 요청 안의 최상위 mutation 필드를 순서대로 실행하지만, 뒤의 필드가 실패해도 앞에서 반영한 변경을 되돌리는 기본 수단은 없다. 원자성이 필요하면 서버의 한 트랜잭션 안에서 처리해야 한다.

트랜지션

useTransition의 startTransition으로 감싼 상태 업데이트는 "급하지 않음"으로 표시된다. 그 렌더가 진행되는 동안에도 타이핑 같은 급한 입력이 먼저 처리된다. startTransition에 넘기는 함수를 Action이라 부르고, React 19부터는 async 함수도 넘길 수 있다.

// 뮤테이션(서버 저장)을 트랜지션(Action) 안에서 실행하는 흔한 조합
startTransition(async () => {
  setOptimisticLiked(true)   // useOptimistic의 set 함수
  await saveLike()           // 서버 데이터를 바꾸는 뮤테이션
})

useOptimistic의 set 함수는 Action 안에서 불러야 한다. 밖에서 부르면 경고가 나고, 임시 값이 잠깐 보였다가 바로 원래 값으로 돌아간다. 트랜지션이 Action이 끝날 때까지 임시 상태를 붙잡아 두는 구조이기 때문이다.

상태 기계(state machine)에서 idle → pending → success처럼 상태가 바뀌는 것도 영어로 transition(전이)이라 부른다. React의 트랜지션과는 다른 개념이다. React 트랜지션은 상태의 종류가 아니라 렌더링 우선순위를 다룬다.

출처: React — useTransition · React — useOptimistic · React 19 — Actions · React — Updating Objects in State: What's a mutation? · TanStack Query — Mutations · SWR — Mutation & Revalidation · GraphQL — Mutations

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • useActionState와 폼 액션

    React 19에서는 <form action={함수}>에 함수를 바로 넘길 수 있고, useActionState가 그 액션의 대기 상태와 마지막 결과를 한 훅으로 관리한다. useState + onSubmit + 로딩 플래그로 짜던 패턴을 대체한다.

  • 서버 함수와 서버 액션

    서버 함수(Server Function)는 'use server'로 표시해 서버에서만 실행되지만 클라이언트에서 네트워크 요청으로 호출할 수 있는 async 함수다. 그중 폼 제출이나 데이터 변경처럼 action 맥락(form action, transition)에서 쓰이는 것을 서버 액션(Server Action)이라 부른다. 서버 액션은 서버 함수의 부분집합이다.

  • 무상태와 상태 유지

    무상태(stateless)는 서버가 이전 요청을 기억하지 않아도 요청 하나만 보고 처리할 수 있는 구조이고, 상태 유지(stateful)는 서버가 요청 사이에 클라이언트 상태를 저장해 두고 다음 요청을 처리할 때 그 상태를 찾아보는 구조다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • 변수·컬렉션 캡슐화

    넓은 범위에서 쓰이는 데이터에 직접 접근하지 못하게 하고, 읽고 쓰는 함수를 통해서만 다루게 하는 리팩터링. 데이터를 옮기거나 바꿀 때 고쳐야 할 곳이 접근 함수 한 곳으로 좁아진다.

보기 옵션