애니메이션을 위한 여러 js라이브러리가 있겠지만,
이 글에서는
Framer Motion, GSAP , Lottie , Three.js 에 대해 알아보겠다.Framer Motion
특징
- React 전용
- 레이아웃 변화 감지 애니메이션 (layout prop)
- Drag / Drop / Gesture 처리에 특화
- AnimatePresence로 컴포넌트 입출력 제어 가능
단점
- React 환경 외에서는 사용 불가.
- 복잡한 타임라인 애니메이션에는 부적합
추천상황
- React 웹앱에서 컴포넌트 간 전환, 간단한 인터랙션, 모션 UI
- 예: 탭 전환, 모달 등장, 리스트 애니메이션, 드래그 카드 인터페이스
예시 코드
GPT와 함께 카드 목록 등장 + Exit 애니메이션을 만들어보았다.
이 글은 Framer Motion을 집중적으로 공부하는 글이 아니므로 어떤 기능들이 있는지는 다른 글로 작성하겠다.
// 설치: npm install framer-motion import { motion, AnimatePresence } from "framer-motion"; import { useState } from "react"; const itemVariants = { hidden: { opacity: 0, y: 30 }, visible: (i: number) => ({ opacity: 1, y: 0, transition: { delay: i * 0.1 } }), exit: { opacity: 0, y: -20, transition: { duration: 0.2 } } }; export default function AnimatedList() { const [items, setItems] = useState([1, 2, 3, 4]); return ( <div> <button onClick={() => setItems(prev => prev.slice(0, -1))}>Remove</button> <ul> <AnimatePresence> {items.map((item, i) => ( <motion.li key={item} custom={i} initial="hidden" animate="visible" exit="exit" variants={itemVariants} style={{ marginBottom: "10px", background: "#ddd", padding: "10px" }} > Item {item} </motion.li> ))} </AnimatePresence> </ul> </div> ); }
결과
GSAP (GreenSock Animation Platform)
특징
- DOM, SVG, Canvas, WebGL 등 대부분 대상 지원
- Timeline 기반으로 복잡한 시퀀스 애니메이션 구현 가능
- 렌더링 최적화가 잘 되어 있어 성능 우수
- Vue/React/Three.js 등 다양한 환경과 통합 가능
단점
- 명령형 문법 → React에서는 구조가 복잡해짐
- 유료 플러그인 사용시 유료 라이선스 필요 (ScrollSmoother 등)
추천 상황
- 고난도 타임라인 애니메이션, SVG + 텍스트 효과, Scroll 기반 인터랙션
- 예: 랜딩 페이지 Hero 섹션, 마이크로 인터랙션, 고급 모션 디자인
예시
cursor가 만들어준 GSAP 애니메이션 예제이다. 코드는 너무 길어서 생략하겠다.
실제로 확인해보니 생각보다 되게 잘 만드는 것 같다ㅋㅋㅋ
Lottie
소프트웨어 마에스트로 기간 동안 멘토님께 로딩 애니메이션으로 Lottie를 추천 받았었다.
특징
- After Effects로 만든 JSON 기반 애니메이션을 실행
- 디자이너와의 협업 최적화 (Bodymovin 플러그인 이용)
- 코드 한 줄로 고품질 애니메이션 실행 가능
- 모바일/웹/앱 모두 지원 (iOS, Android, Flutter, React Native 등)
- 해상도 독립적 (벡터 기반)
단점
- 커스터마이징이 어렵고 JSON이 크면 성능 저하
- 런타임 비용 있음 (JS 파일 크기 + 렌더링 비용)
추천 상황
- 디자인 퀄리티가 중요한 앱, 디자이너가 직접 제작한 모션 사용 시
- 예: 로딩 스피너, onboarding guide, empty state UI
Three.js + Tween.js
내 블로그의 명함도 Three.js로 만들었다. 물론 GPT의 힘을 많이 빌렸다.
특징
- Three.js: 3D WebGL 렌더링 라이브러리
- Tween.js: 숫자 기반의 시간 애니메이션 보조 라이브러리
- 3D 환경에서 자유롭게 씬 구성 + 애니메이션 제어
단점
- 러닝커브 높음 (3D 수학/렌더링 지식 필요)
- UI 요소와의 결합은 어렵고 무거울 수 있음
추천 상황
- WebGL 기반 3D 인터랙션, 포트폴리오, 몰입형 경험 디자인
- 예: 3D 제품 뷰어, 인터랙티브 전시, 캐릭터 애니메이션
토스에서 활용하는 방법
토스에서는 애니메이션을 적극적으로 활용한다.
토스 공고를 보면,

애니메이션과 관련된 라이브러리로 Framer Motion과 GSAP을 사용하는 것을 알 수 있다.
공고에 나와있는 대표적인 예시 🔽
위 사이트를 들어가보면 화려하고 재밌는 애니메이션들이 많다.
이런 애니메이션을 어떻게 구현했는지 알고 싶지만 이건 Interaction UX 분야이므로,
이 글에서는 웹에서 애니메이션을 사용할 때, 주의해야할 점들을 중심으로 글을 작성하고 싶다.
나의 궁금증
간단하게 애니메이션 라이브러리 예시들을 보고, 실제로 코드로 작성해보면서 궁금한 것들을 요약해보았다.
화려함을 얻는 대신 무엇을 희생할까, 어떻게 최적화할까
- 렌더링 비용 증가
- DOM 기반 애니메이션은 브라우저의
reflow와repaint를 유발할 수 있다.reflow에 대해서 잘 모르면 이 글을 참고하자. - 개선 전략
전략 | 설명 |
transform, opacity만 애니메이션 | GPU 가속이 적용되어 reflow 발생 없음 |
레이아웃 트리 변경 최소화 | DOM 노드 삽입/제거보다 visibility, display 제어 |
바운딩/측정 연산은 batch 처리 | offsetHeight, getBoundingClientRect()는 묶어서 처리 |
가상화(Virtualization) 사용 | 리스트가 많다면 react-window, @tanstack/react-virtual 도입 |
will-change 적절히 활용 | will-change: transform으로 렌더링 최적화 힌트 주기 (주의해서 사용) |
- 초기
LCP지연 LCP란, 보통 사용자가 페이지를 열었을 때 “눈에 보이는 주요 콘텐츠가 얼마나 빨리 나타났는가” 를 의미한다.- SEO에 불리해진다.
- 개선 전략
전략 | 설명 |
prefetch, preload 적극 활용 | 주요 리소스는 HTML head에서 선 로드 |
애니메이션은 뷰포트 진입 이후 실행 | IntersectionObserver로 lazy animate |
- 번들 사이즈 증가
- 초기 로딩 시간도 길어지고 속도도 느려진다.
- 캐싱 효율도 떨어진다.
- 개선 전략
- Dynamic Import로 Lazy-load 하기
- Framer Motion의 LazyMotion API 사용
- GSAP의 Modular Import 사용
사실 나 같은 취업 준비생은 위와 같은 문제를 만나기 어렵다고 생각한다.
특히 최적화는 더더욱 해야할 상황이 적다고 생각한다.
그래도 이렇게 이론적으로라도 공부해둔다면, 앞으로 실무에서 한 번이라도 더 의견을 낼 수 있을 것이다.
SSR 환경에서 괜찮을까
애니메이션이 있다고 SEO가 안좋아지는 것은 아니다.
그러나 위에서 언급했듯이 간접적으로
LCP 지표가 안좋아지면 SEO 관점에서 안좋아진다.하지만 애니메이션과 별도로 주요 내용들이 HTML에 존대한다면 SEO를 크게 걱정 안해도 될 것 같다.
또한, SSR에 특화된 애니메이션도 있는 것 같은데,
이것이 실제로 SSR 시점에 재생되거나 동작하는 것은 아니다.
Framer Motion의 motion.div를 예로 들어보면,
motion.div 안에 있는 콘텐츠는 미리 HTML로 렌더링 되는 것이지만
클라이언트 측에서 hydration 후 애니메이션 작동하게 된다.
마무리
개인적으로 웹이나 앱이 나온지 오래 된 시점에서,
웹이나 앱으로 활용할 수 있는 콘텐츠는 이제 많이 적어졌다고 생각한다.
그러면 다 비슷한 환경에서 사람들은 더 이쁜 것을 선택하게 되는 현상이 발생할 수 있다.
따라서, 애니메이션을 적절하게 사용하면 사람들의 퍼널을 늘리거나 세션 시간을 늘릴 수 있을 것 같다.
인터랙션 UI를 직접 개발하지 않더라도,
성능이 낮아져서 UX를 해치는 것을 방지하기 위해서는 오늘 글처럼 기본적인 개념을 알아두는게 좋은 것 같다.
또 내 블로그에 명함을 3D 형태로 만들어본 경험이 있다.

움직이는 방향에 따라 햇빛이 적절하게 반사되도록 구현해보았는데,
이것이 초기 로딩이 꽤나 느렸다. 오늘 공부한 최적화 관점에서 이 명함 코드를 한 번 수정해봐야겠다.
다음 글에서 명함 애니메이션 코드를 리뷰해보고 수정해보도록 하겠다.

