클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

JSP 기본 다루기 2 - JSP 기본 태그와 JSP 스크립트 요소 본문

웹 · 앱 개발/JSP & Servlet

JSP 기본 다루기 2 - JSP 기본 태그와 JSP 스크립트 요소

huenuri 2024. 8. 26. 22:04

지난 단원에서 JSP 파일을 만들어서 실습을 해보았으나 그때는 스크립트립을 사용하지 않고 HTML 코드만 작성해서 만들어보았다. 스크립트립을 사용하면 자바 코드를 쓸 때처럼 사용할 수 있어 무척 신기하고 사용하기 편리했다.


 

 

 

 

JSP 기본 태그

웹 프로그램들은 사용자에 따라 서로 다른 내용이 제공되어야 하는데 이러한 동적 페이지를 구현하기 위해서는 다음과 같이 JSP 태그를 사용해야 한다. 아래 태그들은 서버가 인식하는 JSP 태그이다.

 

 

 

JSP 스크립트 요소

 JSP 문서는 단순히 JSP 태그로만 구성되지 않고 HTML 태그와 함께 사용된다. JSP 문서는 JSP만이 아닌 다양한 구성요소들로 이루져 있다. 자바 기능을 제공하는 JSP 스트립트 요소는 5가지 요소들 중 3가지가 있다.

이를 JSP 스크립트 요소라고 한다.

 

 

1. 스크립트릿

JSP 문서는 HTML 태그로 정적 페이지를 디자인하고 웹 서버에서 처리할 문장들을 자바 언어로 부분적으로 기술하는데, 이때 사용하는 자바 언어를 서버 스크립트 언어라고 한다.

서버 스크립트 언어인 자바를 JSP 문서 내부에 기술하려면 JSP가 제공해주는 스크립트릿 태그를 사용해야 한다.

 

out이라는 내장객체

여기서 out은 일반적인 자바 프로그램의 System.out이 아니다. 서블릿에서 요청이 있을 때마다 호출되는 doGet 혹은 doPost 메소드에서 클라이언트에 응답하기 위해 response.getWriter() 메소드로 얻어낸 PrintWriter로 선언한 out 객체와 동일합니다. 서블릿에는 객체를 생성한 후 사용하지만 JSP 페이지에서는 out이 내장객체 형태로 제공되기에 바로 사용할 수 있다.

 


 

 

 

2. 선언문

JSP 페이지에서 사용되는 변수나 메소드를 정의하기 위해서 선언문을 사용한다. 그렇다면 왜 선언문은 <%을 사용하지 않고 <%!을 사용할까?

<% %> 내에 기술한 코드는 JSP가 서블릿 코드로 변환되었을 때 _jspService() 메소드 내부에 들어간다. static 변수나 메소드 정의는 메소드 내부에 할 수 없고 클래스 영역에 선언해야 하는데 <%! %> 안에 기술한 코드들은 클래스 영역에 정의되기 때문이다.

그렇다면 static 변수가 아닌 일반 변수를 스크립트릿 태그 안에 선언하여 사용할 수 있을까?

 

이 태그 내부에 기술된 내용은 서블릿에서 _jspService() 메소드 내부에 기술되는 내용이기 때문에 <% %> 태그 내부에 static 변수를 선언하거나 메소드를 정의하면 메소드 내부에 static 변수를 선언한 것히 된다. 또한 메소드 내부에 메소드를 정의한 것이 되기에 JSP 문서 내에서 에러가 발생한다.

메소드 내부에 선언되는 변수를 지역변수라고 하면 지역변수는 static 변수가 아니어야 한다. 그렇기 때문에 _jspService() 메소드 내부로 변혼ㅏ된 코드를 기술하는 <% %> 태그 내부에는 static 변수가 아닌 일반 변수 형태로 변수를 선언한고 if문이나 for문과 같은 제어문이나 기타 등등 자바에서 사용되는 문장들을 기술할 수 있다.

 

선언문에 변수를 선언할 수 있는데 자바와 동일한 방법으로 선언하면 된다. 선언문 내부에서는 자바의 문법 구조를 따라야 하기 때문에 변수를 선언하는 문장 끝에는 세미콜론을 기술한다. 선언문 태그에는 변수의 선언 이외에도 메소드를 정의할 수 있다. JSP에서 메소드 정의는 반드시 태그 내부에서 해야 한다.


 

 

선언문에 변수 선언과 메소드 정의하기

 

 

선언문을 제일 뒤로 위치시켜도 결과는 같다. 위치는 어느 곳이나 상관없지만 관례적으로 HTML 문서 맨 위에 위치시킨다.

메소드 정의는 선언문에서만 가능하지만 벼 수는 선언문과 스크립트릿 모두에서 선언할 수 있다. 그렇다면 이 두 변수의 성격은 같을까?


 

 

 

 

선언문에 선언한 변수와 스크립트릿 변수의 성격 파악하기

 

 

 

위의 페이지가 처음 화면인데 새로 고침을 할 때마다 global_cnt가 1씩 증가한다. 스크립트릿 변수는 4만 출력하는데 반면, 선언문에 선언한 변수는 새로 고침을 할 때마다 1씩 증가하기 때문이다.

서블릿은 첫 번째 요청인 경우에만 서블릿 클래스를 찾아 메모리에 로딩하여 인스턴스(객체)를 생성하고, 이 후에 요청에 대해서는 서블릿 인스턴스를 다시 생헝하지 않고 이미 메모리에 로딩된 서블릿으로부터 서비스만 받는다고 했다.

때문에 필드에 선언된 global_cnt는 새로고침을 여러 번 해도 이미 생성된 필드가 계속 사용되기 때문에 값이 계속 증가하는 것이다. 반면 _jspService() 메소드 내의 지역변수로 선언된 local_cnt는 새로고침을 할 때마다 이 메소드가 호출되면서 0으로 초기화한 후에 1 증가하기 때문에 항상 1만 출력된다.


 

 

 

3. 표현식

브라우저에 HTML 형태로 결과를 출력하기 위해서 스크립트릿 태그 내에 jsp 내장 객체 중 출력 담당 out의 print 메소드를 사용한다.

표현식은 변수의 값이나 계산식 혹은 함수를 호출한 멸과를 문자열 형태로 웹 문서에 출력할 때 사용되는 태그이며, <%=로 시작하여 %>로 끝낸다. 이 사이에 출력하고자 하는 변수나 수식, 메소드 등을 기술한다.

서블릿 컨테이너는 <%=와 %>를 만나면 out.print()로 변한다.


 

 

 

표현식의 사용 예

 

 

조금 전에 풀었던 예제와 결과는 같지만 뒷 부분을 표현식으로 작성한 것이다. 표현식은 결과로 출력할 부분만 보여준다. %>에서 빨간줄이 표시가 되어 왜 그런지 한참 생각했는데 원래 이클립스에서 오류가 날 때가 있다는 걸 알게 되었다. 다시 썼다가 지우면 없어진다. 하지만 여전히 x자 표시가 되어서 신경이 쓰이긴 하다.

 


 

 

 

학습을 마치고

오늘 7교시에 이 내용을 공부하고 있었는데 집중이 잘 되지 않아서 조금 밖에 하지 못했다. 8교시에는 반별 행사가 있어서 공부를 하지 못했고 집에 오자마자 1시간이 넘도록 이 부분을 공부했다.

그리고 운동을 갔다와서 저녁을 먹고 나머지 부분을 마무리해본다. 오늘도 공부할 건 정말 많은데 시간이 너무나도 빨리 지나간다. 이제 공부할 시간이 2시간밖에 남지 않았다. 하지만 유니티까지 공부할 시간은 없을 것 같다. 

 

아마도 지금은 벡엔드 공부에 집중을 하고 유니티는 주말에 시간이 날 때 해야 할 지도 모르겠다. 그래도 정말 꼭 하고 싶다.