안그래보이지만 개발자/백엔드

[tomcat+spring] 이클립스 웹개발 초심자를 화나게 하는 MVC 패턴에서의 url 관련 환경설정 정리 (server.xml 수정)

자네트 2019. 11. 1. 16:36
반응형

구글링을 통해 이클립스에 톰캣, 스프링 세팅이 다 되었다면
jsp 파일을 만들고 로컬 환경(당신의 PC)에서 톰캣을 구동할 것이다.
근데 기껏 만든 jsp 화면은 안 나타나고 404 에러만 난다.

index.jsp를 컨트롤러가 보게 하고 싶은데 어떻게 하는지 모르겠다.
브라우저에 뭐라고 쳐야 접속할 수 있지?

이런 사람만 이 포스팅을 볼것
고급자용은 아니므로

이 포스팅을 갑자기 하는 이유는
웹개발을 잘 모르는 윗분들 세팅을 해주면서도
팀원들과 환경 세팅을 다시 하면서도
대학교 다닐 때 MVC 패턴으로 처음 개발하면서도

너무 짜증났던 스프링 mvc url/uri 를 떠올리며
나 초보자일 때의 기억을 되살려 제일 짜증나는 부분만 정리해봄

※ 여기서 스프링 설정은 xml이 아니라 자바 설정 JAVA Config 을 이용하였으며 
스프링은 5.x, 톰캣은 8.5.x 버전이다.

고급자는 이 포스팅을 떠날 것
극 초심자를 위한 포스팅임
ex. mvc 처음 해보는 사람

 

 

 

이클립스에 스프링과 톰캣을 연동하기는 했는데
그 후로 뭘 해야 접속이 되지 ??

기본적으로, 스프링 WebMvcConfigurer - ViewResolver
WebApplicationInitializer,
IndexController가 필요하다.
세 개의 java 파일이 생겨아 한다.

자세한 설정법은 저 키워드로 검색하면 나올 것이다 (...)
xml이 아니라 java config를 이용했다는 것에 유의.

간단히만 설명하자면

WebMvcConfigurer를 implement 하는 클래스를 만들고
ViewResolver를 만들어야한다. 뷰 리졸버의 역할은 jsp 파일을 컨트롤러가 찾아갈 수 있도록 하기 위함이다.

다음으로 WebApplicationInitializer를 implement하는 클래스는
이름에서 보면 알겠지만 웹 어플리케이션을 초기화한다.
config를 설정한 위치나 인코딩 설정 등 다양한 설정이 가능하니 검색해보길 바람.
귀찮아서 그런 거 아님.

그리고 이 포스팅의 핵심인 컨트롤러.
딱히 implement하거나 extend할 필요는 없으며
클래스 선언 위에 @Controller 어노테이션을 써주면 알아서 인식한다.

@Controller
public class IndexController{
	...
    ...
    }​

이런 식으로...
캡쳐하고 싶은데 폐쇄망에서 개발하고 있어서 캡쳐 못함

이러면 이제 내가 만든 jsp 파일을 브라우저에서 볼 수 있을까?
근데 보통 한 번에 성공 못한다.
내가 처음 할 때 그랬다 (...)
URL 개념이 애매해서 그렇다.

로컬에서 실행했다면 접속 아이피는 http://localhost:8080/일 것이다
8080은 톰캣 기본 포트이니 수정했다면 수정한 포트로 숫자만 바꾸면 된다

컨트롤러 안에는 입력하는 url에 따른 매핑을 할 수 있는 메소드를 만들어준다.
예를 들면 이렇다.

@Controller
public class IndexController{
	
    @RequestMapping(value="/")
    public String index(HttpServletRequest req, HttpServletResponse res){
    	return "index";
    	}
    }

RequestMapping(value="/")의 뜻은,
기본 주소 뒤에 / 까지만 치면 이 메서드로 매핑된다는 뜻이다.
즉 기본주소가 http://jeanette.tistory.com이라면 /를 붙인 http://jeanette.tistory.com/까지 입력하면 해당 메서드를 통해 jsp를 찾아가게 된다.

응용하면, value="/test" 라고 적으면
http://jeanette.tistory.com/test 라고 주소창에 입력하면 해당 메서드를 타고 들어온다는 뜻이다.

그리고 리턴값은, 드디어, jsp의 파일명이다.
viewResolver가 jsp의 경로를 잘 보고 있고, suffix가 잘 설정되어있다면
기본 주소만 입력해도 jsp파일이 위치한 경로에 있는 index.jsp 파일을 연결시켜준다는 뜻이다.

그런데 이게 잘 안된다면 ??

 

주소창에 http://localhost:8080/ 만 치면 jsp 확장자 없이 딱 들어가게 하고 싶은데 어떻게 하나요 ????

이클립스에 톰캣을 연동했다면
Project Explorer 목록에 Servers 폴더가 있다
그걸 누르고 해당하는 웹프로젝트와 연동된 이름의 폴더를 열면
server.xml 파일이 있다
주로 이 설정 때문에 안 되는 경우가 많다

server.xml 파일을 열고 쭉 내리다보면

<Connector connectionTimeout="20000" port="8080" ....생략​

이런 부분이 있을 텐데 8080을 다른 포트로 바꾸고 싶으면 바꾸면 된다
그럼 http://아이피:바꾼포트/ 이렇게 접속 가능

그리고 좀 더 내려가보면

<Context docBase="projectName" path="/projectName" reloadable="true" ... 생략

이 부분이 있을 건데 여기가 이 포스팅의 핵심이다.

첫 세팅 후 아무것도 건드리지 않았다면 docBase와 path가 둘 다 프로젝트명으로 되어있을 것이다.
docBase는 파일이 실제로 위치한 경로인데, 이클립스는 프로젝트명으로 폴더를 생성하므로 이 부분은 건드리지 않아도 된다
문제는 path이다.
이 path의 뜻은, 기본 톰캣 주소 뒤에 무조건 붙는 기본 경로라고 생각하면 된다.

톰캣을 시작하면 기본 주소는 http://아이피:포트/가 되는데,
path="/projectName"이 뒤에 붙어서 이 웹 프로젝트에 대한 경로는 http://아이피:포트/projectName이 된다는 뜻이다.

로컬환경에서 실행하면 자기 자신 접속은 localhost로 가능하며 포트 번호를 바꾸지 않았다면 8080번이므로
test라는 웹 프로젝트를 만들어 실행시키고자 한다면
톰캣을 올린 뒤
http://localhost:8080/test
여기로 접속하면 된다는 뜻이다.

그러니 http://localhost:8080/ 까지만 쳐도 해당 웹앱에 접근하게 하고싶다면
server.xml 아래의 path를 "/"로 설정해주면 된다.
물론 다른 어플리케이션에서도 이렇게 설정해놓고 톰캣 두개 올리면 충돌한다.

 

주의할 점

server.xml의 세팅이 자바 세팅보다 우선한다고 생각하면 쉽다.

path="/test"로 설정이 되어있다면,
컨트롤러에서 @RequestMapping(value="/") 이라고 설정했다 해도
http://localhost:8080/test 로 접속해야 한다.
컨트롤러에서 무슨 값을 설정해줘봤자 path에 설정된 경로 뒤에 붙는다고 생각하면 된다.

이걸 내가 첫 프로젝트 때 이해했다면.. 과제가 훨씬 쉬웠을 것이다.

 

흠 일단 생각나는 건 이정도
더 생각나면 추가해야지

반응형