지난 2월 2일, 멋쟁이사자처럼에서의 인턴에 지원하고 합격되었습니다. 선택한 업무는 OpenAI GPT를 연동한 AI 챗봇 서비스 구축입니다.

이때 저에게는 두 가지 선택지가 있었습니다.

  1. 프론트엔드 중심: 이미 경험이 있어 익숙한 화면 구현에 집중하고, 백엔드는 최소한으로 처리한다.
  2. 백엔드 중심: 낯설지만 데이터 설계와 API 서버 구축에 집중한다.

저는 고민 끝에 백엔드 프로젝트를 선택했습니다. 


백엔드 선택이유

프론트엔드 개발 경험이 있었기에 오히려 'API 생산자'의 관점이 절실히 필요했습니다.

'API 소비자'에서 'API 생산자'로

지금까지의 프로젝트에서는 백엔드 개발자가 만들어준 API 명세서를 보고 데이터를 화면에 구현습니다. 또한, 팀 프로젝트에서 백엔드의 역량 부족으로 구현에 한계가 있었습니다. 그러다 보니 서버 내부에서 데이터가 어떻게 가공되는지, 왜 이런 구조로 내려오는지에 대한 이해가 부족했습니다. 이번 기회에 반대로 직접 API를 설계하고 명세서를 작성하여, 클라이언트가 사용하는 API에 대해서 배워보는 것을 경험하고 싶었습니다.

화면은 그려본 경험은 있으나, 백엔드에 대한 이해도가 현저히 부족하면 서비스 전체가 흔들린다는 것을 인지하고 있었습니다.

이번 과제를 통해 API 명세, ERD 설계, 인증/인가 로직 등 백엔드의 역할을 다져놓아, 이 경험을 통해 어떤 프론트엔드를 붙여도 완성도 높은 풀스택 프로젝트로 확장할 수 있을 것이라 생각했습니다.

코드보다 설계를 먼저

백엔드 개발이 처음인 만큼, 무작정 코드를 작성하기보다 설계 단계에 집중했습니다. 이는 프론트엔드 개발 시 API 명세가 바뀔 때마다 겪었던 비효율을 줄이기 위함이기도 합니다.

  • 요구사항 정의: "사용자는 대화의 맥락(Context)이 유지되기를 원한다"는 니즈를 파악하고, 이를 기술적으로 구현하기 위한 데이터 모델을 고민했습니다.
  • API 명세서 작성: 요청(Request)과 응답(Response)의 JSON 스키마를 미리 정의하여, 인터페이스를 명확히 했습니다.
  • ERD 설계: User - Conversation - Message로 이어지는 관계형 데이터베이스 구조를 정규화하여 설계했습니다.

정리

익숙한 프론트엔드가 아닌 백엔드 프로젝트를 선택햇습니다. 이번 인턴 기간의 목표는 '보여주기식 결과물'이 아니라 '개발자로서의 기초 증진'에 있습니다.

약점이라 생각했던 백엔드 영역을 정면으로 마주하고, 설계부터 구현까지 스스로의 힘으로 완주해보려 합니다. 이 4주간의 과정이 끝났을 때, API를 이해하고 설계할 줄 아는 개발자로 성장하길 바랍니다.

728x90

FSD(Feature-Sliced Design)란?

FSD는 이름 그대로 기능(Feature)을 중심으로 애플리케이션을 얇게 조각내어(Sliced) 설계(Design)하는 방법론입니다.

기존의 기술 중심적인 분리(예: 단순히 components, hooks, utils로만 나누는 방식)에서 벗어나, 비즈니스 로직과 사용자 기능을 기준으로 프로젝트 구조를 체계화합니다. 이를 통해 프로젝트의 규모가 커져도 유지보수성과 확장성을 잃지 않도록 돕습니다.


FSD의 핵심 철학 : 단방향 의존성 규칙

FSD를 관통하는 단 하나의 절대적인 규칙이 있습니다. 이 규칙만 이해해도 FSD의 절반은 성공입니다.


 "상위 계층은 하위 계층을 import 할 수 있지만, 하위 계층은 절대 상위 계층을 import 할 수 없다."

FSD는 엄격한 계층구조를 가지고 있으며, 의존성은 항상 위에서 아래로만 흘러야 합니다.

이 규칙 덕분에 순환 참조(Circular Dependency) 문제가 원천 차단되고, 특정 모듈을 수정했을 때 영향받는 범위를 예측하기 쉬워집니다. 하위 계층일수록 더 범용적이고 재사용성이 높습니다.

FSD의 6단계 계층 구조 (Layer)


FSD는 표준화된 6개의 계층을 제안합니다. 위로 갈수록 구체적인 화면에 가깝고, 아래로 갈수록 추상적이고 범용적인 코드에 가깝습니다.

(위에서부터 아래로 설명합니다. 위 계층이 아래 계층을 사용합니다.)

1. App (애플리케이션)

프로젝트의 진입점이자 껍데기입니다.

  • 역할: 전역적인 설정, 스타일, 레이아웃, Context Provider 등 애플리케이션 전체를 초기화하고 감싸는 역할을 합니다.
  • 예시: App.tsx, 라우터 설정, 글로벌 스타일 시트, Redux/Recoil Store 초기화.

2. Pages (페이지)

사용자가 보는 완성된 하나의 화면 단위입니다.

  • 역할: 하위 계층(주로 Widgets)을 조립하여 라우팅 경로에 해당하는 페이지를 구성합니다. 실제 비즈니스 로직은 거의 포함하지 않고 '배치'에 집중합니다.
  • 예시: 메인 페이지, 로그인 페이지, 상품 상세 페이지.

3. Widgets (위젯)

페이지를 구성하는 굵직한 독립적인 UI 블록입니다.

  • 역할: Entities와 Features를 조합하여 만듭니다. 페이지에 가져다 붙이기만 하면 완성된 기능을 제공하는 '조립품'입니다.
  • 예시: GNB(헤더), 푸터, 메인 뉴스 피드 섹션, 상품 결제 폼 영역.

4. Features (기능)

사용자의 상호작용(User Action)이 일어나는 단위입니다. 비즈니스 가치를 제공하는 '동작(Verb)'에 집중합니다.

  • 역할: "사용자가 무엇을 하는가"를 다룹니다. 특정 Entity를 조작하거나 상태를 변경하는 로직이 포함됩니다.
  • 예시: '장바구니 담기' 버튼 클릭 동작, '검색어 입력 후 엔터' 동작, '좋아요 토글' 기능.

 Entities (비즈니스 엔티티)

비즈니스 도메인 데이터 모델 그 자체를 다룹니다.

  • 역할: "무엇을 보여주는가"에 집중합니다. 데이터 구조(Model)를 정의하고, 데이터를 화면에 표시하기 위한 순수한 UI 컴포넌트들이 위치합니다. 재사용성이 높습니다.
  • 예시: 사용자(User) 정보 카드 UI, 상품(Product) 정보 타입 정의 및 가격 표시 컴포넌트.

6. Shared (공용)

특정 비즈니스 로직에 종속되지 않은 가장 기초적인 계층입니다.

  • 역할: 프로젝트 전반에서 재사용되는 유틸리티, UI 라이브러리(버튼, 인풋 등), 설정 파일 등이 위치합니다.
  • 예시: UI 키트(공통 버튼, 입력창), API 호출을 위한 Axios 인스턴스, 커스텀 훅(useInput), 날짜 포맷팅 함수.

FSD를 도입하는 이유

1. 명확한 코드 위치와 역할
"이 코드를 어디에 둘까?"라는 고민이 사라집니다. 각 계층의 역할이 명확하므로 새로운 팀원이 합류해도 프로젝트 구조를 빠르게 파악할 수 있습니다.

2. 높은 응집도와 낮은 결합도 (격리된 환경)
기능별로 폴더가 격리(Sliced)되어 있습니다. A 기능을 수정할 때 B 기능이 영향을 받을 확률이 현저히 줄어듭니다. 이는 사이드 이펙트에 대한 두려움 없이 리팩토링과 기능 추가를 가능하게 합니다.

3. 뛰어난 확장성
프로젝트 초기에는 조금 복잡해 보일 수 있지만, 프로젝트 규모가 커질수록 이 견고한 구조가 빛을 발합니다. 수년간 유지보수해야 하는 대규모 프로젝트에 특히 적합합니다.


정리

FSD는 단순한 폴더 구조 규칙이 아니라, 지속 가능한 프론트엔드 개발을 위한 하나의 사고방식입니다.

처음에는 계층을 나누는 기준이 헷갈릴 수 있습니다. 특히 FeaturesEntities, Widgets의 경계가 모호하게 느껴질 수 있습니다. 하지만 "의존성은 아래로만 흐른다"는 대원칙을 지키며 적용해 나가다 보면, 어느새 스파게티 코드가 사라지고 깔끔하게 정돈된 아키텍처를 마주하게 될 것입니다.

728x90

'Next.js' 카테고리의 다른 글

Next.Js Konva Module not found: Can't resolve 'canvas' 에러 해결법  (0) 2025.07.13
Next.js란?  (0) 2025.07.05
  1. 배열(Array) 메소드
  2. 문자열(String) 메소드
  3. 숫자/수학(Number/Math) 메소드
  4. 객체(Object) 메소드
  5. Set과 Map

1. 배열(Array) 메서드

배열 추가/삭제

push() - 배열 끝에 요소 추가

let arr = [1, 2, 3];
arr.push(4);
console.log(arr);  // [1, 2, 3, 4]

pop() - 배열 끝 요소 제거 및 반환

let arr = [1, 2, 3];
let last = arr.pop();
console.log(last);  // 3
console.log(arr);   // [1, 2]

unshift() - 배열 앞에 요소 추가

let arr = [2, 3];
arr.unshift(1);
console.log(arr);  // [1, 2, 3]

shift() - 배열 앞 요소 제거 및 반환

let arr = [1, 2, 3];
let first = arr.shift();
console.log(first);  // 1
console.log(arr);    // [2, 3]


배열 변환/가공

map() - 배열 각 요소를 변환

let arr = [1, 2, 3];
let doubled = arr.map(x => x * 2);
console.log(doubled);  // [2, 4, 6]

// 객체 배열에서 특정 속성만 추출
let users = [{name: "Alice", age: 20}, {name: "Bob", age: 25}];
let names = users.map(user => user.name);
console.log(names);  // ["Alice", "Bob"]

filter() - 조건에 맞는 요소만 필터링

let arr = [1, 2, 3, 4, 5];
let even = arr.filter(x => x % 2 === 0);
console.log(even);  // [2, 4]

// 특정 조건 만족하는 객체만 추출
let users = [{name: "Alice", age: 20}, {name: "Bob", age: 17}];
let adults = users.filter(user => user.age >= 18);
console.log(adults);  // [{name: "Alice", age: 20}]

reduce() - 배열을 하나의 값으로 누적

let arr = [1, 2, 3, 4];
let sum = arr.reduce((acc, cur) => acc + cur, 0);
console.log(sum);  // 10
// 최댓값 구하기
let arr = [3, 1, 4, 1, 5];
let max = arr.reduce((acc, cur) => Math.max(acc, cur), -Infinity);
console.log(max);  // 5

// 객체로 그룹화
let fruits = ["apple", "banana", "apple", "orange", "banana"];
let count = fruits.reduce((acc, fruit) => {
  acc[fruit] = (acc[fruit] || 0) + 1;
  return acc;
}, {});
console.log(count);  // {apple: 2, banana: 2, orange: 1}

forEach() - 각 요소에 함수 실행 (반환값 없음)

let arr = [1, 2, 3];
arr.forEach(x => console.log(x * 2));
// 출력: 2, 4, 6


배열 검색

find() - 조건에 맞는 첫 번째 요소 반환

let arr = [1, 2, 3, 4];
let found = arr.find(x => x > 2);
console.log(found);  // 3

findIndex() - 조건에 맞는 첫 번째 요소의 인덱스 반환

let arr = [1, 2, 3, 4];
let idx = arr.findIndex(x => x > 2);
console.log(idx);  // 2

indexOf() - 특정 요소의 첫 인덱스 반환

let arr = [1, 2, 3, 2];
console.log(arr.indexOf(2));      // 1
console.log(arr.indexOf(5));      // -1 (없으면 -1)

includes() - 특정 요소 포함 여부 확인

let arr = [1, 2, 3];
console.log(arr.includes(2));  // true
console.log(arr.includes(5));  // false

some() - 조건에 맞는 요소가 하나라도 있으면 true

let arr = [1, 2, 3];
console.log(arr.some(x => x > 2));  // true

every() - 모든 요소가 조건에 맞아야 true

let arr = [1, 2, 3];
console.log(arr.every(x => x > 0));   // true
console.log(arr.every(x => x > 2));   // false


배열 정렬/순서

sort() - 배열 정렬 (원본 변경)

// 숫자 오름차순
let arr = [3, 1, 4, 2];
arr.sort((a, b) => a - b);
console.log(arr);  // [1, 2, 3, 4]

// 숫자 내림차순
arr.sort((a, b) => b - a);
console.log(arr);  // [4, 3, 2, 1]

// 문자열 정렬
let fruits = ["banana", "apple", "cherry"];
fruits.sort();
console.log(fruits);  // ["apple", "banana", "cherry"]

// 객체 정렬
let users = [{name: "Bob", age: 25}, {name: "Alice", age: 20}];
users.sort((a, b) => a.age - b.age);
console.log(users);  // [{name: "Alice", age: 20}, {name: "Bob", age: 25}]

reverse() - 배열 순서 뒤집기 (원본 변경)

let arr = [1, 2, 3];
arr.reverse();
console.log(arr);  // [3, 2, 1]


배열 분할/결합

slice(start, end) - 배열 일부 추출 (원본 유지)

let arr = [1, 2, 3, 4, 5];
console.log(arr.slice(1, 3));   // [2, 3]
console.log(arr.slice(2));      // [3, 4, 5]
console.log(arr.slice(-2));     // [4, 5]

splice(start, deleteCount, ...items) - 요소 삭제/추가 (원본 변경)

let arr = [1, 2, 3, 4];
arr.splice(1, 2);           // [1, 4] - 인덱스 1부터 2개 제거
arr.splice(1, 0, 'a', 'b'); // [1, 'a', 'b', 4] - 인덱스 1에 추가
arr.splice(1, 2, 'x');      // [1, 'x', 4] - 인덱스 1부터 2개 제거하고 'x' 추가

concat() - 배열 합치기

let arr1 = [1, 2];
let arr2 = [3, 4];
let result = arr1.concat(arr2);
console.log(result);  // [1, 2, 3, 4]

// 스프레드 연산자로도 가능
let result2 = [...arr1, ...arr2];
console.log(result2);  // [1, 2, 3, 4]

join(separator) - 배열을 문자열로 합침

let arr = ['Hello', 'World'];
console.log(arr.join(' '));   // "Hello World"
console.log(arr.join(''));    // "HelloWorld"
console.log(arr.join('-'));   // "Hello-World"


기타 유용한 배열 메서드

fill(value, start, end) - 배열을 특정 값으로 채움

let arr = new Array(5).fill(0);
console.log(arr);  // [0, 0, 0, 0, 0]

let arr2 = [1, 2, 3, 4, 5];
arr2.fill(0, 1, 3);
console.log(arr2);  // [1, 0, 0, 4, 5]

 

flat(depth) - 중첩 배열 평탄화

let arr = [1, [2, [3, 4]]];
console.log(arr.flat());     // [1, 2, [3, 4]]
console.log(arr.flat(2));    // [1, 2, 3, 4]
console.log(arr.flat(Infinity));  // [1, 2, 3, 4]

from() - 유사 배열/반복 가능 객체를 배열로 변환

// 문자열을 배열로
let str = "hello";
let arr = Array.from(str);
console.log(arr);  // ["h", "e", "l", "l", "o"]

// 길이가 n인 배열 생성 + 초기화
let arr2 = Array.from({length: 5}, (_, i) => i);
console.log(arr2);  // [0, 1, 2, 3, 4]


2. 문자열(String) 메서드

문자열 검색/확인

indexOf(searchValue) - 문자열에서 특정 문자열의 첫 위치 반환

let str = "Hello World";
console.log(str.indexOf("World"));  // 6
console.log(str.indexOf("x"));      // -1 (없으면 -1)

includes(searchString) - 문자열 포함 여부 확인

let str = "Hello World";
console.log(str.includes("World"));  // true
console.log(str.includes("x"));      // false

startsWith(searchString) - 특정 문자열로 시작하는지 확인

console.log("Hello".startsWith("He"));   // true
console.log("Hello".startsWith("lo"));   // false

endsWith(searchString) - 특정 문자열로 끝나는지 확인

console.log("Hello".endsWith("lo"));   // true
console.log("Hello".endsWith("He"));   // false


문자열 추출

charAt(index) - 특정 인덱스의 문자 반환

console.log("Hello".charAt(1));  // "e"
console.log("Hello"[1]);         // "e" (동일)

slice(start, end) - 문자열 일부 추출

let str = "Hello World";
console.log(str.slice(0, 5));   // "Hello"
console.log(str.slice(6));      // "World"
console.log(str.slice(-5));     // "World"

substring(start, end) - 문자열 일부 추출 (음수 불가)

let str = "Hello World";
console.log(str.substring(0, 5));  // "Hello"
console.log(str.substring(6));     // "World"

slice와 substring 차이

  • slice(): 음수 인덱스 지원 (뒤에서부터 계산)
  • substring(): 음수를 0으로 처리, 시작 부분이 끝 부분보다 크면(start > end이면) 자동으로 바꿈

문자열 변환

split(separator) - 문자열을 배열로 분할

console.log("Hello World".split(" "));    // ["Hello", "World"]
console.log("a,b,c".split(","));          // ["a", "b", "c"]
console.log("Hello".split(""));           // ["H", "e", "l", "l", "o"]

replace(searchValue, newValue) - 문자열 치환 (첫 번째만 적용)

let str = "Hello World World";
console.log(str.replace("World", "JS"));  // "Hello JS World"

replaceAll(searchValue, newValue) -일치하는 모든 문자열 치환

let str = "Hello World World";
console.log(str.replaceAll("World", "JS"));  // "Hello JS JS"

toUpperCase() - 대문자로 변환

console.log("hello".toUpperCase());  // "HELLO"

toLowerCase() - 소문자로 변환

console.log("HELLO".toLowerCase());  // "hello"

trim() - 앞뒤 공백 제거

console.log("  hello  ".trim());      // "hello"
console.log("  hello  ".trimStart()); // "hello  "
console.log("  hello  ".trimEnd());   // "  hello"

padStart(targetLength, padString) - 문자열 앞을 채움

console.log("5".padStart(3, "0"));   // "005"
console.log("day".padStart(6, "to")); // "tododay"

padEnd(targetLength, padString) - 문자열 뒤를 채움

console.log("5".padEnd(3, "0"));   // "500"


문자열 반복

repeat(count) - 문자열 반복

console.log("Ha".repeat(3));  // "HaHaHa"
console.log("*".repeat(5));   // "*****"


기타

length - 문자열 길이

console.log("Hello".length);  // 5


3. 숫자/수학(Number/Math) 메서드

숫자 변환

parseInt(string, radix) - 문자열을 정수로 변환

console.log(parseInt("123"));       // 123
console.log(parseInt("3.14"));      // 3
console.log(parseInt("1010", 2));   // 10 (2진수)
console.log(parseInt("FF", 16));    // 255 (16진수)

parseFloat(string) - 문자열을 실수로 변환

console.log(parseFloat("3.14"));    // 3.14
console.log(parseFloat("3.14abc")); // 3.14

Number(value) - 값을 숫자로 변환

console.log(Number("123"));   // 123
console.log(Number("3.14"));  // 3.14
console.log(Number("abc"));   // NaN

toString(radix) - 숫자를 문자열로 변환

console.log((10).toString());    // "10"
console.log((10).toString(2));   // "1010" (2진수)
console.log((255).toString(16)); // "ff" (16진수)

toFixed(digits) - 소수점 자릿수 고정

console.log((3.14159).toFixed(2));  // "3.14"
console.log((3).toFixed(2));        // "3.00"


Math 객체

Math.max(...values) - 최댓값 반환

console.log(Math.max(1, 2, 3));       // 3
console.log(Math.max(...[1, 2, 3]));  // 3

Math.min(...values) - 최솟값 반환

console.log(Math.min(1, 2, 3));       // 1
console.log(Math.min(...[1, 2, 3]));  // 1

Math.abs(x) - 절댓값

console.log(Math.abs(-5));   // 5
console.log(Math.abs(5));    // 5

Math.floor(x) - 내림

console.log(Math.floor(3.7));   // 3
console.log(Math.floor(-3.7));  // -4

Math.ceil(x) - 올림

console.log(Math.ceil(3.2));   // 4
console.log(Math.ceil(-3.2));  // -3

Math.round(x) - 반올림

console.log(Math.round(3.5));   // 4
console.log(Math.round(3.4));   // 3

Math.pow(base, exponent) - 거듭제곱

console.log(Math.pow(2, 3));  // 8
console.log(2 ** 3);          // 8 (동일)

Math.sqrt(x) - 제곱근

console.log(Math.sqrt(16));  // 4
console.log(Math.sqrt(2));   // 1.414...

Math.random() - 0~1 사이 난수

console.log(Math.random());  // 0.xxxxx

// 1~10 사이 랜덤 정수
let random = Math.floor(Math.random() * 10) + 1;


4. 객체(Object) 메서드

Object.keys(obj) - 객체의 키를 배열로 반환

let obj = {a: 1, b: 2, c: 3};
console.log(Object.keys(obj));  // ["a", "b", "c"]

Object.values(obj) - 객체의 값을 배열로 반환

let obj = {a: 1, b: 2, c: 3};
console.log(Object.values(obj));  // [1, 2, 3]

Object.entries(obj) - [키, 값]으로 배열 반환

let obj = {a: 1, b: 2};
console.log(Object.entries(obj));  // [["a", 1], ["b", 2]]

// 활용: 객체를 Map으로 변환
let map = new Map(Object.entries(obj));


5. Set과 Map

📍 Set (중복 제거)

// 배열 중복 제거
let arr = [1, 2, 2, 3, 3, 3];
let unique = [...new Set(arr)];
console.log(unique);  // [1, 2, 3]

// Set 메서드
let set = new Set([1, 2, 3]);
set.add(4);           // Set {1, 2, 3, 4}
set.delete(2);        // Set {1, 3, 4}
set.has(3);           // true
set.size;             // 3
set.clear();          // Set {}


📍 Map (키-값 쌍 저장)

let map = new Map();
map.set('name', 'Alice');
map.set('age', 20);

console.log(map.get('name'));  // "Alice"
console.log(map.has('age'));   // true
console.log(map.size);         // 2

map.delete('age');
console.log(map.size);         // 1

// 순회
for (let [key, value] of map) {
  console.log(`${key}: ${value}`);
}


6. 팁

배열 초기화

// 길이 n인 배열, 모두 0으로 초기화
let arr = new Array(5).fill(0);  // [0, 0, 0, 0, 0]

// 0부터 n-1까지 배열
let arr2 = Array.from({length: 5}, (_, i) => i);  // [0, 1, 2, 3, 4]

// 1부터 n까지 배열
let arr3 = Array.from({length: 5}, (_, i) => i + 1);  // [1, 2, 3, 4, 5]


2차원 배열 초기화

// n x m 배열 생성
let n = 3, m = 4;
let arr = Array.from({length: n}, () => Array(m).fill(0));
console.log(arr);
// [[0,0,0,0], [0,0,0,0], [0,0,0,0]]


배열 복사

// 얕은 복사
let arr = [1, 2, 3];
let copy1 = [...arr];
let copy2 = arr.slice();
let copy3 = Array.from(arr);

// 깊은 복사 (중첩 배열/객체)
let deepCopy = JSON.parse(JSON.stringify(arr));


최댓값/최솟값 구하기

let arr = [3, 1, 4, 1, 5];

// Math 사용
let max = Math.max(...arr);  // 5
let min = Math.min(...arr);  // 1

// reduce 사용
let max2 = arr.reduce((a, b) => Math.max(a, b));
let min2 = arr.reduce((a, b) => Math.min(a, b));


배열 합계

let arr = [1, 2, 3, 4, 5];
let sum = arr.reduce((acc, cur) => acc + cur, 0);  // 15


배열 평탄화

let arr = [[1, 2], [3, 4], [5]];
let flattened = arr.flat();  // [1, 2, 3, 4, 5]

// 또는
let flattened2 = [].concat(...arr);  // [1, 2, 3, 4, 5]


문자열, 배열 변환

// 문자열 → 배열
let str = "hello";
let arr = str.split('');     // ["h", "e", "l", "l", "o"]
let arr2 = [...str];         // ["h", "e", "l", "l", "o"]
let arr3 = Array.from(str);  // ["h", "e", "l", "l", "o"]

// 배열 → 문자열
let arr = ["h", "e", "l", "l", "o"];
let str = arr.join('');  // "hello"


숫자, 문자열 변환

// 숫자 → 문자열
let num = 123;
let str1 = String(num);      // "123"
let str2 = num.toString();   // "123"
let str3 = num + '';         // "123"

// 문자열 → 숫자
let str = "123";
let num1 = Number(str);      // 123
let num2 = parseInt(str);    // 123
let num3 = +str;             // 123


조건부 카운팅

let arr = [1, 2, 3, 4, 5];
let count = arr.filter(x => x > 2).length;  // 3


빈도수 세기

let arr = ["apple", "banana", "apple", "orange", "banana"];
let freq = arr.reduce((acc, cur) => {
  acc[cur] = (acc[cur] || 0) + 1;
  return acc;
}, {});
console.log(freq);  // {apple: 2, banana: 2, orange: 1}


정리

이 글에서 정리한 메소드들은 자바스크립트에서 자주 사용되는 핵심 메서드들입니다.
각 메서드의 시간 복잡도와 특징을 이해하는 것이 중요합니다.

특히 map, filter, reduce 같은 고차 함수와 slice, splice, sort 같은 배열 조작 메소드는 중요합니다.

 

  • 원본을 변경하는 메서드: push, pop, shift, unshift, splice, sort, reverse, fill
  • 새 배열/문자열을 반환하는 메서드: map, filter, slice, concat, split, join
728x90

'Javascript' 카테고리의 다른 글

Map Method(맵 메소드)  (1) 2025.02.05
호출 스케줄링(scheduling a call)  (0) 2025.02.04
연산자, 약식연산자와 값 유형  (2) 2024.12.26
함수(Function)  (0) 2024.12.25
객체 레터럴  (0) 2024.12.24