diff --git a/next.config.ts b/next.config.ts
index 26f5d74..fdc0334 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -10,6 +10,7 @@ const nextConfig: NextConfig = {
ignoreBuildErrors: false,
},
images: {
+ formats: ['image/avif', 'image/webp'],
remotePatterns: [
{
protocol: 'https',
diff --git a/public/landing/landing-story-thumbnail.png b/public/landing/landing-story-thumbnail.png
deleted file mode 100644
index 9de72a8..0000000
Binary files a/public/landing/landing-story-thumbnail.png and /dev/null differ
diff --git a/public/landing/landing-story-thumbnail.webp b/public/landing/landing-story-thumbnail.webp
new file mode 100644
index 0000000..d19f4a2
Binary files /dev/null and b/public/landing/landing-story-thumbnail.webp differ
diff --git a/public/landing/opening-poster.webp b/public/landing/opening-poster.webp
new file mode 100644
index 0000000..22ac4ff
Binary files /dev/null and b/public/landing/opening-poster.webp differ
diff --git a/src/app/head.tsx b/src/app/head.tsx
new file mode 100644
index 0000000..6669ee7
--- /dev/null
+++ b/src/app/head.tsx
@@ -0,0 +1,7 @@
+export default function Head() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 2fb4aba..f7c3aaa 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,16 +1,28 @@
+import dynamic from 'next/dynamic';
import { Header } from '@/shared/components/layout';
import { HeaderActions } from '@/composite/landing/headerAction';
import { IntroSection } from '@/composite/landing/intro';
-import { QuestioningSection } from '@/composite/landing/questioning';
-import { SuggestionSection } from '@/composite/landing/suggestion';
-import { StoryVideoSection } from '@/composite/landing/storyVideo';
-import { AddGoalFeatureSection } from '@/composite/landing/addGoal';
-import { ManageTodoFeatureSection } from '@/composite/landing/manageTodo';
-import { GoalAdviceFeatureSection } from '@/composite/landing/goalAdvice';
-import { CollectPlanetFeatureSection } from '@/composite/landing/collectPlanet';
-import { FundingDiscountSection } from '@/composite/landing/fundingDiscount';
-import { LaunchSection } from '@/composite/landing/launch';
-import DonationSection from '@/composite/landing/DonationSection';
+
+const QuestioningSection = dynamic(() => import('@/composite/landing/questioning').then(mod => mod.QuestioningSection));
+const SuggestionSection = dynamic(() => import('@/composite/landing/suggestion').then(mod => mod.SuggestionSection));
+const StoryVideoSection = dynamic(() => import('@/composite/landing/storyVideo').then(mod => mod.StoryVideoSection));
+const AddGoalFeatureSection = dynamic(() =>
+ import('@/composite/landing/addGoal').then(mod => mod.AddGoalFeatureSection)
+);
+const ManageTodoFeatureSection = dynamic(() =>
+ import('@/composite/landing/manageTodo').then(mod => mod.ManageTodoFeatureSection)
+);
+const GoalAdviceFeatureSection = dynamic(() =>
+ import('@/composite/landing/goalAdvice').then(mod => mod.GoalAdviceFeatureSection)
+);
+const CollectPlanetFeatureSection = dynamic(() =>
+ import('@/composite/landing/collectPlanet').then(mod => mod.CollectPlanetFeatureSection)
+);
+const FundingDiscountSection = dynamic(() =>
+ import('@/composite/landing/fundingDiscount').then(mod => mod.FundingDiscountSection)
+);
+const LaunchSection = dynamic(() => import('@/composite/landing/launch').then(mod => mod.LaunchSection));
+const DonationSection = dynamic(() => import('@/composite/landing/DonationSection').then(mod => mod.default));
export default function LandingPage() {
return (
diff --git a/src/composite/landing/DonationSection/DonationImage.tsx b/src/composite/landing/DonationSection/DonationImage.tsx
index 5cc0060..5fccc40 100644
--- a/src/composite/landing/DonationSection/DonationImage.tsx
+++ b/src/composite/landing/DonationSection/DonationImage.tsx
@@ -39,6 +39,7 @@ export const DonationImage = () => {
sizes="(max-width: 768px) 200px, 350px"
className="w-50 md:w-87.5 h-auto shrink-0"
alt="donation-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/addGoal/index.tsx b/src/composite/landing/addGoal/index.tsx
index 70000c9..6c8778d 100644
--- a/src/composite/landing/addGoal/index.tsx
+++ b/src/composite/landing/addGoal/index.tsx
@@ -35,6 +35,7 @@ export const AddGoalFeatureSection = () => {
sizes="(max-width: 768px) 200px, 350px"
className="w-50 md:w-87.5 h-auto shrink-0"
alt="fifth-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/collectPlanet/index.tsx b/src/composite/landing/collectPlanet/index.tsx
index 5459dc6..4727a08 100644
--- a/src/composite/landing/collectPlanet/index.tsx
+++ b/src/composite/landing/collectPlanet/index.tsx
@@ -34,6 +34,7 @@ export const CollectPlanetFeatureSection = () => {
sizes="(max-width: 768px) 200px, 350px"
className="w-50 md:w-87.5 h-auto shrink-0"
alt="eighth-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/constants.ts b/src/composite/landing/constants.ts
index 01d4c3f..8e5102c 100644
--- a/src/composite/landing/constants.ts
+++ b/src/composite/landing/constants.ts
@@ -9,7 +9,7 @@ const LandingPageCommonStyle = {
transition: { duration: 0.8, ease: 'easeOut' },
},
left: {
- initial: { opcity: 0, x: -40 },
+ initial: { opacity: 0, x: -40 },
whileInView: { opacity: 1, x: 0 },
viewport: { once: true, amount: 0.3 },
transition: { duration: 0.8, ease: 'easeOut' },
diff --git a/src/composite/landing/fundingDiscount/index.tsx b/src/composite/landing/fundingDiscount/index.tsx
index c6f661e..f5813ce 100644
--- a/src/composite/landing/fundingDiscount/index.tsx
+++ b/src/composite/landing/fundingDiscount/index.tsx
@@ -31,6 +31,8 @@ export const FundingDiscountSection = () => {
height={400}
sizes="(max-width: 768px) 300px 200px"
alt="character-key-ring-image"
+ className="w-75 md:w-125 h-auto shrink-0"
+ loading="lazy"
/>
diff --git a/src/composite/landing/goalAdvice/index.tsx b/src/composite/landing/goalAdvice/index.tsx
index c866753..22af359 100644
--- a/src/composite/landing/goalAdvice/index.tsx
+++ b/src/composite/landing/goalAdvice/index.tsx
@@ -35,6 +35,7 @@ export const GoalAdviceFeatureSection = () => {
sizes="(max-width: 768px) 200px, 350px"
className="w-50 md:w-87.5 h-auto shrink-0"
alt="seventh-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/intro/index.tsx b/src/composite/landing/intro/index.tsx
index 7df8c6b..1fc1bd5 100644
--- a/src/composite/landing/intro/index.tsx
+++ b/src/composite/landing/intro/index.tsx
@@ -13,7 +13,8 @@ export const IntroSection = () => {
autoPlay
muted
loop
- preload="auto"
+ preload="none"
+ poster="/landing/opening-poster.webp"
className="w-full h-full object-cover"
>
@@ -21,7 +22,9 @@ export const IntroSection = () => {
{/* 오버레이 (그라디언트) */}
-
+
그로잇으로 너의 인생이 바뀔거야
diff --git a/src/composite/landing/launch/index.tsx b/src/composite/landing/launch/index.tsx
index 28b953f..e18db13 100644
--- a/src/composite/landing/launch/index.tsx
+++ b/src/composite/landing/launch/index.tsx
@@ -24,12 +24,14 @@ export const LaunchSection = () => {
{/* 배경 & 오버레이 */}
-
+
-
+
2월 APP 런칭
diff --git a/src/composite/landing/manageTodo/index.tsx b/src/composite/landing/manageTodo/index.tsx
index 66b9bac..99d48c0 100644
--- a/src/composite/landing/manageTodo/index.tsx
+++ b/src/composite/landing/manageTodo/index.tsx
@@ -35,6 +35,7 @@ export const ManageTodoFeatureSection = () => {
sizes="(max-width: 768px) 200px, 350px"
className="w-50 md:w-87.5 h-auto shrink-0"
alt="sixth-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/questioning/index.tsx b/src/composite/landing/questioning/index.tsx
index c5b0c2e..228c714 100644
--- a/src/composite/landing/questioning/index.tsx
+++ b/src/composite/landing/questioning/index.tsx
@@ -29,6 +29,7 @@ export const QuestioningSection = () => {
sizes="(max-width: 768px) 230px, 260px"
className="w-57.5 md:w-97.75 h-auto shrink-0"
alt="second-section-image"
+ loading="lazy"
/>
diff --git a/src/composite/landing/storyVideo/StoryVideo.tsx b/src/composite/landing/storyVideo/StoryVideo.tsx
index 003f22a..1718ebf 100644
--- a/src/composite/landing/storyVideo/StoryVideo.tsx
+++ b/src/composite/landing/storyVideo/StoryVideo.tsx
@@ -22,6 +22,7 @@ export const StoryVideo = () => {
preload="metadata"
playsInline
muted
+ poster="/landing/landing-story-thumbnail.webp"
className="aspect-video lg:block rounded-lg"
/>
diff --git a/src/composite/landing/suggestion/index.tsx b/src/composite/landing/suggestion/index.tsx
index 1187b5c..94b662b 100644
--- a/src/composite/landing/suggestion/index.tsx
+++ b/src/composite/landing/suggestion/index.tsx
@@ -29,6 +29,7 @@ export const SuggestionSection = () => {
sizes="(max-width: 768px) 205px, 356px"
className="w-51.25 md:w-89 h-auto shrink-0"
alt="third-section-image"
+ loading="lazy"
/>