• 썸네일

    [babylon.js] 바빌론 리액트에서 사용하기 + vite로 리액트 시작하기

    리액트에서 바빌론을 실행하는 예제는 ms에 없어서 babylon.js 공식문서에서 찾아보았다.

    바빌론 공식문서에 있는 예제를 한번 따라 만들어 보자.

    https://doc.babylonjs.com/communityExtensions/Babylon.js+ExternalLibraries/BabylonJS_and_ReactJS


    Vite를 이용하여 리액트 시작하기

    맨 처음 프로젝트를 만들 때 이전까지는 webpack에서 구성하거나 CRA를 사용하였는데,

    이번에는 vite로 한 번 구현해 보았다. 웹팩에서 직접 만드는 것과는 다르게 vite는 매우 간단하게 구성할 수 있었다.


    프로젝트를 넣을 폴더를 만든 뒤 해당 폴더에서

    npm create vite@latest my-vite

    를 입력하면 몇가지 옵션을 선택할 수 있게 한다.

    여기서 나는 리액트에서 바빌론을 사용하고, Typescript를 이용할 것이기 때문에 아래 사진과 같이 설정했다.

    바빌론 옵션 설정 사진

    여기서 SWC는 Rust로 작성된 JavaScript 컴파일러로 바벨보다 더 좋은 성능으로 코드를 트랜스파일 할 수 있다고 한다.

    이후 필요한 모듈들을 다운로드 한다.

    npm install

    만들어진 프로젝트의 소스폴더에서

    App.tsx, main.tsx를 제외한 css파일은 삭제하였고, 내용도 비워서 빈 페이지로 시작할 것이다.

    깔끔하게 비워진 이미지


    바빌론 엔진이 적용될 캔버스 생성

    바빌론은 3D 렌더링 엔진으로 canvas html요소에 엔진을 적용시킬 수 있다.

    src아래에 components 폴더를 생성하고 SceneComponent.tsx 컴포넌트를 생성하자


    리턴되는 태그를 canvas로 변경하고, 해당 canvas html엘리먼트에 바빌론 엔진을 적용하기 위해 useRef로 해당 요소를 가져온다.

    ref를 가져올 때 HTMLCanvasElement를 제네릭으로 적어주지 않으면 MutableRefObject가 되기 때문에 반드시 적어준다.

    import React, {useRef} from "react";
    
    function SceneComponent() {
        const reactCanvas = useRef<HTMLCanvasElement>(null);
    
        return <canvas ref={reactCanvas} />;
    }
    
    export default SceneComponent;

    이후 useEffect를 이용하여 바빌론엔진을 해당 컴포넌트가 렌더링 될 때 적용시켜 보자.

    이전에 작성한 자습서 보기와 같이 보면서 제작하니 쉽게 이해할 수 있었다.


    캔버스에 바빌론 엔진 적용하고 장면(Scene) 만들기

    첫 번째로 사용할 바빌론 엔진을 가져오고, 같이 사용할 장면을 만드는 Scene도 함께 가져온다.

    가져온 바빌론 엔진에 canvas ref의 current를 넣어주면 요소에 바빌론 엔진을 적용할 수 있다.


    이후 메시들이 떠다닐 공간인 장면을 생성한다.

    import React, {useRef, useEffect} from "react";
    import {Engine, Scene} from "@babylonjs/core";
    
    function SceneComponent() {
        const reactCanvas = useRef<HTMLCanvasElement>(null);
    
        useEffect(()=>{
            const {current : canvas} = reactCanvas;
            const engine = new Engine(canvas);
            const scene = new Scene(engine);
    
        }, [])
    
        return <canvas ref={reactCanvas} />;
    }
    
    export default SceneComponent;


    캔버스 화면 그리기

    화면을 표시하려면 프레임마다 계속 화면을 갱신해 주는 코드를 넣어야 한다.

    engine의 runRenderLoop 메서드를 이용하여 화면을 매 프레임 그릴 수 있다.

    그리고 컴포넌트가 사라질 때 엔진을 제거하도록 클린업 함수를 추가하였다.

    import React, {useRef, useEffect} from "react";
    import {Engine, Scene} from "@babylonjs/core";
    
    function SceneComponent() {
        const reactCanvas = useRef<HTMLCanvasElement>(null);
    
        useEffect(()=>{
            const {current : canvas} = reactCanvas;
            const engine = new Engine(canvas);
            const scene = new Scene(engine);
    
            engine.runRenderLoop(() => {
                if (typeof onRender === "function") onRender(scene);
                scene.render();
            });
            
            //화면을 리사이즈 하는 함수도 추가하였다. 이후 클린업 할 때 같이 사라진다.
            const resize = () => {
                scene.getEngine().resize();
            };
    
            if (window) {
                window.addEventListener("resize", resize);
            }
    
            return () => {
                scene.getEngine().dispose();
                if (window) {
                    window.removeEventListener("resize", resize)
                }
            };
        }, [])
    
        return <canvas ref={reactCanvas} />;
    }
    
    export default SceneComponent;


    렌더 이후 동작할 함수 실행부 만들기

    useEffect에 실행부 코드를 추가하였다. 실행하는 함수는 프롭스로 받아올 onScreanReady이다. 이 함수는 이후 설명할 예정이다.

    메시를 추가하고 화면이 그려졌을 때 캔버스 내부에서 행해질 모든 동작을 여기서 실행시킨다.

    onRender또한 props에서 받아온다.

    props의 type들은 babylon-hook에서 선언되어 가져와 사용한다.

    import React, {useRef, useEffect} from "react";
    import {Engine, Scene} from "@babylonjs/core";
    import { BabylonjsProps } from "babylonjs-hook"; //프롭스의 타입
    function SceneComponent({ onSceneReady, onRender } : BabylonjsProps) {
        const reactCanvas = useRef<HTMLCanvasElement>(null);
    
        useEffect(()=>{
            const {current : canvas} = reactCanvas;
            const engine = new Engine(canvas);
            const scene = new Scene(engine);
    
            //화면이 준비된 후 화면에 들어갈 모든 메시와 동작들을 실행시키는 부분
            //함수의 구현의 props에서 받아오며 아래에서 구현한다.
            if (scene.isReady()) {
                onSceneReady(scene);
            } else {
                scene.onReadyObservable.addOnce((scene) => onSceneReady(scene));
            }
    
            engine.runRenderLoop(() => {
                if (typeof onRender === "function") onRender(scene);
                scene.render();
            });
            
            //화면을 리사이즈 하는 함수도 추가하였다. 이후 클린업 할 때 같이 해제된다.
            const resize = () => {
                scene.getEngine().resize();
            };
    
            if (window) {
                window.addEventListener("resize", resize);
            }
    
            return () => {
                scene.getEngine().dispose();
                if (window) {
                    window.removeEventListener("resize", resize)
                }
            };
        }, [])
    
        return <canvas ref={reactCanvas} />;
    }
    
    export default SceneComponent;


    작동부 함수 제작

    App.tsx에서 생성한 SceneComponent.tsx를 가져와서 집어넣고, props로 줄 onSceneReady 함수와 onRender 함수를 만들자.

    BabylonjsProps에서 정의된 두 함수는 매개변수로 scene을 받는다. BabylonjsProps를 클릭하고 f12를 눌러서 확인할 수 있다.

    export declare type BabylonjsProps = {
        antialias?: boolean;
        engineOptions?: EngineOptions;
        adaptToDeviceRatio?: boolean;
        renderChildrenWhenReady?: boolean;
        sceneOptions?: SceneOptions;
        onSceneReady: (scene: Scene) => void;
        /**
         * Automatically trigger engine resize when the canvas resizes (default: true)
         */
        observeCanvasResize?: boolean;
        onRender?: (scene: Scene) => void;
        children?: React.ReactNode;
    };


    onScreenReady 함수는 캔버스가 준비되었을 때 맨 처음 실행되는 함수이다.

    해당 부분에서 카메라와 광원을 세팅하고 박스와 바닥을 생성한다.


    onRender 함수는 렌더 될 때 마다 실행되는 함수이며, 박스가 회전하게 끔 구현하였다.

    자세한 내용은 주석에 작성했다.

    import {
      HemisphericLight,
      ArcRotateCamera,
      MeshBuilder,
      Vector3,
      Scene,
      Mesh,} from "@babylonjs/core";
    import SceneComponent from "./components/SceneComponent";
    
    export default function App() {
      let box: Mesh;
    
      //화면이 준비되었을 경우 맨 처음 실행되는 함수
      const onSceneReady = (scene: Scene) => {
        // ArcRotateCamera로 대상을 중심으로 회전하는 카메라를 생성
        // 세부 속성은 자습서에 작성한 바와 동일하다.
        const camera = new ArcRotateCamera(
          "camera1",
          (3 * Math.PI) / 2,
          Math.PI / 50,
          550 * 0.015,
          Vector3.Zero(),
          scene 
       );
        
        const canvas = scene.getEngine().getRenderingCanvas();
        camera.attachControl(canvas, true);
        //반구형 광원을 세팅
        const light = new HemisphericLight("light", new Vector3(0, 1, 0), scene);
        light.intensity = 0.7;
        //박스를 2의 크기로 생성하고 위치를 1로 만들었다.
        //박스의 정 가운데 부분이 원점이므로 바닥위에 붙어있게 하기 위함.
        box = MeshBuilder.CreateBox("box", { size: 2 }, scene);
        box.position.y = 1;
        //바닥을 생성
        MeshBuilder.CreateGround("ground", { width: 6, height: 6 }, scene);  };
    
      //이후 계속 렌더링 될 때 마다 실행될 함수. 박스를 계속 회전 시킴
      const onRender = (scene: Scene) => {
        if (box !== undefined) {
          const deltaTimeInMillis = scene.getEngine().getDeltaTime();
          const rpm = 10;
          //박스를 y축을 기준으로 계산 값만큼 계속 회전시킨다.
          box.rotation.y += (rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000);
        }
      };
    
      return (
        <div>
          <SceneComponent  onSceneReady={onSceneReady} onRender={onRender} />
        </div>
      );
    }


    구현 이미지


    이것으로 리액트에서 바빌론엔진을 이용해서 3D렌더를 구현해 보았다.

    blender에서 만든 오브젝트를 가져올 수도 있다고 하니, 만들어진 오브젝트를 붙여 넣어 화려하게 꾸밀 수 도 있을 것 같다.

    다음 프로젝트를 만들 때 한 번 활용해 봐야 겠다.

    2023.11.9 40 1

  • 썸네일

    [babylon.js] 바빌론 자습서 따라해보기

    babylon.js를 이용하면 웹에서 3D 오브젝트를 간편하게 생성할 수 있다.

    아래는 ms에 있는 자습서를 보고 바빌론.js를 따라 생성해 보았다.

    자습서에는 webXR을 이용하여 기기로도 사용할 수 있게끔 만들어져 있는데 이 부분은 제외하고 정리해 보았다.


    자습서 : Babylon.js를 사용하여 첫 번째 WebXR 애플리케이션 만들기

    https://learn.microsoft.com/ko-kr/windows/mixed-reality/develop/javascript/tutorials/babylonjs-webxr-helloworld/introduction-01


    이 자습서에서 다음과 같은 작업을 수행하는 방법을 알 수 있다.

    • 기본 3D 요소를 만드는 babylon.js API

    • 장면 만들기

    • 카메라 추가

    • 광원 추가

    • 기본 3D 요소 추가

    • 상호작용 추가


    바빌론.js 자습서 초기세팅

    먼저 기본 html 태그를 만들고 Babylon.js javascript 파일을 가져온 후, canvas html요소를 본문 내에 추가한다.

    <html>
        <head>
            <title>Babylon.js sample code</title>
            <script src="https://cdn.babylonjs.com/babylon.js"></script>
            <style>
                body, #renderCanvas { width: 100%; height: 100%;}
            </style>
        </head>
        <body>
            <canvas id="renderCanvas"></canvas>
        </body>
    </html>


    바빌론.js 자습서 scene 생성

    canvas 요소 아래 스크립트 태그를 추가하고 다음 코드를 추가하여 검은색으로 채워진 장면을 생성한다.

    <script type="text/javascript">
        const canvas = document.getElementById("renderCanvas");
        const engine = new BABYOLON.Engine(canvas, true);
        const createScene = function(){
            const scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3.Black;
            return scene;
        }
        const sceneToRender = createScene();
    </script>

    화면은 기본적으로 자동으로 계속 렌더링 되지 않는다.

    장면이 계속 바뀔 수 있으니 표시되는 장면을 반복적으로 리렌더링 하려면 만들어진 sceneToRender에 아래 함수를 실행시켜야 한다.

    engine.runRenderLoop(
        function(){
            sceneToRender.render();
        }
    );


    바빌론.js 자습서 기본 3D 요소 추가

    3D 가상 세계에서 물체는 메시(Mesh)로 만들어진다.

    개발자는 미리 정의된 메시를 사용하거나, 고유한 사용자 지정의 메시를 만들 수 있으며, 여기서는 미리 정의된 박스 메시를 사용 한다.

    //매개변수는 박스의 이름, 옵션을 지정할 수 있음
    const box = BABYLON.MeshBuilder.CreateBox("box", {});
    box.position.x = 0.5;
    box.position.y = 1;

    이러고 개발자 도구를 보면 콘솔 탭에 카메라를 찾을 수 없다고 나온다.


    카메라 찾을 수 없음 콘솔

    카메라 없이는 장면을 볼 수 없기 때문에 카메라를 추가해야 함.


    바빌론.js 자습서 카메라 추가

    가상 세계를 보고 상호작용 하려면 카메라를 캔버스에 연결해야 한다.

    대상을 중심으로 회전할 수 있는 BABYLON.ArcRotateCamera 유형의 카메라를 추가해 보자.

    카메라 인스턴스를 만드는 데 필요한 매개변수는 다음과 같다.

    • name : 이름

    • alpha : 세로축을 따른 각도 라디안

    • beta : 가로축을 따른 각도 라디안

    • radius : 대상으로 부터 카메라의 거리

    • target : 카메라가 항상 향하는 지점

    • scene : 카메라가 있는 장면

    카메라 매개변수 요소 이미지

    createScene 함수에 다음 코드를 추가한다.

    const alpha = Math.PI /. 4;
    const beta = Math.PI /. 3;
    const radius : 8;
    const target = new BABYLON.Vector3(0, 0, 0);
    const camera = new BABYLON.ArcRotateCamera("Camera", alpha, beta, radius, target, scene);
    camera.attachControl(canvas, true);

    이후 화면을 보아도 박스가 보이지 않는데 이는 광원(빛)이 없어서 그렇다.


    바빌론.js 자습서 광원 추가

    다양한 조명 속성과 함께 사용할 수 있는 광원의 종류에는

    포인트, 방향, 스폿, 반구의 네 가지 유형이 있다.


    다음과 같은 방법으로 반구 광원을 추가해 보자

    const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0));

    그러면 박스 메시에 빛이 비춰지며 박스가 보이는 것을 알 수 있다.

    광원에 의해 박스가 보이는 이미지


    바빌론.js 자습서 3D 개체와 상호작용

    먼저 큐브에 색을 지정해 보자

    boxMaterial에 박스의 재질과 색을 결정하여 메쉬에 입힐 수 있다.

    const boxMaterial = new BABYLON.StandardMaterial("material", scene);
    //diffuse Color로 연결된 메시 전체에 색을 분산시킬 수 있다.
    boxMaterial.diffuseColor = BABYLON.Color3.Random();
    box.material = boxMaterial;

    이제 큐브가 임의의 색으로 칠해졌으니 두 가지 상호작용을 추가해 보자

    1. 큐브를 클릭했을 때 이벤트 발생 + 색 변경

    2. 색 변경 후 큐브의 위치 이동


    상호작용을 추가하려면 Babylon의 ActionManager를 이용한다.

    액션의 등록은

    box.actionManager.registerAction(
        new BABYLON.ExecuteCodeQAction("이벤트트리거", (evt)=>{
            //이벤트 시 일어날 일
        })
    )

    이렇게 이루어져 있다.

    이벤트 객체를 콘솔로 찍어보면,

    이벤트 요소 콘솔 이미지

    위와 같은 형태로 찍히는데 여기에

    소스(클릭된 메쉬 개체), 소스이벤트(이벤트 정보)와 추가적인 정보들이 기록되어 있다.


    일반적인 상황에서 모든 객체는 우주공간이 아니면 바닥에 붙어있다!

    지금은 공중에 붕 떠있는 상자처럼 보이는데 지면을 줘서 안정감을 챙겨보자.

    아래 코드를 추가하면 씬에 바닥이 추가된다.

    const ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 4, height: 4});

    바닥이 추가된 이미지

    바빌론.js나 three.js같은 javascript 3D Library를 이용하면

    입체를 만들 수 있어서 더 다양한 표현이 가능하다.

    다음엔 리액트에서 3D 라이브러리를 사용하여 구현해 보아야 겠다.

    2023.11.8 38 0

  • 썸네일

    [AWS] EC2와 DB의 연결 방식 변경 후기

    AWS EC2인스턴스에서 DB를 RDS로 사용하는 방법이 금전적 비용이 많이 들어서 방식을 변환하였다.

    결과적으로 AWS에서 사용하는 RDS에서 EC2 내장 MySQL로 전환하였다.


    데이터베이스를 클라우드 형식으로 만들어 사용하는 방법을 생각해 봤는데, 내가 고를 수 있는 방법으로는


    첫 번째, RDS를 이용하여 AWS클라우드에서 사용하는 방법


    두 번째, AWS EC2에 MySQL을 내장하여 사용하는 방법


    세 번째, 다른PC(연구실 컴 등)에 MySQL을 설치하여 해당 컴퓨터를 클라우드 저장소로 이용하는 방법을 사용할 수 있었다.


    이중 첫 번째 방법을 사용하고 있었는데 굳이 RDS 과금이 생길 필요가 없다 생각하여 두 번째 방법으로 전환하였다.


    전환 근거는 다음과 같다.

    RDS가 가지고 있는 장점은 AWS에서 제공해 주는 편리한 모니터링 시스템에 있으며, 원격 저장소 구축이 간편함.

    에러가 발생했을 때 배포하는 EC2 컴퓨터와 분리되어 독립적으로 움직이기 때문에 어디서 문제가 발생했는지 알아채기 쉬움.

    하지만 데이터가 이동하는 규모가 작은 내 프로젝트에서는 굳이 모니터링 시스템이 크게 효과가 없으며 배보다 배꼽이 더 큰 경우라고 생각했음.

    두 번째 방법과 세 번째 방법 중에서 고민을 해 봤는데, 가장 편한 방법은 세 번째 방법이긴 했음.

    하지만, EC2 Linux OS에 DB구축을 해보는 경험도 해 보고 싶었고, 단순한 속도 면에서 생각해 보았을 때도,

    EC2 컴퓨터에서 연구실 컴퓨터로 DB 쿼리를 날리는 것 보다

    EC2서버에서 내장 MySQL에 로컬 호스트로 쿼리를 날리는 게 훨씬 빠를 수 밖에 없다고 생각함.


    23.11.01 EC2 인스턴스 성능 문제로 세 번째 방법으로 전환.

    2023.11.6 29 0

  • 썸네일

    [Next.js] 블로그 구글 검색엔진 최적화(SEO) 적용하기

    내가 쓴 글을 구글에 검색했을 때 작성한 문서들이 구글 검색에 나오게 하고 싶다는 생각이 들었다.

    그리서 SEO에 대해서 구글 공식문서를 찾아보고, 프론트엔드 개발에서 적용할 수 있는 내용들을 블로그에 적용해 보았다.


    https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ko

    구글 검색엔진 기본 가이드


    SEO, 검색 엔진 최적화란 무엇인가?

    SEO(Search Engine Optimization)는 생성된 페이지가 구글에서 잘 검색되도록 만드는 것이다. 구글에서는 페이지를 탐색할 때 크롤러 로봇을 사용하는데 이 로봇이 잘 읽을 수 있도록 몇 가지 작업을 할 수 있다. SEO가이드 문서에서 간단하게 적용할 수 있는 내용은 바로 적용해 보고 차차 추가해 나갈 예정이다.


     

    고유하고 정확한 페이지 제목 만들기

    “홈페이지의 title요소는 웹사이트 또는 비즈니스의 이름을 명시할 수 있으며 비즈니스가 실제로 위치한 장소나 주로 다루는 항목, 주요 품목 등 중요한 정보를 포함할 수도 있습니다.”


    지금 있는 title은 index든 포스팅 페이지든 제목이 personal blog로 변하지 않기 때문에 블로그 프로젝트의 포스팅 된 글들의 제목을 페이지의 타이틀로 적용하면 좋을 것 같다.

    지금있는 title과 description은 layout파일의 metadata에 기록되어 있다. next.js에서는 페이지 마다 다른 타이틀을 지정할 수 있도록 Head를 사용할 수 있는데 이를 적용하기 위해서는 layout파일의 metadata를 지워야 한다.


    인덱스 페이지에서는 title을 익현blog로 변경하고, 메타데이터로 '성익현의 블로그입니다.'를 입력했다.

    export default async function Home() {
      const postList = await getDocumentData();
      const guestBookList = await getGuestBookData();
      return (
        <>
          <title>익현 blog</title>
          <meta name="description" content={'성익현의 블로그 입니다.'} />
          <Normal>
            <Index postList={postList} guestbookList={guestBookList} />
          </Normal>
        </>
      );
    }

    카카오톡에서 페이지를 보냈을 때 타이틀이 잘 날라오는 것을 확인할 수 있었다.


     

    SEO 가이드 문서에서는 홈페이지의 title 요소를 만들 때 몇가지 주의사항이 기재되어 있다.

    요약하자면,

    - 자연스럽게 읽히며 내용의 주제를 효과적으로 전달하는 제목을 선택

    - 페이지 내용과 관계없거나 제목없음과 같은 의미없는 형식은 피해야 함.

    - 각 페이지마다 고유한 title 텍스트가 있어야 함(해당 페이지가 같은 사이트의 다른 페이지와 구분되기 위해)

     

    표제 태그를 사용하여 중요한 텍스트를 강조

    “의미 있는 표제를 사용하여 중요한 주제를 표시하고 콘텐츠의 계층 구조를 만들어 사용자가 쉽게 문서를 탐색할 수 있도록 하세요.”

    페이지의 중요한 부분과 덜 중요한 부분이 무엇인지 생각해 보고 표제 태그를 어디에 사용하는 것이 적절할지 결정해야 한다. 블로그에서 DB에 저장된 글을 불러와서 페이지에 렌더링 할 때 제목 부분은 h1태그를 사용하고 있고, 텍스트 에디터에서 중요한 부분은 표제 태그(h2, h3...)을 이용하여 표시할 것이다.

    이 내용은 시멘틱 태그와 교집합이 있는 부분이며, 프로젝트를 만들 때 이미 적용된 내용이기 때문에 넘어간다.

     

    SEO 가이드 문서에 몇가지 주의사항이 개재되어 있다.

    - em, string과 같은 태그를 사용하는 것이 더 적절할 수 있는데 표제 태그를 남용하지 않을 것.

    - 표제 태그 크기를 무질서하게 섞어 쓰지 않을 것.

    - 표제가 너무 길거나 한 페이지에서 표제 태그를 과도하게 사용하지 않을 것

    - 표제 태그를 스타일을 위해 사용하고 구조를 위해 활용하지 않을 경우는 피해야 할 것.

     

    이미지 최적화 하기

    “HTML 이미지 요소를 사용하여 콘텐츠에 이미지를 삽입해야 합니다.”

    alt 속성을 사용하여 검색 엔진이 이미지에 대한 정보를 얻을 수 있어야 한다.

    alt 속성 또한 프로젝트에 이미 적용된 내용이기 때문에 넘어간다.

     

    SEO 가이드 문서에 기재된 주의사항은 아래와 같다.

    - 스팸으로 간주될 수 있을 정도록 테스트를 길게 작성하지 않을 것.

    - 매우 긴 파일 이름을 사용하지 않을 것.

    - css를 사용하여 색인을 생성할 이미지를 표시하는 것.

     

    사이트를 모바일 친화적으로 만들기

    “오늘날의 세상은 모바일 중심으로 돌아갑니다. 대다수 사람들이 휴대기기를 사용하여 Google에서 검색합니다. 사이트의 데스크톱 버전은 휴대기기에서 보고 사용하기 불편할 수 있기 때문에 모바일 기능을 지원하는 사이트가 있어야 온라인 인지도를 유지할 수 있습니다.”

    SEO 가이드 문서에서는 3가지 모바일 전략을 지원한다.

    - 반응형 웹 디자인(권장)

    - 동적 게재

    - 별도 URL


    프로젝트에 반응형 웹 디자인을 적용하여 만들었기 때문에 나름 모바일 친화적으로 동작하고 있다.

    google에서는 모바일 친화성 테스트를 제공하며, 아래 주소에서 모바일 친화적 라벨이 표시되는 기준을 충족하는 지 확인할 수 있다.

    https://search.google.com/test/mobile-friendly?hl=ko

    색인이 정확하게 생성될 수 있도록 모바일 사이트를 구성하려면 아래 사항을 유의해야 한다.

    - 동적 게재를 사용하거나 별도의 모바일 사이트가 있다면 이를 구글에 알림

    - 반응형 웹 디자인을 사용할 경우 meta name = ‘viewport’ 태그를 사용하여 브라우저에 조정 방법을 알림.

    - 리소스를 크롤링할 수 있는 상태로 유지할 것.

    - 모든 기기에서 모든 기능을 제공할 것(모바일 사용자도 웹 사용자와 같은 모든 기능을 이용할 수 있게)

     

     

    위 내용중 이미 구현된 내용도 있고, 새롭게 추가한 내용도 있는데, 몇 가지 간단하게 적용할 수 있는 내용이 있어 바로 적용하였다. 메타데이터 description에 들어갈 내용은 어떻게 생성할지 생각해 봐야 할 것 같다.

     

    ref

    https://mingeesuh.tistory.com/entry/NEXTjs-SEO-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-feat-Head-meta-%ED%83%9C%EA%B7%B8

    2023.10.29 136 0