πŸ’»μ›Ή(Web)/React

ν”„λ‘ νŠΈμ—”λ“œ μ½”λ”©μ»¨λ²€μ…˜

stonesy 2024. 7. 13. 18:14
728x90

μ΄λ²ˆμ— ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ νŒ€μ›λ“€λΌλ¦¬ μ½”λ”©μ»¨λ²€μ…˜μ„ μ •ν•΄ μ •λ¦¬ν•΄λ³΄μ•˜λ‹€.

 

πŸ€ν”„λ‘ νŠΈμ—”λ“œ μ½”λ”©μ»¨λ²€μ…˜

 

β€»μ°Έκ³ 

ν”„λ‘ νŠΈμ—”λ“œ μ½”λ”© μ»¨λ²€μ…˜

β˜‘οΈμ‹λ³„μž

: λ³€μˆ˜, ν•¨μˆ˜, λ°°μ—΄, 클래슀 λ“±κ³Ό 같은 ν”„λ‘œκ·Έλž˜λ° μš”μ†Œλ₯Ό κ΅¬λΆ„ν•˜κ³  μ‹λ³„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 이름

❌ μ§κ΄€μ μœΌλ‘œ 의미λ₯Ό νŒŒμ•…ν•  수 μžˆλ„λ‘ 가급적이면 μ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

❌ ν•œκΈ€μ„ μ§λ²ˆμ—­ν•œ λ³€μˆ˜λͺ…을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

❌ 곡백을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

❌ μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•˜λŠ” μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ‘ŒπŸ» λ³€μˆ˜, ν•¨μˆ˜λŠ” 카멜 μΌ€μ΄μŠ€λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

userName, totalAmount, orderName // good
username, TotalAmount, order_name // bad

πŸ‘ŒπŸ» 배열은 λ³΅μˆ˜ν˜•μœΌλ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

πŸ‘ŒπŸ» private λ³€μˆ˜λŠ” _λ₯Ό μ ‘λ‘μ‚¬λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

πŸ‘ŒπŸ» HTML νƒœκ·ΈλŠ” μ†Œλ¬Έμžλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.

πŸ‘ŒπŸ» μƒμˆ˜λŠ” μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€λ₯Ό ν™œμš©ν•΄ λŒ€λ¬Έμžμ™€ _λ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έν•©λ‹ˆλ‹€.

const THIS_IS_CONSTANT = 'string';

πŸ‘ŒπŸ» props둜 μ „λ‹¬λ˜λŠ” ν•Έλ“€λŸ¬ ν•¨μˆ˜λŠ” on으둜 μ‹œμž‘ν•©λ‹ˆλ‹€.

function Button(props) {
  return (
    <button onClick={props.onClick} onMouseEnter={props.onMouseEnter}>
      Click me
    </button>
  );
}

const Button = (props) => (
  <button onClick={props.onClick} onMouseEnter={props.onMouseEnter}>
    Click me
  </button>
);

πŸ‘ŒπŸ» Boolean νƒ€μž… λ³€μˆ˜μ˜ μ‹λ³„μž λͺ…은 가급적이면 λΆ€μ •ν˜•μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•ŠλŠ” 것을 κΆŒκ³ ν•©λ‹ˆλ‹€. λ˜ν•œ Boolean νƒ€μž…μ˜ λ³€μˆ˜μ˜ μ‹λ³„μžλŠ” is, has, can 의 접두사λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•©λ‹ˆλ‹€.

const canOpen = true; //good
const hasChildren = true; //good
const isNotBoolean = false; // bad
cosnt isBoolean = true; // bad

πŸ‘ŒπŸ» Enum 선언은 파슀칼 μΌ€μ΄μŠ€λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

// good
enum FormMode {
  Create = 'create',
  Edit = 'edit',
  Add = 'add',
}
// bad
enum FORM_MODE {
  CREATE = 'create',
  EDIT = 'edit',
  ADD = 'add',
}

πŸ‘ŒπŸ» Interface, type μ„ μ–Έ μ‹œ 접두사λ₯Ό 뢙이지 μ•ŠμŠ΅λ‹ˆλ‹€. ν—κ°€λ¦¬μ•ˆ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

// good
interface Server {
  sample: string;
}
// bad
interface IServer {
  title: string;
  value?: string;
}

 

 

Function

  • ν•¨μˆ˜μ˜ μ‹λ³„μžλͺ…은 항상 μ‹œλ©˜ν‹±ν•˜κ²Œ μ„ μ–Έν•©λ‹ˆλ‹€.(μ–΄λ–€ κΈ°λŠ₯을 ν•˜λŠ” ν•¨μˆ˜μΈμ§€ ν•¨μˆ˜λͺ…을 보고 μ•Œ 수 μžˆλ„λ‘ μ„ μ–Έν•©λ‹ˆλ‹€.)
  • 이벀트λ₯Ό ν•Έλ“€λ§ν•˜λŠ” ν•¨μˆ˜λŠ” handle 접두사λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • λ°˜ν™˜κ°’μ΄ boolean인 ν•¨μˆ˜λŠ” is 접두사λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • μ–΄λ–€ 값을 returnν•˜λŠ” ν•¨μˆ˜λŠ” get 접두사λ₯Ό ν™œμš©ν•©λ‹ˆλ‹€.
  • ν•¨μˆ˜λŠ” 선언식과 ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•©λ‹ˆλ‹€.
    • ν•¨μˆ˜ 선언식: function greet() { console.log("Hello!"); } greet(); // "Hello!" 좜λ ₯
    • ν•¨μˆ˜ ν‘œν˜„μ‹: function greet() { console.log("Hello!"); } greet(); // "Hello!" 좜λ ₯
  • μ΄λ•Œ, ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό ν•¨μˆ˜ μƒμ„±μžλ‘œ μ„ μ–Έλœ ν•¨μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ… μ‹œ 값이 ν• λ‹Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„ μ–Έ 이전에 μ‚¬μš© μ‹œ 였λ₯˜κ°€ λ°œμƒ ν•˜λ―€λ‘œ ν•¨μˆ˜λŠ” μ‚¬μš© 전에 μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•¨μˆ˜ 선언문은 λ³€μˆ˜ μ„ μ–Έλ¬Έ λ‹€μŒμ— μ˜΅λ‹ˆλ‹€.
  • λ°°μ—΄ λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” 가독성을 μœ„ν•΄ ν™”μ‚΄ν‘œ ν•¨μˆ˜(Arrow Function)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
// good 
[1, 2, 3].map(x => { const y = x + 1; return x * y; }); 
// bad 
[1, 2, 3].map(function (x) { const y = x + 1; return x * y; });

 

λ³€μˆ˜

  • var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , const와 let을 μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

μ „μ—­λ³€μˆ˜

  • λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ—­λ³€μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜λ©° 암묡적인 μ „μ—­λ³€μˆ˜λŠ” μ ˆλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

λ°°μ—΄κ³Ό 객체

  • λ°°μ—΄κ³Ό κ°μ²΄λŠ” λ°˜λ“œμ‹œ λ¦¬ν„°λŸ΄λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.
    • λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ΄λž€? ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 값을 직접 μž‘μ„±ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법을 μ˜λ―Έν•œλ‹€.
// good
// 배열을 λ¦¬ν„°λŸ΄λ‘œ μ„ μ–Έν•˜λŠ” 예
let fruits = ["apple", "banana", "cherry"];
// 객체λ₯Ό λ¦¬ν„°λŸ΄λ‘œ μ„ μ–Έν•˜λŠ” 예
let person = {
    name: "John Doe",
    age: 30,
    job: "Developer"
};

// bad
// 배열을 μƒμ„±μž ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜λŠ” 예
let fruits = new Array("apple", "banana", "cherry");
// 객체λ₯Ό μƒμ„±μž ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜λŠ” 예
let person = new Object();
person.name = "John Doe";
person.age = 30;
person.job = "Developer";

  • λ°°μ—΄ λ³΅μ‚¬μ‹œ μˆœν™˜λ¬Έμ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
let items = [1,2,3,4];
var len = items.length;
var itemsCopy = [];

// good
const arr = [...items];

// bad
for (var i = 0; i < len; i++) {
  itemsCopy[i] = items[i];
}

 

β˜‘οΈCss in JS

πŸ‘ŒπŸ» CSS μ„ μ–Έ μ‹œ μ‹λ³„μž λͺ…은 λ³€μˆ˜μ˜ 카멜 μΌ€μ΄μŠ€λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

const textFieldCss = `
  font-size: 14px;
`;

πŸ‘ŒπŸ» CSSλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” 가급적 객체가 μ•„λ‹Œ ν…œν”Œλ¦Ώ λ¬Έμžμ—΄μ„ ν™œμš©ν•©λ‹ˆλ‹€.

// good
const buttonStyle = `
  background: blue;
  color: white;
  font-size: 14px;
`;
const Button = styled.button`${buttonStyle}`;

// bad
const buttonStyle = {
  background: 'blue',
  color: 'white',
  fontSize: '14px',
};
const Button = styled.button(buttonStyle);

πŸ‘ŒπŸ» Styled-Components의 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ„ μ–Έν•  λ•Œ λ³€μˆ˜λͺ…은 파슀칼 μΌ€μ΄μŠ€λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.

const Wrapper = styled.div`
  padding: 20px;
`;

const FormRow = styled.section`
  display: flex;
  margin-bottom: 15px;
`;

 

 

β˜‘οΈES6+

πŸ‘ŒπŸ» κ°μ²΄μ—μ„œ μ—¬λŸ¬ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  λ•ŒλŠ” Destructing을 μ΄μš©ν•©λ‹ˆλ‹€.

function Template({v1, v2, ...args}) {
  const A = v1;
};

πŸ‘ŒπŸ» 배열도 Destructuring 이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

// good
const [first, second] = arr;

// bad
const first = arr[0];
const second = arr[1];

 

 

β˜‘οΈκ³΅ν†΅

πŸ‘ŒπŸ»μ£Όμ„μ€ μ„€λͺ…ν•˜λ €λŠ” ꡬ문에 맞좰 λ“€μ—¬μ“°κΈ° ν•©λ‹ˆλ‹€.

λ¬Έμž₯의 끝에 주석을 μž‘μ„±ν•  경우, ν•œ 쀄 주석을 μ‚¬μš©ν•˜λ©° 곡백을 μΆ”κ°€ν•©λ‹ˆλ‹€.

μ‚¬μš©ν•˜μ§€ μ•Šκ±°λ‚˜ 의미 μ—†λŠ” 주석은 항상 μ œκ±°ν•˜μ—¬ μ»€λ°‹ν•©λ‹ˆλ‹€.

// good
function someFunction() {
  ...

  // statement에 κ΄€ν•œ 주석
  statements
}

πŸ‘ŒπŸ»ν‚€μ›Œλ“œ, μ—°μ‚°μžμ™€ λ‹€λ₯Έ μ½”λ“œ 사이에 곡백이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

// good
var value;
if (typeof str === 'string') {
  value = (a + b);
}

// bad
var value;
if(typeof str==='string') {
  value=(a+b);
}

πŸ‘ŒπŸ»μ½€λ§ˆ λ‹€μŒμ— 값이 올 경우 곡백이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

// Good
var arr = [1, 2, 3, 4];

// Good
someFunction(a, b, {
  prop1: 1,
  prop2: 2,
  prop3: 3
});

// Bad - κ΄„ν˜Έ μ•ˆμ— 곡백
if ( typeof str === 'string' )

// Bad - κ΄„ν˜Έ μ•ˆ 곡백, 콀마 λ’€ 곡백 μ—†μŒ
var arr = [ 1,2,3,4 ];

// Bad - 객체의 λ‹«λŠ” κ΄„ν˜Έ λ‹€μŒμ— κ°œν–‰
someFunction(a, b, {
        prop1: 1,
        prop2: 2,
        prop3: 3
    }
);

πŸ‘ŒπŸ»μ£Όμ„μ€ μ„€λͺ…ν•˜λ €λŠ” ꡬ문에 맞좰 λ“€μ—¬μ“°κΈ° ν•©λ‹ˆλ‹€.

λ¬Έμž₯의 끝에 주석을 μž‘μ„±ν•  경우, ν•œ 쀄 주석을 μ‚¬μš©ν•˜λ©° 곡백을 μΆ”κ°€ν•©λ‹ˆλ‹€.

μ‚¬μš©ν•˜μ§€ μ•Šκ±°λ‚˜ 의미 μ—†λŠ” 주석은 항상 μ œκ±°ν•˜μ—¬ μ»€λ°‹ν•©λ‹ˆλ‹€.

728x90