Web

378 posts
자바스크립트 CommonJS 모듈 내보내기/불러오기 (require)

자바스크립트 CommonJS 모듈 내보내기/불러오기 (require)

자바스크립트로 개발하다보면 require나 import 키워드를 통해 외부 라이브러리를 불러오는 코드를 자주 보게 됩니다. require는 Node.js에서 예전부터 사용되고 있는 CommonJS의 키워드이고, import는 ES6(ES2015)에서 새롭게 도입되어 현재 자바스크립트 생태계에서 표준이 되어가고 있는 키워드입니다. 두 개의 키워드 모두 하나의 파일에서 다른 파일의 코드를 불러온다는 동일한 목적을 가지고 있지만, 비슷한듯 약간씩 다른 문법 때문에 개발자들을 혼란스럽게 하기도 하죠. 예를 들어, 위 두 코드는 Expres

자바스크립트 개발자를 위한 필수 npm 커맨드 정리 (+npx)

자바스크립트 개발자를 위한 필수 npm 커맨드 정리 (+npx)

백엔드 개발을 하든 프론트엔드 개발을 하든 자바스크립트 프로젝트에서 npm(Node Package Manager)을 사용하는 것은 거의 필수적인데요. 이번 포스팅에서는 실무에서 자바스크립트 프로젝트를 하면서 자주 사용하게 되는 npm 커맨드들을 정리해보았습니다. 프로젝트 생성 npm init 커맨드를 사용하면 현재 디렉터리에 npm 기반으로 프로젝트를 생성할 수 있습니다. 커맨드를 실행하면 패키지 이름, 버전, 설명 등등을 입력하게 됩니다. 프로젝트를 생성할 때 이러한 정보들을 일일이 입력하는 게 귀찮게 느껴질 수 있습니다. 이 때

RSS: 새 글을 구독자에게 전해 주는 웹 피드

RSS: 새 글을 구독자에게 전해 주는 웹 피드

"RSS는 이제 아무도 안 쓰지 않나요?"라는 이야기를 종종 듣는데요. 2013년 Google Reader가 문을 닫으면서 RSS가 죽었다는 말이 한동안 유행했지만, 사실 RSS는 우리가 모르는 사이에 곳곳에서 일하고 있습니다. 팟캐스트 앱이 새 에피소드를 가져오는 것도, 뉴스레터 서비스가 블로그 새 글을 메일로 보내 주는 것도, 검색엔진이 최근 글을 빨리 찾아가는 것도 대부분 RSS 덕분입니다. 🤔 이 글에서는 웹 피드(web feed)가 무엇인지, RSS 2.0과 Atom, JSON Feed는 어떻게 다른지 살펴보겠습니다. 그

sitemap.xml: 검색엔진에 페이지 목록을 알려주는 사이트맵

sitemap.xml: 검색엔진에 페이지 목록을 알려주는 사이트맵

웹사이트를 처음 만들고 나면 SEO 체크리스트에 꼭 끼어 있는 항목이 하나 있는데요. 바로 사이트맵(sitemap) 제출입니다. 그런데 막상 만들려고 보면 궁금한 게 한둘이 아닙니다. 페이지가 수십 개뿐인 작은 사이트에도 필요할까요? priority는 몇으로 줘야 할까요? 날짜는 매번 빌드할 때마다 바꿔도 될까요? 🤔 이 글에서는 사이트맵이 정확히 무슨 일을 하는지, 검색엔진이 실제로 읽는 태그와 무시하는 태그는 무엇인지 살펴보겠습니다. 그리고 Bun으로 사이트맵을 직접 만들어 보고, 페이지가 많을 때 사이트맵 인덱스(sitema

CSS로 반응형 레이아웃 스타일하기

CSS로 반응형 레이아웃 스타일하기

시장에 출시되는 디바이스들의 화면들이 점점 다양해지면서 다양한 크기의 화면에 똑똑하게 반응하는 웹디자인이 중요해지고 있습니다. 이번 포스팅에서는 CSS의 미디어 쿼리(Media Query)와 float 속성을 이용해서 반응형 레이아웃을 잡는 방법에 대해서 알아보겠습니다. 웹페이지 마크업 CSS로 스타일할 예제 사이트의 전체 웹페이지를 HTML5에서 추가된 시멘택 태그를 활용해서 마크업하도록 하겠습니다. 먼저, 헤더 영역은 <header/> 태그로 감싸고, 사이트명에는 <h2/> 태그, 메뉴바에는 <nav> 태그를 적용합니다. 메인

헷갈리는 HTTP 헤더 총정리: Host, Origin, Referer

헷갈리는 HTTP 헤더 총정리: Host, Origin, Referer

웹 개발을 하다 보면 브라우저 개발자 도구에서 HTTP 요청 헤더를 뜯어볼 일이 종종 있잖아요? 그때 Host, Origin, Referer... 이 세 녀석이 나란히 있는 걸 보면 "이거 다 비슷한 거 아닌가?" 싶을 때가 있는데요. 헤더 자체가 처음이라면 HTTP 메시지가 어떻게 생겼는지부터 보고 오시면 흐름이 더 잘 잡힙니다. 셋 다 URL이나 도메인 정보를 담고 있으니까 대충 같은 역할처럼 보이거든요. 그런데 막상 CORS 문제를 디버깅하거나 보안 설정을 건드려야 할 때 이 헤더들의 차이를 정확히 모르면 삽질을 피할 수가 없

자바스크립트의 btoa와 atob로 Base64 다루기

자바스크립트의 btoa와 atob로 Base64 다루기

자바스크립트로 Base64 인코딩을 다뤄야 할 일이 생기면 가장 먼저 마주치게 되는 함수가 btoa()와 atob()인데요. 이름이 워낙 짧고 비대칭적이라 어느 쪽이 인코딩이고 어느 쪽이 디코딩인지 헷갈리기 십상입니다. 이번 포스팅에서는 두 함수가 무엇이고 어디에 자주 쓰이는지부터 짚어보겠습니다. 그리고 한글이 들어갈 때의 함정과 현대적인 대안도 함께 살펴보겠습니다. btoa와 atob는 무엇일까요? btoa()와 atob()는 자바스크립트에 내장된 Base64 인코딩과 디코딩 함수입니다. 이름의 의미를 풀어서 외워두면 헷갈리지 않

Base64가 무엇이고 왜 쓰일까?

Base64가 무엇이고 왜 쓰일까?

이메일 첨부 파일이나 JWT 토큰, Data URI 같은 곳에서 빠지지 않고 등장하는 글자가 있는데요. 바로 끝에 =가 붙는 영문과 숫자가 뒤섞인 그 문자열, Base64입니다. 이번 포스팅에서는 Base64가 무엇이고 왜 만들어졌는지부터 짚어보겠습니다. 어떤 원리로 동작하는지, 그리고 오늘날 어디에 자주 쓰이는지도 함께 살펴보겠습니다. Base64란? Base64는 임의의 이진 데이터를 64가지 ASCII 문자로만 표현하는 인코딩 방식입니다. 이름 그대로 "기수(base) 64"의 표기 체계인데요. 우리가 평소에 쓰는 10진수가

유니코드와 UTF-8은 어떻게 다르고 한글은 왜 가끔 깨질까?

유니코드와 UTF-8은 어떻게 다르고 한글은 왜 가끔 깨질까?

웹 페이지나 데이터베이스에서 멀쩡하던 한글이 다른 사람에게서는 검색이 안 된다거나, macOS에서 만든 파일을 윈도우에 올렸더니 같은 이름인데도 다른 파일로 인식되는 경험이 있으실 텐데요. 이런 문제 대부분의 뿌리에는 유니코드(Unicode)와 정규화(normalization)라는 개념이 자리잡고 있습니다. 이번 포스팅에서는 UTF-8과 자주 헷갈리는 유니코드의 정체부터 짚어보겠습니다. 한글이 유니코드에서 어떻게 표현되는지, 같은 글자가 왜 두 가지 방식으로 저장될 수 있는지도 함께 살펴보겠습니다. 유니코드는 인코딩이 아닙니다 유니

UTF-8이 어떻게 전 세계 문자를 담아낼까?

UTF-8이 어떻게 전 세계 문자를 담아낼까?

웹 페이지에서 갑자기 한글이 ���처럼 깨져 보인 경험이 한 번쯤은 있으실 텐데요. 파일을 메모장에서 다른 에디터로 열었더니 모든 글자가 외계어로 변하거나, JSON API에서 받은 한글이 전혀 다른 모양으로 나오는 경우 말입니다. 이런 문제 대부분의 뿌리에는 UTF-8이라는 문자 인코딩이 자리잡고 있습니다. 이번 포스팅에서는 UTF-8이 어떻게 전 세계 모든 문자를 담아내는지부터 짚어보겠습니다. 한글이 어떻게 바이트로 변환되는지, 그리고 글자가 깨질 때 무슨 일이 벌어지는지도 함께 살펴보겠습니다. UTF-8이란? UTF-8은 Un

ASCII가 무엇이고 왜 중요할까?

ASCII가 무엇이고 왜 중요할까?

컴퓨터로 텍스트를 다루다 보면 "ASCII 코드"라는 용어를 종종 마주치게 됩니다. URL 인코딩을 설명할 때나 한글이 깨지는 문제를 디버깅할 때마다 ASCII가 빠지지 않고 등장하는데요. 이번 포스팅에서는 ASCII가 무엇이고 왜 만들어졌는지부터 짚어보겠습니다. 문자표가 어떻게 구성되어 있는지, 오늘날 UTF-8과는 어떤 관계를 가지는지도 함께 살펴보겠습니다. ASCII란? ASCII는 American Standard Code for Information Interchange의 약자로, 영문자와 숫자, 그리고 일부 특수 문자를 0

[ES2015] 기본 매개변수 (Default Parameters)

[ES2015] 기본 매개변수 (Default Parameters)

ES2015는 자바스크립트의 근간이 되는 함수에도 여러 가지 변화를 가져왔습니다. 이번 포스팅에서는 그 중 기본 매개변수(Default Parameters)에 대해서 알아보도록 하겠습니다. 매개변수를 무시한 함수 호출 다음과 같이 사용자의 아이디의 배열을 매개변수를 받아서 사용자의 상세 정보를 돌려주는 함수가 있다고 가정해봅시다. 아래와 같이 정상적인 배열을 넘기면 함수는 예상하는 것처럼 잘 돌아갑니다. 하지만 다음과 같이 인자 없이도 위 함수를 호출하면 어떻게 될까요? 문법이 엄격한 다른 언어라면 분명히 함수 호출이 불가능했을텐데

[ES2015] const로 상수 선언하기

[ES2015] const로 상수 선언하기

이번 포스팅에서는 ES2015에서 let과 함께 자바스크립트에 추가된 const 사용법에 대해서 알아보도록 하겠습니다. let 사용법에 대해서는 아래 포스팅들을 참고바라겠습니다. let으로 변수 선언하기 1 let으로 변수 선언하기 2 매직 넘버 아래 코드에서 findUser 함수는 안자로 받은 id 값이 100보다 작은지 여부에 따라서 로직이 분기되어 있습니다. 그리고 id 값이 100보다 큰 경우, 가짜 사용자 객체를 생성 후, name 속성값의 길이가 50보다 큰지 여부에 따라 다시 한 번 로직이 분기되고 있습니다. 예제와 같

[ES2015] let으로 변수 선언하기 2

[ES2015] let으로 변수 선언하기 2

이전 포스팅에서 ES2015의 let 키워드에서 대해서 알아보았습니다. 이번 포스팅에서는 for 문에서 let이 어떻게 사용될 수 있는지 살펴보겠습니다. 예제 코드 다음 코드는 사용자 아이디를 받아 가짜 사용자를 담든 후 콜백 함수를 호출하는 비동기 함수입니다. 마치 DB 연동처럼 setTimeout 함수를 이용하여 1초의 지연을 주었습니다. setTimeout() 함수에 대한 좀 더 자세한 내용은 관련 포스팅을 참고바랍니다. 그리고 아래 코드는 사용자 아이디의 배열을 받아 여러 사용자의 정보를 출력해주는 함수입니다. findUse

[ES2015] let으로 변수 선언하기 1

[ES2015] let으로 변수 선언하기 1

본 포스팅에서는 ES2015를 통해 자바스크립트에 추가된 let 키워드에 대해서 알아보도록 하겠습니다. 문제의 코드 먼저 다음 예제 코드를 살펴보시죠. findUser 함수는 사용자 아이디가 0보다 크면 성공 메시지를 출력하고 아니면 실패 메시지를 출력합니다. 그리고 if-else 문을 빠져나온 후, 실패 메시지를 다시 한 번 출력하고 있습니다. 자, 그럼 다음과 같이 1을 인자로 이 함수를 호출하면 마지막에 출력하는 실패 메시지는 뭐라고 출력이 될까요? 다음과 같이 오류가 발생하지 않고 undefined가 출력이 됩니다! 첫 개발

[자바스크립트] var를 사용할 때 발생하는 문제들

[자바스크립트] var를 사용할 때 발생하는 문제들

많은 자바스크립트 강좌에서 가급적 var 대신에 let이나 const 키워드를 사용하여 변수를 선언하라고 가이드하고 있는데요. 본 포스팅에서는 var의 어떤 문제점 때문에 그런건지 알아보도록 하겠습니다. 아리송한 코드 먼저 다음 코드를 살펴보도록 하겠습니다. 무엇이 출력이 될지 예상이 되시나요? 첫번째 console.log(n)에서 오류가 발생할 것 같기도 하고, 1과 2가 출력될 것 같기도 한데요. 의외로 정답은 다음과 같습니다. 왜 이런 예상치못한 결과가 얻어지는 걸까요? 원인은 var 키워드를 사용할 경우, 변수 Hoistin

자바스크립트 배열 기본 사용법

자바스크립트 배열 기본 사용법

배열을 사용하는 이유? 3개의 과일 이름을 변수에 저장하려면 다음과 같이 3개의 변수를 사용할 것이다. 하지만 만약에 저장한 과일 이름이 300개라면? 위와 같이 일일이 하나 하나의 변수에 저장하기 힘들 것이다. 배열을 이용하면 하나의 변수에 여러 가지 값을 저장할 수 있고, 색인(Index)을 통해 이 값에 접근할 수 있다. 새로운 배열 생성 하기 기본적으로 대괄호 기호인 배열 리터럴(literal)을 이용해서 배열을 생성한다. 배열 리터럴 내에서는 공백이나 줄바꿈은 중요하지 않으므로 각 엘리먼트의 길이기 길 경우 가독성을 위해

TypeScript 입문: JavaScript에 타입이 필요한 이유

TypeScript 입문: JavaScript에 타입이 필요한 이유

JavaScript로 작은 프로그램을 만들 때는 타입을 크게 의식하지 않아도 됩니다. 변수에 문자열을 넣었다가 숫자를 넣을 수도 있고, 함수에 어떤 값을 넘기든 일단 실행은 되니까요. 문제는 프로그램이 커진 뒤에 시작됩니다. formatPrice()는 숫자를 기대하지만 문자열을 받았습니다. JavaScript는 해당 줄을 실행한 뒤에야 toFixed is not a function이라는 오류를 냅니다. 이 함수가 주문 화면 깊숙한 곳에서만 호출된다면 배포 전에 문제를 발견하지 못할 수도 있겠죠. 💥 TypeScript는 이런 실수

Discord