개발일때에는 development, 배포일때에는 productionprocess.env.NODE_ENV를 구분해서 webpack의 설정을 진행해야하는 경우들이 있다.

예를 들면... 보안에 안좋아서 옵션을 달리해야한다던가..?

 

맥에서는 명령어만 삽입해도 진행이 되는데, windows에서는 라이브러리를 사용해줘야한다.

 

cross-env는 이때 운영체제나 플랫폼에 종속되지 않고 동일한 방법으로 env 변수를 주입해주는 패키지이다.

이것을 사용하면 동적으로 process.env(환경 변수)를 변경할 수 있다.

 

 

설치

npm i cross-env

 

사용할 커맨드 앞에 cross-env 를 붙여주기만 하면 된다.

 

 

 

package.json

사용 전 

"scripts": {
    "dev": "next -p 3060",
    "build": "ANALYZE=true NODE_ENV=production next build",
 },

 

 

사용 후

"scripts": {
    "dev": "next -p 3060",
    "build": "cross-env ANALYZE=true NODE_ENV=production next build",
 },

 

 

이렇게 간단하게 해결해주는 패키지이기 때문에 많은 사람들이 사용하고,

그렇기 때문에 비슷한 이름으로 해서 사용자를 헷갈리게 하여 설치하는 순간 정보를 빼가는 해커들도 있었다.

 

 

보안뉴스 캡쳐

 

보안뉴스

https://www.boannews.com/media/view.asp?idx=56184&skind=O

 

개발자는 속이기 쉽다? 자바스크립트 저장소 npm 감염되다

해커들에게 공격 툴이 있는 것처럼 개발자들에게도 소프트웨어 개발 툴이 있다. 그리고 그런 개발 툴들을 단위 단위로 묶어서 관리하는 체계도 있다. 자바스크립트라는 프로그래밍 언어의 패키

www.boannews.com

 

 

해커가 crossenv 라는 패키지를 배포하였고, 개발자가 install시 실수로 '-'를 빼고 설치하게되면 .env 파일을 가져가는 사건도 있었다.

.env에는 보안적인 정보들이 담겨있으니...

 

 

npm 블로그

https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry.html

 

npm Blog Archive: `crossenv` malware on the npm registry

npm Blog (Archive); updates from the npm team are now published on the GitHub Blog and the GitHub Changelog

blog.npmjs.org

 

 

오늘도 이렇게 좋은 패키지를 알아간다ㅎㅎ

 

사이트에 Form을 만들고 이것을 통해 '사이트 주인에게 메일 발송'하는 기능을 작업해보도록하겠습니다.

 

 

EmailJS

- http://www.emailjs.com/

 

Send email from Javascript - no server code required | EmailJS

Send email directly from your client-side Javascript code – no server side code required. Add static or dynamic attachments, dynamic parameters, captcha code and more. Start with our free tier!

www.emailjs.com

- 무료는 텍스트만 가능, 파일전송 X

 

 

 

1. 가입

EmailJS 메인

 

 

 

2. Email Services 페이지

Add New service를 클릭해줍니다.

메일을 발송하고, 받을 수 있는 플랫폼을 선택하고 연동하는 작업입니다.

Email services 페이지

 

 

저는 Gmail를 선택했습니다.

Service ID는 옆에 키 모양 아이콘을 누르면 변경 가능합니다.

(이 key가 공개되면 제 메일을 이용할 수 있을 것이므로, 저는 캡쳐에 나온 키 안썼습니다.)

service 선택 팝업

 

 

Connect Account 눌러서 계정 연동해줍니다.

이때, 팝업이 뜨는데 허용 버튼을 눌러줍니다.

EmailJS 권한 팝업

 

 

안내 문구를 읽어보면 발신자가 본인이 된다는 의미입니다.

허용을 모두 마쳤다면, Create Service 버튼을 클릭합니다.

 

대시보드의 Email Services에 내가 방금 생성한 것이 확인됩니다.

Email Services 대시보드 생성예시

 

 

그리고 연동한 메일에도 관련 Test 메일이 와있습니다.

EmailJS 테스트 메일

 

 

허용 누를때 안내나왔던대로 내가 발신자가 됩니다.

이후, 대시보드에서 보낸 히스토리나 이벤트 같은 것들을 확인할 수 있습니다.

Events에서 방금 테스트메일에 대한 Events를 확인할 수 있습니다.

Events 페이지

 

 

 

3. Email Templates 페이지

Create New Template를 클릭해서 템플릿을 만들어줍니다.

Email Templates 페이지 create 버튼

 

일단, 뭐가 뭔지 모르니 그냥 오른쪽 위에 있는 Save버튼을 눌러줍니다...

 

 

 

4. Integration 페이지

본격적으로 작업을 해보겠습니다.

NPM, Browser, API 버튼을 누르면 각 설명이 적혀있습니다.

 

저는 npm을 통해 작업하겠습니다.

integration 페이지

 

자세한 내용은document을 한번 읽어보세요.

https://www.emailjs.com/docs/sdk/installation/

 

SDK Installation | EmailJS

Guide goes through the various methods used to install EmailJS SDK

www.emailjs.com

 

 

 

5. npm install 및 예제 코드 확인

npm install emailjs-com --save

 

document에 적혀있는 예제

import React from 'react';import emailjs from 'emailjs-com';
import './ContactUs.css';

export default function ContactUs() {
  function sendEmail(e) {
    e.preventDefault();

    emailjs.sendForm('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', e.target, 'YOUR_USER_ID')
      .then((result) => {
          console.log(result.text);
      }, (error) => {
          console.log(error.text);
      });
  }

  return (
    <form className="contact-form" onSubmit={sendEmail}>
      <input type="hidden" name="contact_number" />
      <label>Name</label>
      <input type="text" name="user_name" />
      <label>Email</label>
      <input type="email" name="user_email" />
      <label>Message</label>
      <textarea name="message" />
      <input type="submit" value="Send" />
    </form>
  );
  }

 

이 부분이 주의깊게 봐야하는 부분입니다.

 emailjs.sendForm('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', e.target, 'YOUR_USER_ID')
   .then((result) => {
   	console.log(result.text);
    
   }, (error) => {
   	console.log(error.text);
    
   });
 }

sendForm 메서드에는 3개의 id와 함께 form을 넘겨줘야합니다.

(form data가 아니라 form 엘리먼트입니다.)

 

 

3개의 ID를 발급 받을 수 위치입니다.

  • YOUR_SERVICE_ID : Email Services 페이지에서 발급
  • YOUR_TEMPLATE_ID : Email Templates 페이지에서 발급
  • YOUR_USER_ID : Integration 페이지에서 API Keys에 User ID 확인

 

 

 

6. 코드

Email.JS

import React, { useCallback } from 'react';
import useInput from '../hooks/useInput';
import emailjs from 'emailjs-com';
import styled from 'styled-components';

const Form = styled.form`   
    margin: 0 auto;
    padding: 20px;  
    width: 400px;
    background: #ccc;
    text-align: center;

    input {
        padding: 5px 10px;
        width: 100%;
        border: 1px solid #666;

        & + input,
        & + textarea {
            margin-top: 20px;
        }
    }

    textarea {
        padding: 5px 10px;
        width: 100%;
        min-height: 100px;
        outline: none;
        resize: none;
        IME-MODE: auto;
    }

    button {
        margin-top: 20px;
        padding: 5px 15px;
        background: #fff;
        border: 1px solid #666;
        outline: none;
        cursor: pointer;
    }
`;

const Email = () => {
    const [name, onChangeName] = useInput('');
    const [email, onChangeEmail] = useInput('');
    const [text, onChangeText] = useInput('');

    const onSubmit = useCallback((e) => {
        e.preventDefault();

        const inputNum = e.target.childElementCount - 1; // [D] 버튼한개 제외
        const data = new FormData(e.target);
        const entries = data.entries();
        let failNum = 0;

        for (let i = 0; i < inputNum; i++) {
            const next = entries.next();
            const key = next.value[0];
            const value = next.value[1];

            if (!value) {
                failNum++;
                alert(`${key} 비어있습니다.`);
                break;
            }
        }

        if (!failNum) {
            emailjs.sendForm(
            	'YOUR_SERVICE_ID', 
                'YOUR_TEMPLATE_ID', 
                e.target, 
                'YOUR_USER_ID'
                
            ).then((result) => {
                console.log('result.text', result.text);

            }, (error) => {
                console.log(error.text);
            });
        }
    }, []);

    return (
        <Form onSubmit={onSubmit}>
            <input
                type="text"
                name="name"
                placeholder="이름"
                value={name}
                onChange={onChangeName}
            />

            <input
                type="text"
                name="email"
                placeholder="이메일"
                value={email}
                onChange={onChangeEmail}
            />

            <textarea
                name="text"
                placeholder="메세지"
                value={text}
                onChange={onChangeText}
            />

            <button type="submit">
                발송
            </button>
        </Form>
    );
};

export default Email;

 

 

 

useInput

커스텀 훅입니다.

import { useState, useCallback } from 'react';

export default (initialValue = null) => {
    const [value, setValue] = useState(initialValue);
    const handler = useCallback(({target}) => {
        setValue(target.value);
    }, []);

    return [value, handler, setValue];
};

 

 

 

7. 템플릿 수정 (EmailJS 대시보드 Email Templates 페이지)

코드 작업이 끝났으니 초반에 만들었던 Email Templates를 수정해줍니다.

input의 name값과 맞춰서 key 값을 삽입해주면 됩니다.

 

 

수정 아이콘을 눌러서 수정페이지로 이동합니다.

Email Tempalte 수정 방법

 

 

제목, 컨텐츠 모두 수정해주었습니다.

수정을 완료하였다면 Save를 눌러주세요.

Template 수정 페이지

 

 

 

8. 메일 발송 확인

이제 폼을 작성하여 발송을 눌러봅니다.

예시 폼

 

그 후 내가 서비스로 선택한 플랫폼의 메일함을 보면 메일이 도착합니다.

 

emailJS 템플릿 테스트 메일

 

 

내용도 수정된 것이 확인됩니다.

정상적으로 동작ㅎㅎ!

emailJS 템플릿 테스트 메일 컨텐츠

 

 

파비콘(favicon.ico) 만들기

 

파비콘이란?

' 파비콘 또는 패비콘이란 인터넷 웹 브라우저의 주소창에 표시되는 웹사이트나 웹페이지를 대표하는 아이콘이다. '

-위키백과

 

 

파비콘에 사용할 아이콘 선정

저는 iconflat 사이트에서 무료라이센스 아이콘을 사용하고는 합니다. (라이선스 확인 및 출처 필수)

www.flaticon.com/

 

Flaticon, the largest database of free vector icons

Download all icons in SVG, PSD, PNG, EPS format or as webfonts

www.flaticon.com

 

검색어에 검색을하고 Filters에서 라이센스 Free를 선택해줍니다.

iconflat Filters창

 

원하는 아이콘을 검색하고 아이콘에 마우스를 올리면 다운로드 할 수 있는 버튼이 뜹니다.

iconflat 검색 결과창

 

다운로드 버튼을 클릭하여 아이콘 이미지를 다운로드 받습니다.

iconflat 아이콘

 

 

 

 

ICO 파일로 변환

convert 사이트를 이용해 해당 이미지를 ico 확장자로 변환하게씁니다.

변환사이트는 본인이 구글을 검색해도 되고 아래 사이트를 이용해도됩니다.

https://icoconvert.com

 

ICO Convert - Create Icons From PNG & JPG Images Online

ICO Convert is a free online icon maker and favicon generator, with it you can make icons from png or jpg images, just upload a photo of yourself, resize and crop it, convert to a shape you like, add borders and shadows, and save it as a PNG image or Windo

icoconvert.com

 

 

Step 1. 이미지업로드

이미지 업로드 Step1

파일 추가버튼 클릭 후 파일을 선택해주고, Upload 버튼을 클릭합니다.

Upload 버튼을 누른 후 아래 Step2로 스크롤해 내려갑니다.

 

 

 

Step 2. 이미지 자르기

이미지 자르기 Step 2

내가 올린 파일 이미지가 뜨고 이미지에 마우스 드래그 시 자를 수 있는 도구가 나옵니다.

전 그대로 사용하기 위해 Step 4로 넘어갔습니다.

 

 

 

Step3는 액자나 기울기 등을 적용하는 부분입니다.

파비콘은 심플한게 좋기때문에 건너뛰었습니다.

 

 

 

Step 4. 사이즈 및 포맷설정

Step 5. 다운로드

사이즈 설정 및 다운로드 Step4, 5

 

Step4에서 크기를 설정해줍니다.

디바이스나 브라우저마다 다른 사이즈의 파비콘을 사용할 수 있습니다.

물론 최적화 시켜서 다 맞추면 좋겠지만 일반적으로는 16x16이나 32x32가 많이 사용됩니다.

저는 32x32로 선택했습니다. 

파비콘은 사이트 탭에서 사이트 이름의 옆, 즐겨찾기 시 사이트 이름 옆, 바탕화면에 바로가기 등록 시에도 사용됩니다.

 

 

Step5에서 확장자를 선택 후 Convert ICO를 클릭하면 하단에 파란색 글씨로 Download your icon(s)가 나옵니다.

Download your icon(s) 글씨를 클릭하여 파일을 다운로드합니다.

 

 

+ 만약 다운로드가 안된다면 +

Download your icon(s)위에 마우스를 올린 후 우클릭을 하여 '검사'를 눌러줍니다.

마우스 우클릭 > 검사

 

 

그렇게 하면 옆에 막 코드가 적혀있는 창(개발자도구)이 뜨는데 <a href="링크" 부분의 링크를 클릭해 줍니다.

그러면 다운로드가 됩니다.

저는 16x16 / 32x32 / 64x64 / 256x256을 선택함으로 인해 multi-size 파일이되었는데,

하나만 선택해도 됩니다.

 

 

 

multi-size 옵션

만약 여러 사이즈가 필요하다면 Step4에서 한번에 여러 사이즈르 선택하여 다운로드 받으면 됩니다.

ico파일은 하나의 파일이지만 그 안에 다양한 크기의 이미지를 포함시킬 수 있는 기능을 지원합니다.

아래 참고 이미지처럼 사이즈를 여러개 선택한 후 다운로드 받아보시면 하나의 파일입니다.

multiple sizes 방법

 

 

 

설정 완료

파비콘 설정하면 내 사이트 탭 옆에 뜨는 것을 확인 할 수 있습니다.

사이트 바로가기 설정 시에도 아이콘 확인이 가능합니다.

브라우저 탭, 파비콘 확인
사이트 바로가기, 파비콘 확인

 

 

 

스토리지 중에 무엇을 써볼까하다가 AWS S3를 이용하기로 했습니다.

그래서 조사하고 기억하기 위해 글을 작성합니다!

AWS S3가 무엇인지 알아보겠습니다.

 

 

aws 마크 (출처: 위키백과)

 

 

 

AWS(Amazon Web Services) S3(Simple Storage Serviced)

아마존에서 제공하는 온라인 스토리지 웹 서비스입니다.

높은 내구성, 가용성, 저렴한 가격이 장점입니다.

 

이분의 블로그 글을 참고하시면 자세합니다.

저는 이 블로그 글을 읽고 제가 기억해야하는 부분을 요약한 것입니다.

 https://acstory.tistory.com/33

 

[AWS] S3란? 무제한으로 저장할 수 있는 스토리지!

한마디로 요약하면 S3는 "높은 내구성"과 "높은 가용성"을 "저렴한 가격"으로 제공하는 "인터넷 스토리지 서비스" 이다. 하나의 저장 공간을 구성하고 그 공간에 데이터를 업로드하면 인터넷을 통

acstory.tistory.com

 

내구성과 가용성이 높다라는 것은 외부의 자극에도 변형되지 않고 유지되며 시스템이 장애없이 정상적으로 운영되는 성질이 높다는 것입니다.

 

 

 

일반 스토리지와 객체스토리지(S3)의 차이

일반 스토리지

일반 스토리지 이미지 (출처: https://acstory.tistory.com/33)

1) 업로더가 업로드하면 스토리지에 저장됨

2) 저장된 스토리지에 있는 파일을 사용자가 다운로드 요청

3)

정상: 파일을 정상적으로 응답

손상이 있을 경우: 다운로드 실패 혹은 손상된 파일을 응답

 

 

객체스토리지 (S3)

객체 스토리지 설명 (출처: https://acstory.tistory.com/33)

1) 업로더가 업로드하면 스토리지가 여러 위치에 복제본을 생성

2) 저장된 스토리지에 있는 파일을 사용자가 다운로드 요청

3)

정상: 파일을 정상적으로 응답 (이때 복제본도 응답 가능)

손상이 있을 경우: 손상본을 제외 시키고 정상적인 복제본을 통해 응답 

 

 

단점은 스토리지가 객체를 내부 복제하는데에 시간이 걸린다.

물론 매우 짧다.

객체 스토리지 단점 설명 (출처: https://acstory.tistory.com/33)

따라서 복제 도중 다양한 요청에 대해 일관적인 응답이 아닐 경우도 존재합니다.

덮여쓰기 중 이전 버전을 응답한다거나 삭제했음에도 응답이 되는 경우를 예로 들 수 있습니다.

 

 

 

S3 요금

최초요금은 없으며 사용한 만큼 비용을 지불해야합니다.

스토리지 클래스를 결정할 때엔 네가지 비용 요소를 고려해야한다고 하네요.

- 스토리지 요금

- 요청 및 데이터 검색 요금

- 데이터 전송 및 전송 가속화 요금 

- 데이터 관리 기능 요금

https://aws.amazon.com/ko/s3/pricing/

 

 

리전을 눌러보면 GB당 얼마인지 나옵니다.

리전마다 다르니 확인하시고 사용하세요.

 

 

 


https://acstory.tistory.com/33

aws.amazon.com/ko/s3/

 

+ Recent posts