🌐 웹개발

Three.js

Three.js

웹에서 3D 그래픽을 렌더링하는 JavaScript 라이브러리. WebGL 추상화.

📖 상세 설명

Three.js는 웹 브라우저에서 3D 그래픽을 쉽게 구현할 수 있게 해주는 JavaScript 라이브러리입니다. WebGL API를 추상화하여 복잡한 저수준 코드 없이도 3D 장면(scene), 카메라, 조명, 재질, 메시 등을 직관적으로 다룰 수 있습니다.

2010년 Ricardo Cabello(Mr.doob)가 처음 공개한 이후, Three.js는 웹 3D 그래픽의 사실상 표준이 되었습니다. WebGL의 복잡성을 숨기면서도 강력한 기능을 제공하여, 게임, 시각화, 인터랙티브 아트, 제품 데모 등 다양한 분야에서 활용됩니다.

Three.js의 핵심 구성 요소는 Scene(장면), Camera(카메라), Renderer(렌더러)입니다. Scene에 3D 객체들을 배치하고, Camera로 시점을 설정한 뒤, Renderer가 최종 이미지를 화면에 그립니다. 애니메이션은 requestAnimationFrame을 활용한 렌더 루프로 구현합니다.

실무에서 Three.js는 제품 3D 뷰어, 데이터 시각화, 가상 전시관, WebXR 콘텐츠 등에 필수적입니다. React Three Fiber 같은 React 통합 라이브러리와 함께 사용하면 컴포넌트 기반으로 3D 씬을 구성할 수 있어 유지보수성이 크게 향상됩니다.

💻 코드 예제

// Three.js 기본 장면 설정
import * as THREE from 'three';

// 1. Scene 생성
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x1a1a2e);

// 2. Camera 설정 (시야각, 종횡비, near, far)
const camera = new THREE.PerspectiveCamera(
    75, window.innerWidth / window.innerHeight, 0.1, 1000
);
camera.position.z = 5;

// 3. Renderer 생성
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 4. 3D 객체 생성 (지오메트리 + 재질 = 메시)
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({
    color: 0x6366f1,
    metalness: 0.3,
    roughness: 0.4
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 5. 조명 추가
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);
scene.add(new THREE.AmbientLight(0x404040));

// 6. 애니메이션 루프
function animate() {
    requestAnimationFrame(animate);
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
}
animate();

🗣️ 실무에서 이렇게 말하세요

💬 기획 미팅에서
"제품 페이지에 3D 뷰어를 넣으면 고객이 제품을 360도 돌려볼 수 있어요. Three.js로 구현하면 앱 설치 없이 브라우저에서 바로 체험 가능합니다. glTF 포맷으로 3D 모델 받으시면 될 것 같아요."
💬 면접에서
"Three.js는 WebGL을 추상화한 라이브러리로, Scene-Camera-Renderer 패턴을 사용합니다. 성능 최적화를 위해 geometry 인스턴싱, LOD, frustum culling을 활용했고, React Three Fiber로 선언적 3D 개발도 경험이 있습니다."
💬 코드 리뷰에서
"이 부분에서 매 프레임마다 geometry를 새로 생성하고 있어요. dispose() 안 하면 GPU 메모리 누수가 생깁니다. geometry랑 material은 재사용하거나, 사용 후 반드시 dispose 해주세요."

⚠️ 흔한 실수 & 주의사항

메모리 누수 방치

Geometry, Material, Texture를 사용 후 dispose() 호출하지 않으면 GPU 메모리가 계속 쌓입니다. 특히 동적으로 객체를 생성/삭제하는 경우 필수입니다.

렌더 루프에서 객체 생성

animate() 함수 안에서 new Vector3()나 new Color()를 호출하면 매 프레임 가비지가 생성됩니다. 루프 밖에서 미리 선언하고 재사용하세요.

올바른 방법

BufferGeometry 사용, 텍스처 압축(basis/ktx2), LOD 적용, OrbitControls의 enableDamping으로 부드러운 인터랙션을 구현하세요.

🔗 관련 용어

📚 더 배우기