- 회사에서 당황하지 않고 업무환경 설정이 가능해야 합니다.
- 아래 순서대로 퍼블리싱 세팅하면 문제없이 진행됩니다.
- 추천 프로그램
- Byeond Compare 코드 비교 도구(상용버전)
- node.js
- Node.js는 로컬PC 및 서버PC에서 JS를 실행하는 환경 구성.
- 서버는 대표적으로 웹서버(PC), 데이터베이스 서버(PC) 등이 있음.
- 서버는 고객들이 인터넷으로 접속해서 자료를 사용하는 PC
- 추후 React에서
NVM(Node Version Manage)을 통한 관리 예정
- 아래 목록을 위주로 설치한다.
- PostCSS Sorting : 추후 설정(css 코드 순서정렬 도구 - 설정 필요)
- Auto Colse Tag
- Auto Rename Tag
- Bracket Pari Clor DLW
- CSS Peak
- HTML CSS Support
- HTML to CSS autocompletion
- Image preview
- indent-rainbow
- Korean Language Pack for... (VSCode 재실행 후 확인)
- Live Server
- Marketdown Preview Enhanced
- Material Icon Theme
- Night Owl (테마)
- Prettier-Code formatter (별도 참조)
- 줄맞춤, 들여쓰기, 따옴표, 세미콜론 등에 대한 문서의 포맷(컨벤션)을 맞추어줌
- 설정 버튼(VSCode의 모서리 왼쪽 아이콘⚙) 선택 > Settings 메뉴 선택

- 검색내용으로
format으로 작성 Editor:Default Formatter설정Editor:Format On Save설정
- VSCode 재실행 추천합니다.
- 반드시 프로젝트명은
영어 소문자,단어_단어등의 특수기호 추천 - git 셋팅 먼저 진행 필요 : GitHub 포함해서
- images 폴더 : 파일명.jpg, 파일명.png, 파일명.gif, 파일명.svg
- jpg : 사진
- gif : 그림(애니메이션 그림 가능, 배경 투명 가능)
- png : 사진 + 배경 투명
- svg : 디지털 숫자(벡터)로 계산해서 그림을 만듦(아이콘, 반응형 등에 적극 활용)
- css 폴더 :
모듈별.css파일들 - js 폴더 :
모듈별.js파일들 - assets 폴더 : 기타 파일들(영상, 음악, 계약서, 연락처 ... 포함)
- apis 폴더 :
백엔드 데이터 연동관련 파일들(파일명.json, 데이터 요청 등)- json : JavaScript Object Notation(자바스크립트 객체 문법 적용된 파일)
index.html약속 됨.(파일명 변경 불가 : 엔트리포인트)- 부가적으로 index만 작업하는 이유가 가장 어렵고 복잡하고 비주얼 합니다.
- 단축키 :
! + tab키로 기본형을 생성하자.(반드시 파일 저장 후)
-
웹브라우저가 알아볼 수 있는 문법 구조
-
DOM 구조로 해석 : Document Object Model
-
<!DOCTYPE html>- html 해석할 때 최신 html5 규칙으로 해석하라.
- 수정은 주의해서 해야 합니다.
- 유지 보수를 하는 경우에는 html의 첫 줄을 반드시 문의하고 수정해야 함.
-
head 태그- 문서의 필요로한 정보를 작성하는 곳
- 추후 icon 및 sns 연동 부분에서 주로 활용(
meta 태그) SEO(검색엔진최적화 내용)- js 파일, css 파일을 연결 배치 활용
- 반드시
title 태그내용 작성 필요 GA4설정 내용을 작성하는 곳(Google Analytics)
-
body 태그- 실제 화면에 보여질 내용을 배치함.
-
<태그>내용</태그>
-
반드시 소문자로 모두 구성합니다.
-
내용
- 내용 배치의 레이아웃을 담당함.
- 기본적으로
<div class="wrap"> </div>를 배치하고 내용 작성함. - 최초 구성 필수(경험-경력이 필요함.)
- 내용을 충분히 분석(
Figma, PRD분석)하고 난 이후에주석을 명시후 div 사용 - div 태그 역할에 맞는 이름을
class로 지정함.
- 시멘틱 태그는 태그 단어 자체가 내용을 유추하도록 안내함.
- div로 내용을 구분 후 아래 영역은 태그를 변경하기를 추천합니다.
header 태그: 검색엔진에서 내용을 기대함.(로고, 타이틀, 주메뉴, 검색, 회원기능 ...)main 태그: 컨텐츠 모음footer 태그: 검색엔진에서 내용을 기대함.(카피라이터, 주소, 연락처, 사이트 맵 ...)
- 현재 웹브라우저 내용 갱신(페이지 이동) :
<a href="주소">글자/그림</a> - 웹브라우저 탭 생성(새탭 페이지) :
<a href="주소" target="_blank">글자/그림</a>
- 추천 UI 라이브러리
- action과 method 이해
<form action="백엔드주소"></form><form action="백엔드주소" method="get"></form>- 데이터 공개 :
http://127.0.0.1:5500/good.html?id=iu&pass=1234
- 데이터 공개 :
<form action="백엔드주소" method="post"></form>- 데이터 비공개 :
http://127.0.0.1:5500/good.html
- 데이터 비공개 :
- input 태그 예제
<form action="good.html" method="post">
<!-- 기본정보 -->
<fieldset>
<legend>기본정보</legend>
<label for="userid">아이디(4자~12자)</label> <br />
<input
type="text"
id="userid"
name="id"
minlength="4"
maxlength="12"
required
placeholder="아이디를 입력하세요."
/>
<button>아이디 중복확인</button>
<br />
<br />
<label for="useremail">이메일</label> <br />
<input
type="email"
id="useremail"
neme="email"
required
placeholder="[email protected]"
/>
<br />
<br />
<label for="userpass">비밀번호(6자~16자)</label> <br />
<input
type="password"
id="userpass"
name="pwd"
minlength="6"
maxlength="16"
required
placeholder="비밀번호를 입력해주세요."
autocomplete="off"
/>
</fieldset>
<!-- 상세정보 -->
<fieldset>
<legend>상세정보</legend>
<label>국가 선택:</label>
<select id="country" name="country">
<option value="kr">한국</option>
<option value="us">미국</option>
<option value="cn">중국</option>
<option value="jp">일본</option>
</select>
<br />
<br />
<label>성별</label> <br />
<input type="radio" id="male" name="gender" value="male" checked />
<label for="male">남성</label>
<input type="radio" id="female" name="gender" value="female" />
<label for="female">여성</label>
<br />
<br />
<label>취미(다중선택가능)</label> <br />
<input type="checkbox" id="coding" name="hobby" value="coding" checked />
<label for="coding">코딩</label>
<input type="checkbox" id="tour" name="hobby" value="tour" checked />
<label for="tour">여행</label>
<input type="checkbox" id="music" name="hobby" value="music" checked />
<label for="music">음악</label>
<br />
<br />
<label for="birthday">생년월일</label> <br />
<input type="date" id="birthday" name="birthday" />
<br />
<br />
<label for="file">첨부파일</label> <br />
<input type="file" id="file" name="file" />
<br />
<br />
<label for="intro">자기소개 : </label> <br />
<textarea
id="intro"
name="intro"
rows="5"
cols="40"
placeholder="자기소개를 입력하세요."
></textarea>
</fieldset>
<!-- 정보입력 -->
<fieldset>
<legend>정보입력</legend>
<input type="reset" value="재작성" />
<input type="submit" value="등록" />
</fieldset>
</form>- 동일한 형태의 레이아웃이 반복된다면 묶어서 활용
- 동일한 기능이 반복된다면 묶어서 활용
- 아이콘은 https://react-icons.github.io/react-icons/ 활용
<img src="이미지경로/파일명.확장자" alt="대체글" />
- 문서의 타이틀 역할을 함을 표현함.
- h1 ~ h6로 구성
- html 문서에서 h1은 한번만 사용하기를 권장함.
- 각 영역별로 h2도 한번만 사용하기를 권장함.
- 글자로 된 문단 작성 시 활용
- 한 줄 내림
- 글자를 굵게 표현함.
- 시멘틱 태그로서 내용 구역 구분
- css 선택자
태그 {
}
.클래스 {
}
#아이디 {
}
태그 태그 태그 {
}
.클래스 태그 태그 {
}- 인라인 css (추후 React에서는 인라인 방식을 많이 활용함 : css 우선순위 적용)
<태그 style=""> </태그>- style 태그 css (추후 React에서는 object 방식으로 많이 활용함)
<style></style>
<태그></태그>- style 파일 link 방식 (추후 React에서는 많이 활용함 : 파일명.module.css)
<link rel="stylesheet" href="경로/파일명.css" />css/header.css파일
<link rel="stylesheet" href="css/header.css" />- block, inline, inline-block, none, flex ...
- 하나의
침범할 수 없는 가로 영역 - div, ul, li, h1~h6, p 등등
- 기본적으로 width: 100%
- css의 모든 값을 활용할 수 있다.(width, height, margin, padding 등)
- 한개의 글자처럼 처리됩니다.
- width, height, margin, padding을 적용 못함
- a, img, span, b, strong 등등
- inline과 block을 조합한다.
- 가로로 배치되면서 width, height 등을 자유롭게 활용함
- 엔터키에 의한 공백 한칸이 작성됨. (원하지 않는 공백이 영역에 들어감)
- block이면서 inline이면서 가로 정렬, 세로 정렬, 여백조절 가능
- 가로로 레이아웃 배치 시 최적화
- https://studiomeal.com/archives/197
- justify-content, align-items, gap, flex: 숫자 등등
- block이면서 inline이면서 가로 정렬, 세로 정렬, 여백조절 가능
표처럼 레이아웃 배치 시 최적화- https://studiomeal.com/archives/533
- 화면에 html 태그가 없는 것처럼 처리
- js에서도 없다고 판단하여 초기 처리 코드 불가
- 넓은 화면부터 html, css 작업
- 좁은 화면으로 html, css 마무리 진행 권장
- html에 반드시 아래 코드가 있어야 합니다.
<meta name="viewport" content="width=device-width, initial-scale=1.0" />- 큰 사이즈부터 작은 사이즈로 max-width를 추천합니다.
- 공백을 주의해야 합니다.
- 반드시 {} 안쪽에 원하는 css 코드 하셔야 합니다.
@media and (max-width: 1280px) {
원하는 css 작성
}
@media and (max-width: 1024px) {
원하는 css 작성
}
@media and (max-width: 960px) {
원하는 css 작성
}
@media and (max-width: 540px) {
원하는 css 작성
}- 모든 css 및 html 작업 전에 결정하여야 합니다
- 디자이너 및 기획자에게 문의해야 합니다
- css의 body에 기본 글꼴 배치 권장함
- 절대 유료폰트 확인하고 활용
- relative, absolute, fixed 등
- 픽셀로 정확한 위치를 지정하는 경우 사용
- 반드시 상위 태그에 position이 명시되어야 함
.엄마 {
position: relative;
}
.자식 {
position: absolute;
}- 무조건 웹브라우저를 기준으로 위치 설정
.대상 {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 50px;
z-index: 999;
}- 대표적으로 아이콘 출력하는 경우 많이 활용
<대상> before 내용 after </대상>대상::after {
content: "";
}
대상::before {
content: "";
}- 어느 css가 마지막에 적용되는가?
- 기본 : 태그(작성순서 비교) ===> 클래스(작성순서 비교) ===> 아이디
- 범위(
공백) 선택자 CSS로 다시 적용된다. - 경로(
>) 선택자 CSS로 다시 적용된다. - css 문제해결 : F12 개발자 도구에서 확인(아래에서 윗방향으로 해결)
- 도저히 해결이 안된다면
!important옵션을 사용합니다.
- css 속성 정렬하기
- 단축키 생성 :
shift + alt + p등록 - 참고
"postcssSorting.config": {
"properties-order": [
/* Layout */
"display",
"grid",
"grid-column-gap",
"grid-row-gap",
"grid-auto-flow",
"grid-auto-rows",
"grid-auto-columns",
"justify-items",
"align-content",
"place-items",
"gap",
"align-items",
"justify-content",
"flex-wrap",
"flex-basis",
"flex-grow",
"flex-shrink",
"flex",
"align-self",
"flex-direction",
/* Box */
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"border",
"border-top",
"border-bottom",
"border-right",
"border-left",
"border-style",
"border-color",
"border-top-width",
"border-right-width",
"border-bottom-width",
"border-left-width",
"border-top-style",
"border-right-style",
"border-bottom-style",
"border-left-style",
"border-top-color",
"border-right-color",
"border-bottom-color",
"border-left-color",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"box-shadow",
"overflow",
"overflow-x",
"overflow-y",
"clip",
"position",
"top",
"right",
"bottom",
"left",
"z-index",
"width",
"min-width",
"max-width",
"height",
"min-height",
"max-height",
"float",
"clear",
"visibility",
"vertical-align",
/* Background */
"background",
"background-color",
"background-image",
"background-repeat",
"background-attachment",
"background-position",
"background-clip",
"background-origin",
"background-size",
/* Font */
"font-family",
"font-size",
"font-style",
"font-weight",
"line-height",
"color",
"text-align",
"text-decoration",
"text-transform",
"letter-spacing",
"text-shadow",
"white-space",
"word-spacing",
"word-break",
"word-wrap",
"text-indent",
"direction",
"unicode-bidi",
"hyphens",
/* Animation and Transition */
"animation",
"animation-name",
"animation-duration",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-fill-mode",
"animation-play-state",
"transition",
"transition-property",
"transition-duration",
"transition-timing-function",
"transition-delay",
/* Other */
"content",
"counter-reset",
"counter-increment",
"quotes",
"list-style",
"list-style-position",
"list-style-type",
"caption-side",
"empty-cells",
"table-layout",
"pointer-events",
"cursor",
"resize",
"overflow-wrap",
"scroll-snap-type",
"scroll-padding",
"scroll-padding-top",
"scroll-padding-right",
"scroll-padding-bottom",
"scroll-padding-left",
"scroll-behavior",
"scroll-snap-align",
"scroll-snap-margin",
"scroll-snap-stop",
"scrollbar-width",
"scrollbar-color"
]
}선택 {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}대상 {
/* 2줄 말줄임 */
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
word-break: break-all;
}- Java는 객체지향 프로그래밍, javaScript는 스크립트 프로그래밍
- 웹브라우저용 js가 원본인데 V8 엔진만 추출해서 Node.js 만듦
- PC용 즉, 로컬용 js가 Node.js 입니다. (DB 제어, 네트워크, 소프트웨어, 앱 개발 등)
- html, css 제어 js
- 데이터 연동 js
- 가장 아랫 줄이 제일 좋은 코드 자리 입니다.
<태그 onload="" onclick=""> </태그><script></script>
<태그></태그><script src="경로/파일명.확장자"></script>
<태그></태그>- html과 js가 모두 준비가 되면 실행되길 원함.
window.addEventListener("DOMContentLoaded", function () {
// 할일
});- 이미지 등의 용량이 큰 리소스가 모두 준비되면 실행되길 원함.
window.addEventListener("load", function () {
// 할일
});const tag = document.querySelector("태그")
const class = document.querySelector(".클래스")
const id = document.querySelector("#아이디")
const tags = document.querySelectorAll("태그 태그 태그")
const tags2 = document.querySelectorAll(".클래스 태그 태그")const age = 20;
const tag = `<div>나이는 ${age}</div>`;const tag = `<div>안녕</div>`;
const pos = document.querySelector(".hi");
pos.innerHTML = tag;- js에서 이해할 수 있는 자료의 종류를
데이터 타입또는데이터 형이라고 합니다. - 영어로는 Data Type이라고 합니다.
- 문자와 문자열은 다릅니다.
const 변수명 = 변수값;
const nickname1 = "홍길동";
const nickname2 = "홍길동";
const nickname3 = `홍길동`;- 정수(양수, 음수), 실수(양소수, 음소수)
const 변수명 = 변수값;
const age = 10;
const height = 180.5;- true, false
const isLogin = true;
const isMember = false;- 모든 변수의 초기값;
- 변수값이 정의가 안되었어요.
let nickName;- 개발자가 정말 값이 없다고 명시함.
const = isLogin = null;- 절대로 js 코드에서 절대로 중복이 안되는 내용 만드는 경우
- 복합데이터 또는 참조형 데이터(Reference Data Type)
- 기호로는
[]사용합니다. - 배열은 순서(index)가 중요하므로 순서값 즉, 인덱싱을 관리합니다.
- 인덱스는 자동으로 0번부터
,마다 증가합니다. 변수명[인덱스 번호]를 통해서 원하는 값 추출함.- 배열은
변수명.length가 주어집니다.
const arr = [1, 3, "안녕", true, false, null, undefined, symbol];
arr[3]; // true 추출
arr.length; // 8 출력const obj = {
속성명1: 1,
속성명2: "과학",
속성명3: false,
};
obj.속성명1; // 1
obj.속성명2; // "과학"
obj.속성명3; // false- for문, while문, do while문
- 우선 for문이 활용율 90% 이상일 듯 합니다.
- for문의 특징은 몇 번 박복해야 할지 횟수를 아는 경우 활용
for ( 초기값; 조건식; 증감식;) {
// 할일
}
for(let i = 0; i < 10; i ++) {
console.log(i);
}- if, switch
- 웹퍼블리싱에서는 if문이 코드에 90% 이상일 듯
if(true 냐 false 냐 조건 판단) {
// true 면 실행
}else{
// false 면 실행
}- 대표적인 슬라이드 라이브러리
- Swiper (https://swiperjs.com/)
- Slick (https://kenwheeler.github.io/slick)
- bxSlider (https://bxslider.com/)
- 안정성, 반응형, 모바일 터치 지원
- React(Next.js), Vue, Svlet 등의 FrontEnd 기술지원
- TypeScript 지원 및 예제 지원
- https://swiperjs.com/demos
- Core 소스 : 웹퍼블리싱 참조
- React 소스 : FE에서 참조
- API 문서 참조 : https://swiperjs.com/swiper-api
- 반드시 우리의 css와 js 파일 연결 코드 보다 윗줄에 있어야 합니다.
<!-- Link Swiper's CSS -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"
/>
<!-- Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script><div class="swiper 개발자클래스">
<div class="swiper-wrapper">
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
<div class="swiper-slide">내용</div>
</div>
</div>- load는 이미지 등의 용량이 큰 파일이 로드되면 실행하도록 함.
window.addEventListener("load", function () {
// swiper 만들기 실행
new Swiper(".개발자클래스", {});
});- slidesPerView : 화면당 보여 줄 슬라이드 수
- spaceBetween : 슬라이드의 간격(픽셀 단위)
- slidesPerGroup : 한번 이동 시 몇개의 슬라이드 이동 개수
- breakpoints : 웹브라우저 너비(픽셀) 계산 후 슬라이드 배치
window.addEventListener("load", function () {
new Swiper(".sw_tour", {
slidesPerView: 1,
spaceBetween: 26,
slidesPerGroup: 1,
// 반응형
breakpoints: {
760: {
slidesPerView: 2,
slidesPerGroup: 2,
},
1280: {
slidesPerView: 3,
slidesPerGroup: 3,
},
},
});
});- 그리드를 이용한 2줄 이상 출력하기 (인터파크)
window.addEventListener("load", function () {
new Swiper(".sw_tour", {
slidesPerView: 5,
grid: {
rows: 2,
fill: "row",
},
spaceBetween: 26,
slidesPerGroup: 1,
// 반응형
breakpoints: {
1024: {
slidesPerView: 2,
slidesPerGroup: 2,
grid: {
rows: 1,
fill: "row",
},
},
1280: {
slidesPerView: 3,
slidesPerGroup: 3,
grid: {
rows: 1,
fill: "row",
},
},
},
});
});- 좌측, 우측 슬라이드 이동
- 첫 페이지와 마지막 페이지에서 버튼 숨기기 적용
- 원본 Swiper 예제의 버튼의
클래스명을 꼭 알아내서 활용하자.
.swiper-button-disabled {
display: none !important;
}navigation: {
nextEl: ".버튼클래스명",
prevEl: ".버튼클래스명",
},Live Sass Compiler설치
scss 폴더 만들기scss 폴더/test.scss 파일만들기- 반드시 VSCode의 하단 바에
Watch Sass를Watching...으로 선택
- 파일명.scss는
scss 폴더에 보관 - 파일명.css는
css 폴더에 보관
Settings 메뉴선택
- 다음의 코드를 추가한다.
"liveSassCompile.settings.formats": [
{
"format": "expanded",
"extensionName": ".css",
"savePath": "/css",
"savePathReplacementPairs": null
}
]// 중첩 (Nesting)
.card {
border: 1px solid #000;
.title {
position: relative;
font-weight: 700;
&:hover {
color: blue;
}
&:active {
color: orange;
}
&::after {
content: "";
position: absolute;
left: 0;
top: 0;
width: 32px;
height: 32px;
background-color: red;
}
}
.content {
color: orange;
button {
border: 1px solid green;
&:hover {
background-color: red;
}
}
}
}.card {
border: 1px solid #000;
}
.card .title {
position: relative;
font-weight: 700;
}
.card .title:hover {
color: blue;
}
.card .title:active {
color: orange;
}
.card .title::after {
content: "";
position: absolute;
left: 0;
top: 0;
width: 32px;
height: 32px;
background-color: red;
}
.card .content {
color: orange;
}
.card .content button {
border: 1px solid green;
}
.card .content button:hover {
background-color: red;
} /*# sourceMappingURL=test.css.map */// 변수 만들기
$width-screen: 960px;
$pc-w: 760px;
.wrap {
position: relative;
// 변수 사용하기
width: $width-screen;
.header {
// 변수사용하기
width: $width-screen;
.inner {
// 변수사용하기
width: $pc-w;
}
}
.main {
// 변수사용하기
width: $width-screen;
}
.footer {
// 변수사용하기
width: $width-screen;
}
}- css로 생성할 필요가 없는 경우
_파일명.scss생성 - scss 폴더에
_val.scss파일 만들기(파일명은 자유)
$width-screen: 960px;
$pc-w: 760px;- 변수 사용 시
@import "val";_반드시 제거하고 파일명만 작성
@import "val";
.wrap {
position: relative;
// 변수 사용하기
width: $width-screen;
.header {
// 변수사용하기
width: $width-screen;
.inner {
// 변수사용하기
width: $pc-w;
}
}
.main {
// 변수사용하기
width: $width-screen;
}
.footer {
// 변수사용하기
width: $width-screen;
}
}- 파일명을
_를 활용하자 (scss/_mixins.scss)
@mixin flex-center {
display: flex;
align-items: center;
justify-content: center;
}
@mixin border-fn($cc) {
border: 5px solid $cc;
}- 아래처럼 불러들임
@import "val";
@import "mixins";@import "val";
@import "mixins";
.wrap {
position: relative;
// mixin 사용
@include flex-center;
// 변수 사용하기
width: $width-screen;
.header {
// mixin 사용
@include flex-center;
// 변수사용하기
width: $width-screen;
.inner {
@include border-fn(red);
height: 100px;
// 변수사용하기
width: $pc-w;
}
}
.main {
@include border-fn(#ffffff);
// 변수사용하기
width: $width-screen;
}
.footer {
// 변수사용하기
width: $width-screen;
}
}- Search Engine Optimization: 검색 엔진 최적화
- 구글, 네이버: 검색어를 입력 시 관련 순위로 목록을 제시함
<title>타이틀</title>: 고정된 글자. 검색 결과 타이틀<meta name="description" content="서비스설명" />: 요약설명, 검색 결과 내용<meta name="keyword content="키워드" />: 핵심 키워드<meta property="og: title" content="제목" />: SNS 공유 시 표현 제목<meta property="og: description" content="서비스 설명" />: SNS 공유 시 설명<meta property="og:image" content="https://~" />: 미리보기 이미지 url
robots.txt파일 생성
User-agent: *
Allow: /
Sitemap: https://til-basic-theta.vercel.app/sitemap.xmlsitemap.xml파일 생성(기본구조)
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://til-basic-theta.vercel.app/</loc>
<lastmod>2025-06-27</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://til-basic-theta.vercel.app/</loc>
<lastmod>2025-06-27</lastmod>
<changefreq>yearly</changefreq>
<priority>0.0</priority>
</url>
</urlset>
