인프런 커뮤니티 질문&답변

하늘여우님의 프로필 이미지
하늘여우

작성한 질문수

백엔드 프레임워크 만들기

첫번째 서블릿을 만듭니다. - MasterController

첫 번째 실습 질문입니다.

작성

·

3.4K

0

1. 사전 설명 없이 갑자기 소스 코드 나오고 실습 돌리셔서 당황했습니다.. 그래도 첫 실습인데 어떻게 준비하면 좋을 지 안내 주셨으면 좋겠습니다..

2. localhost:18080/waf/xxxxx?NAME=zero

-> 요청된 리소스 [/waf/xxxxx]은(는) 가용하지 않습니다.

와 같이 오류가 발생합니다... 기초적인 내용이갰지만... 이 부분 뭐가 잘못 되었는지 모르겠습니다...ㅠㅠ

web.xml에는 /waf/* 라고만 되어 있는데, 어떻게 MasterController를 찾아가는건가요..? xxxxx가 어떻게 맵핑이 되는지 모르겠습니다....

답변 1

0

제로님의 프로필 이미지
제로
지식공유자

안녕하세요. 제로입니다.


1. 강의를 듣는 분 입장에서 제가 생각 못한 문제인것 같습니다. 관련 내용 보강하도록 하겠습니다.  알려주셔서 감사합니다. ^^

작동하는 소프트웨어 관점으로 생각해보면 소스코드 만큼 효과적인 설명수단은 없습니다.

그렇기 때문에 소스코드를 가지고 작동하는 모습을 보여 드렸구요.

강의 듣기전 깃 허브에서 해당 챕터 소스코드를 준비해두시고 들어 주시겠어요.


2. 아침에 답글을 적고 지금 보니 제가 엉뚱한 내용을 올렸네요.
답변글 다시 적어 올립니다.


"요청된 리소스 [/waf/xxxxx]은(는) 가용하지 않습니다."   는

- 톰캣이 사용될 document base 경로가 맞지 않거나

- {document base}/WEB-INF/web.xml 자원이 없어서 생긴 문제입니다.

"백엔드 프레임워크를 만들기 위한 환경 구성" 강의 기준으로 구성이 잘 되어 있는지 확인 부탁드려요.


"web.xml에는 /waf/* 라고만 되어 있는데, 어떻게 MasterController를 찾아가는건가요..?" 

에 대한 답변을 드리면


강의 예제로 주소창에 입력한  정보를 가지고 설명 드리겠습니다.

http://localhost:18080/waf/xxxxx?NAME=zero 

를 입력한다고 할때 각각의 정보는

localhost  : 도메인(IP) 네트워크에 연결된 다른 컴퓨터로 접속할 수 있는 정보

18080  : 포트, 아이피를 통해 접속한 컴퓨터의 특정 프로세 (톰캣을 의미합니다.)

/waf/xxxxx   : 프로세스(톰캣)에 전달할 문자열

?NAME=zero  : 프로세스(톰캣)에 추가로 전달할 문자열

로 해석할 수 있습니다.


이때 톰캣은 전달받은 문자열을 해석해 관련된 서비스를 실행하는데

사용자가 전달한 /waf/xxxxx 정보와 web.xml 에 있는 정보를 참고해

실행할 서블릿을 결정합니다.

<web-app>

<servlet>

<servlet-name>waf</servlet-name>

<servlet-class>com.code5.fw.web.MasterController

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>waf</servlet-name>

<url-pattern>/waf/*</url-pattern>

</servlet-mapping>

</web-app>


위 servlet-mapping 태그에 있는 것처럼

사용자가 요청한 문자열인 /waf/xxxxx  는

/waf/*  패턴과 일치함을 톰캣이 알게 되고

이름이 waf 인 서블릿 com.code5.fw.web.MasterController 찾아

사용자 요청을 처리하게 되는거죠


또한 /waf/* 패턴을 통해 /xxxxx 문자열이 분리되게 되는데

지금은 중요한 내용이 아니기 때문에 따로 설명드리지는 않았지만

섹션4에 있는 IoC/DI 에 사용될 서비스키로 사용되게 됩니다.


도움이 되길 바랍니다. ^^

하늘여우님의 프로필 이미지
하늘여우
질문자

빠른 답변 주셔서 감사합니다^^

위의 문제는 1번 문의의 연장선이었습니다.

제가 강사님의 깃허브에서 소스코드 zip파일 다운로드 후 환경설정의 code5 경로가 아닌 다른 경로에 압축해제 후 이클립스에서 로딩을 했습니다.

그러다보니 당연히 documentBase의 code5/web 하위에서 읽어올 /waf/* 가 없어 404에러가 났었던 거네요.

tomcat > modules > web modules > Add External Web Module.. 에서 다른 경로에 설치한 inflearn01/web 을 설정하고 다시 서버 기동하니 정상 수행되었습니다.

질문이 있습니다. 기본 설정한 code5/web 경로가 아닌 다른 경로에 샘플 소스를 위치 시킨다면 지금처럼 매번 위의 web modules 에 추가로 docBase를 설정해주어야 할까요??

친절히 답변 주시고 챙겨주셔서 감사합니다. 강사님 (_ _)

제로님의 프로필 이미지
제로
지식공유자

안녕하세요. 제로입니다.

문의하신 시간과 제가 답변드리는 시간 차이가 있어

학습 흐름에 방해가 될 것 같아 죄송하네요.


"기본 설정한 code5/web 경로가 아닌 다른 경로에 샘플 소스를 위치 시킨다면 지금처럼 매번 위의 web modules 에 추가로 docBase를 설정해주어야 할까요??"

에 답을 드리기 전에 다른 이야기를 하자면


개발자의 고민중 하나는 내가 만든 소프트웨어의 배포가 어렵다는 점입니다.


개발자의 컴퓨터에 맞게 개발된 소프트웨어가

다른 사람의 컴퓨터에선 이상하게 동작하는 경우가 발생하는데

이런 문제는 대부분 소프트웨어가 필요한 자원을 찾지 못한 경우가 많습니다.


그렇다 보니

설치 프로그램 같은 도구사용을 시작으로

배포비용을 혁신한 인터넷프로그래밍

그것마저도 자동화 시킨 CI/CD

인프라영역까지 확장시킨 이미지 기반 컨테이너(도커) 기술로 발전이 되었는데요.


이런 기술을 사용하기 위해선

그래서 실행파일을 쉽게 찾을 수 있는 정보인 PATH 와

실행된 프로그램이 사용될 자원을 쉽게 찾을 수 있는 정보인 classpath 를

이해하는것에서 시작합니다.

그런 관점에서 web 폴더를 만들고 docBase 를 지정

프레임워크를 만들 준비를 하는 겁니다.


톰캣이 사용할 docBase 를 설정한다는 건

실행된 프로그램이 사용할 PATH 와 classpath 를 알려주는 것과 똑같습니다.

그런데 2개 이상의 docBase 가 있다고 하면

톰캣 입장에선 

실행할 프로그램(서블릿) 정보가 있는 /WEB-INF/web.xml 와

실행할 프로그램(서블릿.class 와 관련 자원)이 사용할 자원이 위치해 있는 /WEB-INF/classes 가 필요한데

여러개가 있다고 하면 애매하게 되겠죠.

그렇기 때문에 
하나의 docBase 는 하나의 web 경로만 지정하시는게 좋습니다.


질문에 대한 답변을 정리하면

톰캣이 사용할 docbase 는 한개만 있어야

실행중인 프로그램인 톰캣에게

사용할 자원을 정확하게 알려줄 수 있기 때문에

기존 docbase 는 제거하시면 됩니다.

하늘여우님의 프로필 이미지
하늘여우

작성한 질문수

질문하기