diff --git a/package.json b/package.json index 8f6360b3..06766473 100644 --- a/package.json +++ b/package.json @@ -12,20 +12,21 @@ "main": "dist-electron/main.js", "scripts": { "dev": "pnpm dev:react & pnpm dev:electron", - "dev:react": "vite", + "dev:react": "vite --mode react", "dev:electron": "pnpm transpile:electron && cross-env NODE_ENV=development electron .", - "build": "tsc -b && vite build", + "build": "tsc -b && vite build --mode react", + "build:electron": "tsc -b && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", "transpile:electron": "tsc --project src/electron/tsconfig.json", - "dist:mac": "pnpm transpile:electron && pnpm build && electron-builder --mac --arm64", - "dist:mac:intel": "pnpm transpile:electron && pnpm build && electron-builder --mac --x64", - "dist:mac:universal": "pnpm transpile:electron && pnpm build && electron-builder --mac --universal", + "dist:mac": "pnpm transpile:electron && pnpm build:electron && electron-builder --mac --arm64", + "dist:mac:intel": "pnpm transpile:electron && pnpm build:electron && electron-builder --mac --x64", + "dist:mac:universal": "pnpm transpile:electron && pnpm build:electron && electron-builder --mac --universal", "dist:mac:notarize": "./scripts/build-mac.sh", "dist:mac:intel:notarize": "./scripts/build-mac-intel.sh", "dist:mac:universal:notarize": "./scripts/build-mac-universal.sh", - "dist:win": "pnpm transpile:electron && pnpm build && electron-builder --win --x64", - "dist:linux": "pnpm transpile:electron && pnpm build && electron-builder --linux --x64" + "dist:win": "pnpm transpile:electron && pnpm build:electron && electron-builder --win --x64", + "dist:linux": "pnpm transpile:electron && pnpm build:electron && electron-builder --linux --x64" }, "dependencies": { "@remix-run/router": "^1.17.0", diff --git a/src/app/pages/LoginPage/LoginPage.tsx b/src/app/pages/LoginPage/LoginPage.tsx index 4d6ecd28..d341a830 100644 --- a/src/app/pages/LoginPage/LoginPage.tsx +++ b/src/app/pages/LoginPage/LoginPage.tsx @@ -1,9 +1,14 @@ +import { useEffect } from 'react'; import Lottie from 'react-lottie'; +import { useNavigate } from 'react-router-dom'; -import LottieData from '@/shared/assets/lotties/morib_logo_motion.json'; +import LottieData from '@/shared/assets/lotties/main_motion.json'; import GoogleLoginIcon from '@/shared/assets/svgs/google_login.svg?react'; +import { ROUTES_CONFIG } from '@/router/routesConfig'; + import { useLottieAnimation } from '@/pages/LoginPage/hooks/useLottieAnimation'; +import { authConfig } from '@/shared/config/auth'; const defaultOptions = { autoplay: true, @@ -14,17 +19,15 @@ const defaultOptions = { }, }; -const API_URL = `${import.meta.env.VITE_GOOGLE_URL}`; -const ELECTRON_URL = `${import.meta.env.VITE_ELECTRON_AUTH_URL}`; - const LoginPage = () => { const { isAnimationComplete, lottieRef, handleAnimationComplete } = useLottieAnimation(); + const navigate = useNavigate(); const handleClick = () => { if (window.electron) { - window.open(ELECTRON_URL, '_blank'); + window.open(authConfig.google.url.electron, '_blank'); } else { - window.location.href = API_URL; + window.location.href = authConfig.google.url.react; } }; @@ -34,9 +37,15 @@ const LoginPage = () => { }); }; + useEffect(() => { + if (authConfig.isAuthenticated()) { + navigate(ROUTES_CONFIG.home.path); + } + }, [navigate]); + return (
-
+
{ diff --git a/src/app/router/ProtectedRoute.tsx b/src/app/router/ProtectedRoute.tsx index f3b9fa29..35cb344c 100644 --- a/src/app/router/ProtectedRoute.tsx +++ b/src/app/router/ProtectedRoute.tsx @@ -1,4 +1,4 @@ -import { Navigate, Outlet } from 'react-router-dom'; +import { Navigate, Outlet, useNavigate } from 'react-router-dom'; import ErrorBoundary from '@/shared/components/ErrorBoundary/ErrorBoundary'; @@ -9,9 +9,12 @@ import { ROUTES_CONFIG } from './routesConfig'; const ProtectedRoute = () => { const accessToken = getAccessToken(); + const navigate = useNavigate(); + if (!accessToken) { alert(mapStatusToMessage(401)); - return ; + navigate(ROUTES_CONFIG.login.path, { replace: true }); + return null; } return ( diff --git a/src/app/router/Router.tsx b/src/app/router/Router.tsx index 66aee15e..eced980a 100644 --- a/src/app/router/Router.tsx +++ b/src/app/router/Router.tsx @@ -10,13 +10,13 @@ import LoadingOverlay from '@/shared/components/LoadingOverlay/LoadingOverlay'; import AllowedServicePage from '@/pages/AllowedServicePage/AllowedServicePage'; import HomePage from '@/pages/HomePage/HomePage'; import NotFoundPage from '@/pages/NotFoundPage/NotFoundPage'; +import RedirectPage from '@/pages/RedirectPage/RedirectPage'; import Layout from '@/shared/layout/Layout'; import ProtectedRoute from './ProtectedRoute'; import { ROUTES_CONFIG } from './routesConfig'; const LoginPage = lazy(() => import('@/pages/LoginPage/LoginPage')); -const RedirectPage = lazy(() => import('@/pages/RedirectPage/RedirectPage')); const OnboardingPage = lazy(() => import('@/pages/OnboardingPage/OnboardingPage')); const TimerPage = lazy(() => import('@/pages/TimerPage/TimerPage')); diff --git a/src/app/shared/apisV2/setting/setting.mutations.ts b/src/app/shared/apisV2/setting/setting.mutations.ts index 82a5b6b1..6bdb1a76 100644 --- a/src/app/shared/apisV2/setting/setting.mutations.ts +++ b/src/app/shared/apisV2/setting/setting.mutations.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { reloginWithoutLogout } from '@/shared/utils/auth'; +import { useLogout } from '@/shared/hooks/useLogout'; import { deleteAccount, putChangeProfile } from './setting.api'; import { settingKeys } from './setting.keys'; @@ -18,12 +18,13 @@ export const usePutChangeProfile = () => { export const useDeleteAccount = () => { const queryClient = useQueryClient(); + const { handleLogout } = useLogout(); return useMutation({ mutationFn: deleteAccount, onSuccess: () => { queryClient.invalidateQueries(); - reloginWithoutLogout(); + handleLogout(); }, }); }; diff --git a/src/app/shared/assets/lotties/main_motion.json b/src/app/shared/assets/lotties/main_motion.json new file mode 100644 index 00000000..90873b06 --- /dev/null +++ b/src/app/shared/assets/lotties/main_motion.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.7","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":180.00000733155,"w":600,"h":310,"nm":"로고 최종","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 15","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":127,"s":[0]},{"t":132.600004964603,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-187.325,-19.9],[-187.325,-6.8],[-186.175,-6.8],[-186.175,-12.9],[-182.775,-12.9],[-182.775,-13.925],[-186.175,-13.925],[-186.175,-19.9]],"c":true},"ix":2},"nm":"당","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.492,0.109],[-1.584,0.3],[0,0],[1.45,-0.108],[2.233,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[2.2,0],[1.491,-0.108],[0,0],[-1.517,0.3],[-1.45,0.109],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-201.6,-8.925],[-200.025,-8.925],[-194.487,-9.087],[-189.875,-9.7],[-190.05,-10.7],[-194.5,-10.087],[-200.025,-9.925],[-200.475,-9.925],[-200.475,-17.1],[-192.2,-17.1],[-192.2,-18.1],[-201.6,-18.1]],"c":true},"ix":2},"nm":"당","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,-1.25],[-1.234,-0.691],[-2.167,0],[-1.234,0.691],[0,1.25],[1.233,0.7],[2.166,0],[1.233,-0.7]],"o":[[0,1.25],[1.233,0.691],[2.166,0],[1.233,-0.691],[0,-1.25],[-1.234,-0.7],[-2.167,0],[-1.234,0.7]],"v":[[-199.875,-2.35],[-198.025,0.562],[-192.925,1.6],[-187.825,0.562],[-185.975,-2.35],[-187.825,-5.275],[-192.925,-6.325],[-198.025,-5.275]],"c":true},"ix":2},"nm":"당","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.884],[-1.059,0.542],[-1.767,0],[-1.059,-0.541],[0,-0.916],[1.058,-0.55],[1.75,0],[1.066,0.55]],"o":[[0,-0.916],[1.058,-0.541],[1.75,0],[1.058,0.542],[0,0.884],[-1.059,0.55],[-1.75,0],[-1.067,-0.55]],"v":[[-198.75,-2.35],[-197.162,-4.538],[-192.925,-5.35],[-188.712,-4.538],[-187.125,-2.35],[-188.712,-0.2],[-192.925,0.625],[-197.15,-0.2]],"c":true},"ix":2},"nm":"당","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"당","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 14","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":128.867,"s":[0]},{"t":134.46700642872,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-163.05,-19.875],[-163.05,-4.05],[-161.9,-4.05],[-161.9,-19.875]],"c":true},"ix":2},"nm":"신","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1,-0.433],[0,0],[-1,1.142],[-0.417,1.434],[-0.992,-1.066],[-1.267,-0.533],[0,0],[0.858,0.792],[0.516,1.042],[0,1.134],[0,0],[0,0],[0,0],[0.508,-1.1],[0.85,-0.833]],"o":[[0,0],[1.266,-0.583],[1,-1.141],[0.433,1.35],[0.991,1.067],[0,0],[-1.017,-0.4],[-0.859,-0.791],[-0.517,-1.041],[0,0],[0,0],[0,0],[0,1.184],[-0.509,1.1],[-0.85,0.834]],"v":[[-178.925,-8.2],[-178.275,-7.275],[-174.875,-9.863],[-172.75,-13.725],[-170.612,-10.1],[-167.225,-7.7],[-166.575,-8.625],[-169.387,-10.413],[-171.45,-13.163],[-172.225,-16.425],[-172.225,-18.7],[-173.35,-18.7],[-173.35,-16.425],[-174.112,-13],[-176.15,-10.1]],"c":true},"ix":2},"nm":"신","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-175.375,1.1],[-161.15,1.1],[-161.15,0.1],[-174.2,0.1],[-174.2,-5.45],[-175.375,-5.45]],"c":true},"ix":2},"nm":"신","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"신","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 13","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":130.733,"s":[0]},{"t":136.333007536123,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0.858,-0.408],[0.475,-0.741],[0,-0.966],[-0.475,-0.741],[-0.859,-0.408],[-1.117,0],[-0.85,0.409],[-0.475,0.742],[0,0.967],[0.475,0.742],[0.85,0.409]],"o":[[-1.117,0],[-0.859,0.409],[-0.475,0.742],[0,0.967],[0.475,0.742],[0.858,0.409],[1.1,0],[0.85,-0.408],[0.475,-0.741],[0,-0.966],[-0.475,-0.741],[-0.85,-0.408]],"v":[[-148.95,-18.225],[-151.912,-17.613],[-153.912,-15.887],[-154.625,-13.325],[-153.912,-10.762],[-151.912,-9.038],[-148.95,-8.425],[-146.025,-9.038],[-144.037,-10.762],[-143.325,-13.325],[-144.037,-15.887],[-146.025,-17.613]],"c":true},"ix":2},"nm":"의","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.95,0],[0,0],[-2.242,0.109],[-2.184,0.4],[0,0],[2.275,-0.083]],"o":[[0,0],[2.883,0],[2.241,-0.108],[0,0],[-2.117,0.334],[-2.275,0.084]],"v":[[-155.875,-4.35],[-155.675,-3.3],[-147.987,-3.462],[-141.35,-4.225],[-141.45,-5.1],[-148.037,-4.475]],"c":true},"ix":2},"nm":"의","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0.734],[-0.384,0.584],[-0.692,0.334],[-0.884,0],[-0.684,-0.333],[-0.392,-0.591],[0,-0.733],[0.391,-0.591],[0.683,-0.333],[0.85,0],[0.691,0.334],[0.383,0.592]],"o":[[0,-0.75],[0.383,-0.583],[0.691,-0.333],[0.85,0],[0.683,0.334],[0.391,0.592],[0,0.734],[-0.392,0.592],[-0.684,0.334],[-0.884,0],[-0.692,-0.333],[-0.384,-0.591]],"v":[[-153.5,-13.325],[-152.925,-15.325],[-151.312,-16.7],[-148.95,-17.2],[-146.65,-16.7],[-145.037,-15.312],[-144.45,-13.325],[-145.037,-11.337],[-146.65,-9.95],[-148.95,-9.45],[-151.312,-9.95],[-152.925,-11.337]],"c":true},"ix":2},"nm":"의","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-139.9,1.675],[-138.725,1.675],[-138.725,-19.9],[-139.9,-19.9]],"c":true},"ix":2},"nm":"의","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"의","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 12","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132.6,"s":[0]},{"t":138.200001854835,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.192,0.792],[0,1.267],[0.658,0.675],[1.208,0.367],[1.583,0],[1.2,-0.366],[0.658,-0.675],[0,-0.916],[-1.175,-0.791],[-2.034,-0.15],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.033,-0.15],[1.191,-0.791],[0,-0.916],[-0.659,-0.675],[-1.209,-0.366],[-1.6,0],[-1.2,0.367],[-0.659,0.675],[0,1.267],[1.175,0.792],[0,0],[0,0]],"v":[[-125.55,-8.65],[-125.55,-6.45],[-105.45,-6.45],[-105.45,-8.65],[-114.15,-8.65],[-114.15,-10.625],[-109.312,-12.038],[-107.525,-15.125],[-108.512,-17.512],[-111.312,-19.075],[-115.5,-19.625],[-119.7,-19.075],[-122.487,-17.512],[-123.475,-15.125],[-121.712,-12.038],[-116.9,-10.625],[-116.9,-8.65]],"c":true},"ix":2},"nm":"온","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-123.05,1.575],[-107.7,1.575],[-107.7,-0.625],[-120.325,-0.625],[-120.325,-4.85],[-123.05,-4.85]],"c":true},"ix":2},"nm":"온","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0.75],[-0.909,0.4],[-1.617,0],[-0.9,-0.4],[0,-0.733],[0.9,-0.408],[1.616,0],[0.908,0.409]],"o":[[0,-0.733],[0.908,-0.4],[1.616,0],[0.9,0.4],[0,0.75],[-0.9,0.409],[-1.617,0],[-0.909,-0.408]],"v":[[-120.65,-15.125],[-119.287,-16.825],[-115.5,-17.425],[-111.725,-16.825],[-110.375,-15.125],[-111.725,-13.387],[-115.5,-12.775],[-119.287,-13.387]],"c":true},"ix":2},"nm":"온","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"온","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 11","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":134.467,"s":[0]},{"t":140.067003318953,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-90.3,-14.35],[-90.3,-12.125],[-86.425,-12.125],[-86.425,-4],[-83.675,-4],[-83.675,-20.225],[-86.425,-20.225],[-86.425,-14.35]],"c":true},"ix":2},"nm":"전","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.7,-0.583],[0,0],[-0.925,0.9],[-0.484,1.2],[-0.875,-0.8],[-1.2,-0.416],[0,0],[0.908,1.225],[0,1.417],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.95,-1.3]],"o":[[0,0],[1.283,-0.433],[0.925,-0.9],[0.5,1.1],[0.875,0.8],[0,0],[-1.634,-0.55],[-0.909,-1.225],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.534],[-0.95,1.3]],"v":[[-102.225,-8.75],[-100.825,-6.575],[-97.512,-8.575],[-95.4,-11.725],[-93.337,-8.875],[-90.225,-7.05],[-88.875,-9.2],[-92.687,-11.863],[-94.05,-15.825],[-94.05,-16.425],[-89.5,-16.425],[-89.5,-18.625],[-101.45,-18.625],[-101.45,-16.425],[-96.825,-16.425],[-96.825,-15.825],[-98.25,-11.575]],"c":true},"ix":2},"nm":"전","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-98.2,1.575],[-83.125,1.575],[-83.125,-0.625],[-95.425,-0.625],[-95.425,-5.375],[-98.2,-5.375]],"c":true},"ix":2},"nm":"전","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"전","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 10","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":136.333,"s":[0]},{"t":141.933004426355,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-64.1,-20.225],[-64.1,-3.575],[-61.35,-3.575],[-61.35,-10.975],[-58.25,-10.975],[-58.25,-13.25],[-61.35,-13.25],[-61.35,-20.225]],"c":true},"ix":2},"nm":"한","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-78.725,-15.6],[-65.625,-15.6],[-65.625,-17.775],[-70.8,-17.775],[-70.8,-20.25],[-73.55,-20.25],[-73.55,-17.775],[-78.725,-17.775]],"c":true},"ix":2},"nm":"한","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,-0.833],[-0.459,-0.65],[-0.817,-0.35],[-1.05,0],[-0.825,0.35],[-0.459,0.65],[0,0.834],[0.458,0.642],[0.825,0.35],[1.05,0],[0.816,-0.35],[0.458,-0.641]],"o":[[0,0.834],[0.458,0.65],[0.816,0.35],[1.05,0],[0.825,-0.35],[0.458,-0.65],[0,-0.833],[-0.459,-0.641],[-0.825,-0.35],[-1.05,0],[-0.817,0.35],[-0.459,0.642]],"v":[[-77.575,-10.4],[-76.887,-8.175],[-74.975,-6.675],[-72.175,-6.15],[-69.362,-6.675],[-67.437,-8.175],[-66.75,-10.4],[-67.437,-12.613],[-69.362,-14.1],[-72.175,-14.625],[-74.975,-14.1],[-76.887,-12.613]],"c":true},"ix":2},"nm":"한","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-75.5,1.575],[-60.45,1.575],[-60.45,-0.625],[-72.75,-0.625],[-72.75,-4.875],[-75.5,-4.875]],"c":true},"ix":2},"nm":"한","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0.667],[-0.509,0.375],[-0.834,0],[-0.509,-0.375],[0,-0.666],[0.508,-0.375],[0.833,0],[0.508,0.375]],"o":[[0,-0.666],[0.508,-0.375],[0.833,0],[0.508,0.375],[0,0.667],[-0.509,0.375],[-0.834,0],[-0.509,-0.375]],"v":[[-74.95,-10.4],[-74.187,-11.962],[-72.175,-12.525],[-70.162,-11.962],[-69.4,-10.4],[-70.162,-8.837],[-72.175,-8.275],[-74.187,-8.837]],"c":true},"ix":2},"nm":"한","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"한","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 9","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":138.2,"s":[0]},{"t":143.800005890473,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-48.05,-10.925],[-48.05,-8.725],[-27.95,-8.725],[-27.95,-10.925],[-36.65,-10.925],[-36.65,-12.65],[-30.525,-12.65],[-30.525,-19.525],[-45.525,-19.525],[-45.525,-12.65],[-39.425,-12.65],[-39.425,-10.925]],"c":true},"ix":2},"nm":"몰","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-45.725,-5.275],[-33.15,-5.275],[-33.15,-3.825],[-45.65,-3.825],[-45.65,1.825],[-29.825,1.825],[-29.825,-0.25],[-42.975,-0.25],[-42.975,-1.9],[-30.45,-1.9],[-30.45,-7.325],[-45.725,-7.325]],"c":true},"ix":2},"nm":"몰","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-42.825,-14.775],[-42.825,-17.4],[-33.225,-17.4],[-33.225,-14.775]],"c":true},"ix":2},"nm":"몰","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"몰","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 8","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140.067,"s":[0]},{"t":145.66700735459,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.05,-20.225],[-9.05,-8.3],[-6.3,-8.3],[-6.3,-20.225]],"c":true},"ix":2},"nm":"입","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-1],[-0.517,-0.783],[-0.9,-0.441],[-1.134,0],[-0.9,0.442],[-0.517,0.784],[0,1.017],[0.516,0.784],[0.9,0.442],[1.133,0],[0.9,-0.441],[0.516,-0.783]],"o":[[0,1.017],[0.516,0.784],[0.9,0.442],[1.133,0],[0.9,-0.441],[0.516,-0.783],[0,-1],[-0.517,-0.783],[-0.9,-0.441],[-1.134,0],[-0.9,0.442],[-0.517,0.784]],"v":[[-24.275,-14.075],[-23.5,-11.375],[-21.375,-9.538],[-18.325,-8.875],[-15.275,-9.538],[-13.15,-11.375],[-12.375,-14.075],[-13.15,-16.75],[-15.275,-18.588],[-18.325,-19.25],[-21.375,-18.588],[-23.5,-16.75]],"c":true},"ix":2},"nm":"입","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0.884],[-0.609,0.534],[-0.967,0],[-0.609,-0.533],[0,-0.883],[0.608,-0.533],[0.966,0],[0.608,0.534]],"o":[[0,-0.883],[0.608,-0.533],[0.966,0],[0.608,0.534],[0,0.884],[-0.609,0.534],[-0.967,0],[-0.609,-0.533]],"v":[[-21.6,-14.075],[-20.687,-16.2],[-18.325,-17],[-15.962,-16.2],[-15.05,-14.075],[-15.962,-11.95],[-18.325,-11.15],[-20.687,-11.95]],"c":true},"ix":2},"nm":"입","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.9,1.75],[-6.3,1.75],[-6.3,-7.25],[-9,-7.25],[-9,-4.95],[-18.175,-4.95],[-18.175,-7.25],[-20.9,-7.25]],"c":true},"ix":2},"nm":"입","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-18.175,-0.45],[-18.175,-2.825],[-9,-2.825],[-9,-0.45]],"c":true},"ix":2},"nm":"입","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"입","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 7","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":141.933,"s":[0]},{"t":147.533008461993,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.35,0],[1.308,-0.65],[0,-1.216],[-1.309,-0.658],[-2.334,0],[-1.309,0.659],[0,1.2],[1.3,0.65]],"o":[[-2.334,0],[-1.309,0.65],[0,1.2],[1.308,0.659],[2.333,0],[1.308,-0.658],[0,-1.216],[-1.3,-0.65]],"v":[[8.75,-19.475],[3.288,-18.5],[1.325,-15.7],[3.288,-12.913],[8.75,-11.925],[14.213,-12.913],[16.175,-15.7],[14.225,-18.5]],"c":true},"ix":2},"nm":"을","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.975,-9.175],[18.5,-9.175],[18.5,-10.15],[-0.975,-10.15]],"c":true},"ix":2},"nm":"을","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.475,-5.925],[14.775,-5.925],[14.775,-3.45],[1.55,-3.45],[1.55,1.35],[16.6,1.35],[16.6,0.375],[2.675,0.375],[2.675,-2.525],[15.9,-2.525],[15.9,-6.875],[1.475,-6.875]],"c":true},"ix":2},"nm":"을","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.884],[-1.125,0.509],[-1.917,0],[-1.125,-0.508],[0,-0.883],[1.125,-0.5],[1.916,0],[1.125,0.5]],"o":[[0,-0.883],[1.125,-0.508],[1.916,0],[1.125,0.509],[0,0.884],[-1.125,0.5],[-1.917,0],[-1.125,-0.5]],"v":[[2.5,-15.7],[4.188,-17.788],[8.75,-18.55],[13.313,-17.788],[15,-15.7],[13.313,-13.625],[8.75,-12.875],[4.188,-13.625]],"c":true},"ix":2},"nm":"을","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"을","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 6","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":143.8,"s":[0]},{"t":149.400002780705,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[32.375,-18.025],[32.375,-8.525],[38.9,-8.525],[38.9,-2.275],[29.725,-2.275],[29.725,-1.25],[49.3,-1.25],[49.3,-2.275],[40.025,-2.275],[40.025,-8.525],[46.9,-8.525],[46.9,-9.5],[33.525,-9.5],[33.525,-17.025],[46.65,-17.025],[46.65,-18.025]],"c":true},"ix":2},"nm":"도","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"도","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 5","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":145.667,"s":[0]},{"t":151.267004244823,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.083,0],[0.85,-0.408],[0.466,-0.741],[0,-0.966],[-0.917,-0.883],[-1.5,-0.1],[0,0],[2.166,0],[0,0],[-2.267,0.109],[-2.034,0.317],[0,0],[2.3,-0.083],[0,0],[-0.909,0.875],[0,1.384],[0.466,0.742],[0.85,0.409]],"o":[[-1.084,0],[-0.85,0.409],[-0.467,0.742],[0,1.384],[0.916,0.884],[0,0],[-1.95,0.067],[0,0],[2.533,0],[2.266,-0.108],[0,0],[-2,0.267],[0,0],[1.5,-0.116],[0.908,-0.875],[0,-0.966],[-0.467,-0.741],[-0.85,-0.408]],"v":[[59.625,-18.4],[56.725,-17.788],[54.75,-16.062],[54.05,-13.5],[55.425,-10.1],[59.05,-8.625],[59.05,-4.4],[52.875,-4.3],[53.125,-3.275],[60.325,-3.438],[66.775,-4.075],[66.675,-4.975],[60.225,-4.45],[60.225,-8.625],[63.838,-10.113],[65.2,-13.5],[64.5,-16.062],[62.525,-17.788]],"c":true},"ix":2},"nm":"와","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.75],[-0.384,0.592],[-0.675,0.334],[-0.85,0],[-0.675,-0.333],[-0.384,-0.591],[0,-0.75],[0.383,-0.591],[0.675,-0.333],[0.85,0],[0.675,0.334],[0.383,0.592]],"o":[[0,-0.75],[0.383,-0.591],[0.675,-0.333],[0.85,0],[0.675,0.334],[0.383,0.592],[0,0.75],[-0.384,0.592],[-0.675,0.334],[-0.85,0],[-0.675,-0.333],[-0.384,-0.591]],"v":[[55.175,-13.5],[55.75,-15.512],[57.338,-16.9],[59.625,-17.4],[61.913,-16.9],[63.5,-15.512],[64.075,-13.5],[63.5,-11.488],[61.913,-10.1],[59.625,-9.6],[57.338,-10.1],[55.75,-11.488]],"c":true},"ix":2},"nm":"와","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[68.2,1.675],[69.35,1.675],[69.35,-9.675],[73.2,-9.675],[73.2,-10.675],[69.35,-10.675],[69.35,-19.9],[68.2,-19.9]],"c":true},"ix":2},"nm":"와","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"와","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 4","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":147.533,"s":[0]},{"t":153.133005352225,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.525,-10.6],[76.525,-9.6],[85.675,-9.6],[85.675,-6.9],[78.975,-6.9],[78.975,-5.925],[92.275,-5.925],[92.275,-3.3],[79.05,-3.3],[79.05,1.375],[94.1,1.375],[94.1,0.375],[80.175,0.375],[80.175,-2.375],[93.4,-2.375],[93.4,-6.9],[86.825,-6.9],[86.825,-9.6],[96,-9.6],[96,-10.6]],"c":true},"ix":2},"nm":"줄","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.183,-0.133],[0,0],[-1.559,0.734],[-0.567,1.15],[-1.55,-0.741],[-1.75,-0.233],[0,0],[1.233,0.442],[0.825,0.717],[0,0.9],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.825,-0.716],[1.233,-0.441]],"o":[[0,0],[1.766,-0.233],[1.558,-0.733],[0.566,1.134],[1.55,0.742],[0,0],[-1.184,-0.133],[-1.234,-0.441],[-0.825,-0.716],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.9],[-0.825,0.717],[-1.234,0.442]],"v":[[77.7,-12.9],[78.125,-11.975],[83.113,-13.425],[86.3,-16.25],[89.475,-13.438],[94.425,-11.975],[94.85,-12.9],[91.225,-13.762],[88.138,-15.5],[86.9,-17.925],[86.9,-18.05],[94.25,-18.05],[94.25,-19.075],[78.35,-19.075],[78.35,-18.05],[85.65,-18.05],[85.65,-17.925],[84.413,-15.5],[81.325,-13.762]],"c":true},"ix":2},"nm":"줄","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"줄","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 3","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":149.4,"s":[0]},{"t":154.999999670938,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.941,-1.283],[1.733,-0.566],[0,0],[-0.909,0.859],[-0.5,1.167],[-0.875,-0.791],[-1.2,-0.4],[0,0],[0.9,1.209],[0,1.434],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,1.534],[-0.942,1.284],[0,0],[1.266,-0.433],[0.908,-0.858],[0.5,1.067],[0.875,0.792],[0,0],[-1.684,-0.55],[-0.9,-1.208],[0,0],[0,0],[0,0],[0,0]],"v":[[107.475,-18.825],[107.475,-16.625],[112.125,-16.625],[112.125,-16.4],[110.713,-12.175],[106.7,-9.4],[108.15,-7.25],[111.413,-9.188],[113.525,-12.225],[115.588,-9.438],[118.7,-7.65],[120.1,-9.8],[116.225,-12.438],[114.875,-16.4],[114.875,-16.625],[119.45,-16.625],[119.45,-18.825]],"c":true},"ix":2},"nm":"작","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109.675,-3.575],[121.6,-3.575],[121.6,2.025],[124.35,2.025],[124.35,-5.775],[109.675,-5.775]],"c":true},"ix":2},"nm":"작","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[121.6,-6.85],[124.35,-6.85],[124.35,-12.4],[127.45,-12.4],[127.45,-14.675],[124.35,-14.675],[124.35,-20.225],[121.6,-20.225]],"c":true},"ix":2},"nm":"작","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"작","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 2","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151.267,"s":[0]},{"t":156.86700828046,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.45,0],[0.891,-0.45],[0.5,-0.791],[0,-1.016],[-0.5,-0.791],[-0.892,-0.45],[-1.1,0],[-1.042,0.767],[-0.25,1.25],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.033,0.75]],"o":[[-1.1,0],[-0.892,0.45],[-0.5,0.792],[0,1.017],[0.5,0.792],[0.891,0.45],[1.466,0],[1.041,-0.766],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.267,-1.233],[-1.034,-0.75]],"v":[[136.45,-19.275],[133.463,-18.6],[131.375,-16.738],[130.625,-14.025],[131.375,-11.312],[133.463,-9.45],[136.45,-8.775],[140.213,-9.925],[142.15,-12.95],[146.075,-12.95],[146.075,-8.3],[148.825,-8.3],[148.825,-20.225],[146.075,-20.225],[146.075,-15.175],[142.125,-15.175],[140.175,-18.15]],"c":true},"ix":2},"nm":"업","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.884],[-0.592,0.542],[-0.95,0],[-0.592,-0.541],[0,-0.9],[0.591,-0.541],[0.933,0],[0.591,0.542]],"o":[[0,-0.9],[0.591,-0.541],[0.933,0],[0.591,0.542],[0,0.884],[-0.592,0.542],[-0.95,0],[-0.592,-0.541]],"v":[[133.25,-14.025],[134.138,-16.188],[136.45,-17],[138.738,-16.188],[139.625,-14.025],[138.738,-11.887],[136.45,-11.075],[134.138,-11.887]],"c":true},"ix":2},"nm":"업","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.25,1.75],[148.825,1.75],[148.825,-7.25],[146.1,-7.25],[146.1,-4.9],[137,-4.9],[137,-7.25],[134.25,-7.25]],"c":true},"ix":2},"nm":"업","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[137,-0.45],[137,-2.775],[146.1,-2.775],[146.1,-0.45]],"c":true},"ix":2},"nm":"업","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"업","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선 16","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":153.133,"s":[0]},{"t":158.733009387863,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.583,0],[1.175,-0.333],[0.641,-0.633],[0,-0.85],[-0.642,-0.625],[-1.175,-0.334],[-1.584,0],[-1.184,0.333],[-0.642,0.625],[0,0.85],[0.641,0.634],[1.183,0.334]],"o":[[-1.584,0],[-1.175,0.334],[-0.642,0.634],[0,0.85],[0.641,0.625],[1.175,0.333],[1.583,0],[1.183,-0.334],[0.641,-0.625],[0,-0.85],[-0.642,-0.633],[-1.184,-0.333]],"v":[[171,-6.3],[166.863,-5.8],[164.138,-4.35],[163.175,-2.125],[164.138,0.087],[166.863,1.525],[171,2.025],[175.15,1.525],[177.888,0.087],[178.85,-2.125],[177.888,-4.35],[175.15,-5.8]],"c":true},"ix":2},"nm":"ê³µ","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[161.075,-7.925],[181.125,-7.925],[181.125,-10.125],[171.55,-10.125],[171.55,-14.15],[168.825,-14.15],[168.825,-10.125],[161.075,-10.125]],"c":true},"ix":2},"nm":"ê³µ","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.066,-0.783],[0.25,-0.95],[0,0],[-0.067,0.867],[0,1.2],[0,0],[0,0]],"o":[[0,0],[0,1.017],[-0.067,0.784],[0,0],[0.266,-1.016],[0.066,-0.866],[0,0],[0,0],[0,0]],"v":[[163.375,-17],[175.95,-17],[175.85,-14.3],[175.375,-11.7],[178.075,-11.4],[178.575,-14.225],[178.675,-17.325],[178.675,-19.175],[163.375,-19.175]],"c":true},"ix":2},"nm":"ê³µ","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.65],[-0.892,0.367],[-1.617,0],[-0.892,-0.366],[0,-0.666],[0.891,-0.358],[1.616,0],[0.891,0.359]],"o":[[0,-0.666],[0.891,-0.366],[1.616,0],[0.891,0.367],[0,0.65],[-0.892,0.359],[-1.617,0],[-0.892,-0.358]],"v":[[165.9,-2.125],[167.238,-3.675],[171,-4.225],[174.763,-3.675],[176.1,-2.125],[174.763,-0.613],[171,-0.075],[167.238,-0.613]],"c":true},"ix":2},"nm":"ê³µ","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ê³µ","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"당신의 온전한 몰입을 도와줄 작업 공간 윤곽선","sr":0.80000001192093,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":155,"s":[0]},{"t":160.600003706575,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299,259.466,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105,105,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[199.1,-20.225],[199.1,-4.2],[201.85,-4.2],[201.85,-11.575],[204.95,-11.575],[204.95,-13.825],[201.85,-13.825],[201.85,-20.225]],"c":true},"ix":2},"nm":"간","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.516,-0.733],[0,0],[-1.8,2.067],[0,2.934],[0,0],[0,0],[0,0],[1.475,-1.333]],"o":[[0,0],[3.316,-0.966],[1.8,-2.066],[0,0],[0,0],[0,0],[-0.234,1.717],[-1.475,1.334]],"v":[[184.35,-8.675],[185.5,-6.5],[193.175,-11.05],[195.875,-18.55],[185.3,-18.55],[185.3,-16.35],[192.9,-16.35],[190.338,-11.775]],"c":true},"ix":2},"nm":"간","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[187.675,1.575],[202.7,1.575],[202.7,-0.625],[190.425,-0.625],[190.425,-5.825],[187.675,-5.825]],"c":true},"ix":2},"nm":"간","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"간","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":127.000000928965,"op":180.000003651559,"st":39.799999334653,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"stroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[305.5,154.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109,81],[72,-100.5]],"c":false},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"선 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"모양 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[-0.621]},"t":10.001,"s":[0]},{"t":15.0000006109625,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":0,"s":[0]},{"t":15.0000006109625,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"패스 다듬어 자르기 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":3,"nm":"o null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-45,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.664],"y":[1]},"o":{"x":[1],"y":[0]},"t":48.564,"s":[288.219]},{"t":61.5637525075429,"s":[251.219]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":59,"s":[143.218]},{"i":{"x":[0.606],"y":[1]},"o":{"x":[0.554],"y":[0]},"t":98,"s":[143.218]},{"i":{"x":[0.336],"y":[1]},"o":{"x":[0.329],"y":[0]},"t":103,"s":[129.218]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":109,"s":[143.218]},{"t":186.000007575935,"s":[143.218]}],"ix":4}},"a":{"a":0,"k":[50,7.028,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.434,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[23.4,0,0]},"t":11,"s":[47,0,100]},{"i":{"x":[0,0.214,0.667],"y":[1,1,1]},"o":{"x":[0.674,0.77,0.333],"y":[0,0,0]},"t":21,"s":[47,47,100]},{"i":{"x":[0.383,0.67,0.667],"y":[-4.033,1.023,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":24.659,"s":[47,4.047,100]},{"i":{"x":[0.478,0.48,0.667],"y":[1,1,1]},"o":{"x":[0.664,0.828,0.333],"y":[8.796,0.085,0]},"t":26.25,"s":[47,47,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":28.836,"s":[47,0.012,100]},{"i":{"x":[0.118,0.198,0.667],"y":[1,1,1]},"o":{"x":[0.859,0.862,0.333],"y":[0,0,0]},"t":30.625,"s":[47,47,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.46,0.46,0.333],"y":[0,0,0]},"t":35,"s":[47,0.005,100]},{"i":{"x":[0.837,0.837,0.837],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":46,"s":[47,47,100]},{"i":{"x":[0,0,1],"y":[1,1,1]},"o":{"x":[0.355,0.355,0.333],"y":[0,0,0]},"t":61,"s":[25,25,100]},{"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":64,"s":[28.5,28.5,100]},{"t":68.0000027696968,"s":[25,25,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"1번쩨 원 윤곽선 2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[50,-12.399,0],"ix":2},"a":{"a":0,"k":[76.104,76.104,0],"ix":1},"s":{"a":0,"k":[72.914,72.914,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[33.691,-33.691],[-33.691,-33.691],[0,0],[0,0]],"o":[[-33.691,33.691],[0,0],[0,0],[-33.691,-33.691]],"v":[[-44.158,-44.157],[-44.158,77.848],[16.846,16.845],[77.848,-44.157]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[76.594,73.923],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0,0.949019610882,0.776470601559,1]},{"t":92.0000037472368,"s":[0.023529411765,1,0.823529411765,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"2번재 원 윤곽선 2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[50.243,38.004,0],"ix":2},"a":{"a":0,"k":[152.863,152.859,0],"ix":1},"s":{"a":0,"k":[72.914,72.914,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[33.691,-33.691],[33.691,33.691],[0,0],[-67.381,67.381],[67.382,67.382]],"o":[[33.691,33.691],[-33.691,33.691],[0,0],[67.382,67.381],[67.382,-67.382],[0,0]],"v":[[27.312,-94.693],[27.312,27.312],[-94.694,27.312],[-155.696,88.315],[88.314,88.315],[88.314,-155.696]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[155.946,155.946],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0,0.949019610882,0.776470601559,1]},{"t":92.0000037472368,"s":[0.023529411765,1,0.823529411765,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"3번째 원 윤곽선 2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[50,-46.252,0],"ix":2},"a":{"a":0,"k":[233.617,233.617,0],"ix":1},"s":{"a":0,"k":[72.914,72.914,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[101.072,-101.073],[-101.072,-101.073],[0,0],[-67.382,67.382],[-67.381,-67.381],[0,0]],"o":[[-101.072,101.072],[0,0],[-67.382,-67.382],[67.381,-67.381],[0,0],[-101.073,-101.073]],"v":[[-141.242,-141.242],[-141.242,224.774],[-80.239,163.771],[-80.239,-80.24],[163.771,-80.24],[224.774,-141.242]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[242.564,242.565],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0,0.949019610882,0.776470601559,1]},{"t":92.0000037472368,"s":[0.023529411765,1,0.823529411765,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"4번째 원 윤곽선 2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[50,74.755,0],"ix":2},"a":{"a":0,"k":[310.897,310.897,0],"ix":1},"s":{"a":0,"k":[72.914,72.914,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[134.763,134.763],[0,0],[-101.072,101.073],[101.073,101.072],[0,0],[134.763,-134.763]],"o":[[0,0],[101.072,101.073],[101.073,-101.072],[0,0],[134.763,134.764],[-134.763,134.763]],"v":[[-297.905,190.116],[-236.902,129.113],[129.113,129.113],[129.113,-236.902],[190.116,-297.905],[190.116,190.116]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[298.155,298.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0,0.949019610882,0.776470601559,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0,0.949019610882,0.776470601559,1]},{"t":92.0000037472368,"s":[0.023529411765,1,0.823529411765,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":3,"nm":"Null 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[316,208,0],"ix":2},"a":{"a":0,"k":[826.923,511.538,0],"ix":1},"s":{"a":0,"k":[42,42,100],"ix":6}},"ao":0,"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"M 윤곽선","parent":23,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[0]},{"t":79.5037532382541,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":358.38,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.921],"y":[0]},"t":62.293,"s":[685.428]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.204],"y":[0]},"t":79.504,"s":[202.056]},{"i":{"x":[0.553],"y":[1]},"o":{"x":[0.19],"y":[0]},"t":85,"s":[321.541]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":95,"s":[321.541]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":100,"s":[294.541]},{"t":106.000004317469,"s":[321.541]}],"ix":4}},"a":{"a":0,"k":[109.326,113.111,0],"ix":1},"s":{"a":0,"k":[155,155,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-109.076,112.861],[-109.076,-112.861],[-75.747,-112.861],[0.676,-6.953],[75.746,-112.861],[109.076,-112.861],[109.076,112.861],[73.626,112.861],[73.626,-48.893],[1.816,49.235],[-1.825,49.235],[-73.324,-50.611],[-73.324,112.861]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.325,113.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"m_트랙매트","parent":23,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[673,451,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,144.139,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1252.227,443.164],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"사각형 패스 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":3,"ix":10},"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"그라디언트 선 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.113,-210.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[106.772,111.321],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"사각형 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"R 윤곽선","parent":23,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":66,"s":[0]},{"t":83.5037534011775,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":855.604,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.921],"y":[0]},"t":66.293,"s":[685.428]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.204],"y":[0]},"t":83.504,"s":[202.056]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.204],"y":[0]},"t":89,"s":[243.611]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":101,"s":[243.611]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":106,"s":[206.611]},{"t":112.000004561854,"s":[243.611]}],"ix":4}},"a":{"a":0,"k":[0.001,0.001,0],"ix":1},"s":{"a":0,"k":[155,155,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.87,6.868],[-11.31,0],[0,0],[0,0],[0,0],[8.08,-4.847],[3.58,-7.003],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-12.928],[7.07,-7.069],[0,0],[0,0],[0,0],[-11.31,0],[-6.13,3.522],[0,0],[0,0]],"v":[[-43.175,-80.896],[-43.175,83.017],[-8.935,83.017],[-8.935,-11.513],[1.365,-41.206],[28.935,-51.81],[43.175,-51.81],[43.175,-83.017],[33.175,-83.017],[4.095,-75.746],[-10.455,-59.959],[-10.455,-80.896]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.425,83.267],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"r_트랙매트","parent":23,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[673,451,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,166.209,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1252.227,443.164],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"사각형 패스 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":3,"ix":10},"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"그라디언트 선 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.113,-210.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[106.772,111.321],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"사각형 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"I 윤곽선","parent":23,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":70,"s":[0]},{"t":87.5037535641008,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":1049.18,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.921],"y":[0]},"t":70.293,"s":[685.428]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.204],"y":[0]},"t":87.504,"s":[202.056]},{"i":{"x":[0.323],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93.241,"s":[323.439]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":104,"s":[321.541]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":109,"s":[294.541]},{"t":115.000004684046,"s":[321.541]}],"ix":4}},"a":{"a":0,"k":[17.37,113.111,0],"ix":1},"s":{"a":0,"k":[155,155,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.12,-112.861],[17.12,-112.861],[17.12,-73.473],[-17.12,-73.473]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-17.12,-73.473]],"c":false},"ix":2},"nm":"패스 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.12,-51.052],[17.12,-51.052],[17.12,112.861],[-17.12,112.861]],"c":true},"ix":2},"nm":"패스 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.37,113.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"i_트랙매트","parent":23,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[673,451,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,166.209,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1252.227,443.164],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"사각형 패스 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":3,"ix":10},"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"그라디언트 선 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.113,-210.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[106.772,111.321],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"사각형 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"B 윤곽선","parent":23,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":74,"s":[0]},{"t":91.5037537270241,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":1254.769,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.921],"y":[0]},"t":74.293,"s":[685.428]},{"i":{"x":[0.797],"y":[1]},"o":{"x":[0.204],"y":[0]},"t":91.504,"s":[202.056]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[321.541]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":107,"s":[327.428]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":112,"s":[294.541]},{"t":118.000004806239,"s":[321.541]}],"ix":4}},"a":{"a":0,"k":[85.08,116.746,0],"ix":1},"s":{"a":0,"k":[155,155,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.49,0],[-7.48,4.646],[-4.24,8.08],[0,10.301],[4.44,8.079],[7.47,4.645],[9.7,0],[7.68,-4.646],[4.45,-8.08],[0,-10.302],[-4.24,-8.281],[-7.47,-4.646]],"o":[[9.7,0],[7.47,-4.646],[4.44,-8.281],[0,-10.302],[-4.24,-8.08],[-7.48,-4.646],[-9.49,0],[-7.47,4.645],[-4.24,8.079],[0,10.301],[4.45,8.08],[7.68,4.646]],"v":[[-0.61,84.684],[25.15,77.715],[42.72,58.627],[49.39,30.753],[42.72,3.182],[25.15,-15.906],[-0.61,-22.876],[-26.36,-15.906],[-44.24,3.182],[-50.6,30.753],[-44.24,58.627],[-26.36,77.715]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[15.75,0],[10.51,5.252],[5.23,7.005],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.33,3.808],[-12.93,0],[-12.32,-7.473],[-7.07,-12.927],[0,-16.159],[7.27,-12.927],[12.32,-7.675]],"o":[[-12.73,0],[-8.1,-4.131],[0,0],[0,0],[0,0],[0,0],[0,0],[5.2,-5.932],[10.1,-5.252],[15.55,0],[12.52,7.474],[7.27,12.928],[0,16.159],[-7.07,12.928],[-12.32,7.474]],"v":[[2.73,116.497],[-32.12,108.618],[-52.11,91.915],[-52.11,112.861],[-84.83,112.861],[-84.83,-116.497],[-50.6,-116.497],[-50.6,-32.2],[-31.81,-46.811],[2.73,-54.688],[44.54,-43.479],[73.93,-12.877],[84.83,30.753],[73.93,74.382],[44.84,105.286]],"c":true},"ix":2},"nm":"패스 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.08,116.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"그룹 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"b_트랙매트","parent":23,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[673,451,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,155.174,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1252.227,443.164],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"사각형 패스 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":3,"ix":10},"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"그라디언트 선 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.023529411765,1,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"ì¹  1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.113,-210.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[106.772,111.321],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"사각형 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":180.00000733155,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/app/shared/config/auth.ts b/src/app/shared/config/auth.ts new file mode 100644 index 00000000..b56bbb57 --- /dev/null +++ b/src/app/shared/config/auth.ts @@ -0,0 +1,28 @@ +import { redirect } from 'react-router-dom'; + +import { ROUTES_CONFIG } from '@/router/routesConfig'; + +import { getAccessToken, getIsOnboardingCompleted } from '../utils/auth'; + +export const authConfig = { + google: { + url: { + react: import.meta.env.VITE_GOOGLE_URL, + electron: import.meta.env.VITE_ELECTRON_AUTH_URL, + }, + }, + + isAuthenticated: () => { + const accessToken = getAccessToken(); + return !!accessToken; + }, + + isOnboardingCompleted: () => { + const isOnboardingCompleted = getIsOnboardingCompleted(); + return !!isOnboardingCompleted; + }, + + redirectToLogin: () => { + redirect(ROUTES_CONFIG.login.path); + }, +}; diff --git a/src/app/shared/hooks/useLogout.ts b/src/app/shared/hooks/useLogout.ts new file mode 100644 index 00000000..8ac706bb --- /dev/null +++ b/src/app/shared/hooks/useLogout.ts @@ -0,0 +1,16 @@ +import { useNavigate } from 'react-router-dom'; + +import { ROUTES_CONFIG } from '@/router/routesConfig'; + +import { removeAllTokens } from '../utils/auth'; + +export const useLogout = () => { + const navigate = useNavigate(); + + const handleLogout = () => { + removeAllTokens(); + navigate(ROUTES_CONFIG.login.path, { replace: true }); + }; + + return { handleLogout }; +}; diff --git a/src/app/shared/layout/Sidebar/ModalContentsSetting/AccountContent/AccountContent.tsx b/src/app/shared/layout/Sidebar/ModalContentsSetting/AccountContent/AccountContent.tsx index 970db44b..873e1394 100644 --- a/src/app/shared/layout/Sidebar/ModalContentsSetting/AccountContent/AccountContent.tsx +++ b/src/app/shared/layout/Sidebar/ModalContentsSetting/AccountContent/AccountContent.tsx @@ -4,7 +4,7 @@ import ButtonRadius8 from '@/shared/components/ButtonRadius8/ButtonRadius8'; import ButtonStatusToggle from '@/shared/components/ButtonStatusToggle/ButtonStatusToggle'; import ModalWrapper, { ModalWrapperRef } from '@/shared/components/ModalWrapper/ModalWrapper'; -import { reloginWithoutLogout } from '@/shared/utils/auth'; +import { useLogout } from '@/shared/hooks/useLogout'; import { UserProfileType } from '@/shared/types/profile'; @@ -19,12 +19,15 @@ type AccountContentProps = UserProfileType; const AccountContent = ({ ...props }: AccountContentProps) => { const logoutModalRef = useRef(null); const deleteAccountModalRef = useRef(null); + const { mutate: changeProfile } = usePutChangeProfile(); const { mutate: deleteAccount } = useDeleteAccount(); const [isToggleOn, setIsToggleOn] = useState(props.isPushEnabled); const [userName, setUserName] = useState(props.name); + const { handleLogout } = useLogout(); + const handleToggle = () => setIsToggleOn((prev) => !prev); const handleNameChange = (e: React.ChangeEvent) => { @@ -52,7 +55,7 @@ const AccountContent = ({ ...props }: AccountContentProps) => { }; const handleDeleteAccount = () => { - deleteAccount(undefined, { onSuccess: reloginWithoutLogout }); + deleteAccount(undefined, { onSuccess: handleLogout }); }; return ( @@ -122,7 +125,7 @@ const AccountContent = ({ ...props }: AccountContentProps) => { {(_) => ( diff --git a/src/app/shared/utils/auth.ts b/src/app/shared/utils/auth.ts index 84d44f77..b9e43455 100644 --- a/src/app/shared/utils/auth.ts +++ b/src/app/shared/utils/auth.ts @@ -32,3 +32,18 @@ export const getRefreshToken = () => { export const setRefreshToken = (refreshToken: string) => { localStorage.setItem('refreshToken', refreshToken); }; + +export const getIsOnboardingCompleted = () => { + const isOnboardingCompleted = localStorage.getItem('isOnboardingCompleted'); + return isOnboardingCompleted; +}; + +export const setIsOnboardingCompleted = (isOnboardingCompleted: string) => { + localStorage.setItem('isOnboardingCompleted', isOnboardingCompleted); +}; + +export const removeAllTokens = () => { + localStorage.removeItem('accessToken'); + localStorage.removeItem('refreshToken'); + localStorage.removeItem('isOnboardingCompleted'); +}; diff --git a/src/electron/contants/protocol.ts b/src/electron/contants/protocol.ts new file mode 100644 index 00000000..ad2070b9 --- /dev/null +++ b/src/electron/contants/protocol.ts @@ -0,0 +1 @@ +export const DEFAULT_PROTOCOL = 'morib'; diff --git a/src/electron/main.ts b/src/electron/main.ts index 8289bd79..1b1ddc27 100644 --- a/src/electron/main.ts +++ b/src/electron/main.ts @@ -1,48 +1,60 @@ -import { BrowserWindow, Notification, app, ipcMain, screen, shell } from 'electron'; +import { BrowserWindow, app, ipcMain, shell } from 'electron'; import path from 'path'; -import { startBrowserMonitoring, stopBrowserMonitoring } from './browserMonitor.js'; +import { stopBrowserMonitoring } from './browserMonitor.js'; +import { DEFAULT_PROTOCOL } from './contants/protocol.js'; +import { addBrowserMonitorIpcHandler } from './monitor/browser.js'; +import { showNotification } from './notification/mac.js'; import { getAuthenticatedWindowPath, getPreloadPath, parseTokensFromUrl } from './pathResolver.js'; import { isDev } from './util.js'; +import { blockDevTools } from './window/key.js'; +import { calculateZoomLevel } from './window/resolution.js'; -let mainWindow: BrowserWindow | null = null; -let authWindow: BrowserWindow | null = null; -// 앱 종료 상태를 추적하는 변수 -let isAppQuitting = false; +let mainWindow: BrowserWindow | null = null; // 메인 창 객체 +let isAppQuitting = false; // 앱 종료 상태를 추적하는 변수 + +// ------------------------------------------------------------------------------------------------ +// 프로토콜 설정 코드 +// ------------------------------------------------------------------------------------------------ // NOTE: 기본 프로토콜 설정 (morib://) if (process.defaultApp) { if (process.argv.length >= 2) { - app.setAsDefaultProtocolClient('morib', process.execPath, [path.resolve(process.argv[1])]); + app.setAsDefaultProtocolClient(DEFAULT_PROTOCOL, process.execPath, [path.resolve(process.argv[1])]); } } else { - app.setAsDefaultProtocolClient('morib'); + app.setAsDefaultProtocolClient(DEFAULT_PROTOCOL); } +// ------------------------------------------------------------------------------------------------ +// 애플리케이션이 준비되었을 때 window를 생성하고 렌더러 프로세스를 처리하는 코드 +// ------------------------------------------------------------------------------------------------ + // NOTE: 싱글 인스턴스 Local Lock 설정 const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { app.quit(); } else { - app.on('second-instance', (event: any, commandLine: string[], workingDirectory: string) => { + app.on('second-instance', () => { // Someone tried to run a second instance, we should focus our window. if (mainWindow && !mainWindow.isDestroyed()) { if (mainWindow.isMinimized()) mainWindow.restore(); mainWindow.focus(); } - - // NOTE: 디버깅용 Dialog 주석 처리 - // const lastArg = commandLine.length > 0 ? commandLine.pop()?.slice(0, -1) : ''; - // dialog.showErrorBox('Welcome Back', `You arrived from: ${lastArg}`); }); // Create mainWindow, load the rest of the app, etc... app.whenReady().then(() => { createWindow(); - // 인증 관련 IPC 핸들러 설정 - setupAuthHandlers(); + ipcMain.on('auth:logout', () => { + redirectToLoginPage(); + }); + + ipcMain.on('auth:relogin', () => { + redirectToLoginPage(); + }); // macOS에서 dock 아이콘 클릭 시 창 복원 app.on('activate', () => { @@ -52,9 +64,7 @@ if (!gotTheLock) { createWindow(); } else { // 숨겨진 창이 있다면 표시하기 - if (authWindow && !authWindow.isDestroyed() && !authWindow.isVisible()) { - authWindow.show(); - } else if (mainWindow && !mainWindow.isDestroyed() && !mainWindow.isVisible()) { + if (mainWindow && !mainWindow.isDestroyed() && !mainWindow.isVisible()) { mainWindow.show(); } } @@ -62,172 +72,50 @@ if (!gotTheLock) { }); app.on('open-url', (event: any, url: string) => { - if (authWindow && !authWindow.isDestroyed()) { - if (authWindow.isMinimized()) authWindow.restore(); - authWindow.focus(); - } else { - if (mainWindow && !mainWindow.isDestroyed()) { - mainWindow?.close(); - } - - event.preventDefault(); + if (mainWindow && !mainWindow.isDestroyed()) { const { accessToken, refreshToken, isOnboardingCompleted } = parseTokensFromUrl(url); // dialog.showErrorBox('Welcome Back', `You arrived from: ${url}`); // NOTE: 디버깅용 Dialog 주석 처리 - createAuthenticatedWindow(accessToken, refreshToken, isOnboardingCompleted); - // 브라우저 URL 모니터링을 위한 IPC 핸들러 등록 - setupBrowserMonitorHandlers(); - } - }); -} - -// 인증 관련 IPC 핸들러 설정 -function setupAuthHandlers() { - // 로그인 페이지로 리디렉션 요청 - ipcMain.on('auth:relogin', () => { - console.log('로그인 페이지로 리디렉션 요청 수신'); - - // authWindow가 있으면 닫음 - if (authWindow && !authWindow.isDestroyed()) { - authWindow.close(); - authWindow = null; - } - // mainWindow가 없으면 생성, 있으면 로그인 페이지로 이동 - if (!mainWindow || mainWindow.isDestroyed()) { - createWindow(); - } else { - // 로그인 페이지로 이동 - if (isDev()) { - mainWindow.loadURL('http://localhost:5173/'); - } else { - mainWindow.loadFile(path.join(app.getAppPath(), 'dist-react/index.html')); - } + mainWindow.loadURL( + getAuthenticatedWindowPath(accessToken || '', refreshToken || '', isOnboardingCompleted || ''), + ); - // 창이 숨겨져 있으면 표시 - if (!mainWindow.isVisible()) { - mainWindow.show(); - } - mainWindow.focus(); - } - }); -} - -// 브라우저 URL 모니터링 IPC 핸들러 설정 -function setupBrowserMonitorHandlers() { - // 모니터링 시작 요청 - ipcMain.on('browser-monitor:start', (_, allowedServices: string[]) => { - console.log('브라우저 URL 모니터링 시작 요청 수신:', allowedServices); - - // 도메인 형식 확인 및 정제 (경로 정보 유지) - const processedServices = allowedServices - .map((service) => { - // 빈 서비스 또는 유효하지 않은 형식 제외 - if (!service || service.trim() === '') { - return ''; - } - - // URL 형식인 경우 프로토콜만 제거 (경로는 유지) - if (service.startsWith('http://') || service.startsWith('https://')) { - try { - // URL 객체로 파싱 - const url = new URL(service); - // 호스트명과 경로 유지 (프로토콜만 제거) - return url.hostname + url.pathname; - } catch (e) { - console.warn('허용 서비스 URL 파싱 오류:', e); - return service; - } - } - return service; - }) - .filter((s) => s.length > 0); // 빈 항목 제거 - - if (authWindow && !authWindow.isDestroyed()) { - console.log(`${processedServices.length}개의 허용 서비스로 모니터링 시작:`, processedServices); - startBrowserMonitoring(authWindow, processedServices); + // 브라우저 URL 모니터링을 위한 IPC 핸들러 등록 + addBrowserMonitorIpcHandler(mainWindow); } else { - console.error('메인 창이 없어 모니터링을 시작할 수 없습니다.'); + createWindow(); } }); - - // 모니터링 중지 요청 - ipcMain.on('browser-monitor:stop', () => { - console.log('브라우저 URL 모니터링 중지 요청 수신'); - stopBrowserMonitoring(); - }); } -// 화면 해상도 확인 및 줌 레벨 설정 함수 -function adjustZoomLevelIfNeeded(window: BrowserWindow | null) { - if (!window) return; +// ------------------------------------------------------------------------------------------------ +// 윈도우 생성 코드 +// ------------------------------------------------------------------------------------------------ - // 맥북 14인치 해상도 기준 (3024x1964) - const MAC14_WIDTH = 3024; - const MAC14_HEIGHT = 1964; - - const display = screen.getPrimaryDisplay(); - - const pixelWidth = display.workAreaSize.width * display.scaleFactor; - const pixelHeight = display.workAreaSize.height * display.scaleFactor; - - // 해상도가 맥북 14인치보다 작은 경우 - if (pixelWidth < MAC14_WIDTH || pixelHeight < MAC14_HEIGHT) { - // 콘텐츠가 로드된 후 줌 레벨 설정 - window.webContents.once('did-finish-load', () => { - // 화면 비율 80%로 설정 (줌 레벨 -1.0은 약 80%에 해당) - window.webContents.setZoomLevel(-1.0); - }); - } -} - -function createWindow() { +/** + * 메인 창(mainWindow) 생성 함수 + */ +export const createWindow = () => { mainWindow = new BrowserWindow({ webPreferences: { preload: getPreloadPath(), - devTools: false, // 개발자 도구 비활성화 }, width: 1440, height: 920, - show: false, // 초기에는 창을 표시하지 않음 + // show: false, // 초기에는 창을 표시하지 않음 backgroundColor: '#181C22', // 배경색 설정 (어두운 색상 예시) }); - // 콘텐츠가 준비되면 창 표시 - mainWindow.once('ready-to-show', () => { - mainWindow?.show(); + mainWindow?.webContents.once('did-finish-load', () => { + mainWindow?.webContents.setZoomLevel(calculateZoomLevel()); }); - // 화면 해상도에 따라 줌 레벨 조정 - adjustZoomLevelIfNeeded(mainWindow); - - // 줌 관련 설정 - mainWindow.webContents.on('zoom-changed', (event, zoomDirection) => { - // cmd+ 또는 cmd- 키를 사용한 줌만 허용 - if (zoomDirection !== 'in' && zoomDirection !== 'out') { - event.preventDefault(); - } - }); + blockDevTools(mainWindow); - // 마우스 휠로 인한 줌 변경 방지 (pinch-to-zoom) - mainWindow.webContents.on('before-input-event', (event, input) => { - // 개발자 도구를 열 수 있는 모든 단축키 차단 - if ( - // cmd + option + i (macOS) - (input.key === 'i' && input.meta && input.alt) || - // F12 - input.key === 'F12' || - // cmd + shift + i (macOS), ctrl + shift + i (Windows/Linux) - (input.key === 'i' && input.shift && (input.meta || input.control)) || - // cmd + shift + c (macOS), ctrl + shift + c (Windows/Linux) - (input.key === 'c' && input.shift && (input.meta || input.control)) || - // cmd + shift + j (macOS), ctrl + shift + j (Windows/Linux) - (input.key === 'j' && input.shift && (input.meta || input.control)) || - // 줌 관련 키 중 cmd+ 및 cmd- 외의 다른 키 차단 (ctrl+0 등) - (input.key === '0' && (input.meta || input.control)) - ) { - event.preventDefault(); - } + // 콘텐츠가 준비되면 창 표시 + mainWindow.once('ready-to-show', () => { + mainWindow?.show(); }); mainWindow.webContents.setWindowOpenHandler((details) => { @@ -238,7 +126,7 @@ function createWindow() { // 닫기 버튼 클릭 시 앱을 종료하지 않고 숨김(hide) 처리 mainWindow.on('close', (event) => { // 앱이 실제로 종료되려는 경우는 처리하지 않음 - if (!isAppQuitting && authWindow !== null && !authWindow.isDestroyed() && mainWindow && !mainWindow.isDestroyed()) { + if (!isAppQuitting && mainWindow && !mainWindow?.isDestroyed()) { event.preventDefault(); // 전체화면 상태인지 확인 @@ -248,13 +136,11 @@ function createWindow() { // 전체화면 해제 애니메이션 완료 후 숨김 처리 } else { // 전체화면이 아니면 바로 숨김 - mainWindow.hide(); + mainWindow?.hide(); } return false; } - - return true; }); if (isDev()) { @@ -262,85 +148,41 @@ function createWindow() { } else { mainWindow.loadFile(path.join(app.getAppPath(), 'dist-react/index.html')); } -} - -function createAuthenticatedWindow( - accessToken: string | null, - refreshToken: string | null, - isOnboardingCompleted: string | null, -) { - authWindow = new BrowserWindow({ - webPreferences: { - preload: getPreloadPath(), - devTools: false, // 개발자 도구 비활성화 - }, - width: 1440, - height: 920, - show: false, // 초기에는 창을 표시하지 않음 - backgroundColor: '#181C22', // 배경색 설정 (어두운 색상 예시) - }); +}; - // 콘텐츠가 준비되면 창 표시 - authWindow.once('ready-to-show', () => { - authWindow?.show(); - }); - - // 화면 해상도에 따라 줌 레벨 조정 - adjustZoomLevelIfNeeded(authWindow); +// ------------------------------------------------------------------------------------------------ +// ipc 통신과 관련된 유틸 코드 +// ------------------------------------------------------------------------------------------------ - // 줌 관련 설정 - authWindow.webContents.on('zoom-changed', (event, zoomDirection) => { - // cmd+ 또는 cmd- 키를 사용한 줌만 허용 - if (zoomDirection !== 'in' && zoomDirection !== 'out') { - event.preventDefault(); - } - }); +// NOTE(@10tacion) 윈도우 생성 관련 함수들은 따로 분리하지 않음 (메인 파일에 모두 작성) -> 함수의 인자로 윈도우를 받아 윈도우 객체 변경 사항을 추적하기 쉽지 않기 떄문 - // 마우스 휠로 인한 줌 변경 방지 및 개발자 도구 단축키 차단 - authWindow.webContents.on('before-input-event', (event, input) => { - // 개발자 도구를 열 수 있는 모든 단축키 차단 - if ( - // cmd + option + i (macOS) - (input.key === 'i' && input.meta && input.alt) || - // F12 - input.key === 'F12' || - // cmd + shift + i (macOS), ctrl + shift + i (Windows/Linux) - (input.key === 'i' && input.shift && (input.meta || input.control)) || - // cmd + shift + c (macOS), ctrl + shift + c (Windows/Linux) - (input.key === 'c' && input.shift && (input.meta || input.control)) || - // cmd + shift + j (macOS), ctrl + shift + j (Windows/Linux) - (input.key === 'j' && input.shift && (input.meta || input.control)) || - // 줌 관련 키 중 cmd+ 및 cmd- 외의 다른 키 차단 (ctrl+0 등) - (input.key === '0' && (input.meta || input.control)) - ) { - event.preventDefault(); +/** + * 리로그인 / 로그아웃 관련 IPC 핸들러 유틸 + * mainWindow가 없으면 생성, 있으면 로그인 페이지로 이동 + */ +const redirectToLoginPage = () => { + // mainWindow가 없으면 생성, 있으면 로그인 페이지로 이동 + if (!mainWindow || mainWindow.isDestroyed()) { + createWindow(); + } else { + // 로그인 페이지로 이동 + if (isDev()) { + mainWindow.loadURL('http://localhost:5173/'); + } else { + mainWindow.loadFile(path.join(app.getAppPath(), 'dist-react/index.html')); } - }); - - // 닫기 버튼 클릭 시 앱을 종료하지 않고 숨김 처리 - authWindow.on('close', (event) => { - // 앱이 실제로 종료되려는 경우는 처리하지 않음 - if (!isAppQuitting && authWindow && !authWindow.isDestroyed()) { - event.preventDefault(); - // 전체화면 상태인지 확인 - if (authWindow.isFullScreen()) { - // 전체화면 상태면 먼저 전체화면 해제 후 숨김 - authWindow.setFullScreen(false); - // 전체화면 해제 애니메이션 완료 후 숨김 처리 - } else { - // 전체화면이 아니면 바로 숨김 - authWindow.hide(); - } - - return false; + // 창이 숨겨져 있으면 표시 + if (!mainWindow.isVisible()) { + mainWindow.show(); } + mainWindow.focus(); + } +}; - return true; - }); - - authWindow.loadURL(getAuthenticatedWindowPath(accessToken || '', refreshToken || '', isOnboardingCompleted || '')); -} +// ------------------------------------------------------------------------------------------------ +// 애플리케이션 자체의 동작 관련 코드(앱이 닫힐 때, 앱에서 외부 창을 띄울 때 등) +// ------------------------------------------------------------------------------------------------ // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits @@ -349,34 +191,34 @@ app.on('window-all-closed', function () { if (process.platform !== 'darwin') app.quit(); }); -// 실제 앱 종료 처리 +/** + * dock에서 우측 마우스를 클릭해서 종료를 클릭할 때만 종료가 되기 위해서 isAppQuitting 플래그를 true로 설정 + */ app.on('before-quit', () => { - // 앱 종료 플래그를 true로 설정 isAppQuitting = true; }); -// 앱 종료 시 모니터링 중지 +/** + * ipc로 해당 함수가 호출 되면 모니터링 종료 (타이머가 정지되었을 경우) + */ app.on('will-quit', () => { + // NOTE(@10tacion): 이 함수 내부에서 사용되는 변수가 전역 스코프에 등록된것 같음 그래서 잘 실행되는듯.. -> 추후 직관적으로 변수 관리하는게 필요할듯 stopBrowserMonitoring(); }); -// Handle window controls via IPC +/** + * Handle window controls via IPC + * 이걸 설정해야 일렉트론 내부에서 외부 브라우저를 띄울 때 앱 외부에서 창이 열림 (설정 안하면 일렉트론 내 웹뷰가 열림) + */ ipcMain.on('shell:open', () => { const pageDirectory = __dirname.replace('app.asar', 'app.asar.unpacked'); const pagePath = path.join('file://', pageDirectory, 'index.html'); shell.openExternal(pagePath); }); -// 시스템 알림 표시 IPC 핸들러 +/** + * 시스템 알림 표시 IPC 핸들러 + */ ipcMain.on('notification:show', (_, { title, body }) => { - const iconPath = path.join(app.getAppPath(), 'dist-electron/morib_logo.png'); - - const notification = new Notification({ - title, - body, - icon: iconPath, - silent: false, - }); - - notification.show(); + showNotification(title, body); }); diff --git a/src/electron/monitor/browser.ts b/src/electron/monitor/browser.ts new file mode 100644 index 00000000..031efe9f --- /dev/null +++ b/src/electron/monitor/browser.ts @@ -0,0 +1,50 @@ +import { BrowserWindow, ipcMain } from 'electron'; + +import { startBrowserMonitoring, stopBrowserMonitoring } from '../browserMonitor.js'; + +const startBrowserMonitor = (window: BrowserWindow | null, allowedServices: string[]) => { + if (!window) return; + + console.log('브라우저 URL 모니터링 시작 요청 수신:', allowedServices); + + // 도메인 형식 확인 및 정제 (경로 정보 유지) + const processedServices = allowedServices + .map((service) => { + // 빈 서비스 또는 유효하지 않은 형식 제외 + if (!service || service.trim() === '') { + return ''; + } + + // URL 형식인 경우 프로토콜만 제거 (경로는 유지) + if (service.startsWith('http://') || service.startsWith('https://')) { + try { + // URL 객체로 파싱 + const url = new URL(service); + // 호스트명과 경로 유지 (프로토콜만 제거) + return url.hostname + url.pathname; + } catch (e) { + console.warn('허용 서비스 URL 파싱 오류:', e); + return service; + } + } + return service; + }) + .filter((s) => s.length > 0); // 빈 항목 제거 + + if (window && !window.isDestroyed()) { + console.log(`${processedServices.length}개의 허용 서비스로 모니터링 시작:`, processedServices); + startBrowserMonitoring(window, processedServices); + } else { + console.error('메인 창이 없어 모니터링을 시작할 수 없습니다.'); + } +}; + +export const addBrowserMonitorIpcHandler = (window: BrowserWindow | null) => { + ipcMain.on('browser-monitor:start', (_, allowedServices: string[]) => { + startBrowserMonitor(window, allowedServices); + }); + + ipcMain.on('browser-monitor:stop', () => { + stopBrowserMonitoring(); + }); +}; diff --git a/src/electron/notification/mac.ts b/src/electron/notification/mac.ts new file mode 100644 index 00000000..0b93353e --- /dev/null +++ b/src/electron/notification/mac.ts @@ -0,0 +1,15 @@ +import { Notification, app } from 'electron'; +import path from 'path'; + +const iconPath = path.join(app.getAppPath(), 'dist-electron/morib_logo.png'); + +export const showNotification = (title: string, body: string) => { + const notification = new Notification({ + title, + body, + icon: iconPath, + silent: false, + }); + + notification.show(); +}; diff --git a/src/electron/window/key.ts b/src/electron/window/key.ts new file mode 100644 index 00000000..dc9c1855 --- /dev/null +++ b/src/electron/window/key.ts @@ -0,0 +1,27 @@ +import { BrowserWindow } from 'electron'; + +export const blockDevTools = (window: BrowserWindow | null) => { + if (!window) return; + + window.webContents.on('before-input-event', (event, input) => { + // 개발자 도구를 열 수 있는 모든 단축키 차단 + + if ( + // cmd + option + i (macOS) + (input.key === 'i' && input.meta && input.alt) || + // F12 + input.key === 'F12' || + // cmd + shift + i (macOS), ctrl + shift + i (Windows/Linux) + (input.key === 'i' && input.shift && (input.meta || input.control)) || + // cmd + shift + c (macOS), ctrl + shift + c (Windows/Linux) + (input.key === 'c' && input.shift && (input.meta || input.control)) || + // cmd + shift + j (macOS), ctrl + shift + j (Windows/Linux) + (input.key === 'j' && input.shift && (input.meta || input.control)) || + // 줌 관련 키 중 cmd+ 및 cmd- 외의 다른 키 차단 (ctrl+0 등) + (input.key === '0' && (input.meta || input.control)) + ) { + // 기본 동작 차단 + event.preventDefault(); + } + }); +}; diff --git a/src/electron/window/os.ts b/src/electron/window/os.ts new file mode 100644 index 00000000..5071eb7d --- /dev/null +++ b/src/electron/window/os.ts @@ -0,0 +1,25 @@ +import { BrowserWindow } from 'electron'; + +export const blockClose = (window: BrowserWindow | null, isAppQuitting: boolean, authWindow: BrowserWindow | null) => { + if (!window) return; + + window.on('close', (event) => { + if (!isAppQuitting && authWindow !== null && !authWindow.isDestroyed() && window && !window.isDestroyed()) { + event.preventDefault(); + + // 전체화면 상태인지 확인 + if (window.isFullScreen()) { + // 전체화면 상태면 먼저 전체화면 해제 후 숨김 + window.setFullScreen(false); + // 전체화면 해제 애니메이션 완료 후 숨김 처리 + } else { + // 전체화면이 아니면 바로 숨김 + window.hide(); + } + + return false; + } + + return true; + }); +}; diff --git a/src/electron/window/resolution.ts b/src/electron/window/resolution.ts new file mode 100644 index 00000000..62b3ecf1 --- /dev/null +++ b/src/electron/window/resolution.ts @@ -0,0 +1,52 @@ +import { dialog, screen } from 'electron'; + +/** + * 기본 줌 레벨 + * Zoom Factor 와 Zoom level 은 다른 개념이다. + * Zoom Factor 는 퍼센트 배율로 줌 조절 + * Zoom level 은 지수 배율로 줌 조절 (1.2^n, n은 정수) + * 편의를 위해서 Zoom Level 사용으로 통일 + */ + +/** + * workAreaSize.width >= MAC16_WIDTH(1728) 일 경우 기본 배율 + */ +const BASE_ZOOM_LEVEL = 0; + +/** + * workAreaSize.width < MAC16_WIDTH(1728) 일 경우 줌 축소 + */ +const SMALL_ZOOM_LEVEL = -1.0; + +/** + * 맥북 16인치 해상도 기준 (workAreaSize.width: 1700) + */ +const MAC16_WIDTH = 1700; + +/** + * 화면 해상도에 따른 적절한 줌 팩터를 계산합니다. + * @returns 화면에 맞는 줌 팩터 + */ +export const calculateZoomLevel = (): number => { + // 맥 os 화면 해상도 확인 (workArea란 상단 메뉴바 제외 영역) + const display = screen.getPrimaryDisplay(); + const pixelWidth = display.workAreaSize.width; + + // 해상도가 맥북 16인치보다 작은 경우 줌 축소 + if (pixelWidth < MAC16_WIDTH) { + return SMALL_ZOOM_LEVEL; + } + + return BASE_ZOOM_LEVEL; +}; + +/** + * BrowserWindow 생성 시 webPreferences에 포함할 줌 설정 반환 + * 이 방법은 Chromium의 preference 저장 기능에 영향을 받지 않게 하기 위함 + * @returns webPreferences에 포함할 zoomFactor 값 + */ +export const getZoomPreferences = () => { + return { + zoomLevel: calculateZoomLevel(), + }; +}; diff --git a/vite.config.ts b/vite.config.ts index dd29d55f..a151cf5b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,17 +3,21 @@ import { defineConfig } from 'vite'; import svgr from 'vite-plugin-svgr'; // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), svgr()], - resolve: { - alias: [{ find: '@', replacement: '/src/app' }], - }, - base: '/', - build: { - outDir: 'dist-react', - }, - server: { - port: 5173, - strictPort: true, - }, +export default defineConfig(({ mode }) => { + const isReact = mode === 'react'; + + return { + plugins: [react(), svgr()], + resolve: { + alias: [{ find: '@', replacement: '/src/app' }], + }, + base: isReact ? '/' : './', + build: { + outDir: 'dist-react', + }, + server: { + port: 5173, + strictPort: true, + }, + }; });