LogoSEO Jing
  • All Posts
  • SEO Jing
  • KD Team
  • CLab CoreTeam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

프론트엔드스터디JavaScript에러처리정규표현식

프론트엔드 스터디 심화: 에러 처리와 정규 표현식

2026년 6월 8일·19분 읽기

언제 이 내용이 필요한가?

이 자료는 지금 당장 읽지 않아도 됩니다. 1학기 React 스터디를 마치고, 아래 상황이 되었을 때 돌아오세요.

  • useEffect 안에서 fetch 에러 처리를 하고 싶은데 try/catch가 낯설 때
  • API 응답 유효성 검사, 폼 입력 검증에 정규 표현식을 쓰고 싶을 때
  • 커스텀 에러 클래스로 에러 종류를 구별하고 싶을 때
  • 면접에서 에러 처리나 정규 표현식 관련 질문을 받게 될 때

심화 학습 자료

  • 학습 챕터: poiemaweb — 에러 처리 / 정규 표현식
  • 자료 바로가기: 1. 에러 처리
2. 정규 표현식
  • 딥다이브 요약본 (보충용):

    딥다이브 요약 GitHub

  • 에러 처리는 async/await와 짝을 이루는 개념으로, 프로덕션 코드에서 예외 상황을 안전하게 처리하는 방법입니다. 정규 표현식은 처음 보면 암호처럼 느껴지지만, 자주 쓰는 패턴 몇 가지만 익혀두면 입력 유효성 검사, 문자열 파싱에서 강력하게 활용할 수 있습니다.


    스킵 진단 문제

    아래 10문제를 막힘없이 풀 수 있다면,

    이 자료 전체를 생략하거나 모르는 부분만 선택적으로 읽어도 됩니다.

    Quiz1 / 10
    Q.try/catch/finally에 대한 설명으로 옳은 것은 무엇인가요?

    1. 에러 처리 — 안전한 코드 만들기

    try/catch/finally 기본

    js
    function divide(a, b) {
      if (b === 0) throw new Error("0으로 나눌 수 없습니다");
      return a / b;
    }
    
    try {
      const result = divide(10, 0);
      console.log(result);
    } catch (err) {
      console.error(err.message); // "0으로 나눌 수 없습니다"
      console.error(err.name); // "Error"
    } finally {
      console.log("항상 실행"); // 에러 여부 관계없이 실행
    }
    

    내장 에러 타입

    js
    // JS에서 자주 마주치는 에러 타입들
    try {
      null.property; // TypeError
      undeclaredVar; // ReferenceError
      JSON.parse("{bad}"); // SyntaxError
    } catch (err) {
      if (err instanceof TypeError) {
        console.log("타입 에러:", err.message);
      } else if (err instanceof ReferenceError) {
        console.log("참조 에러:", err.message);
      }
    }
    

    커스텀 에러 — Error 상속

    js
    class ValidationError extends Error {
      constructor(message, field) {
        super(message);
        this.name = "ValidationError";
        this.field = field;
      }
    }
    
    class NetworkError extends Error {
      constructor(message, statusCode) {
        super(message);
        this.name = "NetworkError";
        this.statusCode = statusCode;
      }
    }
    
    // 에러 종류에 따라 다르게 처리
    try {
      throw new ValidationError("이메일 형식이 올바르지 않습니다", "email");
    } catch (err) {
      if (err instanceof ValidationError) {
        console.log(`[${err.field}] ${err.message}`);
      } else if (err instanceof NetworkError) {
        console.log(`HTTP ${err.statusCode}: ${err.message}`);
      } else {
        throw err; // 처리할 수 없는 에러는 다시 전파
      }
    }
    

    async/await 에러 처리

    js
    // 기본 패턴
    async function fetchUser(id) {
      try {
        const res = await fetch(`/api/users/${id}`);
        if (!res.ok) {
          throw new NetworkError("요청 실패", res.status);
        }
        return await res.json();
      } catch (err) {
        console.error("fetchUser 에러:", err.message);
        throw err; // 필요하면 상위로 전파
      }
    }
    
    // 호출부 처리
    async function loadUser() {
      try {
        const user = await fetchUser(1);
        setUser(user);
      } catch (err) {
        setError(err.message);
      }
    }
    

    2. 정규 표현식 — 패턴으로 문자열 다루기

    정규 표현식은 처음 보면 어렵지만, 자주 쓰는 패턴 몇 가지를 익혀두면 입력 유효성 검사, 문자열 파싱, 포맷 변환 등에서 강력하게 활용할 수 있습니다.

    자주 쓰는 패턴

    js
    // 문자 클래스
    const digits = /\d/; // 숫자 [0-9]
    const words = /\w/; // 단어 문자 [a-zA-Z0-9_]
    const spaces = /\s/; // 공백 문자
    const any = /./; // 줄바꿈 제외 모든 문자
    
    // 수량자
    const zeroOrMore = /a*/; // 0번 이상
    const oneOrMore = /a+/; // 1번 이상
    const optional = /a?/; // 0번 또는 1번
    const exactly3 = /a{3}/; // 정확히 3번
    const twoToFour = /a{2,4}/; // 2~4번
    
    // 앵커
    const start = /^hello/; // hello로 시작
    const end = /world$/; // world로 끝
    const exact = /^hello world$/; // 정확히 이 문자열
    

    실무 패턴 예시

    js
    // 이메일 유효성 검사
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    emailRegex.test("user@example.com"); // true
    emailRegex.test("invalid-email"); // false
    
    // 한국 휴대폰 번호
    const phoneRegex = /^01[016789]-?\d{3,4}-?\d{4}$/;
    phoneRegex.test("010-1234-5678"); // true
    
    // URL에서 도메인 추출
    const url = "https://www.example.com/path?query=1";
    const domain = url.match(/https?:\/\/([^\/]+)/)?.[1];
    // "www.example.com"
    
    // 날짜 포맷 변환 (YYYY-MM-DD → YYYY.MM.DD)
    "2026-06-08".replace(/(\d{4})-(\d{2})-(\d{2})/, "$1.$2.$3");
    // "2026.06.08"
    

    주요 메서드

    js
    const str = "Hello World hello";
    const regex = /hello/gi; // g: 전역, i: 대소문자 무시
    
    // test — 매칭 여부 (boolean)
    regex.test(str); // true
    
    // match — 매칭 결과 배열
    str.match(regex); // ["Hello", "hello"]
    
    // replace — 교체
    str.replace(regex, "Hi"); // "Hi World Hi"
    
    // split — 분리
    "a,b,,c".split(/,+/); // ["a", "b", "c"]
    
    // search — 첫 번째 매칭 인덱스
    str.search(/World/); // 6
    

    📝 학습 이해 퀴즈

    아래 코드를 브라우저 콘솔에서 직접 실행해보고 결과를 입력해보세요.

    Quiz1 / 3
    Q.아래 코드의 출력 결과를 순서대로 입력하세요.
    js
    function riskyOperation() {
    throw new TypeError("타입 에러 발생");
    }
    
    try {
    riskyOperation();
    console.log("A");
    } catch (err) {
    console.log("B:", err.name);
    } finally {
    console.log("C");
    }

    📝 심화 인증 미션

    아래 질문에 답해보세요. 직접 코드를 실행해보고 이유를 설명할 수 있어야 합니다.

    Quiz1 / 3
    Q.아래 코드에서 finally 블록은 실행되나요? 실행된다면 어떤 값이 출력되는지, 그 이유를 설명하세요.
    js
    function test() {
    try {
      throw new Error("에러 발생");
      console.log("A");
    } catch (err) {
      console.log("B:", err.message);
      return "catch에서 반환";
    } finally {
      console.log("C");
    }
    }
    
    console.log(test());

    관련 포스팅

    • 프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블

    포스트 목록

    /study/clab-26-1
    파일 13개, 폴더 2개
    프론트엔드 스터디 1주차: 마크업 그 이상, 실무를 위한 중급 HTML 가이드프론트엔드 스터디 2주차: 사용자와 소통하는 폼 & CSS의 시작프론트엔드 스터디 3주차: 프론트엔드의 첫 번째 벽, 박스 모델과 스타일링프론트엔드 스터디 4주차: 자유자재 레이아웃 (포지션과 플렉스박스)프론트엔드 스터디 5주차: JavaScript 시작 — 타입, 변수, 그리고 JS가 이상한 이유프론트엔드 스터디 6주차: 객체, 함수, 그리고 스코프프론트엔드 스터디 7주차: 불변성, 프로토타입, 타입 체크프론트엔드 스터디 8주차: 클로저, Promise, async/await프론트엔드 스터디 9주차: React 입문 전 필수 JS 문법 — map, 구조 분해, 스프레드프론트엔드 스터디 10주차: React 기초 1 — 컴포넌트, JSX, props, useState프론트엔드 스터디 11주차: React 기초 2 — useEffect, 이벤트 처리, 폼프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블프론트엔드 스터디 심화: 에러 처리와 정규 표현식