본문 바로가기
Everyday Study

2024.10.07(월) { JSP, 자바 서블릿, View Resolver, 컨텍스트, 절대&상대적URL }

by xogns93 2024. 10. 7.

💡 JSP (JavaServer Pages)

  • 정의: JSP는 HTML 코드 안에 Java 코드를 삽입하여 동적 웹페이지를 생성하는 웹 애플리케이션 도구입니다.
  • 역할: JSP는 주로 프레젠테이션(뷰) 레이어에서 사용되어 클라이언트에게 보여지는 화면을 동적으로 렌더링하는 데 사용됩니다.
  • 장점: HTML 코드 작성이 편리하며, HTML 안에 쉽게 Java 코드를 삽입할 수 있어 웹 디자이너나 프런트엔드 개발자가 작업하기에 용이합니다.
  • 주 용도: 클라이언트에게 동적인 콘텐츠를 보여주는 작업을 담당합니다.

💡 자바 서블릿(Java Servlet)

  • 정의: 서블릿은 웹페이지를 동적으로 생성하기 위한 서버 측 프로그램으로, Java 언어를 기반으로 만들어집니다. 웹 애플리케이션 서버(Web Application Server) 위에서 컴파일되고 실행됩니다.
  • 역할: 서블릿은 주로 비즈니스 로직 처리 및 클라이언트의 요청을 처리하는 역할을 수행하며, HTTP 요청을 받아 적절한 응답을 반환합니다.
  • 단점: 서블릿에서는 자바 코드 내에 HTML 코드를 포함해야 하므로 코드가 복잡하고 가독성이 떨어집니다. 이는 작업 효율성을 저하시킵니다.
  • 주 용도: 클라이언트의 요청을 처리하고, 데이터베이스와 상호작용하는 비즈니스 로직을 처리합니다.

💡 JSP와 서블릿의 차이점

  • JSP: HTML 코드 안에 Java 소스코드를 삽입하는 방식으로 HTML 작성이 간편하며, 화면을 동적으로 렌더링하는 데 적합합니다.
  • 서블릿: 자바 코드 내에 HTML 코드가 삽입되는 방식이기 때문에 읽고 쓰기가 불편하며, 프런트엔드와의 작업 효율성이 떨어집니다.

💡 JSP와 서블릿의 관계

  • JSP는 내부적으로 서블릿으로 변환됩니다. 즉, JSP는 서블릿의 상위 레벨에서 동작하는 기술로, HTML을 다루기 쉽게 해줍니다.
  • JSP는 프레젠테이션(뷰), 서블릿은 비즈니스 로직(컨트롤러) 역할을 수행합니다. 이 두 기술은 MVC 패턴에서 각각 다른 역할을 담당하며, 이를 통해 코드의 유지 보수성과 효율성을 높일 수 있습니다.

 

그러면 HTML 안에 자바 코드 삽입하는게 훨씬 좋은거아닌가?

 

💡 HTML 안에 Java 코드를 삽입하는 장점 (JSP의 장점)

  1. 코드 작성이 직관적: JSP에서는 HTML과 Java 코드를 함께 작성할 수 있어, 화면을 구성하면서 필요한 동적 처리를 쉽게 추가할 수 있습니다. 즉, 디자이너나 프런트엔드 개발자가 HTML을 직접 다루면서 Java 로직을 포함시킬 수 있다는 점에서 직관적입니다.
  2. 빠른 개발: 동적인 웹 페이지를 빠르게 개발할 수 있습니다. 화면 설계와 비즈니스 로직을 한 파일에서 처리할 수 있기 때문에 빠르게 웹 페이지를 생성할 수 있습니다.
  3. UI와 로직을 동시에 처리 가능: 하나의 페이지 안에서 UI 렌더링과 간단한 로직을 동시에 처리할 수 있어, 작은 프로젝트나 단순한 웹 페이지 개발에 유리합니다.

💡 HTML 안에 Java 코드를 삽입하는 단점 (JSP의 단점)

  1. 유지보수가 어려움: HTML과 Java 코드가 한 페이지에 혼합되어 있을 경우, 시간이 지날수록 유지보수가 어렵습니다. 특히, 규모가 커지면 로직과 UI 코드가 뒤섞여 있어서 가독성이 떨어지고, 수정할 때 실수가 발생하기 쉽습니다.
  2. MVC 패턴 위배: JSP에서 Java 코드를 많이 사용하는 경우, 프레젠테이션(뷰) 레이어에 비즈니스 로직이 포함되어 MVC 패턴의 원칙을 위배하게 됩니다. 이로 인해 코드의 구조화가 어려워지고, 재사용성이 떨어지며 테스트하기 어려워집니다.
  3. 복잡한 로직 처리 비효율: JSP에서 복잡한 비즈니스 로직이나 데이터베이스 처리를 포함할 경우, 로직이 지저분해지고 페이지 처리 속도가 느려질 수 있습니다. 이러한 로직은 서블릿이나 서비스 계층에서 처리하는 것이 더 적합합니다.
  4. 테스트 및 디버깅 어려움: JSP는 동적으로 HTML을 생성하기 때문에, 디버깅이 어렵고 코드가 제대로 동작하는지 확인하기 어려운 경우가 많습니다. Java 코드와 HTML 코드가 섞여 있기 때문에, 어느 부분에서 에러가 발생하는지 찾기가 까다로울 수 있습니다.

💡 JSP 대신 사용하는 대안

HTML과 Java 코드를 분리하여 더 나은 구조로 개발하는 방법으로는 다음과 같은 기술들이 있습니다:

  1. JSTL (JavaServer Pages Standard Tag Library): Java 코드를 직접 HTML에 쓰는 대신, JSTL 같은 태그 라이브러리를 사용해 HTML에서 로직을 처리할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.
  2. EL (Expression Language): JSP의 표현 언어로, 간단한 로직을 처리할 수 있으며 Java 코드 대신 사용할 수 있어 HTML 코드가 더 깔끔해집니다.
  3. Spring MVC: MVC 패턴을 적극 활용하여 **서블릿(Controller)**는 비즈니스 로직을 처리하고, **JSP(View)**는 프레젠테이션 역할만 수행하는 구조로 개발할 수 있습니다. 이 방식은 로직과 UI를 명확히 분리하여 유지보수성과 확장성을 높여줍니다.

결론

HTML 안에 Java 코드를 삽입하는 방식(JSP)은 작고 단순한 웹 애플리케이션에서는 빠르게 개발할 수 있는 이점이 있지만, 복잡한 웹 애플리케이션에서는 유지보수가 어렵고 가독성이 떨어질 수 있습니다. 규모가 커질수록 Java 코드와 HTML 코드를 분리하고, MVC 패턴과 같은 구조적인 방법을 사용하는 것이 더 좋습니다.

 


💡 View Resolver = 뷰 템플릿 엔진

View Resolver 스프링 웹 MVC에서 뷰(View)를 찾는 역할을 하는 컴포넌트입니다. 클라이언트 요청이 컨트롤러에서 처리된 후, 그 결과를 화면에 표시하기 위해서는 뷰(View)가 필요합니다. 스프링 MVC는 뷰 리졸버(View Resolver)를 사용해 요청에 맞는 뷰 파일(JSP, Thymeleaf, FreeMarker 등)을 찾아서 렌더링할 수 있도록 돕습니다.

  • 뷰 리졸버 뷰 템플릿 엔진을 사용해 뷰를 결정합니다. 예를 들어, 스프링은 Thymeleaf, JSP, FreeMarker 같은 템플릿 엔진을 지원하며, 이 엔진들이 HTML이나 기타 클라이언트에 반환할 화면을 생성합니다.
  • 뷰 템플릿 엔진은 주로 모델 데이터를 이용해 동적으로 HTML 페이지를 생성하는 데 사용됩니다.

예시:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

위 설정에서 뷰 리졸버 prefix와 suffix를 사용하여 컨트롤러에서 반환한 뷰 이름을 /WEB-INF/views/ 디렉토리의 .jsp 파일로 매핑합니다.

💡 아웃고잉 파라미터(Outgoing Parameter) 인풋 파라미터(Input Parameter)

  • 아웃고잉 파라미터 서버가 클라이언트로 보낼 데이터를 의미합니다. 서버는 이 파라미터를 HTTP 응답의 일부로 보내며, 클라이언트(예: 웹 브라우저)는 이를 수신하여 화면에 표시하거나, 추가적인 동작을 수행할 수 있습니다.
    {
      "status": "success",
      "data": {
        "id": 123,
        "name": "John Doe"
      }
    }
  • 예: API 요청에 대한 JSON 응답의 필드, 서버에서 보내는 쿠키, 헤더 정보 등이 아웃고잉 파라미터에 해당합니다.
  • 인풋 파라미터 클라이언트가 서버로 보내는 데이터를 의미합니다. 클라이언트가 요청을 보내면서 함께 전달하는 데이터는 주로 HTTP 요청 파라미터, 쿼리 스트링, 헤더 정보, 폼 데이터 등을 통해 전달됩니다.
    POST /login
    Content-Type: application/x-www-form-urlencoded
    
    username=johndoe&password=123456
  • 예: 로그인 요청 시 클라이언트가 보내는 사용자 이름 비밀번호가 인풋 파라미터에 해당합니다.

💡 호스트가 URL의 도메인에 매핑

호스트(Host)는 네트워크 상에서 웹 서버를 식별하는 역할을 하며, 도메인 이름으로 매핑됩니다. 도메인은 특정 IP 주소에 대해 사람이 읽기 쉬운 이름을 제공하는 방식입니다.

  • 예를 들어, www.example.com이라는 도메인은 실제로 특정 IP 주소로 매핑됩니다. DNS(Domain Name System) 서버가 도메인 이름을 해당 IP 주소로 변환하여 클라이언트가 해당 서버에 접근할 수 있게 합니다.
  • 호스트는 서버에서 다수의 도메인을 처리할 수 있으며, 이들 각각을 가상 호스트(Virtual Host)라고도 부릅니다. Tomcat 같은 웹 서버에서는 여러 호스트를 설정하여 하나의 서버가 여러 도메인을 처리할 수 있습니다.

예시:

www.example.com이라는 도메인이 IP 주소 192.168.1.1에 매핑되면, 사용자가 브라우저에 www.example.com을 입력할 때 이 도메인은 DNS를 통해 해당 IP 주소로 변환됩니다.

💡 컨텍스트(Context)

컨텍스트(Context)는 웹 애플리케이션에서 애플리케이션의 경로와 관련된 개념으로, 애플리케이션의 고유한 경로를 나타냅니다. 각 웹 애플리케이션은 서버 내에서 고유한 경로를 가질 수 있으며, 이는 URL의 도메인 뒤에 이어지는 경로로 나타납니다.

  • 예를 들어, http://www.example.com/myapp에서 myapp이 바로 컨텍스트 경로(context path)입니다.
  • 컨텍스트는 여러 애플리케이션이 동일한 서버에서 구동될 때, 각 애플리케이션을 구분하는 역할을 합니다.
  • 스프링 웹 애플리케이션에서는 컨텍스트를 통해 각 애플리케이션에 대한 요청을 정확히 처리할 수 있습니다.

예시:

<Context path="/myapp" docBase="/path/to/myapp" />

위 설정에서 myapp은 애플리케이션의 컨텍스트 경로입니다. 즉, 클라이언트는 http://localhost:8080/myapp로 접속하여 해당 애플리케이션에 접근할 수 있습니다.

💡 도메인 생략 == 상대적 URL

도메인 생략 상대적 URL(relative URL)을 의미합니다. 상대적 URL 현재 위치를 기준으로 한 URL로, 도메인(또는 프로토콜) 정보를 포함하지 않고 경로만 명시합니다.

  • 절대 URL 전체 경로를 포함하여 URL을 명시합니다. 예: http://www.example.com/page.html
  • 상대적 URL 현재 페이지를 기준으로 다른 페이지를 참조합니다. 예: /page.html 또는 page.html

예시:

상대적 URL은 현재 페이지의 도메인과 상관없이, 동일한 서버에서의 다른 리소스나 페이지를 참조할 때 유용합니다. 예를 들어, HTML 파일 내에서 다른 페이지로 링크를 걸 때, 상대 경로를 사용하면 동일한 서버 내의 경로에서 올바르게 동작합니다.

결론

  1. View Resolver 뷰 템플릿 엔진을 사용해 클라이언트에 보일 뷰를 결정하는 역할을 합니다.
  2. 아웃고잉 파라미터는 서버에서 클라이언트로 전달되는 데이터, 인풋 파라미터는 클라이언트에서 서버로 전달되는 데이터를 의미합니다.
  3. 호스트는 URL의 도메인과 매핑되며, 도메인 이름을 IP 주소로 변환하는 역할을 합니다.
  4. 컨텍스트는 애플리케이션의 고유 경로로, 서버 내에서 애플리케이션을 구분하는 역할을 합니다.
  5. 도메인 생략 상대적 URL을 의미하며, 도메인 없이 경로만으로 리소스를 참조하는 방식입니다.