728x90
반응형
728x90
반응형
반응형

🐒 Tampermonkey: 웹 자동화와 커스텀 스크립트의 강력한 도구


  • Tampermonkey은 웹 브라우저에서 사용자 스크립트를 실행할 수 있도록 도와주는 확장 프로그램입니다.
  • Chrome, Firefox, Edge, Safari 등 다양한 브라우저에서 지원되며, Greasemonkey 와 호환됩니다.
  • 이를 활용하면 웹사이트의 동작을 수정하거나 자동화할 수 있습니다.

🔹 Tampermonkey 주요 기능

  • 사용자 스크립트 관리: 여러 개의 스크립트를 손쉽게 추가, 편집, 삭제 가능
  • 자동 업데이트 지원: 스크립트 업데이트 기능 제공
  • 고급 편집기 제공: JavaScript 코드 작성 및 디버깅 기능 포함
  • 다양한 API 지원: GM_xmlhttpRequest, GM_setValue, GM_getValue 등의 API 제공
  • 스크립트 동작 제어: 특정 URL에서만 실행되도록 설정 가능

📌 설치 방법

  1. 공식 웹사이트 또는 브라우저 확장 스토어에서 설치

  2. 설치 후 브라우저 툴바에서 아이콘 클릭하여 스크립트 추가


📝 기본적인 사용자 스크립트 예제

  • javascript
  •  // ==UserScript==
     // @name         예제 스크립트
     // @namespace    http://tampermonkey.net/
     // @version      1.0
     // @description  특정 웹사이트의 배경색 변경
     // @author       사용자
     // @match        https://example.com/*
     // @grant        none
     // ==/UserScript==
     
     (function() {
         'use strict';
         document.body.style.backgroundColor = "lightblue";
     })();
    
  • ✔️ 이 스크립트는 https://example.com/ 사이트에 접속했을 때 배경색을 변경하는 역할을 합니다.

🚀 활용 사례

  • 웹사이트 광고 제거
  • 자동 로그인 및 폼 자동 완성
  • 웹사이트 UI 변경
  • 반복적인 작업 자동화
728x90
반응형
반응형

Vite: 빠르고 효율적인 현대적 프론트엔드 빌드 툴

  • https://ko.vite.dev/guide/

  • Vite프론트엔드 개발 환경 에서 빠르고 효율적인 빌드 및 개발 서버를 제공하는 툴입니다.

  • Vue.js의 주요 기여자인 에반 유(Evan You)가 개발했으며, 현대적 웹 애플리케이션 개발을 위해 설계되었습니다.

주요 특징

    1. 빠른 개발 서버:
    • 브라우저 네이티브 ESM(ES Modules)을 사용하여 개발 서버의 속도를 극대화합니다. 코드를 번들링하지 않고 필요할 때만 모듈을 로드합니다.
    1. 빠른 빌드:
    • Rollup 기반의 프로덕션 빌드와 esbuild를 활용한 빠른 종속성 처리로 최적화된 빌드 성능을 제공합니다.
    1. 핫 모듈 리플레이스먼트(HMR):
    • 코드 변경 시 전체 페이지를 다시 로드하지 않고 변경된 모듈만 빠르게 갱신합니다.
    1. 유연성:
    • Vue, React, Preact, Lit, Svelte 등 다양한 프레임워크와 호환되며 플러그인을 통해 확장이 가능합니다.
    1. 경량화:
    • 설정 파일이 단순하고 프로젝트 초기화 및 설정이 간편합니다.

설치 및 사용

  1. 프로젝트 생성

    npm create vite@latest
    

    또는

    yarn create vite
    
  2. 의존성 설치

    npm install
    

    또는

    yarn install
    
  3. 개발 서버 실행

    npm run dev
    
  4. 프로덕션 빌드

    npm run build
    

기본 설정 파일: vite.config.js / vite.config.ts

javascript

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: {
    port: 3000,
  },
});
728x90
반응형
반응형

크로스 사이트 스크립팅 (Cross-site scripting (XSS))

크로스 사이트 스크립팅(XSS) 는 웹 애플리케이션 보안 취약점 중 하나로, 공격자가 악성 스크립트를 웹사이트에 삽입하여 다른 사용자의 브라우저에서 실행되도록 유도하는 공격입니다.

이를 통해 사용자의 민감 정보를 탈취하거나 악성 행동을 수행할 수 있습니다.


XSS의 주요 유형

  1. 저장형 XSS (Stored XSS)

    • 공격 스크립트가 데이터베이스에 저장되며, 이후 다른 사용자가 해당 데이터를 볼 때 스크립트가 실행됨.
    • 예: 댓글, 게시글, 프로필 정보 등.
    • 공격 예시:

      html

      <script>alert('XSS');</script>
      
    • 결과: 댓글을 읽는 모든 사용자의 브라우저에서 팝업 실행.
  2. 반사형 XSS (Reflected XSS)

    • 악성 스크립트가 즉시 실행되며, 주로 URL이나 폼 입력에 포함됨.
    • 사용자가 악성 링크를 클릭하면 공격이 이루어짐.
    • 공격 예시:
      http://example.com/search?q=<script>alert('XSS');</script>
      
  3. DOM 기반 XSS (DOM-based XSS)

    • 클라이언트 측에서 DOM(Document Object Model)을 조작하여 악성 스크립트를 실행.
    • 서버가 아닌 브라우저 내 스크립트 로직에서 취약점 발생.
    • 공격 예시:

      javascript

      var search = document.location.hash;
      document.write(search);
      
    • URL: http://example.com#<script>alert('XSS')</script>

XSS의 주요 영향

  • 쿠키 탈취: document.cookie를 이용해 세션 정보 탈취.
  • 사용자 계정 탈취: 악성 스크립트로 로그인 정보를 전송.
  • 피싱 사이트로 리디렉션: window.location 조작.
  • UI 변조 및 악성 코드 실행: 사용자 인터페이스에 악성 요소 추가.

예방 방법

  1. 입력값 검증(Input Validation)

    • 사용자가 입력하는 모든 데이터를 엄격히 검증.
    • 화이트리스트 방식을 통해 허용된 값만 처리.
  2. 출력값 인코딩(Output Encoding)

    • HTML, JavaScript, URL에 데이터를 출력하기 전에 적절히 인코딩.
    • 예: <&lt;, >&gt;로 변환.
  3. HTTP 헤더 보안

    • Content Security Policy(CSP)를 설정하여 스크립트 실행을 제한.
    • 예: Content-Security-Policy: script-src 'self';
  4. 라이브러리 사용

    • OWASP의 ESAPI, 웹 프레임워크 내의 보안 기능 활용.
  5. HTML 태그 제거

    • 사용자의 입력에서 HTML 태그를 제거하거나 무해화 처리.

XSS는 매우 일반적이지만 강력한 공격이므로, 입력 검증과 적절한 보안 설정으로 예방하는 것이 중요합니다.

728x90
반응형
반응형

API 키 없이 지도를 구현하는 방법 - OpenStreetMap과 Leaflet.js 활용하기

대부분의 지도 서비스, 예를 들어 네이버 지도구글 지도는 API 키를 요구합니다. API 키는 사용자 인증과 트래픽 관리를 위해 필요하지만, 이를 발급받고 설정하는 과정이 번거로울 수 있습니다. 특히, 간단하게 지도를 표시하거나 간단한 위치 정보를 제공할 경우, 이러한 인증 과정이 부담이 될 수 있습니다.

이 글에서는 API 키 없이도 인터랙티브한 지도를 쉽게 구현할 수 있는 방법을 소개합니다. OpenStreetMapLeaflet.js를 활용하면 API 키 없이도 특정 위치에 마커를 표시하고, 확대와 축소 등 다양한 기능을 손쉽게 구현할 수 있습니다. OpenStreetMap을 사용하여 한국의 특정 위치를 웹 페이지에 표시하는 방법을 살펴보겠습니다.

OpenStreetMap과 Leaflet.js로 지도 구현하기

다음은 OpenStreetMap과 Leaflet.js를 사용하여 서울시청 위치에 마커를 표시하는 예제입니다.

HTML 코드

html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OpenStreetMap 예제</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
    <style>
        #map {
            width: 100%;
            height: 500px;
        }
    </style>
</head>
<body>
    <h2>OpenStreetMap 예제</h2>
    <div id="map"></div>
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
    <script>
        // 지도 생성 및 초기 설정 (서울시청 좌표 사용)
        var map = L.map('map').setView([37.5665, 126.9780], 13); // 위도와 경도 설정

        // OpenStreetMap 타일 레이어 추가
        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            maxZoom: 19,
        }).addTo(map);

        // 마커 추가
        L.marker([37.5665, 126.9780]).addTo(map)
            .bindPopup('서울시청') // 마커 팝업 설정
            .openPopup();
    </script>
</body>
</html>

코드 설명

  1. Leaflet.js와 CSS: Leaflet.js의 라이브러리와 스타일시트는 외부 CDN에서 불러옵니다.
  2. 지도의 크기 설정: <div id="map"></div> 요소의 크기를 CSS로 지정합니다.
  3. 지도의 초기화: L.map()을 사용하여 지도를 초기화하고, setView로 초기 위치를 설정합니다. 예제에서는 서울시청의 좌표를 사용하였습니다.
  4. 지도 타일 추가: L.tileLayer를 통해 OpenStreetMap 타일을 불러와서 추가합니다.
  5. 마커 추가: L.marker를 사용하여 특정 위치에 마커를 추가하고, .bindPopup을 사용하여 팝업을 설정할 수 있습니다.

위 예제 코드를 웹 브라우저에서 실행하면 서울시청 위치에 마커가 표시된 지도가 나타납니다. 이처럼 OpenStreetMap과 Leaflet.js를 이용하면 API 키 없이도 자유롭게 지도를 구현할 수 있습니다. 이 방법을 통해 더욱 간단하고 효율적으로 지도 서비스를 웹에 활용해보세요!

728x90
반응형
반응형

퀘냐(Quenya) 언어 OpenAI API로 번역하기

퀘냐(Quenya)는 반지의 제왕의 저자인 톨킨의 중간계 세계관에서 사용되는 고대 엘프 언어 중 하나로, 시적인 표현과 복잡한 문법 체계를 가진 언어입니다. 톨킨의 작품인 반지의 제왕실마릴리온에서 특히 높은 신분의 엘프들이 사용하는 언어로 등장하며, 고대 엘프들이 사용하는 서정적이고 우아한 언어로 묘사됩니다. 퀘냐는 영어와 한국어와는 문법 및 어휘가 상당히 다르기 때문에 단순한 변환기를 넘어서, 언어 모델의 도움을 통해 보다 정확한 번역이 가능합니다.

JavaScript에서는 OpenAI의 API를 사용하여 ChatGPT에 퀘냐 번역을 요청할 수 있습니다. 아래 예제 코드는 OpenAI의 API를 호출해 ChatGPT를 통해 한국어 텍스트를 퀘냐로 번역하는 방식으로 구현되었습니다. 이 코드를 실행하려면 OpenAI API 키가 필요합니다.

javascript

// OpenAI API를 사용하여 ChatGPT에 번역을 요청하는 JavaScript 예제
const axios = require('axios');  // axios 모듈 필요 (npm install axios)

// OpenAI API 키를 입력하세요
const apiKey = 'YOUR_OPENAI_API_KEY';

// ChatGPT에 번역을 요청하는 함수
async function translateToQuenyaWithChatGPT(text) {
  const prompt = `Translate the following Korean text to Quenya:\n\n"${text}"`;
  
  try {
    const response = await axios.post('https://api.openai.com/v1/chat/completions', {
      model: 'gpt-4',
      messages: [
        { role: 'system', content: 'You are a helpful assistant translating Korean to Quenya.' },
        { role: 'user', content: prompt }
      ]
    }, {
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      }
    });
    
    const translatedText = response.data.choices[0].message.content;
    return translatedText;
  } catch (error) {
    console.error("Error translating to Quenya:", error);
    return null;
  }
}

// 예제 문장
const koreanSentence = "안녕하세요 친구";

translateToQuenyaWithChatGPT(koreanSentence).then(quenyaTranslation => {
  console.log(quenyaTranslation);  // ChatGPT가 번역한 퀘냐 텍스트 출력
});

설명

  • axios를 이용해 OpenAI API에 POST 요청을 보냅니다. axios는 JavaScript로 HTTP 요청을 쉽게 보낼 수 있는 라이브러리입니다.
  • prompt 변수에 원하는 번역 요청 내용을 넣어, ChatGPT 모델이 한국어 문장을 퀘냐로 번역하도록 합니다.
  • OpenAI API 응답에서 번역된 텍스트를 추출하여 콘솔에 출력합니다.

주의사항

  • 이 코드를 실행하려면 OpenAI API 키가 필요합니다.
  • Node.js 환경에서 axios를 사용하려면 npm install axios로 설치해야 합니다.

이와 같은 방식으로 OpenAI API를 이용해 퀘냐와 같은 특별한 언어로도 번역 작업을 수행할 수 있습니다.

728x90
반응형
반응형

소프트웨어 설계의 유연성을 높이는 의존성 주입 기법과 예제

의존성 주입(Dependency Injection, DI)은 객체가 직접 의존성을 생성하지 않고 외부로부터 주입받는 방법입니다. DI의 목적은 객체 간의 결합도를 낮추고 코드의 유연성과 테스트 용이성을 높이는 것입니다. 이를 통해 코드가 변경되거나 테스트 환경이 필요할 때 특정 객체만 대체하여 쉽게 사용할 수 있습니다.

의존성 주입이 필요한 이유

  1. 결합도 감소: 객체가 다른 객체에 대해 직접적으로 의존하지 않도록 만들어 변경에 유연합니다.
  2. 테스트 용이성: 테스트할 때 의존성을 모의(Mock) 객체로 쉽게 대체할 수 있습니다.
  3. 재사용성 향상: 주입받는 객체에 따라 기능을 다양하게 변경할 수 있습니다.

의존성 주입의 방식

DI에는 여러 가지 방식이 있지만, 대표적으로 생성자 주입메서드 주입이 있습니다.

1. 생성자 주입 예제

생성자 주입은 객체를 생성할 때 필요한 의존성을 생성자의 매개변수로 받아 주입하는 방식입니다.

예제: UserService에서 데이터베이스 의존성 주입

아래 예제는 UserService가 데이터베이스에 직접 의존하지 않고, 외부에서 주입된 Database 객체에 의존하도록 설계한 코드입니다.

javascript

// database.js - Database 인터페이스 정의
export class Database {
    getUserFromDB(userId) {
        throw new Error("이 메서드는 오버라이드되어야 합니다.");
    }
}

// MySQLDatabase.js - Database 구현체
import { Database } from './database';

export class MySQLDatabase extends Database {
    getUserFromDB(userId) {
        // MySQL을 이용한 데이터 조회 로직 (예시)
        return { id: userId, name: "John Doe", email: "johndoe@example.com" };
    }
}

// userService.js - 데이터베이스 의존성을 주입받는 UserService
export class UserService {
    constructor(database) {
        this.database = database; // 생성자를 통해 의존성 주입
    }

    getUserInfo(userId) {
        return this.database.getUserFromDB(userId);
    }
}

// main.js - MySQLDatabase 주입 및 UserService 사용
import { MySQLDatabase } from './MySQLDatabase';
import { UserService } from './userService';

const database = new MySQLDatabase();
const userService = new UserService(database); // 의존성 주입
const userInfo = userService.getUserInfo(1);

console.log(userInfo);

코드 설명

  1. Database는 데이터베이스를 추상화한 인터페이스로, getUserFromDB 메서드가 있습니다.
  2. MySQLDatabaseDatabase를 구현하여 실제 MySQL 기반의 데이터 조회 기능을 제공합니다.
  3. UserServiceDatabase 타입의 database 객체를 생성자를 통해 주입받아 getUserInfo 메서드를 통해 사용자 정보를 조회합니다.
  4. main.js에서는 UserServiceMySQLDatabase 객체를 주입하여 사용할 수 있습니다.

이렇게 구성하면, 나중에 Database 인터페이스를 구현한 다른 데이터베이스(예: PostgresDatabase 등)로 쉽게 교체할 수 있습니다.


2. 메서드 주입 예제

메서드 주입은 특정 메서드를 호출할 때 의존성을 전달하여 주입하는 방식입니다. 메서드 주입은 주로 객체 생성 후에 의존성을 주입해야 할 때 사용됩니다.

예제: NotificationService를 주입받아 알림 전송

아래 예제에서는 NotificationServiceEmailNotifierSMSNotifier를 주입하여 알림을 전송하는 예제입니다.

javascript

// NotificationService.js - 알림 서비스를 정의
export class NotificationService {
    setNotifier(notifier) {
        this.notifier = notifier; // 메서드를 통해 의존성 주입
    }

    sendNotification(message) {
        if (!this.notifier) {
            throw new Error("Notifier가 설정되지 않았습니다.");
        }
        this.notifier.notify(message);
    }
}

// EmailNotifier.js - 이메일 알림 구현체
export class EmailNotifier {
    notify(message) {
        console.log("이메일 전송: " + message);
    }
}

// SMSNotifier.js - SMS 알림 구현체
export class SMSNotifier {
    notify(message) {
        console.log("SMS 전송: " + message);
    }
}

// main.js - EmailNotifier와 SMSNotifier 주입 및 NotificationService 사용
import { NotificationService } from './NotificationService';
import { EmailNotifier } from './EmailNotifier';
import { SMSNotifier } from './SMSNotifier';

const notificationService = new NotificationService();
const emailNotifier = new EmailNotifier();
const smsNotifier = new SMSNotifier();

notificationService.setNotifier(emailNotifier);
notificationService.sendNotification("이메일로 알림 전송");

notificationService.setNotifier(smsNotifier);
notificationService.sendNotification("SMS로 알림 전송");

코드 설명

  1. NotificationServicesetNotifier 메서드를 통해 알림 발송자를 주입받습니다.
  2. EmailNotifierSMSNotifier는 각각 이메일과 SMS 방식으로 알림을 전송하는 구현체입니다.
  3. main.js에서는 NotificationServiceEmailNotifierSMSNotifier를 각각 주입하여 필요한 형태로 알림을 전송합니다.

이처럼 의존성 주입을 활용하면 객체의 결합도를 낮추고 테스트가 쉬워지며, 코드의 유연성과 재사용성이 크게 향상됩니다.

728x90
반응형
반응형

인류를 위한 ES6 (ES6 for Humans)


  • 📢 전체 가이드는 이제 Amazon 에서 제공됩니다.

인간을 위한 ES6 - Apress 책



1. let, const 및 블록 범위

  • let은 블록 범위라고 하는 모든 블록에 바인딩되는 선언을 만들 수 있게 해줍니다.
  • 함수 범위를 제공하는 var를 사용하는 대신 ES6에서는 블록 범위 변수(let 또는 const)를 사용하는 것이 좋습니다.

  • js

      var a = 2;
      {
          let a = 3;
          console.log(a); // 3
          let a = 5; // TypeError: Identifier 'a' has already been declared
      }
      console.log(a); // 2
    

  • 블록 범위 선언의 또 다른 형태는 상수를 만드는 const입니다.
  • ES6에서 const는 값에 대한 상수 참조를 나타냅니다.
  • 즉, ObjectArray의 내용은 변경될 수 있지만 변수의 재할당만 방지됩니다.

  • 간단한 예는 다음과 같습니다.

  • js

      {
          const b = 5;
          b = 10; // TypeError: Assignment to constant variable
      
          const arr = [5, 6];
          arr.push(7);
          console.log(arr); // [5,6,7]
          arr = 10; // TypeError: Assignment to constant variable
          arr[0] = 3; // value is mutable
          console.log(arr); // [3,6,7]
      }
    

  • 염두에 두어야 할 몇 가지 사항:
    • letconst의 호이스팅은 변수와 함수의 전통적인 호이스팅과 다릅니다. letconst는 모두 호이스팅되지만 Temporal Dead Zone 때문에 선언 전에는 액세스할 수 없습니다.
    • letconst는 가장 가까운 둘러싼 블록으로 범위가 지정됩니다.
    • 고정된 문자열이나 값을 사용하여 const를 사용하는 경우 CAPITAL_CASING이 적절할 수 있습니다(예: const PI = 3.14)
    • const는 선언과 함께 정의되어야 합니다.
    • 변수를 다시 할당할 계획이 아니라면 항상 let 대신 const를 사용하세요.


2. 화살표 함수

  • 화살표 함수는 ES6에서 함수를 작성하기 위한 단축 표기법입니다.
  • 화살표 함수 정의는 매개변수 목록 ( ... ), 그 뒤에 => 마커, 함수 본문으로 구성됩니다.
  • 단일 인수 함수의 경우 괄호를 생략할 수 있습니다.

  • js

      // Classical Function Expression
      function addition(a, b) {
          return a + b;
      };
      
      // Implementation with arrow function
      const addition = (a, b) => a + b;
      
      // With single argument, no parentheses required
      const add5 = a => 5 + a;
    

  • 위의 예에서 addition 화살표 함수는 명시적인 return 문이 필요 없는 "간결한 본문 (concise body)"으로 구현되어 있습니다. => 뒤에 생략된 { }에 주목하세요.

  • 다음은 일반적인 "블록 본문"을 사용한 예입니다. 중괄호 래퍼를 포함합니다.

  • js

      const arr = ['apple', 'banana', 'orange'];
      
      const breakfast = arr.map(fruit => {
          return fruit + 's';
      });
      
      console.log(breakfast); // ['apples', 'bananas', 'oranges']
    

  • 보십시오! 더 있습니다...

  • 화살표 함수는 코드를 더 짧게 만들 뿐만 아니라 this 바인딩 동작과 긴밀하게 연관되어 있습니다.

  • this 키워드를 사용한 화살표 함수의 동작은 일반 함수의 동작과 다릅니다.

  • JavaScript의 각 함수는 자체 this 컨텍스트를 정의하지만 화살표 함수는 가장 가까운 둘러싼 컨텍스트의 this 값을 캡처합니다.

  • 다음 코드를 확인하세요.

  • js

      function Person() {
          // The Person() constructor defines `this` as an instance of itself.
          this.age = 0;
      
          setInterval(function growUp() {
              // In non-strict mode, the growUp() function defines `this`
              // as the global object, which is different from the `this`
              // defined by the Person() constructor.
              this.age++;
          }, 1000);
      }
      
      var p = new Person();
    

  • ECMAScript 3/5에서는 this의 값을 덮어쓸 수 있는 변수에 할당함으로써 이 문제가 해결되었습니다.

  • js

      function Person() {
          this.age = 0;
      
          setInterval(() => {
              setTimeout(() => {
                  this.age++; // `this` properly refers to the person object
              }, 1000);
          }, 1000);
      }
      
      let p = new Person();
    
  • 위에서 언급했듯이, 화살표 함수는 가장 가까운 둘러싼 컨텍스트의 this 값을 캡처하므로 다음 코드는 중첩된 화살표 함수에서도 예상대로 작동합니다.

  • js

      function Person() {
          this.age = 0;
      
          setInterval(() => {
              setTimeout(() => {
                  this.age++; // `this` properly refers to the person object
              }, 1000);
          }, 1000);
      }
      
      let p = new Person();
    
  • 화살표 함수의 'Lexical this'에 대한 자세한 내용은 여기를 참조하세요



3. 기본 함수 매개변수

  • ES6에서는 함수 정의에서 기본 매개변수를 설정할 수 있습니다.

  • 간단한 예시는 다음과 같습니다.

  • js

      const getFinalPrice = (price, tax = 0.7) => price + price * tax;
      getFinalPrice(500); // 850
    


4. Spread / Rest 연산자

  • ... 연산자는 사용 방법과 장소에 따라 확산 연산자 또는 나머지 연산자라고도 합니다.

  • 반복 가능한 항목과 함께 사용하면 개별 요소로 "분산"하는 역할을 합니다.

  • js

      const makeToast = (breadType, topping1, topping2) => {
        return `I had ${breadType} toast with ${topping1} and ${topping2}`;
      };
    

  • js

      const ingredients = ['wheat', 'butter', 'jam'];
      makeToast(...ingredients);
      // "I had wheat toast with butter and jam"
      
      makeToast(...['sourdough', 'avocado', 'kale']);
      // "I had sourdough toast with avocado and kale"
    

  • Spread는 다른 객체로부터 새로운 객체를 형성하는 데에도 좋습니다.

  • js

      const defaults = {avatar: 'placeholder.jpg', active: false}
      const userData = {username: 'foo', avatar: 'bar.jpg'}
      
      console.log({created: '2017-12-31', ...defaults, ...userData})
      // {created: "2017-12-31", avatar: "bar.jpg", active: false, username: "foo"}
    

  • 새로운 배열도 표현적으로 형성될 수 있습니다.

  • js

      const arr1 = [1, 2, 3];
      const arr2 = [7, 8, 9];
      console.log([...arr1, 4, 5, 6, ...arr2]) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

  • ...의 다른 일반적인 사용법은 모든 인수를 배열로 모으는 것입니다.

  • 이를 "rest" 연산자라고 합니다.

  • js

      function foo(...args) {
          console.log(args);
      }
      foo(1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]
    


5. 객체 리터럴 확장

  • ES6에서는 변수에서 속성을 초기화하고 함수 메서드를 정의하기 위한 단축 구문을 제공하여 객체 리터럴을 선언할 수 있습니다.

  • 또한 객체 리터럴 정의에서 계산된 속성 키를 가질 수 있는 기능도 제공합니다.

  • js

      function getCar(make, model, value) {
          return {
              // with property value shorthand
              // syntax, you can omit the property
              // value if key matches variable
              // name
              make,  // same as make: make
              model, // same as model: model
              value, // same as value: value
      
              // computed values now work with
              // object literals
              ['make' + make]: true,
      
              // Method definition shorthand syntax
              // omits `function` keyword & colon
              depreciate() {
                  this.value -= 2500;
              }
          };
      }
      
      let car = getCar('Kia', 'Sorento', 40000);
      console.log(car);
      // {
      //     make: 'Kia',
      //     model:'Sorento',
      //     value: 40000,
      //     makeKia: true,
      //     depreciate: function()
      // }
    


6. 8진수와 2진수 리터럴

  • ES6에서는 8진수와 2진수 리터럴에 대한 새로운 지원이 추가되었습니다.

  • 숫자 앞에 0o 또는 0O를 붙이면 8진수 값으로 변환됩니다. 다음 코드를 살펴보세요.

  • js

      let oValue = 0o10;
      console.log(oValue); // 8
      
      let bValue = 0b10; // 0b or 0B for binary
      console.log(bValue); // 2
    


7. 배열 및 객체 구조 분해

  • 구조 분해는 객체와 배열을 다룰 때 임시 변수의 필요성을 피하는 데 도움이 됩니다.

  • js

      function foo() {
          return [1, 2, 3];
      }
      let arr = foo(); // [1,2,3]
      
      let [a, b, c] = foo();
      console.log(a, b, c); // 1 2 3
    
    function getCar() {
      return {
        make: 'Tesla',
        model: 'g95',
        metadata: {
          vin: '123abc',
          miles: '12000'
        }
      };
    }
    
    const {make, model} = getCar();
    console.log(make, model); // Tesla g95
    
    const {make, metadata: {miles}} = getCar();
    console.log(make, miles); // Tesla 12000
    


8. 객체의 super

  • ES6에서는 프로토타입이 있는 (클래스 없는) 객체에서 super 메서드를 사용할 수 있습니다. 다음은 간단한 예입니다.

  • js

      const parent = {
          foo() {
              console.log("Hello from the Parent");
          }
      }
      
      const child = {
          foo() {
              super.foo();
              console.log("Hello from the Child");
          }
      }
      
      Object.setPrototypeOf(child, parent);
      child.foo(); // Hello from the Parent
                   // Hello from the Child
    


9. 템플릿 리터럴 및 구분 기호

  • ES6에서는 자동으로 평가되는 보간을 추가하는 더 쉬운 방법이 도입되었습니다.

    • `${ ... }`는 변수를 렌더링하는 데 사용됩니다.
    • 백틱( ` )을 구분 기호로 사용합니다.
  • js

      let user = 'Kevin';
      console.log(`Hi ${user}!`); // Hi Kevin!
    


10. for...offor...in

  • for...of는 배열과 같은 반복 가능한 객체를 반복합니다.

  • js

      const nicknames = ['di', 'boo', 'punkeye'];
      nicknames.size = 3;
      for (let nickname of nicknames) {
          console.log(nickname);
      }
      // di
      // boo
      // punkeye
    

  • for...in은 객체의 열거 가능한 모든 속성을 반복합니다.

  • js

      const nicknames = ['di', 'boo', 'punkeye'];
      nicknames.size = 3;
      for (let nickname in nicknames) {
          console.log(nickname);
      }
      // 0
      // 1
      // 2
      // size
    


11. MapWeakMap

  • ES6MapWeakMap이라는 새로운 데이터 구조 세트를 도입합니다.
  • 이제 우리는 실제로 JavaScript에서 항상 맵을 사용합니다.
  • 사실 모든 객체는 Map으로 간주될 수 있습니다.

  • 객체는 키(항상 문자열)와 값으로 구성되는 반면 Map에서는 모든 값(객체와 기본 값 모두)을 키 또는 값으로 사용할 수 있습니다.

  • 이 코드를 살펴보세요.

  • js

      const myMap = new Map();
      
      const keyString = "a string",
          keyObj = {},
          keyFunc = () => {};
      
      // setting the values
      myMap.set(keyString, "value associated with 'a string'");
      myMap.set(keyObj, "value associated with keyObj");
      myMap.set(keyFunc, "value associated with keyFunc");
      
      myMap.size; // 3
      
      // getting the values
      myMap.get(keyString);    // "value associated with 'a string'"
      myMap.get(keyObj);       // "value associated with keyObj"
      myMap.get(keyFunc);      // "value associated with keyFunc"
    

11.1. 약한 맵 (WeakMap)

  • WeakMap은 키가 약하게 참조되는 Map으로, 키가 가비지 수집되는 것을 막지 않습니다.
  • 즉, 메모리 누수에 대해 걱정할 필요가 없습니다.

  • 여기서 주의해야 할 점은 WeakMap과 달리 Map에서는 모든 키가 객체여야 합니다.

  • WeakMap에는 delete(키), has(키), get(키), set(키, 값)의 4가지 메서드만 있습니다.

  • js

      const w = new WeakMap();
      w.set('a', 'b');
      // Uncaught TypeError: Invalid value used as weak map key
      
      const o1 = {},
          o2 = () => {},
          o3 = window;
      
      w.set(o1, 37);
      w.set(o2, "azerty");
      w.set(o3, undefined);
      
      w.get(o3); // undefined, because that is the set value
      
      w.has(o1); // true
      w.delete(o1);
      w.has(o1); // false
    


12. SetWeakSet

  • Set 객체는 고유한 값의 컬렉션입니다.

  • 컬렉션에는 모든 고유한 값이 있어야 하므로 중복 값은 무시됩니다.

  • 값은 기본 유형 또는 객체 참조일 수 있습니다.

  • js

      const mySet = new Set([1, 1, 2, 2, 3, 3]);
      mySet.size; // 3
      mySet.has(1); // true
      mySet.add('strings');
      mySet.add({ a: 1, b:2 });
    

  • forEach 메서드나 for...of 루프를 사용하여 삽입 순서대로 집합을 반복할 수 있습니다.

  • js

      mySet.forEach((item) => {
          console.log(item);
          // 1
          // 2
          // 3
          // 'strings'
          // Object { a: 1, b: 2 }
      });
      
      for (let value of mySet) {
          console.log(value);
          // 1
          // 2
          // 3
          // 'strings'
          // Object { a: 1, b: 2 }
      }
    
  • 세트에는 delete()clear() 메서드도 있습니다.


12.1. 약한 셋 (WeakSet)

  • WeakMap과 비슷하게 WeakSet 객체를 사용하면 약하게 보관된 객체를 컬렉션에 저장할 수 있습니다.

  • WeakSet의 객체는 한 번만 발생하며, WeakSet의 컬렉션에서 고유합니다.

  • js

      const ws = new WeakSet();
      const obj = {};
      const foo = {};
      
      ws.add(window);
      ws.add(obj);
      
      ws.has(window); // true
      ws.has(foo);    // false, foo has not been added to the set
      
      ws.delete(window); // removes window from the set
      ws.has(window);    // false, window has been removed
    


13. ES6의 클래스

  • ES6는 새로운 클래스 구문을 도입합니다.
  • 여기서 주목할 점 하나는 ES6 클래스가 새로운 객체 지향 상속 모델이 아니라는 것입니다.
  • 이들은 JavaScript의 기존 프로토타입 기반 상속에 대한 구문적 설탕 역할을 할 뿐입니다.

  • ES6에서 클래스를 보는 한 가지 방법은 ES5에서 사용했던 프로토타입과 생성자 함수를 다루는 새로운 구문일 뿐입니다.

  • static 키워드를 사용하여 정의된 함수는 클래스의 정적/클래스 함수를 구현합니다.

  • js

      class Task {
          constructor() {
              console.log("task instantiated!");
          }
      
          showId() {
              console.log(23);
          }
      
          static loadAll() {
              console.log("Loading all tasks..");
          }
      }
      
      console.log(typeof Task); // function
      const task = new Task(); // "task instantiated!"
      task.showId(); // 23
      Task.loadAll(); // "Loading all tasks.."
    

13.1. 클래스에서의 extendssuper

  • 다음 코드를 고려해 보세요.

  • js

      class Car {
          constructor() {
              console.log("Creating a new car");
          }
      }
      
      class Porsche extends Car {
          constructor() {
              super();
              console.log("Creating Porsche");
          }
      }
      
      let c = new Porsche();
      // Creating a new car
      // Creating Porsche
    
  • extendsES6에서 자식 클래스가 부모 클래스를 상속할 수 있도록 합니다.

  • 파생된 생성자는 super()를 호출해야 한다는 점에 유의하는 것이 중요합니다.

  • 또한, super.parentMethodName()를 사용하여 자식 클래스의 메서드에서 부모 클래스의 메서드를 호출할 수 있습니다.



  • 염두에 두어야 할 몇 가지 사항:
    • 클래스 선언은 호이스트되지 않습니다. 먼저 클래스를 선언한 다음 액세스해야 합니다. 그렇지 않으면 ReferenceError가 발생합니다.
    • 클래스 정의 내부에 함수를 정의할 때 function 키워드를 사용할 필요가 없습니다.


14. 심볼

  • SymbolES6에서 도입된 고유하고 불변의 데이터 유형입니다.

  • 심볼의 목적은 고유 식별자를 생성하는 것이지만 해당 식별자에 대한 액세스는 절대 얻을 수 없습니다.

  • 심볼을 만드는 방법은 다음과 같습니다.

  • js

      const sym = Symbol("some optional description");
      console.log(typeof sym); // symbol
    
  • Symbol(…)와 함께 new를 사용할 수 없다는 점에 유의하세요.

  • 심볼이 객체의 속성/키로 사용되는 경우, 해당 속성은 객체 속성의 일반적인 열거에 나타나지 않도록 특별한 방식으로 저장됩니다.

  • js

      const o = {
          val: 10,
          [Symbol("random")]: "I'm a symbol",
      };
      
      console.log(Object.getOwnPropertyNames(o)); // val
    
  • 객체의 심볼 속성을 검색하려면 Object.getOwnPropertySymbols(o)를 사용합니다.



15. 반복자 (Iterators)

  • 반복자는 해당 시퀀스 내에서 현재 위치를 추적하면서 컬렉션에서 한 번에 하나씩 항목에 액세스합니다.
  • 시퀀스의 다음 항목을 반환하는 next() 메서드를 제공합니다.
  • 이 메서드는 done과 value라는 두 가지 속성을 가진 객체를 반환합니다.

  • ES6에는 객체의 기본 반복자를 지정하는 Symbol.iterator가 있습니다.
  • 객체를 반복해야 할 때마다(예: for..of 루프의 시작 부분) 인수 없이 @@iterator 메서드가 호출되고 반환된 반복자는 반복할 값을 얻는 데 사용됩니다.

  • 반복 가능한 배열과 그 값을 사용하기 위해 생성할 수 있는 반복자를 살펴보겠습니다.

  • js

      const arr = [11,12,13];
      const itr = arr[Symbol.iterator]();
      
      itr.next(); // { value: 11, done: false }
      itr.next(); // { value: 12, done: false }
      itr.next(); // { value: 13, done: false }
      
      itr.next(); // { value: undefined, done: true }
    
  • 객체 정의로 obj[Symbol.iterator]()를 정의하여 사용자 정의 반복자를 작성할 수 있습니다.


16. 생성기, 제네레이터 (Generator)

  • Generator 함수는 ES6의 새로운 기능으로, 함수가 시간이 지남에 따라 여러 값을 생성할 수 있게 해주는데, 이 때 반환되는 객체는 반복을 통해 함수에서 한 번에 하나씩 값을 가져올 수 있습니다.

  • Generator 함수는 호출되면 반복 가능한 객체 를 반환합니다.

  • ES6에서 도입된 새로운 * 구문과 yield 키워드를 사용하여 작성되었습니다.

  • js

      function *infiniteNumbers() {
          let n = 1;
          while (true) {
              yield n++;
          }
      }
      
      const numbers = infiniteNumbers(); // returns an iterable object
      
      numbers.next(); // { value: 1, done: false }
      numbers.next(); // { value: 2, done: false }
      numbers.next(); // { value: 3, done: false }
    
  • yield 가 호출될 때마다 생성된 값이 시퀀스의 다음 값이 됩니다.

  • 또한, 제네레이터는 생성된 값을 요구에 따라 계산하므로 계산하기 어려운 시퀀스나 무한한 시퀀스를 효율적으로 표현할 수 있습니다.



17. 약속, 프로미스 (Promise)

  • ES6에는 promises에 대한 기본 지원이 있습니다.
  • promise 은 비동기 작업이 완료되기를 기다리는 객체이며, 해당 작업이 완료되면 promise 가 이행(해결)되거나 거부됩니다.

  • Promise를 만드는 표준적인 방법은 매개변수로 두 개의 함수가 주어진 핸들러를 허용하는 new Promise() 생성자를 사용하는 것입니다.

  • 첫 번째 핸들러(일반적으로 resolve라는 이름)는 미래 값이 준비되면 호출하는 함수이고, 두 번째 핸들러(일반적으로 reject라는 이름)는 미래 값을 확인할 수 없는 경우 Promise를 거부하기 위해 호출하는 함수입니다.

  • js

      const p = new Promise((resolve, reject) => {
          if (/* condition */) {
              resolve(/* value */);  // fulfilled successfully
          } else {
              reject(/* reason */);  // error, rejected
          }
      });
    

  • 모든 Promise에는 then이라는 메서드가 있는데, 이 메서드는 콜백(callback) 쌍을 받습니다.

  • 첫 번째 콜백은 프로미스가 해결되면 호출되고, 두 번째 콜백은 프로미스가 거부되면 호출됩니다.

  • js

      p.then((val) => console.log("Promise Resolved", val),
             (err) => console.log("Promise Rejected", err));
    

  • then 콜백에서 값을 반환하면 해당 값이 다음 then 콜백으로 전달됩니다.

  • js

      const hello = new Promise((resolve, reject) => { resolve("Hello") });
      
      hello.then((str) => `${str} World`)
           .then((str) => `${str}!`)
           .then((str) => console.log(str)) // Hello World!
    
  • 약속을 반환할 때 약속의 해결된 값은 다음 콜백으로 전달되어 효과적으로 연결됩니다.

  • 이는 "콜백 지옥"을 피하는 간단한 기술입니다.

  • js

      const p = new Promise((resolve, reject) => { resolve(1) });
      
      const eventuallyAdd1 = (val) => new Promise((resolve, reject) => { resolve(val + 1) });
      
      p.then(eventuallyAdd1)
       .then(eventuallyAdd1)
       .then((val) => console.log(val)); // 3
    



  • 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
  • 일부 모바일 환경에서는 ❤️ 버튼이 보이지 않습니다.

728x90
반응형
반응형

terminal-image-cli : 터미널에 이미지 표시 (JS)

터미널에 이미지 표시 (javascript)

색상을 지원하는 모든 터미널에서 작동합니다. 애니메이션 GIF를 지원합니다.

iTerm에서는 특수 이미지 지원 기능이 있으므로 이미지가 전체 해상도로 표시 됩니다.

설치

npm install --global terminal-image-cli

사용법

$ image --help

  Usage
    $ image <image>
    $ cat <image> | image

  Examples
    $ image unicorn.jpg
    $ cat unicorn.jpg | image

관련 사항

728x90
반응형

'Javascript' 카테고리의 다른 글

소프트웨어 설계의 유연성을 높이는 의존성 주입 기법과 예제  (0) 2024.11.08
인류를 위한 ES6 (ES6 for Humans)  (0) 2024.10.27
Javascript Promise 2  (0) 2018.11.22
Javascript Promise  (0) 2018.11.22
Callback Hell  (0) 2018.11.22
반응형
// promise2.js
function countdown(seconds) {
return new Promise(function(resolve, reject) {
for(let i=seconds; i>=0; i--) {
setTimeout(function() {
if(i===13) return reject(new Error("DEFINITELY NOT COUNTING THAT"));
if(i>0) console.log(i + '...');
else resolve(console.log("GO!"));
}, (seconds-i)*1000);
}
});
}
countdown(15).then(
function() {
console.log("countdown completed successfully");
},
function(err) {
console.log("countdown experienced an error: " + err.message);
}
);
728x90
반응형

'Javascript' 카테고리의 다른 글

인류를 위한 ES6 (ES6 for Humans)  (0) 2024.10.27
terminal-image-cli : 터미널에 이미지 표시 (JS)  (1) 2024.10.25
Javascript Promise  (0) 2018.11.22
Callback Hell  (0) 2018.11.22
Error first callback  (0) 2018.11.22
반응형
// promise.js
function countdown(seconds) {
return new Promise(function(resolve, reject) {
for(let i=seconds; i>=0; i--) {
setTimeout(function() {
if(i>0) console.log(i + '...');
else resolve(console.log("GO!"));
}, (seconds-i)*1000);
}
});
}
countdown(5).then(
function() {
console.log("countdown completed successfully");
},
function(err) {
console.log("countdown experienced an error: " + err.message);
}
);
/*
const p = countdown(5);
p.then(function() {
console.log("countdown completed successfully");
});
p.catch(function(err) {
console.log("countdown experienced an error: " + err.message);
});
*/
728x90
반응형

'Javascript' 카테고리의 다른 글

terminal-image-cli : 터미널에 이미지 표시 (JS)  (1) 2024.10.25
Javascript Promise 2  (0) 2018.11.22
Callback Hell  (0) 2018.11.22
Error first callback  (0) 2018.11.22
String.raw  (0) 2018.11.22
반응형
// callback-hell.js
const fs = require('fs');
fs.readFile('a.txt', function(err, dataA) {
if(err) console.error(err);
fs.readFile('b.txt', function(err, dataB) {
if(err) console.error(err);
fs.readFile('c.txt', function(err, dataC) {
if(err) console.error(err);
setTimeout(function() {
fs.writeFile('d.txt', dataA+dataB+dataC, function(err) {
if(err) console.error(err);
});
}, 60*1000);
});
});
});
// const fs = require('fs');
function readSketchyFile() {
try {
fs.readFile('does_not_exist.txt', function(err, data) {
if(err) throw err;
});
} catch(err) {
console.log('warning: minor issue occurred, program continuing');
}
}
readSketchyFile();
728x90
반응형

'Javascript' 카테고리의 다른 글

Javascript Promise 2  (0) 2018.11.22
Javascript Promise  (0) 2018.11.22
Error first callback  (0) 2018.11.22
String.raw  (0) 2018.11.22
template tag  (0) 2018.11.22
반응형
// error-first-callbacks.js
const fs = require('fs');
const fname = 'may_or_may_not_exist.txt';
fs.readFile(fname, function(err, data) {
if(err) return console.error(`error reading file ${fname}: ${err.message}`);
console.log(`${fname} contents: ${data}`);
});
728x90
반응형

'Javascript' 카테고리의 다른 글

Javascript Promise  (0) 2018.11.22
Callback Hell  (0) 2018.11.22
String.raw  (0) 2018.11.22
template tag  (0) 2018.11.22
치환자 ${}  (0) 2018.11.22

+ Recent posts