공지
뉴스레터 공간을 https://puddingcamp.com/newsletters 로 옮겼습니다.

하드 스킬

0030. React Hooks이란?

이번 하드스킬편에서는 연재 중인 리액트 입문 컨텐츠로 함수 컴포넌트와 리액트 훅을 살펴봅니다.

2024.11.11
from.
푸딩캠프

함수 컴포넌트 등장과 한계

(1) 클래스 컴포넌트의 한계

React의 초기 버전에서는 클래스(class)로 컴포넌트를 작성해 상태 관리와 생명주기를 다뤘습니다. 다음은 클래스 컴포넌트 예시예요.

 
 

복잡해 보이지요? 함수 컴포넌트를 작성해볼게요.

 
 

깔끔하죠? 게다가 코드 흐름이 더 직관적입니다.

 

(2) 함수 컴포넌트의 한계

하지만, 은총알은 없습니다. 위와 같은 예시는 간단하기 때문에 문제를 깔끔하게 해결해주지만, 조금만 컴포넌트 관계가 복잡해져도 금방 한계에 부딪힙니다. 컴포넌트 관계가 복잡해지다보면 상태 로직을 재사용하게 되는데, 이 과정에서 HOC(Higher Order Components) 문제나 래퍼 지옥(wrapper hell) 문제가 자주 발생하죠.

첨부 이미지

과장한 게 아니예요. 마치 콜백 지옥처럼(callback hell) 컴포넌트가 깊게 중첩되는 건 흔히 발생합니다. 게다가 함수 컴포넌트는 JavaScript 측면에선 함수잖아요. 함수 안에서 변수에 접근하는 스코프(scope)가 각 중첩 단계마다 생성되므로 코드 가독성이 좋지 않지요. 또 컴포넌트가 강하게 결합되어 분리하기 어렵고, 코드 수정을 어렵게 합니다.

이러한 문제를 Hooks가 해결해줍니다.

 

리액트 Hooks

리액트 Hooks는 함수 컴포넌트에서 상태(state) 관리와 생명주기(lifecycle) 기능을 사용할 수 있게 해주는 기능입니다. 훅(갈고리)이라는 이름의 유래는 공식적인 설명은 없는 것 같은데, 컴포넌트 생명주기에 어떤 동작을 건다는 설명이 가장 지지 받지요.

(1) 컴포넌트 생애주기(lifecycle)

리액트 컴포넌트의 생애주기는 크게 3단계로 구분합니다.

1) 컴포넌트 마운트 될 때

컴포넌트가 리액트 돔(Dom)에 렌더링 되는 시점입니다.

 
 

2) 상태가 변경될 때

컴포넌트가 받는 Props가 변경되거나 컴포넌트의 상태(State)가 변경되는 시점입니다.

 
 

다이시 카토는 리액트 훅이 등장하면서 상태를 생성하는 새로운 방법이 생겼다고 하면서, 폼, 서버 캐쉬, 내비게이션 상태와 같은 상황에서 발생하는 상태 관리 문제를 해결하는 것이 리액트 훅의 목표 중 하나라고 하기도 했습니다. (책, 리액트 훅을 활용한 마이크로 상태 관리 (위키북스))

 

3) 마운트 된 컴포넌트가 마운트 해제 될 때

리액트 돔에 마운트 된 컴포넌트가 마운트 해제되어 DOM에서 제거되는 시점입니다.

 
 

(2) Hooks 사용 방법

리액트 훅은 JavaScript 측면에서 단순 함수입니다. `use`라는 접두사를 붙인 이름을 사용하지요.

 
 

리액트 훅은 함수 컴포넌트 안이나 사용자 제작 훅(Custom Hook) 안에서만 사용할 수 있습니다. 훅을 호출(call, invoke)하는 건 최상위 스코프 단계에서만 호출할 수 있어요. 가령, 조건문 안에서는 사용하지 못해요. 가장 중요한 이유는 훅의 순서를 보장하지 못하기 때문이에요. 조건에 따라 호출되는 훅이 달라지거든요.

 
 

반복문에서 사용하지 못합니다. 반복문을 사용하기에 따라서는 순서가 보장되지만, 예측 가능성이 떨어지고 최적화하기 어렵습니다. 이와 관련해서는 조건부 렌더링에서 Transpiling과 Compiling을 설명하며 다뤘습니다. 그리고, 또 다른 이유는 리액트가 규약보다는 설정(Convention over Configuration) 철학을 따르는 점이 아닐까 생각합니다. 유연성을 조금 포기하는 대신 안전하고 유지보수하기 좋은 코드를 유도하는 거죠.

 

푸딩캠프 이야기

토이스토리 2기 모집을 잠시 기다려주세요

혹시 토이스토리 2기에 참가하러 방문하신 분이라면 신청하는 영역이 없어서 당황하셨을 거예요. 내부 사정으로 잠시 2기 모집을 멈추고 정비하고 있거든요. 그대로 모집을 유지해도 되지만, 초반에 참가하신 분은 결제 후 하염없이 기다리실 것 같아 고민 끝에 모집을 잠시 멈췄습니다.

곧 재개할 예정이며, 12월 초에서 중순에 2기 시작을 하도록 일정을 계획하고 있습니다. 조금만 기다려주세요!

다가올 뉴스레터가 궁금하신가요?

지금 구독해서 새로운 레터를 받아보세요

✉️

다른 뉴스레터

0046. Vitest에서의 스냅샷 테스트 개념과 활용

리액트 애플리케이션을 제작하다보면, 컴포넌트의 UI 구조가 예상치 못하게 바뀌어버리는 상황을 미리 파악하는 일이 중요한 경우가 있습니다. 스냅샷 테스트(Snapshot Test)는 컴포넌트가 렌더링해내는 결과물(주로 DOM 구조)을 파일 형태로 보관하고, 테스트 실행 시 새로 생성...

2024.12.23·하드 스킬

0043. 리액트 테스팅과 웹 표준, 그리고 시맨틱 웹

토이스토리 2기 커리큘럼이 조정됩니다. 그리고 이번 리액트 입문하는 연재 콘텐츠에서는 실제로 테스트 코드를 작성해요. 웹 프론트엔드의 테스팅에 관심 있는 분들은 이번 연재분을 꼭 보세요!. 푸딩캠프 이야기 토이스토리 2기 커리큘럼 조정 푸딩캠프에서 토이 프로젝트를 만들어 출시하는 ...

2024.12.16·하드 스킬

0052. 사용자 정의 훅(Custom Hook) 테스트

토이스토리 2기를 리뉴얼 출시합니다. 랜선 사수와 함께 결제를 연동한 프로젝트를 출시하고 운영해보세요! 이번 하드스킬 콘텐츠는 리액트 커스텀 훅을 테스트하는 내용을 다룹니다.. 토이스토리 2기 리뉴얼 출시 출시해서 운영하는 토이 프로젝트. 거기에 결제까지. 토이 프로젝트를 출시하고...

2025.01.06·하드 스킬

0055. TanStack Query로 API 호출 컴포넌트 테스트하기

26년차 CTO 개발자를 사수로서 팀 프로젝트를 함께 하는 방법을 소개합니다. 또한 TanStack Query를 사용하는 환경에서 테스팅하는 방법을 다룹니다.. 푸딩캠프 이야기 26년차 CTO 출신 개발자를 사수로서 함께 프로젝트를 만드세요! 대부분의 경우 나의 성장을 조력할 코치...

2025.01.11·하드 스킬

0049. Vitest에서 Mocking과 의존성 주입(Dependency Injection) 처리하기

토이스토리 2기를 리뉴얼하여 곧 출시합니다. 무엇이 달라지는지 핵심 요약해 전해드립니다. 이번 하드스킬은 리액트 입문하기의 테스팅 콘텐츠로, Vitest에서 모킹과 의존성 주입을 하는 내용을 다룹니다.. 푸딩캠프 이야기 토이스토리 2기 리뉴얼 토이 프로젝트를 만드는 푸딩캠프 프로그...

2024.12.30·하드 스킬

0042. 테스팅과 리액트 테스팅

이번 리액트 입문 연재 콘텐츠는 테스팅에 관해 개괄합니다. 프론트엔드, 리액트에서 테스팅을 학습하시려 했다면 이번 콘텐츠로 시작해보세요! 프레임워크 없는 프론트엔드 개발 스터디 참가자 모집을 이제 곧 마감해요. 서두르세요!. 푸딩캠프 이야기 프레임워크 없는 프론트엔드 개발 스터디 ...

2024.12.09·하드 스킬
© 2026 푸딩캠프

그동안 메일리로 여러분을 찾아뵙던 뉴스레터를 https://puddingcamp.com/newsletters 로 옮겼습니다. 신규 구독은 푸딩캠프 웹사이트에서 진행해주세요. :)

뉴스레터 문의newsletter@puddingcamp.com

메일리 로고

도움말 자주 묻는 질문 오류 및 기능 관련 제보

서비스 이용 문의admin@team.maily.so 채팅으로 문의하기

메일리 사업자 정보

메일리 (대표자: 이한결) | 사업자번호: 717-47-00705 | 서울특별시 송파구 위례광장로 199, 5층 501-8호

이용약관 | 개인정보처리방침 | 정기결제 이용약관 | 라이선스