프로젝트를 진행하다보니, Font를 설정해야 되는데, 일반적으로 App.css를 사용하는 방식이 아니라, Styled-Component를 사용했기에 조금 더 복잡했다.
font는 OpenSource 나 원하는곳에서 잘 다운 받으면 된다. 나는 눈누라는 폰트 저장소를 애용한다. 저작권에 주의하며 다운받자.
다운을 받을 때, ttf, otf, woff 중 어떤것을 받을지 선택 할 수 있는데, 우선 ttf로 적용하였다.
ttf
는 true type font otf
는 open type font 으로 pc에 설치하는 폰트이며 woff
는 web open font format 으로 웹에서 사용하는 포맷이다.
로딩속도는 woff2 > woff > ttf 순서
그럼 잘 다운받은 폰트를 src폴더 안에 fonts라는 디렉토리를 만들어 잘 저장해둔다.
프로젝트 내부의 폴더구조는 다음과 같다
원래는 App.css에 font를 적용시켜 <App>
에 감싸주기만 하면 됐다. 하지만, 지금은 Styled-Component를 사용하므로 GlobalStyle로 잘 적용시켜보자.
우선 styles 디렉토리에 있는 GlobalStyle을 담당하고있는 global.ts에 사용하고싶은 font들을 추가해주었다.
// global.ts
import { createGlobalStyle } from 'styled-components';
import GmarketSansTTFBold from '../fonts/GmarketSansTTFBold.ttf';
import GmarketSansTTFMedium from '../fonts/GmarketSansTTFMedium.ttf';
import GmarketSansTTFLight from '../fonts/GmarketSansTTFLight.ttf';
const GlobalStyle = createGlobalStyle`
@font-face {
font-family: 'GmarketSansTTFBold';
src: local('GmarketSansTTFBold'), local('GmarketSansTTFBold');
font-style: normal;
src: url(${GmarketSansTTFBold}) format('truetype');
}
@font-face {
font-family: 'GmarketSansTTFMedium';
src: local('GmarketSansTTFMedium'), local('GmarketSansTTFMedium');
font-style: normal;
src: url(${GmarketSansTTFMedium}) format('truetype');
}
@font-face {
font-family: 'GmarketSansTTFLight';
src: local('GmarketSansTTFLight'), local('GmarketSansTTFLight');
font-style: normal;
src: url(${GmarketSansTTFLight}) format('truetype');
}
여기서 문제가 하나 생기는데, .ttf
파일을 제대로 import 해줄 수 없다. 해당 문제는 src의 디렉토리위에 fonts.d.ts
를 만들어 해당 타입의 모듈을 import 해줄 수 있게 수정해주면 된다.
// fonts.d.ts
declare module "*.ttf";
이제 index.tsx에 폰트들이 추가된 GlobalStyle을 잘 둘러주기만 하면 된다.
import App from "./App";
import GlobalStyle from "./styles/global";
const rootElement = document.getElementById("root");
if (!rootElement) throw new Error("Failed to find the root element");
const root = createRoot(rootElement);
root.render(
<StrictMode>
<GlobalStyle />
<App />
</StrictMode>
);
이제 해당 App 안에 있는 컴포넌트에서 자유롭게 폰트를 꺼내서 사용할 수 있다.
// main.tsx
...
const Title = styled.p`
margin-top: 5rem;
height: 10rem;
font-size: 10rem;
font-family: GmarketSansTTFLight, sans-serif, Arial;
`;
잘 적용된 모습을 볼 수 있다.
이번에는 우선 ttf로 통일을 했지만, 역시나 개선을 위해 woff로 하는것이 좋아보인다. 튜닝을 하게된다면, 웹폰트로 지정을 해서 로딩속도를 개선해보자.
왜 src가 두개죠 ?