Skip to content

๐ŸฆŠ FE Guide

JaeMeDev edited this page Mar 16, 2023 · 1 revision

๐Ÿ€ย PR ๊ฐ€์ด๋“œ

  • PR์€ 4์•ผ ๊ฐœ๋ฐœํŒ€ ๊ฐ€์ด๋“œ์— ๋งž์ถฐ์„œ ์ง„ํ–‰.
  • Merge ์ง„ํ–‰์‹œ์—๋Š” Squash Merge๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. Squash Merge ์ง„ํ–‰์‹œ History๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ์ƒ๋Œ€๋ฐฉ์ด ๊ธฐ๋ถ„๋‚˜์˜์ง€ ์•Š๊ฒŒ ์นœ์ ˆํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋ฆฌ๋ทฐ ์™ธ์— ๊ถ๊ธˆํ•œ ์ ์€ Slack์œผ๋กœ ์งˆ๋ฌธํ•œ๋‹ค.
  • ๋ฆฌ๋ทฐํ•  ๊ฒŒ ์—†์œผ๋ฉด ์ด๋ชจ์ง€๋ผ๋„ ๋‚จ๊ฒจ์ค€๋‹ค.

๐Ÿ€ย Component ๊ฐ€์ด๋“œ

  • React ์ปดํฌ๋„ŒํŠธ ์ œ์ž‘์‹œ function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ํ•จ์ˆ˜ ์ž‘์„ฑ ์‹œ Arrow Function(() โ‡’ void) ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
type LoginButtonProps = {
	text: string;
};

function LoginButton({ text }: LoginButtonProps){
	const handleClick = () => {
		console.log('click');
	};

	return (
		<button onClick={handleClick}>
			{text}
		</button>
	);
}

๐Ÿ€ย TypeScript ๊ฐ€์ด๋“œ

๐Ÿ€ย Test ๊ฐ€์ด๋“œ

  • Test Code๋Š” ๊ผญ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜์ž.
  • ์ •๋ง ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด, ChatGPT ์˜ ํž˜์„ ๋นŒ๋ ค๋ณด์ž.(ChatGPT ๊ฐ€ ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์ง€๋Š” ์•Š์ง€๋งŒ, ์ผ€์ด์Šค๋Š” ์–ด๋Š์ •๋„ ์ž˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Œ.)
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” jest-plugin-context ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BDD ํ˜•์‹์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. (TDD๋Š” ์–ด๋ ต๋‹ค๋ฉด ์•ˆํ•ด๋„ ๋จ.)
  • describe ํ‚ค์›Œ๋“œ๊ฐ€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๋ฉด context ๋Š” ๋ฌธ๋งฅ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ jest ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ context ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— jest-plugin-context ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • describe ๋Š” ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ณ , context ๋Š” ๋™์ผํ•œ ์ƒํƒœ์—์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
describe('Test Component', () => {
  const renderComponent = () => render((
    <Test />
  ));

  context('๋ชจ๋ฐ”์ผ์ธ ๊ฒฝ์šฐ', () => {
    it('๋ฒ„ํŠผ์ด ๋ณด์—ฌ์•ผ ํ•œ๋‹ค', () => {
	  const { container } = renderComponent();

	  // ...
	});
  }

  context('๋ชจ๋ฐ”์ผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ', () => {
    it('๋ฒ„ํŠผ์€ ๋ณด์ด์ง€ ์•Š์•„์•ผ๋งŒ ํ•œ๋‹ค', () => {
	  const { container } = renderComponent();
	  // ...
	});
  }
});
  • ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ชจ๋ฐ”์ผ์ธ ๊ฒฝ์šฐ ๋ฒ„ํŠผ์ด ๋ณด์—ฌ์•ผ ํ•˜๊ณ , ๋ชจ๋ฐ”์ผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฒ„ํŠผ์ด ๋ณด์ด์ง€ ์•Š์•„์•ผ๋งŒ ํ•˜๋Š” ๋ฌธ๋งฅ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด given2 ๋„ ์‚ฌ์šฉํ•œ๋‹ค. ์ข€ ๋” ์„ ์–ธ์ ์ด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
describe('Some Component', () => {
  const renderComponent = () => render((
    <Test isMobile={given.isMobile} />
  ));

  context('๋ชจ๋ฐ”์ผ์ธ ๊ฒฝ์šฐ', () => {
	given('isMobile', () => true);

    it('๋ฒ„ํŠผ์ด ๋ณด์—ฌ์•ผ ํ•œ๋‹ค', () => {
	  const { container } = renderComponent();

	  // ...
	});
  }

  context('๋ชจ๋ฐ”์ผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ', () => {
	given('isMobile', () => false);

    it('๋ฒ„ํŠผ์€ ๋ณด์ด์ง€ ์•Š์•„์•ผ๋งŒ ํ•œ๋‹ค', () => {
	  const { container } = renderComponent();
	  // ...
	});
  }
});
Clone this wiki locally