5화. Lottie & Motion One — 감성 애니메이션 만들기✨
안녕하세요, 프론티어들! 🌟 오늘은 프론트엔드 필수 라이브러리 시리즈의 다섯 번째 이야기로, 더욱 고급스럽고 감성적인 애니메이션을 구현할 수 있는 특별한 라이브러리, Lottie와 Motion One에 대해 알아볼게요! 이 두 라이브러리는 웹 애니메이션의 새로운 차원을 열어주고 있답니다! 🎭

Lottie: After Effects의 마법을 웹으로 ✨
Lottie는 Airbnb에서 개발한 라이브러리로, After Effects에서 만든 복잡한 애니메이션을 웹, 모바일 앱 등 다양한 플랫폼에서 쉽게 재생할 수 있게 해주는 마법 같은 도구예요!
Lottie의 주요 특징:
- 디자이너-개발자 협업의 혁명 🤝
- 디자이너는 After Effects로 작업, 개발자는 JSON 파일만 임포트
- 복잡한 코드 없이 프로페셔널한 애니메이션 구현 가능
- 가벼운 파일 크기 🪶
- GIF나 비디오보다 훨씬 작은 파일 크기
- JSON 기반으로 벡터 그래픽을 활용해 고품질 유지
- 다양한 플랫폼 지원 📱
- 웹, iOS, Android, React Native 등 모든 플랫폼 호환
- 한 번 만들어 여러 곳에서 사용 가능
- 뛰어난 제어 기능 🎮
- 재생, 일시정지, 속도 조절, 반복 등 세밀한 제어
- 스크롤, 클릭 등 사용자 인터랙션에 반응하는 애니메이션 구현 가능
// React에서 Lottie 사용하기
import Lottie from 'lottie-react';
import animationData from './animation.json';
function App() {
return (
<div className="app">
<h1>Lottie 애니메이션 예제</h1>
<Lottie
animationData={animationData}
loop={true}
autoplay={true}
style={{ width: 300, height: 300 }}
onComplete={() => console.log('애니메이션 완료!')}
/>
</div>
);
}

Lottie 애니메이션 활용 방법:
- LottieFiles 플랫폼 활용하기 🌐
- LottieFiles에서 수많은 무료/유료 애니메이션 탐색
- 웹 에디터로 기존 애니메이션 수정 가능
- After Effects에서 직접 만들기 🎨
- Adobe After Effects + Bodymovin 플러그인으로 제작
- 완전한 커스터마이징 가능
- 인터랙티브 Lottie 만들기 👆
- 마우스 움직임이나 스크롤에 반응하는 애니메이션
- 데이터에 따라 동적으로 변하는 인포그래픽
// 스크롤에 반응하는 Lottie 예제
import { useEffect, useRef } from 'react';
import lottie from 'lottie-web';
import animationData from './scroll-animation.json';
function ScrollLottie() {
const animationContainer = useRef(null);
const anim = useRef(null);
useEffect(() => {
if (animationContainer.current) {
anim.current = lottie.loadAnimation({
container: animationContainer.current,
renderer: 'svg',
loop: false,
autoplay: false,
animationData
});
return () => anim.current?.destroy();
}
}, []);
useEffect(() => {
const handleScroll = () => {
const scrollPosition = window.scrollY;
const documentHeight = document.body.clientHeight - window.innerHeight;
const scrollPercentage = scrollPosition / documentHeight;
// 애니메이션의 전체 프레임 수
const totalFrames = anim.current.totalFrames;
// 스크롤 위치에 따라 프레임 설정
const frameNumber = Math.floor(scrollPercentage * totalFrames);
anim.current.goToAndStop(frameNumber, true);
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return (
<div className="scroll-animation-container" ref={animationContainer}></div>
);
}
2025년 Lottie의 최신 기능:
- 웹 컴포넌트 지원: 프레임워크에 독립적인 웹 컴포넌트로 사용 가능
- AI 기반 최적화: 파일 크기와 성능을 자동으로 최적화
- 3D 애니메이션 지원: After Effects의 3D 레이어 지원 개선
- 실시간 데이터 바인딩: 데이터에 따라 자동으로 변하는 애니메이션
Motion One: 웹 애니메이션의 새로운 표준 🚀
Motion One은 2025년 현재 가장 빠르게 성장하고 있는 애니메이션 라이브러리 중 하나로, WAAPI(Web Animations API)를 기반으로 한 고성능 애니메이션 라이브러리예요!

Motion One의 주요 특징:
- 뛰어난 성능 ⚡
- 브라우저의 내장 Web Animations API 활용
- 자바스크립트 메인 스레드 부하 최소화
- 가벼운 번들 크기 📦
- 미니 버전은 단 2.3KB (gzip 압축 시)
- 필요한 기능만 임포트 가능한 모듈식 설계
- 직관적인 API 📝
- 간결하고 배우기 쉬운 명령형 API
- GSAP과 유사한 문법으로 전환이 쉬움
- 스크롤 애니메이션 내장 📜
- 스크롤 연동 애니메이션을 쉽게 구현
- 퍼포먼스 최적화된 스크롤 트래킹
// Motion One 기본 사용 예시
import { animate, scroll, inView } from 'motion';
// 기본 애니메이션
animate(
'.box',
{ x: 100, opacity: 1, rotate: 180 },
{ duration: 1, easing: 'ease-in-out' }
);
// 스크롤 애니메이션
scroll(
animate('.parallax', { y: [0, 300] }),
{ target: document.querySelector('.container') }
);
// 요소가 뷰포트에 들어올 때 애니메이션
inView('.reveal', ({ target }) => {
animate(target, { opacity: 1, y: 0 }, { delay: 0.2 });
});
Motion One 활용 방법:
- 단순한 전환 효과 🔄
- 페이지 내 요소의 상태 변화 애니메이션
- 호버, 클릭 등 사용자 인터랙션에 따른 피드백
- 스크롤 기반 애니메이션 📱
- 스크롤에 따라 요소가 움직이는 패럴랙스 효과
- 스크롤 위치에 따른 스토리텔링
- 뷰포트 기반 애니메이션 👀
- 요소가 화면에 나타날 때 실행되는 등장 효과
- 순차적으로 등장하는 리스트 아이템
// 뷰포트에 나타날 때 순차적으로 애니메이션
import { inView, timeline } from 'motion';
// 리스트 아이템이 순차적으로 나타나는 효과
inView('.list-container', ({ target }) => {
const items = target.querySelectorAll('.list-item');
timeline([
[items,
{ opacity: [0, 1], y: [20, 0] },
{ delay: 0.1, duration: 0.5, stagger: 0.1 }
]
]);
return () => timeline([
[items, { opacity: 0, y: 20 }]
]);
});
2025년 Motion One의 최신 기능:
- 스프링 애니메이션 개선: 물리 기반 스프링 효과 고도화
- SVG 모핑: 손쉬운 SVG 형태 변형 애니메이션
- CSS 변수 지원 강화: CSS 변수를 직접 애니메이션화
- 3D 변환 최적화: GPU 가속 3D 효과 지원 확대
Lottie vs Motion One: 어떤 상황에 어떤 라이브러리가 좋을까? 🤔
두 라이브러리는 목적과 접근 방식이 다르기 때문에, 상황에 따라 선택해야 해요!

Lottie를 선택해야 할 때:
- 디자이너와 긴밀하게 협업하는 프로젝트
- 복잡하고 세밀한 캐릭터 애니메이션이 필요할 때
- After Effects로 이미 제작된 애니메이션이 있을 때
- 브랜딩과 관련된 고품질 애니메이션이 중요할 때
Motion One을 선택해야 할 때:
- 성능이 최우선인 프로젝트
- 스크롤 기반 인터랙션이 중심인 웹사이트
- 번들 크기를 최소화해야 할 때
- 코드로 직접 제어하는 애니메이션이 필요할 때
실전 활용 사례 💼
실제 프로젝트에서 두 라이브러리를 어떻게 활용할 수 있는지 살펴볼게요!
Lottie 활용 사례:
- 브랜드 로딩 화면 🏢
- 앱/웹 시작 시 회사 로고가 움직이는 로딩 화면
- 브랜드 아이덴티티를 강화하는 애니메이션
- 상태 피드백 ✅
- 성공, 실패, 로딩 중 등의 상태를 표현하는 애니메이션
- 사용자에게 직관적인 피드백 제공
- 온보딩 튜토리얼 🧭
- 앱/웹의 기능을 설명하는 애니메이션 가이드
- 복잡한 개념을 시각적으로 쉽게 전달
Motion One 활용 사례:
- 스크롤 스토리텔링 📖
- 스크롤에 따라 진행되는 이야기형 웹사이트
- 요소들이 스크롤에 맞춰 자연스럽게 움직이는 효과
- UI 요소 트랜지션 🔄
- 메뉴 열기/닫기, 모달 표시/숨기기 등의 부드러운 전환
- 사용자 경험을 향상시키는 자연스러운 움직임
- 데이터 시각화 📊
- 차트, 그래프 등이 데이터에 따라 부드럽게 변화
- 데이터의 변화를 직관적으로 보여주는 애니메이션
두 라이브러리의 통합: 최고의 조합 💫
Lottie와 Motion One은 각자의 강점이 있어, 함께 사용하면 더욱 강력한 애니메이션을 구현할 수 있어요!
// Lottie와 Motion One 함께 사용하기
import { useRef, useEffect } from 'react';
import Lottie from 'lottie-react';
import { inView } from 'motion';
import animationData from './animation.json';
function EnhancedAnimation() {
const lottieRef = useRef(null);
const containerRef = useRef(null);
useEffect(() => {
if (containerRef.current) {
// Motion One으로 뷰포트 감지
inView(containerRef.current, ({ target }) => {
// Lottie 애니메이션 제어
lottieRef.current?.play();
// 추가 요소 애니메이션
const elements = target.querySelectorAll('.additional-element');
elements.forEach((el, i) => {
animate(el,
{ opacity: [0, 1], y: [20, 0] },
{ delay: 0.5 + (i * 0.1) }
);
});
});
}
}, []);
return (
<div ref={containerRef} className="animation-container">
<Lottie
ref={lottieRef}
animationData={animationData}
autoplay={false}
loop={false}
/>
<div className="additional-element">추가 설명 1</div>
<div className="additional-element">추가 설명 2</div>
</div>
);
}
애니메이션과 성능: 최적화 팁 ⚡
아름다운 애니메이션도 성능 저하를 일으키면 좋은 UX가 될 수 없어요. 최적화 팁을 알아볼게요!
Lottie 최적화:
- 복잡성 줄이기: 레이어 수, 효과, 마스크 등을 최소화
- 불필요한 속성 제거: Bodymovin 내보내기 시 필요한 속성만 선택
- 화면 밖 애니메이션 일시정지: 보이지 않는 애니메이션은 리소스 낭비
- 스크롤 기반 재생: 필요한 부분만 재생해 CPU 사용량 감소
Motion One 최적화:
- transform과 opacity 속성 활용: GPU 가속을 활용하는 속성 우선 사용
- requestAnimationFrame 사용 줄이기: WAAPI 활용으로 자동 최적화
- 애니메이션 타이밍 조절: 너무 많은 동시 애니메이션 피하기
- will-change 속성 활용: 브라우저에 변화 예고로 최적화 유도
접근성과 애니메이션: 모두를 위한 웹 ♿
아름다운 애니메이션도 접근성을 해치면 안 돼요. 접근성 고려 사항을 알아볼게요!
- prefers-reduced-motion 지원: 모션 감소 설정을 존중하는 대체 애니메이션 제공
@media (prefers-reduced-motion: reduce) { .animation { transition: none !important; animation: none !important; } }- 적절한 콘텐츠 대체: 애니메이션이 전달하는 정보를 텍스트로도 제공
- 깜빡임 주의: 광과민성 발작을 유발할 수 있는 빠른 깜빡임 피하기
- 집중력 분산 최소화: 중요한 정보 읽기를 방해하는 과도한 애니메이션 자제
마무리 🎁
Lottie와 Motion One은 각자의 방식으로 웹 애니메이션의 새로운 차원을 열어주는 강력한 도구예요. Lottie는 디자이너와의 협업과 복잡한 애니메이션에, Motion One은 성능 최적화와 코드 기반 애니메이션에 강점이 있어요!
여러분의 프로젝트에 맞는 라이브러리를 선택해 더욱 매력적이고 감성적인 웹 경험을 만들어보세요. 애니메이션은 단순한 장식이 아니라 UX의 핵심 요소이니까요! ✨
다음 시간에는 폼 처리와 유효성 검사의 강자, React Hook Form & Zod에 대해 알아볼 예정이니 기대해주세요! ✅
여러분의 웹사이트에 생동감과 감성을 불어넣어 보세요! 😄👋
'개발' 카테고리의 다른 글
| 프론트 필수 라이브러리 모음 : 7화 Zustand & Jotai & Redux - 상태 관리 비교 🧩✨ (0) | 2025.04.23 |
|---|---|
| 프론트 필수 라이브러리 모음 : 6화. React Hook Form & Zod - 폼과 유효성 검증🧩✨ (0) | 2025.04.22 |
| 프론트 필수 라이브러리 모음 : 4화. Framer Motion vs GSAP vs Anime.js - 애니메이션 비교🧩✨ (0) | 2025.04.20 |
| 프론트 필수 라이브러리 모음 : 3화. Radix UI - 접근성 최강 컴포넌트들 🧩✨ (0) | 2025.04.19 |
| 프론트 필수 라이브러리 모음 : 2화 Tailwind CSS & Shadcn/ui - 요즘 대세 스타일링 방법 🧩✨ (0) | 2025.04.18 |