문제상황

개발을 진행하던 중, feat-a 라는 브랜치에서 코드 작업을 하다가 여러 commit이 진행되었다. 그러다 문제가 발생해서 2개의 commit만큼 working tree를 되돌리기 위해 git reset --hard HEAD^ 명령어를 두 번 수행했다. 그럼 두 번 되돌리던 중 앞서 지나간 commit은 어떻게 되는 것이며, 어떻게 되돌릴 수 있을까?

 

해결방법

git reset --hard HEAD^ 명령을 여러 번 수행하면, 현재 브랜치의 HEAD를 과거 커밋으로 이동시키고, 그 시점 이후의 모든 변경 사항을 working tree와 staging area에서 제거한다. 즉, 최근의 커밋 이력이 없어진 것처럼 보이게 된다. 하지만, 앞서 존재했던 커밋 이력은 영구적으로 삭제된 것은 아니다. Git은 이를 dangling commit(떠도는 커밋)이라고 부르며, Git의 내부 데이터 구조에 여전히 남아있다. 이 커밋들은 Git이 자동으로 저장하는 reflog를 통해 추적 가능하다. 커밋 이력을 복구하는 방법을 알알보자.

git reflog 명령어를 사용하면, 브랜치가 이동한 모든 기록을 볼 수 있다. 이전 커밋으로 reset하기 전의 상태를 찾고, 해당 커밋 해시를 복사한다. 그리고 git reset --hard <커밋 해시> 명령어를 사용하여 해당 커밋으로 돌아갈 수 있다.

나의 경우에는, 개발 중 문제가 생긴 코드가 꼬여서 하나하나 해결하기 어려워 이전 커밋으로 되돌린 상태에서 기존의 작업물이 아까워서 나중에 언젠가 도움이 될까 싶어 브랜치로 남겨 두려는 욕심이 있었기에, 새로운 브랜치를 따서 해당 커밋을 HEAD로 잡아두어 코드를 보관하고자 하였다. 따라서 해당 작업을 명령어로 남겨둔다.

git reflog // 여기서 원하는 커밋 해시 찾기 ex.abcd12
git checkout -b temp-feat abcde123 // temp-feat라는 로컬 저장소에 abcd12라는 이력 보관
728x90

JWT를 이용해서 로그인을 구현하다 보면, 토큰을 어디에 저장할 것인지 결정해야 하는 순간이 온다. 로컬스토리지에 저장하기, 세션스토리지에 저장하기, 쿠키에 저장하기 등등 여러 방법들을 마주할 것이다. 나는 주로 로컬스토리지에 저장하는 것으로 구현하곤 하는데, 로컬스토리지라는 것 자체에 궁금증이 생겨 찾아보고 정리해본다.

 

LocalStorage란?

LocalStorage는 브라우저에서 제공하는 웹 저장소로, 웹 애플리케이션의 데이터를 클라이언트 측에 영구적으로 저장할 수 있는 기능이다. LocalStorage는 세션이 종료되거나 브라우저가 닫혀도 데이터를 유지하며, 웹 애플리케이션에서 서버와의 통신 없이도 데이터를 관리할 수 있게 해 준다. HTML5 표준에서 추가된 기능으로, 모든 최신 브라우저가 이 기능을 지원한다.

 

LocalStorage의 메모리 영역

LocalStorage는 각 도메인(Origin)별로 독립된 메모리 공간을 사용하며, 도메인별로 할당된 메모리의 양은 브라우저마다 상이하다. 일반적으로 브라우저에서 할당된 용량은 약 5MB 정도이며, 이 용량 한도 내에서 문자열 형태의 데이터를 저장할 수 있다. Chrome, Firefox, Safari, Edge, Opera 모두 약 5MB 정도의 제한을 두고 있다. LocalStorage는 비휘발성 메모리를 사용하기 때문에, 페이지를 새로고침하거나 브라우저를 닫았다가 다시 열더라도 저장된 데이터를 유지한다.

 

자바스크립트에서 LocalStorage 사용 방법

LocalStorage는 딕셔너리와 같은 키-값 쌍(key-value pair) 형식으로 데이터를 저장한다. 모든 값은 반드시 문자열이어야 하며, 숫자, 객체 등의 다른 데이터 타입은 문자열로 변환한 후에 저장해야 한다.

저장: localStorage.setItem()

localStorage.setItem('key', 'value');
localStorage.setItem('userId', this.userId); // 예시

조회: localStorage.getItem()

let value = localStorage.getItem('key');
console.log(value); // 'value' 출력

삭제: localStorage.removeItem(), localStorage.clear()

localStorage.removeItem('key'); // 'key'에 해당하는 값 삭제
localStorage.clear(); // 모든 데이터 삭제
// 삭제되어 없는 값을 조회하게 되면 null을 반환한다

저장된 데이터 개수 확인: localStorage.length

let length = localStorage.length;
console.log(length); // 저장된 데이터의 개수 출력

저장된 데이터의 키 조회: localStorage.key()

let key = localStorage.key(0);
console.log(key); // 첫 번째로 지정된 키 값 출력

 

LocalStorage가 삭제되는 경우

내가 LocalStorage에 대해 찾아본 이유로, 저장하고 있는 값이 혹시 없어지는 경우가 존재하는지 궁금했다. 기본적으로 LocalStorage는 데이터를 영구적으로 저장하는 공간이다. 따라서, 수동으로 삭제하지 않는 한 데이터가 자동으로 제거되지는 않는다. 브라우저를 닫아도 데이터는 유지되며, 사용자가 직접 localStorage.clear()나 localStorage.removeItem()을 호출하지 않는 이상 계속 보존된다. 다만 몇 가지 경우에는 데이터가 제거될 수 있는데 그러한 경우는 다음과 같다.

  1. 사용자가 브라우저 캐시를 삭제하는 경우
  2. 브라우저나 운영체제가 제공하는 디스크 정리 기능을 사용하는 경우
  3. 특정 브라우저(특히 Safari)는 디스크 공간이 부족할 때 LocalStorage 데이터를 자동으로 정리할 수 있다

 

LocalStorage를 사용하는 적절한 시점

LocalStorage는 데이터를 장기간 유지해야 하는 경우에 적합하다. 주로 다음과 같은 상황에서 유용하게 사용할 수 있다.

  • 사용자 설정 (ex. 다크 모드 여부, 언어 설정 등)을 저장할 때
  • 비로그인 상태에서 사용자의 상태를 유지해야 할 때
  • 캐시 용도로 데이터를 저장해 서버 요청을 줄이고 성능을 개선할 때
  • 쇼핑 카트나 폼 데이터를 저장해 사용자 경험을 향상시킬 때

 

주의사항

LocalStorage를 사용할 때 몇 가지 주의할 점들이 있다. 기본적으로 LocalStorage는 동기적으로 작동하므로, 대량의 데이터를 읽고 쓰는 작업은 성능에 영향을 줄 수 있다. 그리고 모든 데이터는 문자열 형태로 저장되므로, JSON 객체는 JSON.stringify()와 JSON.parse()를 통해 문자열로 변환한 뒤 사용해야 한다. 마지막으로 LocalStorage는 보안 취약점을 가질 수 있다. 민감한 정보를 LocalStorage에 저장하는 것은 바람직하지 않으며 보안이 필요한 데이터는 서버에서 관리하는 것이 좋다.

 

LocalStorage와 다른 웹 저장소의 차이

LocalStorage 외에도 브라우저에는 SessionStorage와 쿠키(Cookie)가 있다. 이들 간의 차이점을 간략하게 정리하면 다음과 같다.

  • LocalStorage: 도메인 별로 저장되며, 브라우저가 닫혀도 데이터가 유지된다. 대개 5MB까지 저장 가능
  • SessionStorage: LocalStorage와 비슷하지만 세션이 끝날 때(즉, 탭이나 창을 닫을 때) 데이터가 제거
  • 쿠키(Cookie): 서버와 클라이언트 간의 데이터 전달을 위해 주로 사용되며, LocalStorage보다 용량이 매우 제한적(4KB)이다. 쿠키는 만료 시간을 설정할 수 있다.
728x90

YAML(YAML Ain't Markup Language) - 사람이 읽기 쉬운 데이터 형식

이름부터 심상치 않은 이녀석... 웹 프론트 개발을 할 때는 자주 만나지는 않았지만, 이미지 생성 AI 모델인 stable diffusion 구동을 위해 이런저런 작업을 하던 도중 YAML 파일의 내용을 바탕으로 아나콘다 가상환경을 생성할 일이 있었다.(requirements.txt 와 비슷한 역할로) 그렇게 접하게 된 YAML 파일. 꼭 가상환경의 구성 외에도 이런저런 config 용도로 많이 사용되는 듯 한데, 이 파일은 어떤 형식인지 궁금해서 찾아보고 정리하게 되었다.

YAML은 사람이 읽기 쉽고 간결한 데이터 직렬화 형식이다. 다른 데이터 형식인 XML이나 JSON과 같은 용도로 사용되지만, 가독성이 높고 작성이 간편한 점에서 차별화된다. YAML은 주로 애플리케이션 설정 파일, 데이터 파일, 구성 정보 등을 저장하는 데 자주 사용된다.

 

1. YAML의 기본 개념

YAML은 데이터를 계층 구조로 표현하며, 들여쓰기를 사용하여 데이터 간의 관계를 나타낸다. 예를 들어, JSON에서는 중괄호({})를 사용하여 데이터를 구조화하지만, YAML에서는 들여쓰기만으로 같은 구조를 나타낼 수 있다. YAML은 프로그래머뿐만 아니라 비전문가도 쉽게 이해할 수 있도록 설계되었다. 구문이 간단하고 사람이 읽기 쉽게 구성되어 있어 설정 파일이나 데이터를 작성할 때 유용하다.

# 서버 설정 정보
server:
  name: my-server
  port: 8080
  enabled: true

# 데이터베이스 설정 정보
database:
  host: localhost
  username: admin
  password: secret
  tables:
    - users
    - products
    - orders

이 예시는 서버와 데이터베이스 설정을 담고 있다. 각 항목은 들여쓰기를 통해 계층 구조를 표현하며, 리스트는 - 기호를 사용하여 정의된다.

 

2. YAML의 주요 특징

  1. 간결한 구문: YAML은 데이터 간의 구조를 들여쓰기로 표현하기 때문에 중괄호나 대괄호가 필요없다. 이는 XML이나 JSON에 비해 훨씬 간결한 표현을 가능하게 한다.
  2. 높은 가독성: YAML은 사람이 읽고 쓰기 쉽게 설계되었다. 데이터가 중첩되거나 복잡해도 들여쓰기를 통해 직관적으로 구조를 파악할 수 있다.
  3. 유연한 데이터 표현: YAML은 다양한 데이터 타입을 지원한다. 문자열, 숫자, 리스트, 딕셔너리 등 프로그래밍에서 자주 사용하는 구조를 YAML에서도 간단하게 표현할 수 있다.
  4. 주석 지원: YAML 파일에서 주석을 사용할 수 있어, 코드 설명이나 주석을 통해 문서화 작업을 쉽게 할 수 있다. 주석은 # 기호로 시작하며, 주석 뒤의 내용은 무시된다.

 

3. YAML 파일의 장점

  1. 쉬운 유지보수: YAML은 설정 파일을 읽고 수정해야 하는 사용자에게 매우 편리한 형식입니다. 코드의 구조를 쉽게 이해할 수 있으며, 주석을 추가해 설명을 더할 수 있어 유지보수가 용이합니다.
  2. 데이터의 직관적인 표현: YAML은 데이터를 시각적으로 직관적으로 표현할 수 있다. 특히, 복잡한 계층구조를 표현할 때도 들여쓰기를 사용해 쉽게 구조를 파악할 수 있다.
  3. 다양한 프로그래밍 언어와의 호환성: YAML은 파이썬, 자바, C#, PHP 등 다양한 프로그래밍 언어에서 지원된다. 대부분의 언어에는 YAML 파서를 쉽게 사용할 수 있는 라이브러리가 존재한다. 파이썬에서는 PyYAML 같은 라이브러리를 통해 YAML 파일을 쉽게 파싱하고 데이터를 처리할 수 있다.

 

4. YAML 사용 예시

  1. 애플리케이션 설정 파일: YAML은 많은 소프트웨어에서 설정 파일로 사용된다. 내가 처음 경험한 YAML 파일도 그러하다. 예를 들어, Python의 Django, Java의 Spring Boot 같은 프레임워크는 설정 파일로 YAML을 사용할 수 있다. 환경 설정이나 데이터베이스 연결 정보 등을 YAML로 저장하여 애플리케이션을 유연하게 구성할 수 있다.
  2. CI/CD 파이프라인: 지속적 통합 및 배포(CI/CD) 도구인 Jenkins, GitLab CI, CircleCI 등에서 YAML을 사용해 빌드 및 배포 파이프라인을 정의할 수 있다. 예를 들어, GitLab CI에서 .gitlab-ci.yml 파일을 사용하여 프로젝트의 빌드 및 테스트 과정을 정의할 수 있다.

 

5. YAML vs JSON

사실 YAML과 JSON은 매우 비슷한 역할을 한다. 두 형식 모두 데이터를 직렬화하기 위한 것이며, 계층 구조를 지원한다. 그러나 YAML은 JSON보다 가독성에 더 중점을 두고 있다. JSON에서는 {, }, : 같은 구분 기호를 많이 사용하지만, YAML은 들여쓰기를 사용하여 이러한 기호를 생략할 수 있다. YAML을 한 번 이해하면 복잡한 데이터 구조도 간단하게 표현할 수 있으니, 잘 숙지해서 사용하면 좋을 듯 하다.

728x90

'🔨 개발 > 📚 개발지식모음집' 카테고리의 다른 글

파이썬 람다 함수 사용법 정리  (2) 2024.11.04
20240903 requirements.txt 문제  (0) 2024.09.03
20240808  (0) 2024.08.08
20240807  (0) 2024.08.07
20240806  (0) 2024.08.06

+ Recent posts