URL 형식, 정규표현식, 테스트 코드

HongBoogie·2024년 8월 8일

정규 표현식

  • 기본 구문:
    • /pattern/flags
    • 예: /abc/i (i 플래그는 대소문자 구분 없음)
  • 주요 메타문자:
    • . : 임의의 한 문자
    • ^ : 문자열의 시작
    • $ : 문자열의 끝
    • `` : 0회 이상 반복
    • + : 1회 이상 반복
    • * : 0회 혹은 여러개
    • ? : 0회 또는 1회
    • {n} : 정확히 n회 반복
    • {n,} : n회 이상 반복
    • {n,m} : n회 이상 m회 이하 반복
  • 문자 클래스:
    • [abc] : a, b, c 중 하나와 일치
    • [^abc] : a, b, c를 제외한 문자와 일치
    • [a-z] : a부터 z 사이의 문자와 일치
  • 특수 문자 클래스:
    • \d : 숫자 [0-9]
    • \D : 숫자가 아닌 문자 [^0-9]
    • \w : 단어 문자 [A-Za-z0-9_]
    • \W : 단어 문자가 아닌 문자
    • \s : 공백 문자
    • \S : 공백이 아닌 문자
    • \b : 63개 문자(영문 대소문자 52개 + 숫자 10개 + _(underscore))가 아닌 나머지 문자에 일치하는 경계(boundary)
    • \B : 63개 문자에 해당하는 경계
  • 그룹과 참조:
    • (abc) : 그룹화
    • (?:abc) : 비캡처링 그룹
    • \1, \2 등 : 이전 그룹 참조
  • 선택:
    • a|b : a 또는 b
  • 주요 플래그:
    • i : 대소문자 구분 없음
    • g : 전역 검색
    • m : 다중행 모드
    • s : .이 개행 문자도 포함하도록 함
  • 주요 메서드:
    • test() : 패턴 일치 여부 확인 (boolean 반환)
    • exec() : 매칭 결과 배열 반환
    • match() : 문자열에서 매칭 결과 배열 반환
    • replace() : 패턴에 일치하는 부분을 다른 문자열로 교체
    • search() : 패턴과 일치하는 부분의 인덱스 반환
    • split() : 패턴을 기준으로 문자열을 분할
  • 예시:
    const regex = /hello/i;
    console.log(regex.test("Hello, world!"));// true
    
    const str = "The quick brown fox jumps over the lazy dog";
    console.log(str.match(/\b\w{4}\b/g));// ['quick', 'over', 'lazy']
    
  • 주의사항:
    • 특수문자를 리터럴로 사용할 때는 이스케이프 필요 (예: \., \+)
    • 정규표현식은 강력하지만 복잡할 수 있으므로 가독성에 주의
    • 성능에 영향을 줄 수 있는 패턴 사용에 주의 (예: 과도한 백트래킹)

URL 규격과 형식

URL이란?

URL은 웹상에서 문서, 이미지, 동영상 등의 자원들의 위치를 나타내는 주소 이다. 즉, 웹 페이지를 찾기 위한 주소를 뜻한다.

URL은 크게 3가지로 구성되어 있는데,

  1. 프로토콜 종류
  2. 자원이 있는 서버의 IP, 도메인, 포트 주소
  3. 자원의 위치

이다.

URL(Uniform Resource Locator)의 기본 구조를 살펴보면,

scheme :// host : port / path ? query # fragment
  • scheme: 프로토콜 (예: http, https, ftp)
  • host: 도메인 이름 또는 IP 주소
  • port: 포트 번호 (선택적, 생략 시 기본값 사용)
  • path: 리소스 경로
  • query: 추가 매개변수 (선택적)
  • fragment: 문서 내 특정 부분 지정 (선택적)

으로 나눌 수 있다.

파일 경로를 URL로 표시하는 방식

로컬 파일 시스템의 경로를 URL로 표현할 때는 "file://" 스킴을 사용한다.

  • Unix 스타일: file:///home/user/document.txt
  • Windows 스타일: file:///C:/Users/username/Documents/file.txt

Unix 스타일 경로 문자열 표기 방식

  • 디렉토리 구분자로 슬래시(/) 사용
  • 루트 디렉토리는 단일 슬래시(/)로 표시
  • 상대 경로: ./current_directory, ../parent_directory
  • 홈 디렉토리: ~/Documents (틸드 사용)

예: /home/user/documents/file.txt

Windows 스타일 경로 문자열 표기 방식

  • 디렉토리 구분자로 백슬래시(\) 사용 (단, URL에서는 슬래시(/) 사용)
  • 드라이브 문자와 콜론으로 시작 (예: C:)
  • 절대 경로: C:\Users\username\Documents\file.txt
  • 상대 경로: .\current_directory, ..\parent_directory

예: C:\Users\username\Documents\file.txt

HTTP란?

  • 서버와 클라이언트가 인터넷 상에서 데이터를 주고받기 위한 프로토콜이다.
  • 어떤 종류의 데이터도 전송할 수 있다.

작동 방식

  • http는 서버/클라이언트 모델을 따른다.클라이언트가 서버에게 요청을 보내면, 서버는 클라이언트에게 응답을 보낸다.
  • http는 무상태 프로토콜이며, stateless 방식을 따른다.
stateless 방식이란? 
서버가 여러 클라이언트들을 구별할 수 없다는 것이다
클라이언트가 서버에게 요청을 보내고, 서버가 응답한 후 연결이 끊겼다고 가정하자.
그 후 똑같은 클라이언트가 또다시 서버에게 요청을 했다면, 서버는 그 클라이언트를 아까 클라이언트와 같다고 식별할 수 없다., 클라이언트의 정보를 가지지 않고 있다는 뜻이다.

stateless 방식의 장 / 단점

장점

  • 불특정 다수를 대상으로 하는 서비스에 적합하다.
  • cli, server가 최대 연결 수보다 훨씬 많은 요청과 응답을 처리할 수 있다.

단점

  • 연결이 끊어진 후에 클라이언트가 이전에 무엇을 했는지 알 수 없다. (이러한 단점을 보완하기 위해 cookie 등장)

Cookie 란?

서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다. 클라이언트는 동일 서버에 재 요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용하고, 사용자의 로그인 상태를 유지할 수 있다는 특징이 있다.

주로 세 가지 목적을 위해 사용되는데,

  1. 세션 관리
    • 서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리
  2. 개인화
    • 사용자 선호, 테마 등의 세팅
  3. 트래킹
    • 사용자 행동을 기록하고 분석하는 용도

테스트 코드

  • 우리가 작성한 코드에 문제가 없는지 테스트하기 위해 작성하는 코드
  • 개발자가 작성한 코드를 실행하고 예상된 결과가 정상적으로 나오는지 확인하는데 사용

크게 세가지로 나뉘는데

  • Unit Test
    • 가장 작은 규모의 기능을 테스트하는 것.
    • 소프트웨어 개별 코드 단위를 테스트해 오류를 발견하고 이를 수정해 전체적인 소프트웨어 품질을 향상시킴.
  • Integration Test
    • 여러가지 기능을 합쳤을 때 생기는 문제를 방지하기 위한 테스트
    • 단위 테스트에서 검증된 개별 모듈들을 결합하여 그들이 예상대로 상호작용하고 있는지 확인한다.
  • E2E Test
    • 백엔드부터 시작해 웹 페이지가 원하는대로 동작하며 원하는 데이터를 잘 보여주는지 확인하는 테스트
    • 실제 사용자의 시나리오를 테스트함으로써 소프트웨어가 의도한대로 동작하는지 확인

테스트 코드의 장단점

장점

  • 테스트 코드를 통해 발생 가능성이 있는 오류를 사전에 찾아냄으로써 서비스의 품질을 향상시킬 수 있다.
  • 테스트 코드 작성을 통해 다른 개발자가 작성한 코드의 예상 동작을 확인할 수 있어 문서화도 가능하다.
  • 코드 수정 이후에도 기능이 정상적으로 작동하는 지 검증할 수 있다.

단점

  • 테스트 코드를 작성하면서 발생하는 개발 시간 및 유지보수 비용이 발생한다.
  • 서비스의 기능이 변경되거나 확장될 때마다 테스트 코드도 함께 수정해야한다.
  • 테스트 코드에 많은 시간을 투자하다보면 오버 엔지니어링이 발생하기도 한다.
  • 러닝 커브가 높은 편이라 학습하는데 시간이 필요하다.

포트 포워딩

  • 이건 그냥 갑자기 궁금해서 찾아봤다
  • 컴퓨터 네트워크에서 라우터를 거쳐 하나의 IP주소와 포트번호의 결합으로 통신요청을 다른 곳으로 넘겨주는 역할
  • 최근 공유기는 라우터 역할도 함께 하게 되는데, 공유기는 공용 IP 주소를 가지고 있고 공유기에 연결된 컴퓨터들에게 사설 네트워크를 구축할 수 있게 한다.
  • 사설 네트워크를 구축한다 라는 말은 연결된 각 PC들에게 사설 IP를 할당해준다는 것과 같다. 공용 IP의 주소는 42억개로 매우 제한된 개수를 가지고 있기에 하나의 공용 IP를 보유하고 있는 공유기에서 사설 IP를 할당함으로서 이런 문제들을 보완하고 있다.
  • NAT는 하나의 공인 아이피를 여러개의 사설 아이피 주소와 매핑하여 여러 대의 장치가 동시에 인터넷을 사용할 수 있게 한다.
profile
개발이 즐겁고 노는게 즐거워요

0개의 댓글