네 ! 안녕하세요 최근에 개인적으로 자동화를 Server 쪽에서 진행하다보니 Node.js Express로 많이 짜게 되었는데요

 

자동화를 하면서 놓쳣던 부분들 ( pm2의 로깅관리, 서버의 주소 노출 등등 ) 의 경험을 다시 덧붙여서 TypeScript & Express 보일러 플레이트를 하루정도 들여서 만들었던 과정을 포스팅하려고합니다.

 

TS를 설명하는 부분들은 아니니 TS는 건너가고 webpack 에 대한 설명도 어느정도는 건너 서 말씀드리겠습니다.

 

Node.js

일단 위의 모든 것들을 행하기 위해서는 Node.js를 설치 하여야 합니다.

 

https://nodejs.org/en/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

유명한 사이트죠 현재 포스팅 기준은 Windows에서 하였기 때문에 Windows로 진행 하도록 하겠습니다.

 

설치 같은 경우는 많이 포스팅하기도했고 검색해도 많이 나오기 때문에 스킵 하도록 하겠습니다.

 

Node.js가 설치가 완료 되었다면 이제 환경 설정을 할 차례입니다.

 

Windows PowerShell, CMD, Visual Studio Code 등의 Terminal 에서 내가 작업할 프로젝트 폴더를 만들고 이동합니다.

 

ex: mkdir network 

     cd network

그 후에 기본적인 npm 세팅을 하도록 합시다.

 

npm init -y  // npm 기본 세팅 
npm i -D  // devDependencies 참조 
npm i // dependencies 참조 

 

npm i -D : 개발디펜던시로 devDependencies 를 기준으로 설치 하시면 됩니다.

npm i : 프로젝트 디펜던시로 dependencies 를 기준으로 설치 하시면 됩니다.

 

** npm i -D typescript @types./axios

    npm i axios 

 

webpack 에 대해 설명을 제대로 하자면 더 길어질수있어 기존에 작성하였던 webpack 포스팅을 참조 드립니다.

https://ipex.tistory.com/entry/TypeScript-TS-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-with-webpack-v4TypeScript-Environment-Configuration-with-webpack-v4

 

이번 포스팅에서는 webpack 과 typescript + express 구조에 대해서 말씀을 드리려고합니다.

 

일단 express부터 간단하게 구조를 짜보자면

 

이와 같은 구조가 일단 만들어집니다.

 

log - 서버 로깅 폴더

public - static 파일을 serving 하기 위한 공유 폴더

route - express Route 폴더 

views - index.html 등 뷰 템플릿 엔진을 사용하기 위한 폴더

index.ts - express 서버의 진입점 ( 시작점 ) 

폴더 구성 후 tsconfig.json 을 생성 

{

  "compilerOptions": {

    "module": "commonjs",

    "target": "es6",

    "moduleResolution": "node",

    "strict": true,

    "alwaysStrict": true,

    "noImplicitAny": true,

    "allowSyntheticDefaultImports": true,

    "outDir": "dist",

    "listEmittedFiles": true,

  },

  "include": [

    "src/**/*"

  ]

}

src 하위에 있는 ts가 전부 js로 변환됨을 확인하실수 있습니다. outDir에 의해서 dist 폴더로 말이죠

프로젝트/src 구조이기 때문에 outDir은 단순히 dist로만 해도 /프로젝트/dist에 결과 파일이 생성됩니다.

( 폴더 구조 그대로요 )

 

그래서 사실 저도 여기까진 전혀 문제가 되지 않았습니다.

Express 구조 

src / 

    log

    public

    route

    utils

    views

    index.ts

라는 간단한구조에서 tsc만 돌리면 폴더 구조 그대로 dist에 빼주기 때문에 package.json 에서

tsc후 바로 실행 

npm start 에 tsc후에 node dist로 실행해버리면 ( 트랜스 파일 후 서버까지 실행 ) 

이 정상적으로 되기 때문입니다.    하지만 문제는 public 폴더입니다. 단순하게 테스트용도로 바로 쓸수있는 형태의 페이지를 써야해서 nunjucks라는 Node.js 템플릿 엔진을 사용하는데요

 

그렇게 되면 public 폴더도 같이 서빙해야됩니다. ( index.html 과 수 많은 js css 등 ) 

 

그래서 webpack 을 같이 쓰게 되고 webpack + tsc의 콜라보가 발생합니다. ( FE코드와 BE코드의 각각 분리된 컴파일 ) 

 

FE 코드 트랜스파일링 (webpack)

public폴더와 views폴더만 따로 배포하기 위해서 webpack 을 사용하였습니다.  하지만 

entry :{

 'index':'./src/public/js/index.js' 

}

 

와 같이 입력하면 dist/index.js 로 빌드가 됩니다.  우리의 FE 코드들은 dist/public/index.js가 되어야 하기 때문입니다.

 

그래서 entry 를 수정합니다.

 

entry : {

  'public/index':'./src/public/js/index.js'

}

 

dist/public/index.js 에 정확하게 번들링되어 결과가 정상적으로 나타납니다.  하지만 여기서 문제가 생깁니다.

views도 같이 뽑아내기위해서  HtmlWebPackPlugin 을 사용하는데요  해당 플러그인을 쓰게되면 자동으로 css와 js들의 태그를 붙여 주게 됩니다.

 

<link> href="../public/index.css" rel="stylesheet">





<body>
     ....
    <script type="text/javascript"src="../public/index.js"></script>
</body>

이와 같이 말이죠 Express에서 index.html 의 위치는

src

   views

        index.html 

입니다. 그렇기 때문에 해당 js와 css의 접근을 위해서는 ../public 으로 접근을 해야 합니다.

src

   views

       index.html

   public

       index.js

       index.css

 

여기까진 전혀 문제가 없어 보이지만 큰 문제가 하나있습니다.

app.use(express.static(path.join(__dirname, "public")));

express에서는 static 파일을 서빙하기 위해서 public폴더를 지정하였는데요 

../public이 되어버리면  해당 파일들이 서빙이 되지 않습니다. ( send.render 시에 404 not found가 발생 ) 

 

그래서 해당 방법을 위해서 

 

webpack output 에 publicPath 를 이용합니다.

 output:{
       publicPath:'',
       path:path.join(__dirname,'./dist'),
       filename: '[name].js'
    }, // 결과 파일

이와같이 변경하게 되면 ../public은 사라지지만 /public  이 남습니다.

express.static으로 public이 이미 지정되어있기 때문에 /public/index.css가 아니라 index.css가 되어야합니다.

 

그리고 webpack 에서 또한 리소스 파일들 ( 폰트 이미지 등)도 같이 dist로 나가야 하는 상황입니다. 

 

현재 문제점

 

expres는 public 폴더를 static으로 쓰고있는 상황이여서 파일 경로가

 

public/index.css 라면

 

index.css 로 요청을 해야 express내부적으로 public/index.css로 요청을 하게 되지만

 

webpack 옵션으로 인해 /public/index.css로 요청하게 되어 express에서는

 

public/public/index.css를 찾게 되는 현상이 발생 

 

해당 현상을 해결하기전에 아래와같이 필요한 파일들을 이동하였습니다.

 

[ 파비콘 index.html 등 리소스 파일 이동 ] 

 plugins:[
        
        new HtmlWebPackPlugin({
            template:'./src/views/index.html',
            filename:'./views/index.html',
            showErrors:true
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        }),
        new CopyWebpackPlugin([
            {
                context:'./src/public/resource/',
                from:'**/*',
                to:'./resource'
            },
            {
                from:'./src/views/favicon.ico',
                to:'./'
            },
        ])
    ],

const CopyWebpackPlugin = require('copy-webpack-plugin'); 을 이용 했습니다. context : 루트 위치고 from 에서 to로 이동합니다.  

** 유의 할점은 번들링하기전에 파일들을 이동하는 거 이기 때문에 webpack 번들링과 연관되지않습니다. ( 그래서 플러그인이기도하지요)

 

그리고 해당 경로를 해결하기 위해서 생각을 해보았습니다. ts는 

 

/dist

   /express구조

 

 로 만들어 냅니다.

 

webpack 을 똑같이 사용하기엔 express에서는 webpack 에서 번들링되는 부분들은 public 에서만 쓰면 됩니다.

 

위와같이 entry 이름을 'public/index' 로 해버리면 public 경로가 잡혀버려서 경로 문제가 생기기 때문에

 

entry 는 다시 index 로 변경합니다.

 

그렇게 되면 

 

dist/

   index.css 로 생성되는데

 

  output:{
       publicPath:'',
       path:path.join(__dirname,'./dist/public'),
       filename: '[name].js'
    }, // 결과 파일

path 경로를 dist/public으로 잡으면 됩니다. 

 

그렇게 되면

 

dist/public/

            index.css

            index.js 등 으로 나타나게 됩니다.

 

그리고 나선 express 에서의 코드를 간단하게 수정합니다.

 

nunjucks.configure('views');  -> nunjucks.configure('dist/public/views')

    nunjucks.configure('dist/public/views',{
      autoescape:true,
      express:this.app
    });
    
    this.app.use(express.static(path.join(__dirname,"public")));
    this.app.use(favicon(path.join(__dirname,"/public/resource/fav","favicon.ico")));

 

** 혹시 의아 하실수 있습니다. dist에서 app.js가 실행되는데 왜 ./public/views 가 아니라 dist인지

configure에서 path 는 current working directory 이기 때문에  root/dist/public/views 로 되어집니다.

 

1. express template -> 경로 수정 

2. favicon ( express 에서 faviocn 을 미리 response하기 위해서 serve-favicon 이라는 모듈을 사용) 경로 변경

3. webpack config 수정 

const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
    target:"node",
    devServer:{
        contentBase:path.resolve(__dirname,'/src'),
        disableHostCheck:true,
        host:'0.0.0.0'
    },
    name:'network',
    mode:'development', // "production" | "development" | "none"
    devtool:'eval',  // source-map   hidden-source-map
    resolve:{
        modules:['node_modules'],
        extensions:['.scss','.css','.js'],
        alias:{
            "@gdlUtils":path.resolve(__dirname,'src/gdlUtils'),
            "@userCSS":path.resolve(__dirname,'src/public/css'),
            "@res":path.resolve(__dirname,'src/public/resource'),
            'public':path.join(__dirname,'public')
        }
    },
    entry:{
        'index':'./src/public/js/index.js'
  
    }, 
    module: {
    rules: [
  
      {
        test:/\.html$/, // html loader
        use:[
            {
                loader:'html-loader',
                options:{minimize:false}
            }
        ]
      },
  
       {
          test:/\.css$/i,
          use:[
              {
                loader:MiniCssExtractPlugin.loader,
              },
             'css-loader'
          ],
          
       },
      {
          test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
          use:{
              loader:'url-loader',
              options:{
                  name:'[path][hash].[ext]',
                  limit:10*1024 // 10kb
              }
          }
      },
      {
        test: /\.ico$/,
        loader: 'file-loader'
     }
        
           
    ]
    }, 
    
    plugins:[
        
        new HtmlWebPackPlugin({
            template:'./src/views/index.html',
            filename:'./views/index.html',
            showErrors:true
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        }),
        new CopyWebpackPlugin([
            {
                context:'./src/public/resource/',
                from:'**/*',
                to:'./resource'
            },
        ])
    ],
    optimization:{},
    output:{
       publicPath:'',
       path:path.join(__dirname,'./dist/public'),
       filename: '[name].js'
    }, 
  }

 

4. 환경에 맞게 pakcage.json 수정 ( scripts 부분만 )

  "scripts": {
    "build": "webpack -p",
    "nms-dev": "webpack && tsc && node dist",
    "dev": "nodemon --exec npm run nms-dev",
    "restart": "pm2 restart 'NMS'",
    "deploy": "webpack && tsc && pm2 start dist --name 'NMS'",
    "stop": "pm2 stop 'NMS'",
    "delete": "pm2 delete 'NMS'",
    "log": "pm2 log 'NMS'",
    "abcde": "tsc && node dist",
    "be-dev": "nodemon --exec npm run abcde",
    "tsc": "tsc",
    "f": "pm2 stop 'NMS' && pm2 delete 'NMS'",
    "webpack": "webpack"
  },

network 경로 위치에서 npm run nms-dev 라고 입력 해봅시다

 

[결과 화면]

 

이로써 기본적인 대쉬보드를 만들기 위한 아주 최소한의 기본작어빙 완료 되었습니다.

 

앞으로 해야할건 nunjucks를 통한 템플릿 화 + 자동화된 케이스 및 코드 작성 연결

 

nunjucks를 -> SPA FE로 포팅 정도가 있겠네요

 

(이번에는 너무많이 작업해놔서 포스팅을 못할정도가 되지 않길 )

 

긴글 읽어주셔서 감사합니다~

 

질문은 언제나 환영합니다.

 

소스코드 : 

https://github.com/lgance/network/commits/master

 

lgance/network

Contribute to lgance/network development by creating an account on GitHub.

github.com

의 Commit 13499cfa87c1aab7c4506bf54b561ba4090f6937 을 찾으시면 됩니다.

 

커밋 메시지는 typeScript & express boilerplate 입니다. 

감사합니다. ~

선택

자바를 새로 시작하는김에 Eclipse로 시작하였으나 난관이 하나있었습니다. 

jar파일을 하나 만들어서 사용해줘야되는데  gradle 과 Maven 을 쓰지 않으면  Eclipse에서는

jar 파일 생성 -> 생성된 jar파일 에 Dependency jar 다시 merge 하여 jar 다시 생성 의 과정을 거쳐야 합니다.

 

JAVA를 시작한지 일주일도 채 안되었던 상태이기도하고 gradle, maven 형태로 가는거보단 기본적인 jar

생성이라도 간편하게 할수 없을까 찾다보니 Intellij 의 Community 버전의 경우 한번에 Dependency jar도 가능하고 

 

여러가지 편리성도 있고 IDE자체적으로도 많은 차이가 있습니다. (이건 따로 검색해보면 너무많이 나오네요 ㅎㅎ)

 

세팅

https://www.jetbrains.com/idea/ <-- 이 링크에서 인텔리 J Community 

 

IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains

A Capable and Ergonomic Java IDE for Enterprise Java, Scala, Kotlin and much more...

www.jetbrains.com

설치 후 기본 프로젝트 생성

 

Create New Project 

 

자바 버전도 이상하게 나오지만 당황하지 말고 그냥 Next 후 Finish

 

test를 입력후 Shift + F10 ( Run ) 정상적으로 실행됨을 알수 있다. 

 

하지만 제 PC에 설치되어있는 jdk 는 openjdk 1.8을 사용하기 때문에 환경을 변경 해줍니다.

 

Project Structure ( Ctrl + Alt + Shift + S ) 

 

눌러보면 아마 No SDK 로 나타날 것입니다.

JDK 선택 

 

저의 openjdk 의 위치는 위와같습니다.

C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.201-1 해당 위치로 선택합니다.

지정후 apply 하게되면

Shift + F10 으로 실행시 jdk 1.8 을 설정함을 확인 하실수 있습니다~

 

단축키

현재까지 확인된 편리한 단축 기능들입니다.

sout

sout = System.out.println  으로 sout을 입력하면 자동완성이 됩니다.

psvm

psvm = public static void main 으로 sout과 마찬가지입니다. ( 함수내에서는 나타나지 않습니다. ) 

 

Ctrl + Shift + F10 or Shift + F10 

Run (Main Class 실행)

Alt + Insert  

클래스를 사용하여 변수들을 관리하게 되는데 이때 getter setter클래스는 변수에 대해 매번 getter setter를 작성해야 하는 불편함이 있습니다. 해당 기능들을 자동완성 시켜주는 단축키입니다.

Ctrl + Shift + F 

프로젝트 전체 검색입니다.

Ctrl + N 

프로젝트의 클래스 전체 검색입니다.

Ctrl + E

최근에 열였던 클래스 검색 (프로젝트가 커지면 쓸모는 없습니다.)

Alt + 1

프로젝트로 이동(navigator) 하게되며 추후 ctrl + shift + 방향키 선택시

해당 네비게이션의 사이즈가 변합니다.

ESC로 다시 프로젝트 이동후 Alt + 방향키 로 탭을 이동하면서 코드를 작성할 수 있습니다.

Ctrl + Alt + L 

중요합니다. 코드 작성후에 계속 써주면 코드를 정리해줍니다.

 

F2

에러가 있는 곳으로 넘겨서 이동합니다. (에러가 없을 경우엔 메서드 단위로 이동합니다.)

혹은 Ctrl + B 는 사용된 함수로 이동합니다.

Alt + 6

Todo List 체크하기가 됩니다.

잘못된 To do 의 예

 

정상 투두 스타일

// TODO 대문자로 적어 주셔야 정상 투두스타일이며 Alt + 6 에 걸립니다 

 

Ctrl + F11

브레이크 포인트 대신 단축 포인트를 지정합니다.

1번으로 지정하게 된 후에 다른 코드에서 작성 하다가 Ctrl + 1 (Ctrl + 북마크 문자)을 하게되면

해당 단축 포인트로 포커싱이 이동됩니다.  생각보다 유용한 단축키입니다.

 

원래 FE개발을 좋아하기에 아래와 같은 겉멋 로딩 창 문자열 생성기 주소도 넣어봤습니다

 

겉멋 로딩 창 문자열 생성기
http://patorjk.com/software/taag/#p=display&f=Slant&t=App%20Start

불러오는 중입니다...

마지막 으로 저는 Material Theme를 사용하는 데요 

 

Material Theme 변경 시 

 

Ctrl + Shift + A   > plguins 입력 후 Material theme 검색해서 설치

Ctrl + Shift + A > settings 입력시 세팅창 

 

변경된 Material Theme

Material Oceanic Theme

즐거운 JAVA 되세요~

'개발일지(Language) > Java 일지' 카테고리의 다른 글

JAVA 기본기 - 변수  (0) 2019.12.02
JAVA ? 프로그래밍 언어? JAVA 시작하기 (QA)  (0) 2019.11.20
낙서장  (0) 2016.06.15

JAVA는 정말 맨땅에 헤딩 한다는 생각으로 책을 정독 하려고합니다.

 

 

변수 타입

1. primitive type (기본형 )

     논리형(boolean) , 문자형(char) , 정수형 (byte,short,int,long) 실수형 (float,double)

 

2. reference type ( 참조형 )

     1번에 primitive type이 아닌 모든 것들  ex:) String 

 

자료형의 범위는 byte,short,int,long 의 경우만  -2 n-1 ~ 2 n-1 -1 (n은 bit의 수) 

                       (1    2    4    8) byte

                       (1    8    32   64)  bit  -> n 에 대입하여 범위 추측 가능 

** n 비트로 표현할수 있는 정수의 개수 2n 개 ( 2 n-1승 + 2 n-1승 )

** n 비트로 표현할수 있는 부호있는 정수 범위 -2 n-1 승 + 2 n-1승 -1 

(-1의 이유는 0이 포함되기 때문 )

8비트일 경우 -2(7승) ~ 2(7승)-1 -> -128 ~ 127 

short나 byte의 경우 내부적으로 계산시 4byte로 변환하여 연산이 수행되기 때문에  숫자는 그냥  int를 사용하는게 낫다 ( int = 4byte 라 변환되는 연산이 수행되지않습니다. )

 

 

 

javac 로 .java 파일 빌드시 오류 

error: unmappable character (0xEB) for encoding x-windows-949

에러 내용을 보면 for encoding ~ 뒷 부분을 확인하실수 있는 경우가 있습니다.

에디터로 작성된 encoding이 x-windows-949 로 되어있어서 

해당 에러가 발생할 수 있습니다.

실행 뒤에 -encoding "UTF-8" 을 붙여서 실행 해서 해결 할수 있습니다~

JDK 1.6 에서 변화점

final int STATUS = 1; 

// 상수의 경우 선언과 함꼐 초기화가 되어야 하지만 

JDK 1.6 이후로는 필수는 X

 

2진수 변경 하는 메소드

Integer.toBinaryString(10진수 값)

 

- 논리형 ( boolean ) 

true와 false 중 하나이며 기본은 "false"   True X False

- 문자형 ( char )

char ch = "A" 는 ch 에 A가 저장되는것이 아닌 65(유니코드) 가 저장됨 

그렇기 때문에 char ch = 65; 로 선언해서 사용가능 

** 유니코드를 알기 위해서는

 char ch = 'A';
 int unicode = (int)ch; // (int)'A' 로 하여도 괜찮습니다.

System.out.println("유니코드 값 " + unicode);

// 결과  :  유니코드 값 65 

특수 문자 입력은 javaScript 와 똑같은 것으로 보입니다.

\r = carriage return

\n = new line

\f = form feed

\t = tab

\' = 싱글쿼터

\" = 더블쿼트

 

char의 경우 0 ~ 65536

short 의 경우 ( 음의 정수 까지 표현하기 때문에 ) -32768 ~ 32767

 

 

encoding and decoding

위에 문자가 유니코드로 변환이 되는 경우에 'A'  -> 65로 변환되는 과정을 인코딩이라고 합니다.

반대로 변환이 된 65를 다시 'A'의 문자로 변화되는 것을 디코딩 

알기 쉽게 되어있는 'A'를 보기 힘든 유니코드로 변경되는 과정을 인코딩이라고 했으니 암호화하다라는 뜻과도 일맥상통 한다고 볼수 있습니다.

 

- 정수형 ( byte, short, int, long )

소수점 에 대한 범위 및 사용법

 

- 실수형 ( float, double )

소수점 에 대한 범위 및 사용법 

 

 

 

** 추가적으로 기본기 다지기에서 따로 작성해야 할 내용

(진수 변환법, 아스키 코드, 유니코드 ) 

자바! 자바! 이클립스라는 IDE자체에 별 생각이 없었기에 자바를 굳이 시작하진 않았습니다. 

 

(Node.js 로 웬만한건 다 구현이 됐었고 심지어 자동화도 *Node.js에서 *selenium도 메이저 버전이고 아주 급격하게 성장하고있는 퍼펫티어도 Node.js기반입니다.)

 

새로운 프레임워크 (Integrated Automation Framework) - Fitnesse

 

이번에 새로 들어온 회사에서 통합 테스트 프레임워크인 Fitnesse 라는것을 만나게 되었는데

 

정말 자동화에 대한 아이디어가 샘솟는 프레임워크 였습니다.

 

(출처 : http://www.nextree.co.kr/p2613/)  여기서 QA(저희)는 QA담당자와 개발자 둘다 포함하고 있습니다.

 

나중에는 도커로 묶던 어플리케이션 형태로 만들어서 쓰면 될거 같기도 하고

- 테스트코드에 대해서 백엔드에 작업을 해놓고 프론트 앤드 화면에선 파라미터 값을 입력 하면

  백엔드에서는 set이라는 모듈을 통해 파라미터에 따른 함수 실행을 하는 형태 

(하나의 test set 에 이용자가 정하는 여러가지 케이스에 대해 테스트를 하고 History 까지 남길수 있습니다.)

 

Node.js와 연동에 대해서 조금 찾아 보았으나 해당 fitnesse에 대한 자료도 많진 않았고 연동자료들이 있긴하였으나

 

조금 억지스러운 연동들이 많았습니다. ( fitxutre를 파싱하여 쓰는 형태다보니 node에서도 어거지로 맞추면 돌아는 가는형태이지만 이걸 억지로 하는건 기존 저희 팀에 개발된 프로젝트와도 삐걱댈수 있기 때문에 정말 필요한 형태가 아니라면 지양 하고자 했습니다.)

 

그리고 IT인으로 살아가는데 잘하는 언어가 html css, js ts(js수퍼셋) 이라면 뭔가 아쉬울거 같았습니다. (물론 저는 js를 좋아합니다.)

 

학부생을 나오면서 C , C++ , pyhton 맛은 봤지만 어디가서 뭐 이거로 뭐 할수 있습니다. 수준은 아니였기 때문에 한가지를 더 하고 싶었던 생각이 있었습니다. 업무에 적용해서 하면 훨씬 빠르게 성장할수 있었기 때문입니다.

 

그래고 매년 코테를 재미삼아 C,C++ 로 했었는데 이제는 이것도 그만하려고 합니다. 심지어 작년엔 nhn 에도 붙었었지만 지원이력만 남는게 썩 좋지는 않은거같아서  추가적인 언어에 대한 갈망이 있던 찰나에 Fitnesse를 만났고

 

JAVA를 선택하게 되었습니다. 

 

Fitnesse의 메인 언어는 자바입니다.  자바와는 거리가 먼 커리어였기에 이번에 자바의 정석을 통하여

 

기본기를 좀 다지고  멋진 Fitnesse 적용기가 되려고 합니다. 

 

우선 자바의 히스토리 뭐 이런건 책에 있으니 넘어가고 JDK 를 일단 설치 하여야 합니다.

 

오라클 JDK는 유료화 선언이 되었기에 openJDK 를 설치 하도록 합시다.

 

단순히 openjdk 라고 검색하게되면 리눅스 계열 설치는 많이 나오기 때문에 저는 윈도우즈에서 openjdk 를 설치하고

 

진행 해보려고합니다.( 나중에 꼭 MAC을 사서 MAC에서 하는 그날을... )

 

http://jdk.java.net/archive/

 

Archived OpenJDK GA Releases

Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Public License, version 2, with Classpath Exception. WARNING: These older versions of the JDK are provided to hel

jdk.java.net

openjdk 링크입니다.

 

* 참고로 LTS버전(안정화 버전)은 1.8버전이고 그다음 LTS버전은 18.9버전입니다. 

JAVA 8 - LTS 

JAVA 18 - LTS ( 예정 )

 

저는 공부용이니 JAVA 10 을 쓰겠지만 프로덕션은 8이 맞습니다.

 

GA Date : Oracle 자바의 출시일을 뜻합니다.

 

저는 10.0.2 (build 10.0.2+13) 로 설치 하도록 하겠습니다.

 

해당 압축을 푼 후 jdk-10.0.2 폴더를 이동 하도록 하겠습니다.

 

 

해당 위치에 openjdk 라는 폴더를 만든 후 위에 압축을 풀어 이동합니다.

 

내 컴퓨터 우클릭 - 속성 - 고급 시스템 설정 - 고급 탭 - 환경 변수 

 

 

앞에서 지정하였던 폴더 경로를 복사후 

 

새 시스템 변수로 등록 합니다.

확인 후에 

 

Path 선택 후 편집 을 이동하여 아까 지정한 JAVA_HOME 변수를 사용한다.

아래와같이 %JAVA_HOME%\bin 을 입력 후 확인 

 

 

후 종료

 

윈도우 로고 + R => cmd 입력 

 

 

java --version 과

 

javac --version 을 입력합니다.

 

 

정상적으로 openjdk 설치를 확인하였습니다.

 

여기서 마지막으로 java와 javac를 입력 하였는데요

 

기본적인 설명만 적어놓고 다음 시간으로 넘어 가도록 하겠습니다.

 

javac  - 자바 컴파일러 로 자바 소스코드 (.java) 를 바이트코드로 컴파일합니다. (.class)

    -> javac Hello.java

java - 자바 인터 프리터 로 컴파일러가 생성한 바이트코드 (.class)를 해석하고 실행합니다.

    -> java Hello 

javap - 자바 역 어셈블러로 컴파일된 클래스파일(.class)을 원래의 소스로 변환합니다. (java) 

    -> javap Hello > Hello.java

 

만약에 같은 프로젝트에 쉘로  build.sh 를 만들어서 빌드한다고 하면 (IDE 없이)

 

#!/bin/sh

javac Hello.java 
# javac Hello.java -encoding=UTF-8    Encoding Settings
java Hello

 

이런 형태가 될것 같습니다.

 

만약에 작성된 에디터와 인코딩이 맞지 않는 다면 빌드시에 -encoding을 사용하여서 맞춰줄수 있습니다. 

 

javadoc - 자동문서 생성기로 소스파일에 있는 주석 /** */을 이용하여 JAVA API 문서와 같은 형식의 문서를 자동으로 생성합니다.

 

jar - 압축 프로그램 클래스 파일과 프로그램의 실행에 관련된 파일을 하나의 jar 파일(.jar)로 압축하거나 압축해제합니다.

 

JDK ( Java Development Kit ) 자바 개발도구

JRE  ( Java Runtime Environment ) 자바 프로그램이 실행하기 위한 최소환경

 

JRE는 JDK 안에 포함되어 있으며 JDK 가 더 큰 영역입니다. 

javac는 JDK 안에 있습니다.

 

여기까지 자바를 시작하기 위한 기본 준비가 되었습니다. 얼른 자바에 기본을 다지고 통합 테스트 자동화까지

 

해보도록 합시다.

'개발일지(Language) > Java 일지' 카테고리의 다른 글

Intellij IDEA ( JAVA IDE ) Community 버전  (0) 2019.12.10
JAVA 기본기 - 변수  (0) 2019.12.02
낙서장  (0) 2016.06.15

안녕하세요 저번 블로그 포스팅 에서는 TypeScript를 입문하기 위해서 한글 공식 문서와 함께 vscode상에서의 프리티어 

 

설정 등을 하여서 정말 기본중의 기본 튜토리얼만 진행 해보았습니다.

 

// TypeScript Documentation korea Language 

https://typescript-kr.github.io/pages/tutorials/TypeScript%20in%205%20minutes.html

 

TypeScript 한글 문서

TypeScript 한글 번역 문서입니다

typescript-kr.github.io


그런데 제가 하고자 하는 거랑은 맞지 않았던 것이 있습니다.

TypeScript를 JS로 빌드 하지만 JS만으로는 한계가 있기 때문에 기본적으로 html 파일과 css파일이 필요합니다만

 

ts만 따로 빌드하기엔 뭔가 깔끔하지 않는 느낌이랄까요 그래서 같이 한꺼번에 할수 없을까 하여

 

이것저것 찾아 보았습니다. 이왕하는거 sass도 쓰고 이것저것 해보는것이 더 좋은 것 같아서

 

webpack v4

 

웹팩 요즘 많이들 이야기 나오는 번들러 입니다. 해당 번들러에 ts-loader ( TypeScript Loader ) 를 사용하면 같이 이용해볼수 있을 것 같더군요

 

물론 각자 검색해서 공식홈으로 가도 되시겟지만   아래 일단 공유 !

https://webpack.js.org/

 

webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

webpack 구조

위의 사진을 보시면 딱 원하는 것들이 나왔습니다.

저는 좌측에

 

.ts .js .scss .png, .jpg .html   .....   -> .html,.css,.js .jpg.png ... 이외 리소스 정도로 사용할수 있겠네요 

 

일단 webpack 을 설치 하여야 합니다.

 

npm i -D webpack webpack-cli webpack-dev-server

webpack , webpack-cli, webpack-dev-server 입니다. 

그리고 같은 프로젝트에 에 webpack.config.js 파일을 생성 합니다. 

webpack 기본 세팅을 하기 위해서는 여러가지 방법이 필요한데요

 

 

const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    name:'myTypeScript-setting',
    mode:'development', // "production" | "development" | "none"
    devtool:'eval',  // source-map   hidden-source-map
    resolve:{
        modules:['node_modules'],
        extensions:['.ts','json','.jsx','.scss','.css','.js'],
        alias:{
            "@gdlComponents":path.resolve(__dirname,'src/gdlComponents'),
            "@gdlCommonLayout":path.resolve(__dirname,'src/gdlComponents/CommonLayout'),
            "@gdlCommonWidget":path.resolve(__dirname,'src/gdlComponents/CommonWidget'),
            "@gdlUtils":path.resolve(__dirname,'src/gdlUtils'),
            "@gdlConfig":path.resolve(__dirname,'src/gdlConfig/_config'),
            "@userCSS":path.resolve(__dirname,'src/css/userCSS')
        }
    },
    entry:{
        index:['./src/index.ts']
    }, 

    module: {
		rules: [
			{
				test: /\.ts$/,
                use: ['ts-loader'],
                exclude:["/node_modules"]
            },

            {
                test:/\.html$/, // html loader
                use:[
                    {
                        loader:'html-loader',
                        options:{minimize:true}
                    }
                ]
            },
            {
                test:/\.scss$/,
                use:[
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'sass-loader',
                ]
            },
            {
                test:/\.(png|svg|jpg|gif)$/,
                use:[
                    {
                        loader:'file-loader',
                        options:{
                            name:'[hash].[ext]', // [path][name].[ext]?[hash] result : path/to/file.png?e43b20c069c4a01867c31e98cbce33c9
                            outputPath:'res/images',
                            publicPath:'res/images'
                        }
                    }
                ]
              
                    
            },
        
		]
    },
    
    plugins:[
        new HtmlWebPackPlugin({
            template:'./src/index.html',
            filename:'./index.html'
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        })
    ],
    optimization:{},
    output:{
        path:path.join(__dirname,'./dist/src'),
        filename:'[name].js'
    },
  
}

현재 제가 사용하고 있는 webpack.config.js 입니다. 

https://github.com/lgance/gdlComponent

 

lgance/gdlComponent

my TypeScript Play Ground. Contribute to lgance/gdlComponent development by creating an account on GitHub.

github.com

해당 코드는 위의 주소에서 계속 최신화를 하고 있습니다. 받으신 후에 

npm i

npm audit fix

npm start

하시면 dist폴더에서 index.html 을 더블클릭으로 결과물 확인이 가능합니다

 

코드 를 보여준 이유는 뭔가 기본적으로 딱 돌아가는 형태를 확인하면 이해하는데 있어서 훨씬 빠르게 이해할수 있기

 

때문입니다. 제가 만약에 계속 작성되는 코드 때문에 이글을 읽을 당시에 이해하기 힘들정도로 

 

코드가 많아 질수 있기 때문에 

 

2f75f71e41738ca5b3dcb85d521c9980bfcac647 < commit id  의 커밋을 받아서 확인해 보시면 될것 같습니다.

 

해당 커밋의결과 물은 

 

이와 같이 나타납니다. 하단의 img태그가 있긴 한데 이거는 아직 테스트용으로 index.html 에서 img태그 를 지우시면

 

문제없이 화면에 채워서 나타날 겁니다. 

 

다시 webpack.config.js 로 돌아오게 되면

 

기본적으로 중요하게 봐야 할 부분은

 

 

entry 

 

시작점을 뜻합니다. 현재 프로젝트에서 시작하여야 하는 소스코드의 위치를 뜻합니다. 저는 

./src/index.ts 로 작성이 되어있는데요 

 

해당 위치를 시작점으로 잡습니다. 

현재 프로젝트 구조인데요 보시면 ./src를 저는 기준으로 실 소스 코드를 작성하기 때문에 entry 포인트를 위와같이 잡았습니다.

webpack 명령어를 실행시 config를 확인하여서 src/index부터 번들링할 코드를 찾게 됩니다.

 

output

 

엔트리가 시작 점이였다면 아웃풋(output)은 끝점 어디로 나와야 하는가 입니다. 위의 사진에서 보면

 

좌측에 있는 여러가지 번들링되어야 하는 리소스(webpack 에선 모두 모듈이라고합니다.) 들이 이리저리 엮여있는데 

 

이 시작점은 entry 로 이미 지정이 되어있습니다.  그럼 다 묶인상태에서 어디로 나올것인가 에 대한 지정을 하는곳이 이

 

ouput 이라고 할수 있습니다.

 

위의 코드에 보시면 output은

 output:{
        path:path.join(__dirname,'./dist/src'),
        filename:'[name].js'
    },

로 되어있으니 현재 프로젝트 위치에서 ./dist/src에 번들링된 파일들이 나오게 될 것으로 보입니다. 

 

파일네임에 지정된 name값은  entry 에서 지정한 이름이 들어가게 됩니다.

entry:{
        index:['./src/index.ts']
    }, 

index라는 값이 들어갈 것 같습니다

 

현재까지 entry 와 output에 대해 작성하였는데 webpack 은 사실 더 복잡하고 세밀하게 제어가 됩니다. 

 

현재는 entry 와 output이 1개씩이지만 entry 를 여러개 만들어서 output을 대응시킬수도 있습니다. 

 

해당 작업은 추후에 작성해보면 될 것 같습니다. 

 

module

 

모듈 은 이제 중간 단계라고 보실수 있습니다. Entry 에서 시작점을 잡았고 해당 위치에서 엮어야 할 파일들을 다 엮은 

 

후에 output의 설정대로 dist(저는 dist로 설정)로 번들링된 결과물을 만들어 냅니다. 그러면 중간에 entry 로 부터

 

읽어들인 파일들을 어떤식으로 불러서 처리해야 할까? scss css ts이런것들은 그냥 부른다고 되는게 아니라 기존에는 

 

빌드 과정을 거쳐서 하였던 것들인데 이것들을 중간에 처리 해주는 과정이 있는데 이부분을 module 에 기록하며

 

각각의 파일들을 불러서 처리 해주는 녀석을 Loader (로더) 라고 합니다. webpack 은 파일들을 처리해주어야 하는데

 

JS만 동작하기 때문에 이부분들을 로더를 통해서 진행이 됩니다. 로더는 test 와 use로 동작하게 되는데 이중

 

test 어떠한 파일을 로딩할건지 지정 

 

use 해당 파일을 읽어 올 로더를 설정 

 

저는 일단 읽어와야 할 파일들이 html,ts scss, 이외 이미지 파일들 이 있기 때문에

 

ts-loader, html-loader, css-loader, sass-loader, file-loader를 사용 하였습니다. 이외에도 노드에서 sass를 읽어오기 위한

 

node-sass등 여러가지 디펜던시 등을 추가하였습니다. 아래 그림 참고

 

** npm i -D 로 설치 하셔야 합니다. 런타임에선 사용하지않기 때문에 devDependencies로 넣어야 합니다.

현재 사용하고있는 모듈들이며 모듈에 대해서 각각 따로 자료 조사를 해보면 더 쉽게 나오겠지만 간단하게만 설명을 하자면

 

css-loader  - css파일을 import하여 사용할수 있게 도와줌

style-loader - css를 style태그를 만들어서 index.html 에 추가를 도와줌

sass-loader - scss 파일을 css로 변환 ( node-sass 와 같이 사용하여야 함)

file-loader,url-loader - 리소스 파일들을 변환

html-loader - html 파일을 변환

html-webpack-plugin - html 파일을 변환시 해당 플러그인을 통하여 추가 변환

mini-css-extract-plugin - css파일을 새로하나 만들어서 번들링 (이게없을 경우 index.css가 생기지않아 한쪽에 css가 너무 많아져 성능 문제가 생김)

ts-loader - .ts파일들을 js로 변환 (tsconfig.json 을 참고하여 컴파일)

 

이제 맨 위에 있는 module중 ts-loader부터 말씀드리겠습니다.

 

 

ts-loader

 

말그대로 entry 포인트 부터 ts파일들을 찾아서 지정할 부분입니다. 보시면

( TypeScript를 안쓴다면 babel이 대체됩니다.  babel-loader 를 사용하시면 됩니다. )

 

{
     test: /\.ts$/,
     use: ['ts-loader'],
     exclude:["/node_modules"]
},

 

test - 어떠한 파일들을 로딩할지 정규식형태로 .ts로 되어있습니다.

user : ts-loader 해당 읽어들인 파일들을 어떠한 로더로 읽어올지 입니다. test에서 ts를 읽었기 때문에 ts-loader를

        선택하여 읽어 옵니다.

exclude: 선택옵션인데 읽지 말아야할 경로를 지정했습니다. 저는 node_modules를 했습니다.

 

 

html-loader

 

html을 만난다면 해당 html을 읽어서 번들링할때 포함해줍니다.

{
  test:/\.html$/, // html loader
    use:[
      {
      loader:'html-loader',
      options:{minimize:true}
      }
 	]
},

options : minimize:true  -> html 파일들을 공백 개행없이 만들어 줍니다. ( 더 많은 옵션은 html-loader 를 참조 )

 

이외에 모듈들도 위와같은 형태를 가지며

 

추가적으로 사용하고 있는 plugins하나만 소개해드리면

 

plugins

 

MiniCssExtractPlugin 을 사용하고있는데 이는 npm 에서 새로 설치 한후에 require로 가져와서

 

아래와같이 플러그인을 사용할수 있습니다. 

 

entry -> module( loader )  ->  plugins  -> output  와같이 중간단계에서 추가적으로 해주어야 할 작업들에 대해서

 

이와같이 webpack 자체적으로 추가하여 사용할수 있습니다.

 plugins:[
        new HtmlWebPackPlugin({
            template:'./src/index.html',
            filename:'./index.html'
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        })
    ],

 

해당 설정들 말고 위에 resolve나 devtool, mode name 등에 대한 옵션들은 하나씩 찾아가며 하면 어렵지 않은 부분이라

 

이번 포스팅에서는 제외하였습니다.  webpack 이 한번에 이해가 안될때 보일러 플레이트 같은 프로젝트를 돌려보면

 

이해가 좀 쉬울거라고 생각되어집니다. 위의 공유된 github에서 clone후 실행해보면서 이해할수 있으면 좋을 것 같습니다.

 

 

우선 TypeScript 백문이 불 여일 타 라고 docs가 너무 잘되어있는 사이트가 있어서 한번 다 입력하면서 이것저것 내용들을 작성해볼까 합니다. 기존에 바닐라 JS도 TS로 이어서.. 진행하려고 합니다. 

 

앞으로 작성할 Type Script 일지에 관련된 URL을 2가지만 적고 가려고합니다.

 

// TypeScript Documentation korea Language 

https://typescript-kr.github.io/pages/tutorials/TypeScript%20in%205%20minutes.html

 

TypeScript 한글 문서

TypeScript 한글 번역 문서입니다

typescript-kr.github.io

 

TypeScript 설치 

Node.js와 NPM 이 설치되어있다는 가정하에 다음 명령어로 설치합니다.

npm i -g typescript

TypeScript 설치 확인 

npm ls -g --depth=0

TypeScript @3.4.5 가 확인됩니다.

자 설치가 확인됐으면 Lint를 설치하러 갑니다.

사실 Lint를 없어도 TypeScript는 tsc라는 명령어를 통해서 컴파일을 하게 되는데 이 부분에서 에러가 있다면 알아서 다 잡아줍니다. (에러가 있다고 컴파일이 안되진 않습니다. 경고를 통해서 알려줄 뿐)

 

test.tsc 파일을 생성하고 아래와 같은 코드를 입력합시다. 

function greeter(person:string){
	return 'hello, ' + person;
}

greeter(1);

와 같이 적었을 경우 에러를 vsc자체에서는 보여주지 않습니다. 하지만 tsc 명령어를 통해서 빌드하게 되면 아래와 같이 에러 부분을 보여주게 됩니다.

 

아래의 명령어를 입력하게 되면 TypeScript 가 컴파일을 해주게 됩니다.

tsc test.ts

에러는 났지만 정상적으로 컴파일이 된 상태 

이외 기본적인 튜토리얼들은 TypeScript 공식을 참조 

 

하지만 언제나 많은 코드들을 매번 컴파일하는 거보다 에디터에서 미리 볼 수 있으면 좋기 때문에 Visual Studio Code에 확장으로 TSLint를 설치합니다.

 

TSlint 

Ctrl + Shift + X (입력)

가장 다운로드 많은 것을 설치하자!(deprecated 는 제외)

이제 위의 greeter를 다시 가보면 아래 사진과 같이 잘못된 부분을 잡아 주는 효과를 볼 수 있습니다.

 

TSLint의 효과!!

사실 Lint는 해당 내용보다는 autofix라고 해서 자동으로 값이나 필요한 구문들을 도와주는 기능이 핵심이라고 볼 수 있습니다. (C 나 JAVA에서 Assist라고도 하는)

 

tslint 확장을 제어하기 위해서 tslint 모듈도 설치합니다.

 

npm i -g tslint

tslint --init

tslint.json 에 있는 설정을 통해서 여러 가지 룰이나 룰에 적용되는 위치 등을 설정할 수 있습니다. (tslint.json이나 tsconfig.json 은 경험을 쌓다가 한 번에 정리하도록 하겠습니다.)

 

tslint 사용 전에 eslint와 문제로 인해서 vsc에서 수정하여야 할 부분이 있습니다.

settings 관련 내용

https://code.visualstudio.com/docs/getstarted/settings

 

Ctrl + Shift + P  -> settings 입력 - > 기본 설정 : 설정 열기 (JSON)

 

설정 파일(settings.json)에 아래 값을 입력합니다.

 "editor.formatOnSave": false,
  "tslint.autoFixOnSave": true, 

Unknown configuration setting 이 뜨게 되는 경우가 있는데요 

 

네... deprecated 됐다고 합니다.  프리티어로 변경합시다.

https://marketplace.visualstudio.com/items?itemName=eg2.tslint

 

TSLint (deprecated) - Visual Studio Marketplace

vscode-tslint (deprecated) Note: This extension has been deprecated in favor of the vscode-typescript-tslint-plugin. To learn about the differences between vscode-tslint and the new extension please refer to this document. Integrates the tslint linter for

marketplace.visualstudio.com

npm uninstall -g tslint 

제거 

 

VSCode Prettier Configuration( 프리티어 세팅 )

 

1. Prettier VSC에서 설치 

2. Ctrl + Shift + P  -> settings -> 기본 설정 (JSON)

"editor.formatOnSave": true 입력

3. npm 프리티어 설치 

npm i tslint-config-prettier

4. tslint.json 수정

{
  "defaultSeverity": "error",
  "extends": ["tslint:latest", "tslint-config-prettier"],
  "jsRules": {},
  "rules": {
    "semicolon": true
  },
  "rulesDirectory": []
}

5. test.js 작성 

let test = "test" 

6. 저장 시 자동으로 ; 가 붙는 현상 확인 

 

 

tslint.json rules

https://palantir.github.io/tslint/rules/

tsconfig.json 

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

tsconfig Schema 타입 스크립트 스키마 파일입니다.

http://json.schemastore.org/tsconfig

 


tsconfig.json

TypeScript에서 사용되는 환경 설정이라고 보시면 됩니다. 컴파일 옵션 (webpack 유사)

해당 파일을 생성하기 위해서 아래의 명령어를 입력합니다.

tsc --init

tsconfig.json

위의 옵션들은 너무 설명들이 많은데 간단하게 옆에 주석처리는 되어있습니다.

그리고 또 하나 문제점이 같은 위치에 ts와 js가 나눠져 있는데  코드를 작성하는 부분과 빌드된 부분들을 나눠야 할 것으로 보입니다.

 

결론은 TypeScript 세팅을 위해서

 

1. VSC에서 프리티어 확장을 설치 

2. npm에서 TypeScript (글로벌)와  tslint-config-prettier를 설치 후 vscode settings.json 에 

              "editor.formatOnSave": true, 추가 

3. tsc--init으로 tsconfig.json 생성 tslint.json으로 기본 룰 생성 

2. npm i prettier 설치

3. package.json 내에 prettier key 설정

package.json

 

  "prettier": {
    "printWidth": 80,
    "useTabs": false,
    "tabWidth": 2,
    "bracketSpacing": true,
    "semi": true,
    "singleQuote": false
  }
}

 

4. editor.formatOnSave true 설정

 

TypeScript 시작 전 환경 설정 완료

 

** 추가 사항  저는 사실 TypeScript 만 프리티어가 적용됐으면 하는데  기존에 사용하던 js들도 적용이 되서

아래와 같이 기본 formatOnSave는 true로 놓고  javascript 만 false하였습니다. 

 

 "editor.formatOnSave": true,
  "[javascript]": {
    "editor.formatOnSave": false
  }

위 방법 또는

 "editor.formatOnSave": false
"[typescript]": {
    "editor.formatOnSave": true,
  },

 

 

요즘들어 생각 하고있습니다. 나태해지고 있는 나를 보며  이렇게 살면 안됩니다!! 라고 말을 해야 한다는 걸요


기존에 연차가 낮을  때는 몰랐지만  뭔가 제자리에 있는 제가 연차가 쌓이는걸 너무 보기 싫습니다...


이제는 가만히 있을수 없다고 생각하여


웹의 정말 기본부터 하나씩 포스팅 수를 늘린다는 생각보다는 모든 궁금증에 대한 기본 적인 것 들을 하나씩 하나씩 


최소 차근차근 포스팅을 하려고 합니다.  기존에는 가능하면 하루 이틀에 한번씩 하려고했는데 이게 나태해지면 끝이 없


는 것 같습니다. 하루에 한번 이틀에 한번 이면 좋겠지만 


목표로 하는 바는 바닐라 JS로 컴포넌트 만들어보기 입니다.  한 5개 정도 일단 만들어 보려고 합니다.


기본기가 탄탄해야 된다고 생각해서 웹을 처음한다는 생각으로 다시 접근하겠습니다!!!


VanillaJS


바닐라JS  처음에 이 친구가 무엇을 하는 친구인가 또 어떤 JS인가 궁금했습니다. 


하지만 구글링을 통해 알게 되었죠 때 묻지 않은 순수한 JS라는 걸요 


이친구를 저는 잘안다고 생각 했는데 그리 만만한 친구가 아니였던 것 같습니다.


바닐라 JS에 대한 스터디를 진행하고 그에 대한 내용을 github과 이 도전 카테고리에


공개 할려고합니다. github 주소는 아래와 같습니다.

https://github.com/lgance/reactStudy/blob/master/myVanillaJS/index.html


혼자 공부하는 것들에 대해서 작성합니다. 


해당 내용은 저 자신이 보기 위함입니다. 하하 나중에야 이불킥감 일수 있지만.


컴포넌트를 만드는게 궁극의 목적은 아닙니다. 전반적인 웹의 기본과 브라우저 등에 대해서 공부를 할려고 하기 때문에


저와의 스터디라고 볼수 있겠네요 


github은 때 되는대로 올릴생각입니다.!!


그럼! 다음에 봬용






안녕하세요 js에서 사용하는 Array 에 대한 메서드에 대해 간단 설명 및 예시로 작성 하려고 합니다.


오늘은 [1] 입니다.  빨간 색 부분은 IE 미지원의 경우 입니다.


** 빨간메서드 부분은 Polyfill이 도입되어야 합니다.


각 함수마다 서포팅 되는 호환성 에 특이 한점은 적도록 하겠습니다.


[1] 에서 작성할 배열 메서드 입니다.

concat(IE 5.5) ,fill, filter(IE 9), findfindIndexincludes, indexOf(IE 9)




[2] 에서 작성할 배열 메서드 입니다.

join, keys, lastIndexOf, pop, push, shift, unshift,


[3] 에서 작성할 배열 메서드 입니다.

some, every, slice, splice, sort, toLocaleString, toSource, values


[4] 에서 작성할 배열 메서드 입니다.

reduce, reduceRight, reverse,  copyWithin, Array.of , Array.from



** 모든 설명은 mdn 을 참조하였습니다.


1. concat 


호환성 :  IE 5.5 이상 동작합니다. (전 브라우저 지원이라고 봐도 될거같습니다.)

description : 인자로 주어지는 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환합니다. 

깍돌이 설명:  배열1.concat(배열2) 와 같이 쓰면   [ 배열1 + 배열 2 ] 가 된 새 배열3 이 나옵니다.


** 메서드를 호출하게 된 배열 뒤에 인수로 넘어온 배열들을 붙여서 새로운! 배열을 생성합니다.

this나 인수로 넘겨진 배열의 내용을 바꾸지 않고 주어진 배열들을 합친뒤 얕은 복사(shallow copy)

를 리턴 합니다.


Example 1  fruits 배열과 animal 배열의 합치기  (2개)



Example 2  fruits 배열과 animal 배열과 language 배열의 합치기 (3개)



Example 3 fruits 배열에 단일 값 "NinJa" 와  ["QA","devOps"] 를 이어 붙이기

(배열에 값 붙이기)

Example Code


// concat

var fruits =["apple","oragne","grapes","strawberry","watermelon"];
var animal = ["dog","rabbit","horse","chicken","lion"];
var language = ["C","C++","Python","JS","GO"];

// Example 1
var newArray = fruits.concat(animal);
console.warn(newArray);

// Example 2
var newArray = fruits.concat(animal,language);
console.warn(newArray);

// Example 3
var newArray = fruits.concat("NinJA",["QA","devOps"]);
console.warn(newArray);



번외편 !

배열을 단순하게 + 로 더하면 어떻게 될까 ?

문자열이 됩니다.! ( 하지만 자세히 보면 watermelondog 로 붙어있는 부분이 있습니다. )

[... 끝]+[처음...]이 붙는 부분에서 "끝처음" 로 붙네요 쓸순 없습니다. ㅎ_ㅎ




2. fill


호환성 : IE,Opera는 아예 지원되지 않습니다.  (Chrome 36이상 FireFox 31이상 Safari 7.1이상)

폴리필을 사용 하여야 합니다.  // 폴리필 주소

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

description : 배열의 시작인덱스부터 끝 인덱스까지 정적 값으로 배열 요소들을 채웁니다.


깍돌이 설명:   배열을 정해진 특정 값으로 채워넣기 위해 사용하는 함수입니다. (react에서 자주 사용합니다.)


** 해당 메서드를 사용한 배열의 원본 값이 변합니다. 주의 !!


Example 1  fruits 배열을 4로 채우기 



Example 2  fruits 배열을 2부터 4로 채우기 2부터에서 2는 index입니다(0부터시작)


Example 3  fruits 배열을 2부터 3까지만 4로 채우기  2에서 3은 index입니다.


** 특이사항 : 시작하는 start는 현재 인덱스를 포함하지만 end는 그 전 인덱스까지 입니다.
Example 4  fruits 배열의 start를 -1로 시작 
** 음수일 경우     start + length (배열 전체 길이 )
이기 때문에 현재 배열의 길이는 5이기 때문에 5 + - 1 이 되어서 fruits[4] 부터 4값이 들어가게 됩니다. 


Example 5  fruits 배열의 start를 -2로 시작 
** -2 + 5  = > 3 이기 때문에 index[3] 부터 4가 들어가게 됩니다. strawberry 부터 4값이


Example 6  fruits 배열의 end 를 -1로 시작
** 음수일 경우    end +  length (배열 전체 길이 ) > start와 형태가 같지만
start는 해당 위치부터
end는 해당위치까지입니다.

react 에서 순수 위젯 리스트를 표현할때 사용하기도 합니다.
const btnList = Array(this.props.count).fill(null).map((i,index) =>{
return <button type="button" style={btnStyle} key={"Btn_"+index} >
{this.props.name +"_"+index}</button>;
});





3. filter


앗.. filter부터 안써놓은지 몰랐습니다. ㅜㅜ 새롭게 다시 작성해서 채우도록;; 하겠습니다.'



호환성 :  IE 브라우저 9 이상 지원합니다. 

description : 조건에 맞는 함수를 통과하는 요소를 모아 새로운 배열로 반환 합니다.

깍돌이 설명:  특정 조건에 맞는 배열을 새롭게 반환시켜주는 함수라고 보시면 될 것 같습니다.


var fruits =["apple","oragne","grapes","strawberry","watermelon"];
fruits.filter(function(ele,index,arr){
    return ele.length >= 7; // ['strawberry','watermelon']
});






4. find


호환성 :  IE미지원

description : 

깍돌이 설명:  IE를 미지원하기 때문에 폴리필 코드가 필요합니다.

 


** 

Example 1  


5. findIndex


호환성 : 

description :

깍돌이 설명:  


** 

Example 1  


6. includes


호환성 : 

description :

깍돌이 설명:  


** 

Example 1  


7. indexOf


호환성 : 

description :

깍돌이 설명:  


** 

Example 1  




var temp = {

// do  attribute

}


temp라는  데이터 모델?(객체) 를 통해서 값을 채우고 해당값을 


var resultArr = []; 에


resultArr.push(temp);


식으로 사용하다가 객체 참조 오류가 나는 경우가 생겼습니다.


temp를 수정후 


resultArr.push(temp) 시에는


resultArr [0] = >temp를 가지고있습니다.


다시한번 push 할 경우


resultArr[1] = > temp 0과 1둘다 temp와 같은 곳을 바라보게 됩니다.


수정하면서 push 는 되지만


결국 마지막 수정된 push 값을 resultArr은 전부 가지고있게 되는 것입니다.


예시를 들어 보겠습니다.


해당 예시는 객체 참조 에 대한 예시일뿐입니다.

	

	var temp = {
			"name":"",
			"age":""
	};


	var resultArr = [];

	var response = [
		{"name":"AAA","age":"aa"},
		{"name":"BBB","age":"bb"},
		{"name":"CCC","age":"cc"},
	];



	for(var i=0;i<3;i++)
	{
			temp.name = response[i].name;
			temp.age = response[i].age
			resultArr.push(temp);
	}



해당 결과는?




마지막에 수정되었던 CCC cc값을 전부 가지고있습니다. 모든 배열들이 새로 추가될때마다 같은 temp를 바라보게 되는 상황이 있기 때문입니다.

** push 하는 순간에 (shallow copy (얕은복사) 가 일어나기 때문에 발생하는 현상입니다.)


// 해당 상황에 대한 해결법은

Array.prototype.slice.call 

Array.prototype.slice.apply 

Object.assign 등이 있지만 객체 참조에 대한 이야기로 계속 진행하겠습니다.





gdl blah 가 있습니다. 들어온 숫자만큼 블라 블라를 외치네요


objRef 라는 새로운 객체를 생성 후 속성으로 gdl blah 를 가지게 되면


위의 그림과 같이 같은 함수를 바라보게 됩니다.


아마 해당상태에서는 함수의 동작은 블라를 외치기만 하기 때문에 큰 문제가되어 보이지는 않습니다.





objRef는 그대로 놓은 상태로 gdl의 블라를 제거한다면 위의 그림과 같이


function 은 gdl의 blah 를 바라보고있었지만 해당 연결고리가 끊어지는 바람에  objRef는 바라볼곳이 없어지며 에러를 발생 시킵니다.


해당 객체 참조 이슈가 나타나게 되는데


함수를 작성할 때 함수 Context 를 지정하여 서 해결 할수 있습니다.



각 펑션이 현재 가지고있는 object를 context로 가지기 때문에 앞선 gdl이 사라져도 문제 없이 동작됨을 확인할수 있습니다.


너무 자주 쓰는데 너무 자주 찾아 보는거같아서 포스팅을 해놓고 보면 좀 나을거라 생각되서 포스팅을 합니다.


map,forEach 대해서 포스팅합니다.


함수 전부 Array.prototype 인것으로 보아 배열의 메서드로 보여집니다.


우선 map 부터 보자면



1. map 


Array.prototype.map()

var new_array = arr.map(function callback(currentValue[,index[,array]]) { // new_array 새 요소 반환} [thisArg]) 라고 되어있습니다.  mdn 참조


currentValue : 배열의 요소중 , 현재 처리되고있는 요소 


index  : 현재 처리되는 요소의 배열 내 인덱스


array : 메소드가 적용되는 본래 배열







반환 : 실행한 함수의 결과를 모은 새로운 배열 


** 새로운 배열을 만들어서 반환하기 떄문에 기존의 arr (원본) 배열은 그대로있음을 확인할수 있습니다.

또한 반복 중에 기존의 값에 새로운 값들을 추가해서 반환하여도 원본의 배열은 그대로임을  알수 있습니다.



2. forEach


Array.prototype.forEach();


forEach 의 파라미터 역시 위의 map과 동일합니다.


차이점은




반환 : undefined 반환값이 존재하지 않습니다.



또한 사용상의 주의점 ( js 의 주의) 이라고 할수 있는 점이 하나있습니다. 위에서는 원본 배열을 수정하여도 수정이 되지않는 점이 확인되었는데요


객체의 배열 형태면 이야기가 다릅니다.


forEach 에서 수정된 부분들이 forEachTest로 변경되었습니다.


그리고 그아래에 map으로도 다시 수정하게 되면



기존에 수정하였던 forEach 까지 수정되게 되는 현상이 발생합니다.


이런 현상은 js의 참조 현상 때문인데요 객체를 수정하실때는 매우 유의하여야 합니다.


이부분에 대해서는 따로정리 하였습니다.

// JavaScript 객체 참조 

http://ipex.tistory.com/entry/JavaScript-%EA%B0%9D%EC%B2%B4-%EC%9D%98-%EC%B0%B8%EC%A1%B0





개인적으로 자주 사용하는 메서드들 로는

fill() : 특정값으로 채움

filter() : 특정 조건에 맞는 배열 반환

includes() : 해당 값이 포함된지 확인

push() ,pop(), shift(),unshift(),reduceRight(),reverse(),slice(),sort(),splice(),reudce() 등등이 있습니다.



+ Recent posts