개발자의 끄적끄적

[was/server]Jeus,WebToB 설치 및 설정 [펌] 본문

개발/was & server

[was/server]Jeus,WebToB 설치 및 설정 [펌]

효벨 2020. 8. 6. 02:00
728x90
반응형

[was/server]Jeus,WebToB 설치 및 설정 [펌]

 

WebtoB vs JEUS 및 서블릿 컴파일

 

WebtoB는 웹서버이다. JEUS는 웹컨테이너이다.

WebtoB standard edition에는 JEUS의 웹 컨테이너 엔진이 얹혀져서 나간다.

물론 많은 양의 데이터를 핸들링하기에는 적합하지 않다.

그렇게 하고 싶다면 JEUS를 같이 써서 해야한다.

JEUS에서는 자체 웹서버를 포함하고 있다.

물론 내장된 웹서버는 WebtoB이다.

물론 많은 동시 접속자 수를 핸들링하고 싶지만 내장된 웹서버로는 힘들다.

그건 그냥 개발 테스트용 웹서버로 보면 된다.


큰 사이트의 경우에는 2개를 연동해서 써야만 한다.

WebtoB와 제우스는 설치는 압축을 푼다음 install.sh를 실행시키면 된다.( unix기준 ) 설치 과정은 매뉴얼 참조하면된다.

각각의 제품은 XML을 이용하고 있다. 그리고 WebtoB는 이렇게 만들어진 XML문서를 컴파일 해야한다.
wscfl -i filename.m

으로 컴파일 해주면 wsconfig라는 파일이 생기고 WebtoB는 구동될 때 이 파일을 가지고 해당 정보를 로드한다.

물론 처음 구동시만 읽어들이기 때문에 변경시에는 웹서버를 다시 start시켜야 한다.

구동 명령은 wsboot이며 중지 명령은 wsdown이다. 이것은 해당 $webtob/bin디렉토리에 있다.
JEUS는 따로이 컴파일 할 것은 없으나 읽어들이는 XML파일들이 있다. 주로 많이 바뀌는 것이 WEBMain.xml이다.

JEUS 구동 명령어를 한번에 입력하는 것이다.

start : jeusp -xml -Uadministrator -Ppassword
down : jeusadmin hostname jeusexit -Uadministrator -Ppassword

아래의 내용은 WebtoB와 JEUS를 연동하는 환경 설정 파일( *.m, WEBMain.xml )의 내용이다.


1. WebtoB
=========================================
*DOMAIN
webtob

*NODE
nitgenaix WEBTOBDIR="/users/hite95/webtob", <== WebtoB가 설치된 디렉토리
SHMKEY = 54000,
DOCROOT="/users/hite95/webtob/docs", <== WebtoB의 document root
PORT = "8080", <== WebtoB의 접속포트(브라우저가 접속할)
HTH = 1,
LOGGING = "log1",
ERRORLOG = "log2",
ServiceOrder="ext,uri", <== (추가) ext(확장자), uri(경로) 순서로 분기 우선순위
JSVPORT = 9900 <== JEUS 와 연동할 포트(WEBMain.xml에 있는 포트와 동일)

*SVRGROUP
htmlg NODENAME = "nitgenaix", SvrTYPE = HTML
cgig NODENAME = "nitgenaix", SVRTYPE = CGI
ssig NODENAME = "nitgenaix", SVRTYPE = SSI
jsvg NODENAME = "nitgenaix", SVRTYPE = JSV <== JEUS 와 연동하기 위한 서버그룹

*SERVER
html SVGNAME = htmlg, MinProc = 2, MaxProc = 10
cgi SVGNAME = cgig, MinProc = 4, MaxProc = 10
ssi SVGNAME = ssig, MinProc = 2, MaxProc = 10
MyGroup SVGNAME = jsvg, MinProc = 25, MaxProc = 30

<== JEUS 와 연동할 서버 프로세스(이름은 WEBMain.xml의 registration-id, 갯수는 min/max 와 동일)

*URI
uri1 Uri = "/cgi-bin/", Svrtype = CGI
uri2 Uri = "/examples/", Svrtype = JSV <== 위에서 ServiceOrder가 "ext,uri"인 경우는 설정할 필요 없음.

*ALIAS
alias1 URI = "/cgi-bin/", REalPath = "/users/hite95/webtob/cgi-bin/"

*LOGGING
log1 Format = "DEFAULT", FileName = "/users/hite95/webtob/log/access.log"
log2 Format = "ERROR", FileName = "/users/hite95/webtob/log/error.log"

*EXT
htm MimeType = "text/html", SvrType = HTML
jsp MimeType = "application/jsp", SvrType = JSV, SVRNAME = MyGroup


================================================================


* wscfl -i <환경설정파일> 로 환경설정 파일을 새로 컴파일 해 주셔야 합니다.


2. JEUS에서 WEBMain.xml 편집
================================================================
...
<webserver-connection>
<http-listener> <==== 이것은 JEUS 내장 간이 웹서버 설정입니다.
<listener-id>http1</listener-id>
<port>8088</port> <==== http://ip:8088/로 접속하면 됩니다.
<output-buffer-size>8192</output-buffer-size>
<thread-pool>
<min>25</min>
<max>30</max>
<step>2</step>
<max-idle-time>1000</max-idle-time>
</thread-pool>
</http-listener>
<webtob-listener> <=== WebtoB와의 연동을 위해서 추가해야 하는 부분입니다.
<listener-id>webtob1</listener-id>
<port>9900</port> <=== WebtoB의 JSVPORT 와 동일해야 합니다.
<webtob-address>127.0.0.1</webtob-address> <=== WebtoB의 IP 입니다.
<registration-id>MyGroup</registration-id> <=== WebtoB의 SERVER 명과 동일
<thread-pool>
<min>25</min>
<max>30</max>
</thread-pool>
</webtob-listener>
</webserver-connection>
...
================================================================

이와같이 설정하면 됩니다.

서블릿(.java)는 개발자가 직접 컴파일 해서 WEB-INF/classes 아래 패키지형태로 두어야 합니다.

RASIN은 서블릿을 자동으로 컴파일 한다고 합니다.
제우스는 서블릿을 자동으로 컴파일 하지 않습니다.

서블릿 컴파일은 다음과 같이 합니다.

[UNIX] .../WEB-INF/classes 아래서
javac -classpath .:$JEUS_HOME/classes:$JEUS_HOME/lib/system/jeus.jar -d . *.java

[WIN]
javac -classpath .;%JEUS_HOME%\classes;%JEUS_HOME%\lib\system\jeus.jar -d . *.java


jspwork 아래는 JSP파일이 컴파일 된것입니다.
JSP는 WEB-INF/classes에 두는 것이 아니라 CONTEXT 아래 두셔야 합니다.
가령 CONTEXT(DocBase)가 aaa라면

$SERVLET_HOME/GroupDocBase/aaa/*.jsp (하위 DIR 포함)
$SERVLET_HOME/GroupDocBase/aaa/WEB-INF/classes/*.class (패키지 포함)

1. 제우스 & 웹투비 설치 디렉토리
/jeus/jeus33
/jeus/jeus33/WebtoB

2. 홈 디렉토리 설정(.cshrc 에서 수정)
JEUS_HOME=/jeus/jeus33
EJB_HOME=/jeus/jeus33/webhome/ejb_home (ejb 화일들이 놓이는 위치)
SERVLET_HOME=/ekp/enRiseEKP
--> /ekp/enRiseEKP/webhome/ekp (jsp 들이 놓이는 위치)
SERVLET_HOME + GroupDocBase + DocBase (container.xml 화일에서 설정)

3. 제우스 기동종료(ekp 계정으로 실행)
부팅 : jstart
종료 : jdown

4. 웹투비 기동종료(ekp 계정으로 실행)
부팅 : wsboot
다운 : wsdown

5. $JEUS_HOME/config/`hostname`/JeusMain.xml 에서
디비 관련 설정 변경.
<User>ekp</User>
<Password>ekp</Password>
<PortNumber>1521</PortNumber>
<ServerName>211.46.52.17</ServerName>

6. html 이나 이미지 경로 변경 (ekp 계정으로 실행)
$WEBTOBDIR/config/ekp.m 화일변경
DOCROOT="/ekp/enRiseEKP/webhome", (이부분 변경)
PORT = "80", ( 서비스 포트 변경)

변경후 wscfl -i ekp.m
웹투비 재기동

7. jeus 버젼 확인 방법
jeusadmin -version

8. 라이센스 확인 방법
jeusadmin -licensedue 9 라이센스 화일이 놓이는 위치
$JEUS_HOME/license/license 라는 이름으로 존재.

 

 

### 설치/시동/테스팅/종료 ###

----------------------------------------------------------------------------------------

1. 필요 프로그램

- j2sdk1.4.1_07 (http://java.sun.com) # j2sdk1.4.1_07 이하 버젼 권장 (1.4.2버젼대에서는 문제발생할 수 있음)

- jeus42.exe (http://www.tmax.co.kr)

- webtob_3.1.6(build3).exe (http://www.tmax.co.kr)

----------------------------------------------------------------------------------------

2. j2sdk1.4.1_07 설치

- path 맨 앞에 C:/jdk1.4.1_07/bin 설정

- classpath에 . 설정

----------------------------------------------------------------------------------------

3. JEUS42 설치

- JEUS42.exe를 실행

(windows2003 서버의 경우 installing... uninstall부분에서 정지시는 windows2000호환성모드로 다시 실행)

- http://www.tmax.co.kr의 download링크를 클릭 (회원가입필요)

JEUS license를 신청 -> 이메일을 통해 license부여받음 (90일 사용가능)

부여받은 license파일을 제우스홈license에 복사 (덮어쓰기)

- 설치 후 다음 세개의 파일을 자신의 환경에 맞게 편집

1) 제우스홈config노드명JEUSMain.xml

2) 제우스홈webhomeservlet_homewebappsexamplesweb-infweb.xml
3) 제우스홈config노드명노드명_servlet_engine1WEBMain.xml

-------------------------------------------------------------------------------------

4. webtob3.1.6 설치

- webtob_3.1.6(build3).exe 실행하여 설치

(windows2003에서 installing... uninstall부분에서 정지시는 windows2000호환성모드로 다시 실행)

- http://www.tmax.co.kr의 download링크를 클릭 (회원가입필요)

WEBTOB license를 신청 -> 이메일을 통해 license.dat부여 (90일 사용가능)

부여받은 license.dat파일을 c:webtoblicense에 복사 (덮어쓰기)

-------------------------------------------------------------------------------------

5. PATH 설정 후 리부팅 : 자신의 환경에 맞게 설정하고 시스템을 리부팅

(Program Files처럼 공백을 포함한 디렉토리를 가진 경로는 맨뒤로...)

ex) PATH=C:J2SDK1.4.1_07bin;C:webtobbin;C:WINDOWSsystem32;C:WINDOWS;C:WINDOW
SSystem32Wbem;C:webtobbin;C:Jeus42libetcantbin;C:Jeus42bin;C:Jeus42libsystem

-------------------------------------------------------------------------------------

6. WEBTOB 환경설정

1) 웹투비홈configsample.m을 카피해서 http.m을 생성

2) wscfl -i http.m을 커맨드창에서 실행 (webtob 환경설정)

정상결과 예)

Current configuration:
Number of client handler(HTH) = 1
Supported maximum user per node = 975
Supported maximum user per handler = 975
CFL is done successfully for node(노드명(노드명))

---------------------------------------------------------------------------------------

7. 시동

1) webtob를 실행

- webtob 실행 : wsboot

2) JEUS를 실행

- 우선 command창을 두개 띄웁니다.(제우스, 제우스관리자)

- 제우스창에 "jeus + 엔터"

- 제우스관리자창에 "jeusadmin 노드명 -U유져명 -P제우스패스워드 ->boot

- 제우스창에 에러(Exception)가 없다면 실행 성공!!!

--------------------------------------------------------------------------------------

8. 테스팅

- JEUS기본포트는 8088, webtob기본포트는 8080

- JSP 기본경로

제우스홈webhomeservlet_homewebappsexamples
http://127.0.0.1/examples/

- Servlet 기본경로

제우스홈webhomeservlet_homewebappsexamplesWEB-INFclasses
http://127.0.0.1/examples/

--------------------------------------------------------------------------------------

9. 종료

1) JEUS종료

- 제우스관리자창에 down -> jeusexit

2) WEBTOB종료

- 웹투비창에 wsdown -i

제우스 서버가 Ready 된 후 boot 를 하게 되면 제우스매니저는 JEUSMain.xml 를 읽어 Runtime환경을 구성한 후 노드에 있는 제우스서비스를 시작.

1. Configuration File

ⓐ JEUSMain.xml :JEUS Manager 와 노드를 관리하는 기본설정파일

ⓑ file-realm.xml : 보안설정

ⓒ WEBMain.xml : Servelt/JSP Engine 설정

ⓓ jeus-web_dd_<context>.xml : JEUS Web Application deployment descriptor

ⓔ EJBMain.xml : EJB 엔진 환경설정

ⓕ jeus-ejb-dd_<EJB Module Name>.xml : JEUS EJB Module deployment descriptor

ⓖ JNLP.xml :JNLP설정

ⓗ Jeus-client-dd.xml :Application client deploy descriptor

ⓘ JMSMain.xml : JMS Engine 설정

ⓙ tool-option.xml :XML Validation 과 JManager 툴 셋팅

2. 디렉토리

Bin : JEUS 에서 제공되는 툴 및 실행파일들이 있는곳

- jeus.properties : JEUS_BASEPORT 꼭!! 기억

JEUS_BASEPORT : JEUS Manager로 접속하기 위한 TCP/IP 포트 이며, 다른 기능을 위한 포트 계산의 기본

lib : 시스템운영시 포함되어야 할 package 들이 있는 곳

ⓐ /system : 엔진이 사용하는 lib (건드리지 않아도 됨)

ⓑ /application : 사용자 어플리케이션에서 사용하는 클래스파일이 위치

ⓒ /datasource : JDBC 드라이버, Connector Resource Adapter 의 .jar파일, 설정파일

- classpath 에 잡아 놓아도 jeus 엔진 인식하지 못한다.

config : 환경설정파일들이 위치하게 된다.

- /security :보안 관련 파일이 모여 있는곳

- /xsds : jeus 시스템 및 어플리케이션 설정시 사용되는 xml 문서에 대한 DTD 파일들이 모여 있는 곳

- /lekpro[nodeName] : Engine Group의 설정이 있는 곳

logs : 시스템의 log 파일들이 놓이는 곳

/TM : Transaction Manager 가 Log를 남기는 폴더 (정상 종료시 이 폴더가 자동 삭제)

/노드이름_엔진타입_엔진이름 : 각 엔진에 대한 로그를 남긴다.

samples : 예제소스 저장

webhome : 시스템에 deploy된 어플리케이션과 이들의 운영을 위해 Engine들이 생성한 코드들이 놓이는 곳

-/admin_home : webManager 에서 사용되는 Servlet/Jsp 파일이 있는곳

-/client_home :

-/ejb_home : ejb 홈디렉토리

-/servlet_home : web container가 생성된 코드들이 놓이는 곳

workspace : jeus가 동작하면서 필요한 작업을 하는 임시 디렉토리

3. Exception

ⓐ JVMBind Exception

- baseport 충돌

- 한대에 제우스 두개

- 기존의 JVM이 남아 있을 경우

- 제우스가 떠 있는데 또 띄울경우

[해결방법]

@ Windows

- 작업관리자 >프로세스> java.exe 모조리 종료

@ Linux , Unix

- ps -ef| grep java 검색해서 모조리 kill 시킨다.

ⓑ XML Parsing Exception

: Tag 안 닫혔거나, 주석안에 내부 주석 썼을때, 오타

ⓒ Fail to Context

: Web Server( WebtoB)와 연결이 안된 경우

 

* 제우스 3.1 버전에서의 서블릿 연동과 관련한 문제

webtob와 jeus를 연동해서 사용하실 경우 최초 요청에 대한 처리는 webtob에서 처리하게 됩니다.

따라서 실제 webtob에서 처리할 내용이 아니라 jeus에서 처리해야 할 것이라면 webtob에게

해당 요청이 jeus에서 처리해야할 것이라고 알려주어야 합니다.

그러한 세팅이 webtob에서 URI 절입니다.

즉 다음과 같은 경우는 http://ip/examples/sss인 경우라면 webtob에서 URI절에 다음과 같이 세팅할 경우

uri2 URI = "/examples/", SVRTYPE = JSV

JEUS로 요청을 넘기게 됩니다. 만약 http://ip/sss 형태라면

uri3 URI = "/", SVRTYPE = JSV

이렇게 세팅을 하시면 모든 요청이 jeus쪽으로 넘어가게 됩니다.

이 경우 문제라면 image와 같은 처리도 모두 jeus의 worker thread가 처리하므로 성능상의 문제와 webtob의 효용에 대한 문제가 있을 수 있겠습니다

* JEUS4.2 설정

1. JEUS에서 웹 동시접속자수를 제한하려면 어떻게 설정하여야 하나요?

=> WebtoB 환경설정 파일을 컴파일("wscfl -i http.m")하면 동시접속자 수가 나옵니다. HTH값을 증가시키면 동시접속자 수가 배수로 늘어납니다. MaxQURL을 설정하여 동시접속자수와 지정된 QUEUE를 초과하는 경우 busy.html로 redirect할 수 있습니다. 자세한 것은 webtob 매뉴얼을 참고하시기 바랍니다.

2.클래스화일의 변경 시 재부팅하지 안고도 반영되도록 WEBMain.xml에서 AutoReload를 설정하는 것으로 알고 있읍니다. 그런데, WEBMain.xml에 AutoReload가 설정되어 있지 않으면 default로 true로 설정되는지요... 현재 개발환경에는 설정되어 있지 않는데도 재부팅하지 않고 반영이 되고 있어서요... 그리고, jsp-work-dir의 설정도 default로 jspwork인지도 궁금합니다...

=> AutoReload 설정은 jeus-web-dd_컨텍스트명.xml 에서 설정합니다. default는 true로 되어있습니다. JspWork 위치는 $SERVLET_HOME/jspwork 값이 default 입니다. WEBMain.xml에서 다른 위치로 변경가능합니다.

3.jar 라이브러리와 개발되는 클래스의 디렉토리 지정은 어디서 하나요...현재는 \RUN\was\WEB-INF\lib, RUN\was\WEB-INF\classes 디렉토리의 jar와 class를 사용하고 있는데,어디서 지정이 되어서 사용되고 있는 건지, 아니면 지정되지 않으면 default가 위의 디렉토리인지

=> 컨텍스트 아래 WEB-INF/classes와 lib는 제우스 내부에서 자동으로 설정됩니다. 따로 설정하는 곳은 없습니다. 즉, WEBMain.xml에서 컨텍스트를 등록하면 자동으로 인식하는 위치 입니다. 그리고 추가적으로 WEBMain.xml에 added-class-path를 이용하여 제우스에서 인식할 수 있는 CLASSPATH를 등록할 수 있습니다. 자세한 설정은 매뉴얼을 참고하시기 바랍니다.


제우스 가상호스트 설정하기

웹투비에서 VHOST 설정하고 제우스에서 엔진컨테이너를 하나더 추가하여
추가된 엔진컨테이너를 VHOST SERVER와 연결하면 됩니다.

예를 들어주신 환경 기반에서 설정은 다음과 같습니다.

1) WEBTOB VHOST 설정(환경파일.m)
- 웹투비 설정이 변경되면 "wscfl -i 환경파일.m"으로 컴파일

===============================================
*DOMAIN
domainname

*NODE => 기존설정 그대로
camel2k
WEBTOBDIR="/home/jeus40/jeus40/webserver",
SHMKEY = 54000,
HOSTNAME = "aaa.aaa.co.kr",
DOCROOT="/root1", => DOCROOT가 다른곳이라면 해당 경로
PORT = "80",
LOGGING = "log1",
ERRORLOG = "log2",
JSVPORT = 9900,
HTH = 1

(참고) DOCROOT는 WEBTOB가 직접처리할 수있는 정적 자료 ROOT를 말합니다.
JEUS docbase와는 다른 곳입니다. 물론 여기 예에서는 같은 곳을
설정하고 있습니다.
보통 DOCROOT는 HTML/IMAGE/JS 등등이 위치하며, docbase는 Web Application
들을 두는 곳입니다. 즉, JSP/SERVLET/JAVA BEAN 등이 될 수 있습니다.


*VHOST => 추가
vhost1 DOCROOT="/root2", => DOCROOT가 다른곳이라면 해당 경로
PORT="80",
NODENAME = "camel2k",
HOSTNAME = "bbb.aaa.co.kr",
LOGGING = "log3",
ERRORLOG = "log4"

*SVRGROUP
htmlg NODENAME = "camel2k", SvrType = HTML
jsvg NODENAME = "camel2k", SVRTYPE = JSV
vhostg NODENAME = "camel2k", SVRTYPE = JSV, VHOSTNAME = vhost1 => 추가

*SERVER
html SVGNAME = htmlg, MinProc = 15, MaxProc = 20
MyGroup SVGNAME = jsvg, MinProc = 25, MaxProc = 30
MyGroup2 SVGNAME = vhostg, MinProc = 25, MaxProc = 30 => 추가

*URI
ex Uri = "/examples/",Svrtype = JSV
aaa Uri = "/AAA/",Svrtype = JSV => 기존설정 그대로
bbb Uri = "/BBB/",Svrtype = JSV => 기존설정 그대로

*LOGGING => log3, log4 추가
log1 Format = "DEFAULT", FileName = "/home/jeus40/jeus40/webserver/log/access.log", Option = "sync"
log2 Format = "ERROR", FileName = "/home/jeus40/jeus40/webserver/log/error.log", Option = "sync"
log3 Format = "DEFAULT", FileName = "/home/jeus40/jeus40/webserver/log/access_v1.log", Option = "sync"
log4 Format = "ERROR", FileName = "/home/jeus40/jeus40/webserver/log/error_v1.log", Option = "sync"

==================================================


2) 제우스 엔진 추가
- $JEUS_HOME/config/노드명/노드명_servlet_engine1 을 노드명_servlet_engine2 복사
- $JEUS_HOME/config/노드명/JEUSMain.xml에서 다음과 같이 <engine-container>를 모두
복사하여 추가후 아래와 같이 수정

<engine-container>
... 기존 설정 ...
</engine-container>
<engine-container>
<name>container2</name> => 변경
<command-option>-Xmx128m</command-option>
<system-log>
<target>stdout</target>
<buffer-size>0</buffer-size>
<level>debug</level>
</system-log>
<engine-command>
<type>servlet</type>
<name>engine2</name> => 변경
<startup-mode>xml</startup-mode>
</engine-command>
<engine-command> => EJB를 사용지 않으면 필요없음
<type>ejb</type>
<name>engine2</name> => 변경
<startup-mode>xml</startup-mode>
<deploy-mode>xml</deploy-mode>
</engine-command>
<tm-config>
<pooling>
<min>10</min>
<max>20</max>
<step>2</step>
<period>600000</period>
</pooling>
<active-timeout>300000</active-timeout>
<commit-timeout>120000</commit-timeout>
<capacity>20000</capacity>
</tm-config>
</engine-container>

- $JEUS_HOME/config/노드명/노드명_servlet_engine2/WEBMain.xml 수정

...
<servlet-home>/root2/</servlet-home> => 엔진1은 /root1/ 이겠지요?
<group-docbase></group-docbase>
...
<context>
<context-name>AAA</context-name> 
=> jeus-web-dd_AAA.xml 존재 및 <docbase>AAA</docbase> 있어야함
<context-path>/AAA</context-path>
</context>
<context>
<context-name>BBB</context-name> 
=> jeus-web-dd_BBB.xml 존재 및 <docbase>BBB</docbase> 있어야함
<context-path>/BBB</context-path>
</context>
<webserver-connection>
<webtob-listener>
<port>9900</port> => WEBTOB JSVPORT와 일치
<hth-count>1</hth-count> => WEBTOB HTH와 일치
<listener-id>webtob2</listener-id> => 다른값으로 수정
<output-buffer-size>2048</output-buffer-size>
<thread-pool>
<min>25</min> => WEBTOB MyGroup2의 MinProc과 일치
<max>30</max> => min 이상의 적당한 값
<step>1</step>
</thread-pool>
<webtob-address>웹투비주소</webtob-address> => Jeus 에 포함된 웹투비Light는 "localhost"만 설정할 수 있습니다.
<registration-id>MyGroup2</registration-id>
=> 추가된 VHOST SERVER 이름과 일치 여기서는 MyGroup2
</webtob-listener>
</webserver-connection>

그리고 나서 웹투비 제우스를 재기동하면 됩니다.

3) 테스트
http://aaa.aaa.co.kr/AAA/index.jsp => /root1/AAA/index.jsp 호출됨
http://bbb.aaa.co.kr/AAA/index.jsp => /root2/AAA/index.jsp 호출됨

 

 

출처 : https://m.blog.naver.com/PostView.nhn?blogId=webpro000&logNo=60063338380

반응형
Comments