톰캣의 구조를 CMD창에서 구동하며 익혀보자

서현서현·2022년 5월 31일
0

서블릿 & JSP

목록 보기
21/26
post-thumbnail

CMD창에서 톰캣 구동하기


Untitled

위 경로에서 > startup.bat

Untitled

Untitled

새로운 창이 켜진다.

크롬 켜서 주소창에 내 IP주소 검색

Untitled

톰캣이 실행된걸 알 수 있다

톰캣 끄기는 shutdown.bat


연결이 안되는 경우

server.xml

Untitled

포트가 8080으로 되어있을 확률높음. 이미 다른 서비스가 8080을 점유하고 있기 때문

80으로 바꾸어서 세팅한다(세팅 전 netstat /ano findatr “LISTENING” 해서 해당 포트 쓰고있는데가 있는지 확인)

RedirectPort =”443”은 무슨 의미?

Untitled

Secure Server, 인증서가 필요해서 우리는 만들 수 없었고, 이후 OPEN SSL 프레임워크를 사용하여 만들어 볼거임!

혀튼 그래서 아직 우린 Secure Server 아니므로

Untitled

Redirect URL 사용 안하니까 저렇게 뜨는거

이렇게 톰캣이 24시간 80포트를 Listening 하도록 만들었다.


톰캣 폴더들의 역할

💡 톰캣이 어떻게 동작하는지 개발환경을 한번 뜯어보자~

bin, conf

Untitled

bin : 톰캣 구동, 셧다운

conf : 톰캣의 구체적인 설정값 등을 변경

Untitled

web.xml 파일이 있음. WAS(톰캣)라는 커다란 컨테이너에 어플리케이션들이 들어있던것

이를 웹 컨테이너, 어플리케이션 컨테이너 라고 부른다.

컨테이너 ? 그릇, 없으면 서블릿이 동작 X 톰캣이라는 그릇 안의 여러 어플리케이션들은 바로 webApps 확인!

webApps

webApps : 그안의 폴더 갯수만큼의 어플리케이션이 구동된다

Untitled

톰캣이 어플을 서비스 한다! 라면 그 어플을 대상으로 요청을 한번 보내보자!

도큐먼트 베이스라고 부른다

Root의 index.jsp

Untitled

바디에

문장 추가하면

Untitled

localhost 접속이 이 화면에 해당하는 html이었다는것을 알 수있다

이번엔 docx라는 컨텍스트에 접근해보자

Untitled

docs의 엄청 많은 html중 index.html이 실행된것을

Untitled

알 수 있다.

어떤 컨텍스트에 index나 default라는 이름의 html이 있으면 그것이 디폴트로 동작한다. (=웰컴페이지)

위의 주소를 해석하면 localhost = webApps 폴더까지의 경로라고 해석 할 수 있다


예제 1

그럼 aio.html 들어가보자

http://localhost/docs/api/index.html

+) docs url은 클라이언트 쪽에선 접근 못하게 되어있어야함.

docs의 일부공간만 허용해야한다는것!

다른 페이지도 이런식으로….

D:\B_Util\5_5.ApacheTomcat\apache-tomcat-8.5.79\apache-tomcat-8.5.79\webapps\examples

예제 2

async에 접속하려면?

Untitled

http://localhost/examples/jsp/async/async1.jsp.html 이렇게 들어가야겠지!

또한번 말하지만, 이렇게 url을 작성하는것은 이 접속의 본질이 네트워크 뒤의 하드디스크의 파일에 접근하는 거니까, 직접 접근하면 보안문제가 생겨버림! 그래서 url을 이용해서 접근하는것이다….

새로운 Context 생성해서 브라우저에 띄우기

Untitled

Untitled

왜? 웰컴페이지 없어서!

Untitled

first에 위 html저장해준다

Untitled


동적 어플리케이션 형태로 변경

depth1 경로 만들어서

Untitled

Untitled

정적자원을 만든거임. 경로가 원래 소스 경로와 일치하기때문에 다른 처리가 필요없었음

근데 이제 클라이언트 시간을 넣으려고 함.

Untitled

하드코딩은 정적자원이고 따라서 시간이 맞지도 않음. 자바나 자바스크립트를 통해 실행코드를 작성해서 넣으면 됨

클라이언트쪽 브라우저의 시간이 필요하므로 JSP가 아닌 JS의 형태로 만들어줘야함

Untitled

이 자원은 동적자원 아니고 정적자원임!

서버가 로그인 되어있을때도 경로 하나도 안바뀌고 url이라는 논리주소에 그대로 반영되어있으니?..

Untitled

같은 url로도 그대로 작동한다

페이지 소스 보면 이렇게 그대로 뜬다

Untitled

즉, 시간을 서비스 하는게 아니라 위 코드를 서비스 하는것이다

형태가 변화하지 않으니 동적자원이 아니고 정적자원을 서비스 하고 있는것이다

이제 위에 서버의 시간도 함께 잡아보자!!!!!!!!

서버의 시간은 자바를 이용해서 넣어주장

웹상에서 발생하는 요청을 담고 웹을 기준으로 응답을 보내주는 기능을 담은 객체가 필요하고

이를 서블릿이라고 한다

이제 백엔드에서 동작하는 코드를 서블릿 스펙으로 동작시켜보자

+) 웹앱스의 모든 폴더에는 web-inf가 있음 얘는 꼭 넣어줘야 한다는 얘기. 그리고 web-inf에는 모두 web.xml이 들어있다. 즉 이 두가지가 꼭 필요한 규칙이다

Untitled

first에 web-inf와 src, classes 폴더를 만들어준다.

classes안에는 클래스들이 들어가있어야한다. 즉 얘는 classPath임!

calsses라는 녀석은 해당 컨텍스트에서 제일 먼저 사용되는 classPath임

이제 서블릿 소스를 저장해보자

Untitled

저장후 내용을 좀 바꿔

Untitled

컴파일 해줘볼까

Untitled

클래스패스가 필요…

적어도 3개이상의 클래스패스가 이미 지정되어있음

-cp 옵션 세개는 지정이 되어있음

-d 옵션으로… 클래스파일을 클래시스에 넣어줘야하니까

Untitled

하면 오류 뜸

왜? >>

  1. 현재 클래스가 httpservlet을 상속받는데, httpservlet이 없음(바로 밑에있거나 컨테이너가 갖고있느거 써야됨,,,) 임포트해주자

Untitled

  1. jar파일

jdk에서 찾아야되는데 스탠다드 에디션에는 웹과 관련된게 없음 즉 서블릿이없음 즉 서블릿 못만듦

그럼 중프때 서블릿 어케 만듦? = 톰캣을 설치해야하는이유 (24시 80포트, 스탠다드에디션jdk에 없는 서블릿api를 톰캣이 제공)

Untitled

저거 열면 httpServlet 리퀘스트와 리스폰스 다들어있음

즉 이 파일을 우리가 써야하는 또다른 경로로 지정해야함

Untitled

컴파일됨

Untitled

classes에 뎁스구조가 완성됨

이제 클래스를 실행

근데 메인메소드가 없다

서블릿 객체는 메인에 의해 구동되는 동작구조가아님

즉 스탠드얼론이 아님

톰캣은 컨테이너, 서블릿스펙을이용하는 과정에서 중요역할, 즉 버츄얼머신에서 운용이아이날 버츄얼이 톰캣을 구동하고 톰캣이 우리걸 구동시키는 구조가 되어야함

이런 작업을 WEB.XML에 하는것

Untitled

이런 서블릿이 있으니까 톰캣 너가 관리해줘! 하는 의미

서블릿 매핑 : 그럼 이걸 어떤 조건에서 실행할 것인가?

Untitled

명령을 내리기 위해선 URL을 사용하므로 어떤 URL을 썼을때 서블릿을 동작 시킬지 정의하는것

서블릿 앨리먼트 하나, 서블릿 매핑이라는 앨리먼트를 하나씩 짝지은 WEB.XML이 필요

컨씨컨브이

Untitled

이제 내용을 우리에 맞게 바꿔보자

Untitled

자 시작~

서블릿을 운영하는건 톰캣, 즉 서블릿 컨테이너

그릇에 서블릿을 넣어줘야지

그 작업을 서블릿이란는 엘리머늩가 하게됨

Untitled

Untitled

이렇게 한쌍을 구성하려면

Untitled

네임을 이용해서 한쌍으로 만들어준다

이제 실행해보자

Untitled

이건 이제 진짜경로가 아니니까 가상url(?)

변경된 xml 정보 모르니 처음부터 읽도록 리스타트 해줘야함!

Untitled

소스보기

Untitled

코드가 실행된 결과가 서비스 되는거지 코드 자체가 서비스 된느게 아나ㅣㅁ

아까 js코드 적었던거랑 비교하면 … js코드는 코드 자체가 서비스 되었으므로 정적자원

이번 소스는 코드가 전혀 포함되어있지 않음(두겟이런거 안보임) 그럼 이 서비스의 실행결과는 이미백그라운드에서 실행된 후 코드는 사라지고 결과만 보여주는것

즉, 동적요청이다!

그 언어의 소스가 응답 데이터인가 소스가 다 실행된 결과가 응답으로 나오는가? 이게 키포인트

서버의 시간을 포함시켜서 돌려보자

Untitled

소스 바꿔서 재컴파일

javac -cp ........\lib\servlet-api.jar -d ..\classes HelloServlet.java

안돌아가는데 Hello서블릿이라는 객체가 없어서.. 이건 톰캣이 만들어줌 (싱글톤적용)

그래서 HelloServlet은 단 하나 존재하게 됨

즉 아무리 새로고침 해도 시간이 안나오고 아까전 페이지 그대로임 최초 객체 생성시 만들었던 인스턴스가 계속 유지되므로 그 싱글톤이 사라지기 전까진 바뀌지 않음

즉 가비지 컬렉션을 통해 서버 리스타트가 필요

서버 재구동

Untitled

즉 정리하자면

소스 수정후 반영하려면 새로운 소스에 대해 컴파일 해야함

근데 이미 싱글톤 있으니까 서버 재구동 필요

재구동 후 요청 보내면 응답데이터 잘 들어옴!

예제 ) 클라이언트의 시간과 진짜 클라이언트의 시간을 보여주는…?

  • 클라이언트 사이드와 서버사이드의 차이 보도록하기

Untitled

재컴파일

javac -cp %CATALINA_HOME%\lib\servlet-api.jar -d ..\classes -encoding utf-8 HelloServlet.java

현재위치와 api 고려하여,,,,,,,, 클래스파일 만들기

req, resp는 톰캣에서 빌려쓰는거니까 (스탠다드에디션에 없기때문)

서버 리스타트

확인

왼쪽이 서버사이드 시간

오른쪽이 클라이언트 사이드 시간

우클릭후 소스보기를 보면 결정적 차이가 보인다

서버사이드는 고정데이터가 결과값으로

클라이언트는 결과를 만드는 소스코드가 응답데이터로 나옴 (시점이 응답이 나온후 스크립트 코드를 보고 만든시간)

각각 정적/ 동적자원

한글자만 수정해도 컴파일을 다시해야하는 (톰캣을 재구동해 싱글톤 바꿈) 이 귀찮은 과정이 서블릿의 가장 큰 단점

모듈화

Untitled

sample.html에서 코드를 카피해왔던거잖아

이걸 모듈화 해보자

web-inf에 저장을 해보자

Untitled

샘플js

샘플html에 모듈 넣자

Untitled

스크립트는 브라우저가 실행.. 하니까 저 경로 당연히 못읽음

그대로 url을 가져야하는 정적자원은 절대로 여기서 관리X

Untitled

자리를 옮기자

Untitled

이렇게 수정후 브라우저에서 first/depth1/sample.html 하면 됨 (클라이언트니까 재구동필요없느ㅡ)

F12누른후 네트워크탭을 열고 새로고침하면 요청이 몇개인지 볼 수 있는데 sample.html과 sample.js가 있음. 클릭하면 탭이 여러개 열리는데 response탭을 보면 현재 응답태그가 보인다. 그걸 가져가서 브라우저가 실행한거임! 실행해보니까 스크립트코드가 있었으므로 그것을 대상으로 요청을 또해서 받아온것. 받아오면 그 스크립트태그안에 넣고 보여준것이다….

web-inf 폴더의 특징

개발시 어떤 단계를 따라야하는지

알았다

Untitled

저부분 지워버림

Untitled

위로 한칸 올라가면 webinf가 아니라.. 로컬호스트

왜냐면 url이 localhost/first/hello.do임 ㄷㄷ

hello.do가 브라우저에 랜더링되어 first안에 있음, 그폴더에서 한단계위로 올라간거니까~ url을 그대로 해석해 판단한다. 그래서 로컬호스트까지 올라가게 되는것

Untitled

컴파일부터 다시해주자

그리고 다시 스타트업 후

hello.do 링크 들어가면

f12보면 요청이 보인다

소스보기 하면 스크립트코드가 바뀌어있는게 보이겠지

그걸 브라우저 입장에서 해석

브라우저가 해석하려 했더니 갖고읶는 경로가 저거밖에 없ㄱ음. 즉 현재폴더는 ./가 되고 … (왜냐면 서블ㄹ릿이 가지고있는 절대경로는 파일시스템은 모르기때문… 서블릿매핑했기때문에)

web.xml을 열어서 변경

Untitled

서버 리스타트

브라우저에서 first/hello.do 하면 안나옴

first/depth1/hello.do 해야함

근데 클라이언트 시간이 안나온다?!

⇒ h12열어보면 js가 404에러가 뜬게 보임

sec가 상대경로이므로 현재위치를 depth1으로 알고있는거

즉 src를 ../으로 만들어야 해석됨

똑같은 결과데이터를 JSP로

web-inf 밖에// 클라이언트가 접근 가능ㅎ라도록 저장

Untitled

Untitled

그대로 브라우저에 sample.jsp

Untitled

이건 동적자원임

서버는 시간데이터가 하드코딩 되어있음 데이터객체가 이미 생성되고 그 결과만 넘어온것, 그래서 소스보기 하고 새로고침시 계속 바뀌니까 동적자원

서버사이드 시간 출력하는 부분에 백그라운드 컬러를 입히고 싶다면?

Untitled

Untitled

톰ㅋㅅ에 등록이나 매핑설정 안함 → 서블릿보다 빠름….. 개발자가 할일이 줄어들었다! 이게바로 jsp가 시작된이유

서블릿을 만들어서 웹컨텐츠를 만들었으나 서블릿이 컴파일,등록,매핑,서버리스타트 해야해서 너무 귀찮음ㅡㅡ 그래서 나온게 jsp

모델2구조

서블릿은 수정시 계속 리스타트 jsp는 고치고 바로 반영됐었음.. jsp의 장점을 활용,,, jsp로 클라이언트가 바로 요청 불가하니까 서블릿으로 요청보내면 서버는 그것만 처리. 즉 jsp로 보내주고…. 뒤는알지

그래서 jsp가 뷰, 서블릿이 컨트롤러, 전송되는 데이터가 model ⇒ mvc패턴!


정리

bin에는

conㄹ

webapps의 갯수가 웹상에서 동작하는 어플의 갯수

하나 추가하면 콤캣에서 사용할수있는 어플리케이션을 하나 늘려준것

각 컨텍스트가 이용하는 자원… 웹베이스 또는 도큐먼트베이스로 부른다

즉 우리 폴더에서 webapps

저 공간에 있는게 웹에서 공개가 되고있음

우리는 전체시스템에서 딱 이 공간만 보여주기 위해 진짜경로말고 url을 사용해야한다. 즉 로컬호스트나 아이피어드레스

요청이 들어오면 웹앱스 자원에 있는걸로 해결!

루프백 어드레스나 특정IP어드레스 + 파일어드레스(?)를 이용

localhost/docs/경로 걔속 따라감….

웹앱스까지느,느 로컬호스트로 그뒤는 경로로

Untitled

Untitled

엥 근데 얘는 왜안돼?

사실 컨텍스트 아래는 경로로… 뎁스구조가 그댜ㅐ로 반영이 아님

근데 바녕ㅇ이 다 되는게 아니라…

Untitled

web-inf는 접근 불가능! 톰캣의 금고임 외부 클라이언트의 접근이 불가능

서버에서는 접근가능. 보안관련된걸 만드는 보안폴더

중프때 저 아래에 넣었음 근데 그럼 jsp를 그대로 불러올수 없었어

그럼 어케 띄웎더라? 모델2구조

응답을 내보내기위해 외부에 서블릿을 만들어 클라가 서블릿에 요청을 보내고 그게 jsp로 이동한 후 jsp가 클라에 응답해주느 구조여씀

Untitled

외부에서 접근할 수있기때문에 그자체로 url이며 정적자원

Untitled

web-inf안에 모든 클래스가 다 들었으므로 클래스패스라고 불렀음

.class파일은 web-inf니까 클라가 접근할 수 없음

즉 모든 클래스가 web-inf로 되어있는데 즉 정적자원이 아님 그럼 클라가 어케 접근해?

⇒ web.xml에서 서블릿을 등록해주고 매핑주소를 설정해줌

즉 웹의 클래시스에 있는 자원은 다이렉트로 사용은 불가능하지만 매핑주소를 이용하면 외부섯비스인것척럼 사용이 가능해진다

url을 갖지못하는 서블릿이 매핑을 통해 가짜 url로 동작…

Untitled

web/inf/hello.classes 쓰는건 불가능! 클라이언트의 요청이기때문

Untitled

Untitled

0개의 댓글