NextPederationPlugin 활용 가이드 1: 패키지 구성 및 기본 설정

0

1. 패키지 구성 개요

NextPederationPlugin을 사용하여 여러 모듈을 연동하고, 각각의 기능을 독립적으로 개발할 수 있습니다. 이 가이드에서는 ui-system 패키지, flight 모듈, hotel 모듈, 그리고 이들을 통합하는 app-front 애플리케이션을 구성하는 방법을 단계별로 설명합니다. 각 패키지와 모듈은 고유한 역할을 가지고 있으며, 이들을 유기적으로 연결하여 하나의 통합 시스템을 만들 수 있습니다.

2. UI 시스템 패키지 구성 (`ui-system`)

1. package.json과 주요 스크립트

`ui-system` 패키지는 공통 UI 컴포넌트를 제공하는 패키지로, 이 패키지의 `package.json` 파일은 다음과 같이 구성합니다:

{
	"name": "@amu/amu-ui-system",
	"version": "0.3.23",
	"description": "",
	"main": "dist/index.es.js",
	"types": "dist/index.d.ts",
	"author": "attrest medialab Co, Ltd.",
	"license": "ISC",
	"files": ["dist"],
	"scripts": {
		"preinstall": "npx only-allow pnpm",
		"dev": "vite",
		"build": "rm -rf dist && tsc -p ./tsconfig.build.json && vite build",
		"serve": "vite preview",
		"storybook": "storybook dev -p 6006",
		"build-storybook": "storybook build",
		"test": "vitest",
		"test:run": "vitest run --coverage"
	},
	"dependencies": {
		"typescript": "^4.5.2"
	},
	"peerDependencies": {
		"react": "^17.0.2",
		"react-dom": "^17.0.2",
		"styled-components": "^5.3.3"
	},
	"devDependencies": {
		"prettier": "^2.4.1",
		"storybook": "^6.4.0",
		"vite": "^2.6.4",
		"webpack": "^5.58.2"
	}
}
  • preinstall: `pnpm` 패키지 매니저만을 사용하도록 강제합니다.
  • dev: `vite` 개발 서버를 실행합니다.
  • build: `dist` 디렉토리를 삭제하고, TypeScript 컴파일 및 `vite` 빌드를 실행합니다.
  • storybook: 스토리북 개발 서버를 실행합니다.

2. 주요 디펜더시 설정

  • dependencies: 타입스크립트를 포함하여 프로젝트에서 사용할 주요 패키지들입니다.
  • peerDependencies: React, React-DOM, Styled-Components와 같은 패키지는 프로젝트에서 동일한 버전을 사용하도록 설정합니다.
  • devDependencies: 개발 환경에서 사용할 도구들입니다.

3. UI 컴포넌트 개발 및 빌드

1. `Button` 컴포넌트 만들기

UI 시스템 구성을 위한 `Button` 컴포넌트는 다음과 같이 정의됩니다:

import React, { forwardRef, useRef } from 'react';
import styled from 'styled-components';
import { ButtonProps, ButtonSize } from './type';
import useRipple from '@/hooks/useRipple';

const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
	{
		children,
		size = 32,
		type = 'button',
		color = 'system1',
		variant = 'filled',
		startIcon,
		endIcon,
		width,
		...props
	}, 
	ref,
) {
	const innerRef = useRef<HTMLButtonElement | null>(null);
	const ripples = useRipple(innerRef);
	
	return (
		<StyledButton
			{...props}
			type={type}
			$size={size}
			$color={color}
			$variant={variant}
			$width={width}
			ref={(node) => {
				innerRef.current = node;
				if (typeof ref === 'function') {
					ref(node);
				} else if (ref) {
					ref.current = node;
				}
			}}
		>
			{startIcon}
			{children}
			<RippleContainer>{ripples}</RippleContainer>
			{endIcon}
		</StyledButton>
	);
});

const StyledButton = styled.button`
	display: inline-flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
	width: ${({ $width }) => $width ?? 'auto' };
	${({ $size }) => `
		height: ${$size}px;
		font-size: ${$size / 2}px;
	`}
	background-color: ${({ $color, theme }) => theme.color[$color]};
`;

export default Button;

2. 테마 설정 (컬러, 폰트 등)

`color.ts` 파일에서 테마 색상을 정의합니다:

const system1 = '#000000';
const primaryMain = '#1a73e8';

const color = {
	system1,
	primaryMain,
	// 다른 색상 정의
};

export default color;

3. 글로벌 스타일 설정 및 적용

`globalStyle.ts` 파일에서 글로벌 스타일을 정의합니다:

import { createGlobalStyle } from 'styled-components';
import PoppinsR from './fonts/poppins-v19-latin-regular.woff';
import NotoSansB from './fonts/NotoSans-Bold.woff';

const GlobalStyle = createGlobalStyle`
	@font-face {
		font-family: 'Poppins';
		src: url(${PoppinsR}) format('woff');
		font-weight: 400;
	}
	@font-face {
		font-family: 'NotoSansKR';
		src: url(${NotoSansB}) format('woff');
		font-weight: 700;
	}
	body {
		font-family: 'Poppins', 'NotoSansKR', sans-serif;
	}
`;

export default GlobalStyle;

결론

이 글에서는 ui-system 패키지를 구성하고, 주요 설정 및 UI 컴포넌트를 개발하는 방법을 다루었습니다. 다음 글에서는 flight 및 hotel 모듈 애플리케이션을 구성하고, 이를 통해 실제 기능을 구현하는 방법을 알아보겠습니다.

Leave a Reply