본문 바로가기
  • 1+1=3
개발삽질/SSAFY하는 동안 기록

[BackEnd] 서블릿과 JSP

by 여스 2022. 3. 22.
반응형

클라이언트 -> 웹서버(=http server)에 접속할 때, 이 웹서버는 접속,응답처리밖에 못함.

따라서 java같은 언어를 돌리려면 application서버가 더 필요해. 

그래서 이 web server와 application server를 합친걸 WAS(web application server)라고 함.

톰캣이 무료라서 이걸로 연습을 했음.

이 어플리케이션 서버는 나중에 mvc패턴에서 Service역할과 비즈니스 로직을 구현함.

 

설치

서블렛은 기본 자바(JSE)에는 포함되어 있지 않아서 외부 라이브러리가 필요함.

예전에는 아파치에서 제공하는 http server(웹서버)와 tomcat(어플리케이션 서버)를 모두 받아야 했는데 이제는 걍 tomcat만 있어도 되므로 tomcat만 다운받으면 된다.(https://tomcat.apache.org/download-90.cgi)

 

톰캣은 적당한 위치에 저장하되, 그 위치는 되도록 고정시키고 움직이지 않는걸 추천한다. 움직이면 인식 못함...

 

암튼 다이나믹 웹서버를 만들고, 톰캣을 라이브러리를 연결해주면, 다음처럼 javax패키지가 있음을 볼 수 있다. 바로 이 javax패키지에 servlet이 있다.

 

서블릿 만들어보자.

서블릿이란 사실 인터페이스이다. 그러므로 당연히 내가 아무Class하나 만들어서 implements Serlvet해도 된다. 근데 이러면 추상메소드가 너무 많아지기에 불편함.

고로, 우리가 쓰기 편하게 HttpServlet이란 추상클래스가 이미 제공되고, 난 그저 이 추상클래스를 상속해서 몇가지 추상메서드만 오버라이드해주면 편하다.

 

코드는 아래와 같다.

어노테이션은 옛날버전(dynamic web module버전이 3.0미만)에선 web.xml에다 쓰던걸 개선한 방식임(url바꾸고 싶으면 xml왔다갔다거려야 하는 불편함 해소)

@WebServlet("/hs")
public class HelloSsafy extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("<body>");
		out.println("Hello! 나는 희준이야");
		out.println("</body>");
		out.println("</html>");
	}

}

response.getWriter()관련 api문서 보는것도 재밌을 것이다,

 

 

위 코드에서 서블렛의 역할을 볼 수 있음.

1. 클라이언트로부터 데이터 받기- doGet

2. 로직처리

3. 응답페이지 만들기(html만들기).즉 클라이언트에게 출력해주는 것임.

 

Servlet 생명주기

객체는 서블릿 컨테이너가 단 한번만 생성함.

Servlet class는다른 class와는 다르게 main method가 없다. 즉, 객체의 생성부터 사용의 주체가 사용자가 아닌 Servlet Container에게 있다.

Clinet가 요청(request)를 하게 되면Servlet Conatiner는 Servlet객체를 초기에 단한번만 생성하고 초기화한다. 그리고 그 담부터 요청이 올때마다 그 객체를 이용해서 처리한다. 그리고 Servlet이 필요없게 되면 제거하는 역할도 Container가 담당한다.

여기서 재미있는 건 그럼 객체 한명인데 여러명이 객체를 이용할때 어떡하냐 문제인데, 이건 스레드를 나눠서 실행하고 스레드 정보를 스레드풀에 저장하게 됨.(시간날 때 관련 블로그 보자:https://maenco.tistory.com/entry/WEB-Multi-Thread-Thread-Pool%EC%9D%98-%EC%9D%B4%ED%95%B4 )

 

암튼 아주짧게 정리하면

init()(단 한번)

doGet(), doPost()  (요청시마다)

destroy()(젤 마지막 단 한번)

순서로 실행된다.

 

 

JSP

아주 간단히 말하면, 서블릿은 html in java이고, JSP는 java in html이다. 이해 팍됨

 

그러나 결국엔 jsp는 서블릿이다. 왜냐면 jsp경로까지 가서 보면 톰캣이 만들어준 java파일이 있는데,

내 경로는 다음처럼 되어있음ㅋㅋ

 

프로젝트경로.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\examples\org\apache\jsp\example

에 들어가보면

열어보면 결국 serlvet임을 알 수 있다.(Servlet을 상속받은 HttpJspBase를 상속하고있음)

심지어 이렇게 기본객체도 내장되어 있다.

jsp에서 적은게 요렇게 servlet에서 변환되어서 out.write()됨.여기서 out은 javax.servlet.jsp.JspWriter객체넹 tmi..

암튼 결국은 jsp는 서블릿으로 먼저!!! 변경되는 것이 실행되고, 그담에 html을 뿌리던가 되는 순서가 중요하다.(주석 할때 jsp주석이랑 html주석 구분, 또는 javascript같은거 함께 쓸때 순서이해 못하면 에러남)

 

대충 큰 그림은 이렇다..

 

 

나중에 짜잘짜잘한 기능들은 써가면서 손으로 익히는 게 더 좋겠어서 정리는 여기까지만.

반응형

댓글