[ 一日30分 인생승리의 학습법] [1탄!!]KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요?

제목 : KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요?

KrakenD 는 ApiGateway 입니다

KrakenD 는 ApiGateway 입니다. 지금부터 사용하는 목적, 역할, 설치 방법, 구현방법, 플레이 그라운드(데모화면) 등을 한번 살펴 보도록 하겠습니다. 
 

1. API GateWay 도데체 왜! 필요할까요?

    API  Gateway 는 MSA 마이크로 서비스에 필수요소 입니다. 

   앞으로 비지니스 기업들이 MSA 마이크로 서비스가 채택하고 있으며, 인터넷 비즈니스 86 %가 마이크로 서비스를

   사용 중이거나 사용하려고 계획 중에 있습니다. 가 5 년 내에 마이크로 서비스가 91%이상이 MSA 아키텍처가

   사용될것으로 예상하고 있습니다. 

 

그래서 오늘은 API Gateway 솔루션인 KrakenD 를 알아볼까요?

 

* 기존 아키텍쳐는 모노로틱 방식  ->  MSA 마이크로 서비스로 전환되고 있기 때문이죠!

 

 

 

2. 그럼 KraKenD Api Gateway 도데체 어떻게, 생겼나요? 

      KraKenD Api Gateway는 참으로 많은일을 하고 있습니다.

      1. 모니터링 

      2. 보안 

      3. Throtting 

      4. Proxy

      5. QoS

      6. Cache

      7. Aggergatioin

      8. Manipulation 

      9. Filtering 

      10. Decoding 

 

무려 10가지나 하고 있네요 ~

 

 

  

 

3. 무엇때문에 API GateWay 가 필요 할까요?

    수많은 API 들을 처리 하기 위해선 아래 물음표가 (?) 가 무엇을 해야할지를 알수가 있습니다.

    이 물음표는 상당히 많은 일을 처리해야만 합니다. 과연 물음표가 몇가지 일을 할수 있을까요?

 

 

3-1 . 물음표가 해야할일들은.. 바로 

         manipulation, Aggergation, Service Discovery, Filtering, Metrics/Tracing, Authorization

         Cicuit Breaker , security, Authorization, Circuit Breaker , Securiy ... 등등. 무려 21가지 일을 하고

        있네요. 와우~ 

 

 

 

4. 작동하려면 어떻게 하나요? 

    그럼 설치도 해보고, 내부 구조가 어떻게 되어 있는지 환경설정등은 어떻게 하는지 한번 보겠습니다. 

    설치하기 위해선 Mac Os , docker , 리눅스, 우분투 등등 있으며, 저는 설치를 위해 Centos7 을 준비해 보았습니다.

    krakend 를 실행해도 command not found 뜨지요!

    설치 방법은 간단합니다.  

 

 

 

4-1) 첫번째 Krakend 사이트에 접속을 합니다. 접속후 go to instll note 접속/클릭하여 가이드를 받습니다.

 

 

 

 

Linux

CentOS and Redhat

4-2) 설치및 실행되는 과정이 보이시죠! 그대로 따라만 하시면 됩니다.

1
2
3
yum install -y krakend 
systemctl start krakend 
 
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
준비 중...                         ################################# [100%]
Updating / installing...
   1:krakend-repo-0.2-0               ################################# [100%]
 
 
[root@localhost ~]# yum install -y krakend
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirror.kakao.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
base                                                                                                  | 3.6 kB  00:00:00
extras                                                                                                | 2.9 kB  00:00:00
krakend                                                                                               | 2.9 kB  00:00:00
updates                                                                                               | 2.9 kB  00:00:00
(1/3): extras/7/x86_64/primary_db                                                                     | 164 kB  00:00:00
(2/3): updates/7/x86_64/primary_db                                                                    | 6.7 MB  00:00:00
(3/3): krakend/primary_db                                                                             | 5.6 kB  00:00:01
Resolving Dependencies
--> Running transaction check
---> Package krakend.x86_64 0:1.1.1-0 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=============================================================================================================================
 Package                      Arch                        Version                         Repository                    Size
=============================================================================================================================
Installing:
 krakend                      x86_64                      1.1.1-0                         krakend                       27 M
 
Transaction Summary
=============================================================================================================================
Install  1 Package
 
Total download size: 27 M
Installed size: 65 M
Downloading packages:
경고: /var/cache/yum/x86_64/7/krakend/packages/krakend-1.1.1-0.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 8ad6fdd2: NOK                                                                                                                                                                  EY
Public key for krakend-1.1.1-0.x86_64.rpm is not installed
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-krakend
Importing GPG key 0x8AD6FDD2:
 Userid     : "Devops Faith Package Manager <packages@devops.faith>"
 Fingerprint: 5b27 0f2e 01e3 75fd 9d56 35e2 5de6 fd69 8ad6 fdd2
 Package    : krakend-repo-0.2-0.x86_64 (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-krakend
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : krakend-1.1.1-0.x86_64                                                                                    1/1
  Verifying  : krakend-1.1.1-0.x86_64                                                                                    1/1
 
Installed:
  krakend.x86_64 0:1.1.1-0
 
Complete!
 
 
[root@localhost ~]# systemctl start krakend
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

4-3) 아까전에 Krakend 실행 하면 command not found 에서 Krakend 로고와 함게 화면이 이쁘게 보이면 성공!

 

 

4-4) 경로는 아래와 같습니다. 내용을 보시면  krakend.json 파일이 보이실겁니다. 이 파일로 기동이 되며,

      외부파일설정등은 extra_config 파일로 컨트롤도 가능합니다. 

      경로에 위치한  /etc/krakend/krakend.json 파일로 구동됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
[root@localhost ~]# cd /etc/krakend/
[root@localhost krakend]# ll
합계 12
-rw-r--r--1 krakend root 8801  3월  9 23:44 krakend.json
[root@localhost krakend]# vi krakend.json
 
 
[root@localhost krakend]# cat krakend.json
{
    "version"2,
    "name""My lovely gateway",
    "port"8000,
    "cache_ttl""3600s",
    "timeout""3s",
    "extra_config": {
      "github_com/devopsfaith/krakend-gologging": {
        "level":  "DEBUG",
        "prefix""[KRAKEND]",
        "syslog"false,
        "stdout"true
      },
      "github_com/devopsfaith/krakend-metrics": {
        "collection_time""60s",
        "proxy_disabled"false,
        "router_disabled"false,
        "backend_disabled"false,
        "endpoint_disabled"false,
        "listen_address"":8090"
      },
      "github_com/devopsfaith/krakend-cors": {
        "allow_origins": [ "http://192.168.99.100:3000""http://localhost:3000" ],
        "allow_methods": [ "POST""GET" ],
        "allow_headers": [ "Origin""Authorization""Content-Type" ],
        "expose_headers": [ "Content-Length" ],
        "max_age""12h"
      }
    },
    "endpoints": [
        {
            "endpoint""/supu",
            "method""GET",
            "headers_to_pass": ["Authorization""Content-Type"],
            "backend": [
                {
                    "host": [
                        "http://127.0.0.1:8000"
                    ],
                    "url_pattern""/__debug/supu",
                    "extra_config": {
                        "github.com/devopsfaith/krakend-martian": {
                            "fifo.Group": {
                                "scope": ["request""response"],
                                "aggregateErrors"true,
                                "modifiers": [
                                {
                                    "header.Modifier": {
                                        "scope": ["request""response"],
                                        "name" : "X-Martian",
                                        "value" : "ouh yeah!"
                                    }
                                },
                                {
                                    "header.RegexFilter": {
                                        "scope": ["request"],
                                        "header" : "X-Neptunian",
                                        "regex" : "no!",
                                        "modifier": {
                                            "header.Modifier": {
                                                "scope": ["request"],
                                                "name" : "X-Martian-New",
                                                "value" : "some value"
                                            }
                                        }
                                    }
                                }
                                ]
                            }
                        },
                        "github.com/devopsfaith/krakend-circuitbreaker/gobreaker": {
                            "interval"60,
                            "timeout"10,
                            "maxErrors"1
                        }
                    }
                }
            ]
        },
        {
            "endpoint""/github/{user}",
            "method""GET",
            "backend": [
                {
                    "host": [
                        "https://api.github.com"
                    ],
                    "url_pattern""/",
                    "whitelist": [
                        "authorizations_url",
                        "code_search_url"
                    ],
                    "disable_host_sanitize"true,
                    "extra_config": {
                        "github.com/devopsfaith/krakend-martian": {
                            "fifo.Group": {
                                "scope": ["request""response"],
                                "aggregateErrors"true,
                                "modifiers": [
                                {
                                    "header.Modifier": {
                                        "scope": ["request""response"],
                                        "name" : "X-Martian",
                                        "value" : "ouh yeah!"
                                    }
                                },
                                {
                                    "body.Modifier": {
                                        "scope": ["request"],
                                        "contentType" : "application/json",
                                        "body" : "eyJtc2ciOiJ5b3Ugcm9jayEifQ=="
                                    }
                                },
                                {
                                    "header.RegexFilter": {
                                        "scope": ["request"],
                                        "header" : "X-Neptunian",
                                        "regex" : "no!",
                                        "modifier": {
                                            "header.Modifier": {
                                                "scope": ["request"],
                                                "name" : "X-Martian-New",
                                                "value" : "some value"
                                            }
                                        }
                                    }
                                }
                                ]
                            }
                        },
                        "github.com/devopsfaith/krakend-ratelimit/juju/proxy": {
                            "maxRate"2,
                            "capacity"2
                        },
                        "github.com/devopsfaith/krakend-circuitbreaker/gobreaker": {
                            "interval"60,
                            "timeout"10,
                            "maxErrors"1
                        }
                    }
                }
            ]
        },
        {
            "endpoint""/private/{user}",
            "backend": [
                {
                    "host": [ "http://api.github.com" ],
                    "url_pattern""/",
                    "whitelist": [
                        "authorizations_url",
                        "code_search_url"
                    ]
                }
            ],
            "extra_config": {
                "github.com/devopsfaith/krakend-jose/validator": {
                    "alg""RS256",
                    "aud""http://api.example.com",
                    "roles_key""http://api.example.com/custom/roles",
                    "roles": [ "user""admin" ],
                    "jwk-url""https://albert-test.auth0.com/.well-known/jwks.json"
                }
            }
        },
        {
            "endpoint""/show/{id}",
            "backend": [
                {
                    "host": [
                        "http://showrss.info/"
                    ],
                    "url_pattern""/user/schedule/{id}.rss",
                    "encoding""rss",
                    "group""schedule",
                    "whitelist": ["items""title"],
                    "extra_config": {
                        "github.com/devopsfaith/krakend-ratelimit/juju/proxy": {
                            "maxRate"1,
                            "capacity"1
                        },
                        "github.com/devopsfaith/krakend-circuitbreaker/gobreaker": {
                            "interval"60,
                            "timeout"10,
                            "maxErrors"1
                        }
                    }
                },
                {
                    "host": [
                        "http://showrss.info/"
                    ],
                    "url_pattern""/user/{id}.rss",
                    "encoding""rss",
                    "group""available",
                    "whitelist": ["items""title"],
                    "extra_config": {
                        "github.com/devopsfaith/krakend-ratelimit/juju/proxy": {
                            "maxRate"2,
                            "capacity"2
                        },
                        "github.com/devopsfaith/krakend-circuitbreaker/gobreaker": {
                            "interval"60,
                            "timeout"10,
                            "maxErrors"1
                        }
                    }
                }
            ],
            "extra_config": {
                "github.com/devopsfaith/krakend-ratelimit/juju/router": {
                    "maxRate"50,
                    "clientMaxRate"5,
                    "strategy""ip"
                }
            }
        }
    ]
}
[root@localhost krakend]#
 
 
 
 

4-5) 실행과 결과를 확인 해보겠습니다. (옵션으로 -d 는 debug 모드 , -c 는 config 입니다.) 시켜 보도록 하겠습니다.

       krakend run -d -c /etc/krakend/krakend.json &

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost krakend]# krakend run -d -c /etc/krakend/krakend.json &
[11723
[root@localhost krakend]# Parsing configuration file: /etc/krakend/krakend.json
[KRAKEND] 2020/03/14 - 13:45:35.818 ▶ ERROR unable to create the GELF writer: getting the extra config for the krakend-gelf module
[KRAKEND] 2020/03/14 - 13:45:35.818 ▶ INFO Listening on port: 8000
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ DEBUG creating a new influxdb client
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ DEBUG no config for the influxdb client. Aborting
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ WARNIN influxdb: unable to load custom config
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ WARNIN opencensus: no extra config defined for the opencensus module
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ WARNIN building the etcd client: unable to create the etcd client: no config
[KRAKEND] 2020/03/14 - 13:45:35.819 ▶ DEBUG no config for 
.
[중략]
.
.
[KRAKEND] 2020/03/14 - 13:45:38.990 ▶ DEBUG URL: /__debug/supu
[KRAKEND] 2020/03/14 - 13:45:38.990 ▶ DEBUG Query: map[]
[KRAKEND] 2020/03/14 - 13:45:38.990 ▶ DEBUG Params: [{param /supu}]
[KRAKEND] 2020/03/14 - 13:45:38.990 ▶ DEBUG Headers: map[Accept-Encoding:[gzip] User-Agent:[KrakenD Version 1.1.1] X-Forwarded-For:[::1] X-Martian:[ouh yeah!]]
[KRAKEND] 2020/03/14 - 13:45:38.990 ▶ DEBUG Body:
[GIN] 2020/03/14 - 13:45:38 | 200 |     113.304µs |             ::1 | GET      /__debug/supu
[GIN] 2020/03/14 - 13:45:39 | 200 |    86.21318ms |             ::1 | GET      /supu
 
 
 

 

4-6) 결과를 확인은 curl 해보고 -> curl -i local localhost:8000/__debug/supu 

       아래와 같이 현재 debug 모드 이기 때문에.. HTTP/1.1 200 OK 나오면 성공 {"message":"pong"}<-메세시가

       보여야합니다.

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# curl -i localhost:8000/supu
HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
Content-Type: application/json; charset=utf-8
Vary: Origin
X-Krakend: Version 1.1.1
X-Krakend-Completed: true
Date: Sat, 14 Mar 2020 04:45:39 GMT
Content-Length: 19
 
{"message":"pong"}
 

 

4-7) 또는 웹페이지에 localhost:8000/__debug/supu 확인해보면 되는데 , 웹상에{"message":"pong"} 메세지가 보여야

      합니다.  웹에서 확인 하기 위해서는 터널링 작업이 필요 합니다.   putty에서 아래와 같이 설정만하시면 됩니다. 

 

 

4-8) 터널링 설정 방법입니다. 터널링 

 

 

 

 

4-9) 터널링을 모르시는 분들을 위해 간단히 설명 드리자면... 그림 보시면 아~~ 하시는분들도 있고, 

모르시는분은.. 그림 되게 못그렸네~ 하시고 터널링 <- 이렇게 설정 하시면 됩니다. ^^

 

 

 

PuTTY 터널링(SSH 포트 포워딩)

고객사의 서버에 ssh 포트는 열려있는데 그 밖의 포트(db, web, ftp 등..) 는 보안상 외부에 막혀 있는 경우가 종종 있습니다.

또는 서버장비를 역할별로(db서버, 웹서버, 메일서버 등..) 여러 대 두고 특정 서버의 ssh 포트 하나만 열어주는 경우도 있습니다.

예를 들어 111.111.111.111 서버의 ssh만 열어주고 같은 네트워크상에 있는 DB서버장비(111.111.111.112)는 막아놓는 경우도 있습니다.

이럴때 필요한 것이 터널링인데, 터널링이란 한 네트워크에서 다른 네트워크의 접속을 거쳐 통신을 할 수 있도록 하는 것을 말합니다.

 

쉽게 생각하면 문이 두개인 집이 있고 집 안에는 두개의 현관이 있다고 가정합니다.

밖에서 봤을때 각 문을 열고 들어가면 각각의 현관으로 들어갈 수 있습니다.

그러나 A문만 열려져 있고 B문은 닫혀 있을 때 B 현관에 들어가려면 어떻게 해야 할까요?

그렇습니다 A문을 통해 들어가서 안에서 다시 B현관으로 이동하면 됩니다.

이러한 개념이 터널링입니다.

 

 

 

 

 

 

 

터널링은 언제 사용하는가?

예를 들어보겠습니다.

신규 개발 프로젝트에 착수하여 개발을 진행하기 위해 고객이 열어준 ssh(22) 포트를 통해 서버에 접속했습니다.

앞으로 개발을 진행할 서버 주소는 1.1.1.1입니다.

 

그리고 이번에는 dbms 접속을 위해 db 클라이언트 프로그램으로 1.1.1.1:3306으로 접속을 시도했는데 3306는 고객이 보안상 열어줄 수 없다며 막아놓았고

터널링으로 접속할 것을 요구했습니다.

 

또한 이번 프로젝트에는 메일 시스템이 연동되는데 메일서버의 경우 서버 장비가 별도의 장비이고 아이피는 1.1.1.2입니다.

메일 서버장비는 1.1.1.1 서버와 동일한 네트워크에 있고 내부주소는 192.168.0.2입니다.

 

역시 테스트를 위해 1.1.1.2:25로 접근했지만 접속이 막혀있습니다.

 

이런 경우 개발자 입장에서는 접근도 안되는 시스템들을 가지고 테스트 없이 개발을 해야하는 상황입니다.

 

종합해보면 다음과 같습니다.

1. 개발 할 어플리케이션 서버는 1.1.1.1 서버에 띄워야 한다.

2. 1.1.1.1서버의 경우 22번 포트는 열어져 있어 putty는 문제없이 사용 가능하지만 db(3306)의 경우 외부에서 접근이 안된다.

3. 어플리케이션 개발을 위해서는 1.1.1.2서버의 메일서버 1.1.1.2:25 도 접근이 가능해야 하는데 1.1.1.2 리눅스 서버 자체에 접근이 불가능하다.

4. 1.1.1.1 서버와 1.1.1.2는 고객사의 같은 네트워크에 있다.

5. 결론은 1.1.1.1의 22번 포트가 유일하게 접근할 수 있는 통로이다.

6. 나머지 포트와 IP는 접근이 안되므로 JDBC DB 연결 테스트 및 메일 연결 테스트가 안되어 개발 진행이 어렵다.

 

 

현업에서 개발하다보면 정말 흔한 일이고 VPN같은 프로그램도 이용해야 할 일이 많다는 것을 아실겁니다.

 

그러나 우리에게는 22번이라는 통로가 있기때문에 이 통로를 경유해 다른 통로들도 들어갈 수 있습니다.

그리고 이것을 바로 터널링이라고 합니다.

 

ssh 포트 22번이 열려있는 경우를 예로 들자면 22번 포트를 통로로 두고 내부의 다른 포트들과 통로를 연결해주는 터널 역할을 해주는 것입니다.

 

putty로 터널링 하기

putty 이외에 다른 리눅스 원격 클라이언트들이 많은데 터널링의 개념만 알면 설정방법이 달라도 개념은 같으니 별 다른 어려움이 없을 것입니다.

 

 

1. 먼저 터널링을 하기 위해서는 외부(나) 와 서버를 연결해주기 위한 통로를 하나 만들어야 하므로 해당 서버에 접속 후 로그인 합니다.

여기서는 1.1.1.1을 22번 SSH로 접속 한 후 root로 로그인하는 것입니다.

(포트가 열려있다고 해도 그 문에 들어가야 합니다. 즉 root로 로그인이 필요합니다.)

 

2. 접속 후 putty 윈도우 창에서 마우스 우클릭 - Change Settings.. -  Connection - SSH - Tunnels 항목을 클릭

 

 

 

 

3. 터널링 설정을 해줍니다(중계 터널을 만들어 주기 위해 설정하는 것).

 

 

 

 

Destination에 터널링할 서버:연결하고 싶은 대상 포트 번호

Source port에 내가 로컬에서 사용할 포트번호

 

예를들어 db 서버를 터널링 해주고 싶은 경우 1.1.1.1:3306을 Destination에 입력하고 로컬에서 사용할 포트(Source port)로 3307 입력합니다. 

 

3307을 입력하는 이유는 내 컴퓨터에 개발용 mysql 서비스가 띄어져 있을 경우 포트가 겹칠 수 있기 때문입니다.
1.1.1.2의 메일서버로 연결하고 싶은 경우에도 똑같습니다.모두 입력했으면 Add를 눌러 등록 후 Apply 를 눌러 적용해줍니다.

 

이렇게 되면 터널을 통해 마치 내 1.1.1.1의 3306 db가 내 로컬 pc에 연결되어있는것처럼 사용할 수 있습니다.

이제 로컬에서 고객사 db에 jdbc를 테스트 하거나 db 클라이언트로 원격 접속할 때에는 localhost:3307을 사용하면 됩니다.



참고문헌 : 출처: https://dololak.tistory.com/29 [코끼리를 냉장고에 넣는 방법]

[출처] https://tommypagy.tistory.com/174

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1088 [ 一日30分 인생승리의 학습법 ] Build Your Own Remote Desktop Application using Javascript, Python & WebRTC — Part 2 file 졸리운_곰 2022.08.05 5
1087 [ 一日30分 인생승리의 학습법 ] Build Your Own Remote Desktop Application using Javascript, Python & WebRTC — Part 1 file 졸리운_곰 2022.08.05 2
1086 [ 一日30分 인생승리의 학습법 ] REST API 규칙 졸리운_곰 2022.08.03 0
1085 [ 一日30分 인생승리의 학습법 ]REST API 설계 (네이밍) 졸리운_곰 2022.08.03 0
1084 [ 一日30分 인생승리의 학습법] [2탄!!] KrakenD Demo 면을 알아보죠! file 졸리운_곰 2022.08.01 0
» [ 一日30分 인생승리의 학습법] [1탄!!]KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요? file 졸리운_곰 2022.08.01 0
1082 [ 一日30分 인생승리의 학습법] 오픈소스 라이선스 별 의무사항 졸리운_곰 2022.07.29 0
1081 [ 一日30分 인생승리의 학습법] The complete guide to (external) Domain Specific Languages file 졸리운_곰 2022.07.08 3
1080 [ 一日30分 인생승리의 학습법] [Elasticsearch] 기본 개념잡기 file 졸리운_곰 2022.06.02 7
1079 [ 一日30分 인생승리의 학습법]node - pm2로 node.js 프로세스 관리하기 - 기본 명령어, 실행하기 file 졸리운_곰 2022.05.28 3
1078 [ 一日30分 인생승리의 학습법][1탄!!]KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요? file 졸리운_곰 2022.04.15 5
1077 [ 一日30分 인생승리의 학습법][API Gateway] Kong Gateway 설치 file 졸리운_곰 2022.04.15 3
1076 [ 一日30分 인생승리의 학습법] TeX_및_LaTeX_수식_문법 file 졸리운_곰 2022.03.19 23
1075 [ 一日30分 인생승리의 학습법] Visual Basic application on linux 졸리운_곰 2022.02.22 5
1074 [ 一日30分 인생승리의 학습법] Truffle을 이용한 DApp 개발환경 구성 file 졸리운_곰 2022.02.20 78
1073 [ 一日30分 인생승리의 학습법]LaTeX 활용해서 논문쓰장 file 졸리운_곰 2022.02.17 10
1072 [ 一日30分 인생승리의 학습법] LaTeX 초보자가 감을 잡는 것을 돕는 몇가지 팁 졸리운_곰 2022.02.17 7
1071 [ 一日30分 인생승리의 학습법] 수식 입력이 가능한 마인드맵 프로그램, 프리플레인(freeplane) file 졸리운_곰 2022.02.16 13
1070 [ 一日30分 인생승리의 학습법] Awesome Metaverse Awesome 짱!~ 메티버스 오픈소스 file 졸리운_곰 2022.02.13 4
1069 [ 一日30分 인생승리의 학습법] 제 NAS의 Docker 목록 file 졸리운_곰 2022.01.31 22
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED