Spring MVC Example - HelloWorld!

개ant미·2024년 2월 15일
0

Spring

목록 보기
4/7

저번 포스팅에서는 DAO와 지속성 개발에 대한 좋은 예시와 방법에 대하여 알아보았다. 이반 포스팅에서는 IntelliJ에서 Maven build tool을 사용하여 Hello World를 출력하는 Spring MVC 애플리케이션을 만들어 볼 예정이다.

HelloWorld의 흐름

포스팅 1번에서 Spring MVC가 내부적으로 돌아가는 흐름를 배웠다. 그렇다면 Hello World를 출력하기 위해서는 어떤 흐름으로 애플리케이션이 돌아갈까?

  1. 브라우저에서 요청을 받으면 DispateherServlet로 요청을 받는다.
  2. 어떤 Controller를 사용해야 하는지 모름으로 DispateherServlet 는 HandderMapper로 요청을 보내어 URL이 mapping 되는 Controller를 찾은후 반환한다
  3. DispateherServlet는 이제 어떤 Controller를 사용해야 하는지 알고 있으므로 해당 Controller에 요청하여 Model (MAV)를 반환 받는다
  4. DispateherServlet는 ViewResolver에서 logical view와 physical view를 연결하여 actual view를 반환한다
  5. DispateherServlet에서 View로 이동하여 actual view, model, form을 합쳐 사용자에게 보여줄 페이지를 반환한다.

개발 순서

  1. Meaven 웹 어플리케이션 생성
  2. 의존성 주입 - pom.xml 파일
  3. 프로젝트 구조도
  4. Spring 구성 - AppConfig.java
  5. Servlet 컨테이너 초기화 - SpringMvcDispatcherServletInitializer.java
  6. Model Class - HelloWorld.java
  7. Controller Class - HelloWorldController.java
  8. View - helloworld.jsp
  9. Build + Deploy + Run an application
  10. 결과 화면

연습 시작

1. Meaven 웹 어플리케이션 생성

2. 의존성 주입 - pom.xml

    
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>net.javaguides.springmvc</groupId>
	<artifactId>springmvc5-helloworld-exmaple</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>springmvc5-helloworld-exmaple Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<failOnMissingWebXml>false</failOnMissingWebXml>
	</properties>
	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>5.1.0.RELEASE</version>
		</dependency>

		<!-- JSTL Dependency -->
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>javax.servlet.jsp.jstl-api</artifactId>
			<version>1.2.1</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>

		<!-- Servlet Dependency -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

		<!-- JSP Dependency -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.1</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	<build>
		<sourceDirectory>src/main/java</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
의존성기능
1JSTLJava 코드를 바로 사용하지 않고 HTML 태그(<>) 형태로 직관적인 코딩을 지원하는 라이브러리
2ServletServlet은 View 부분과 Control 부분을 분리해서 독립적인 작업을 할 수 있는 기본적인 구조
자바를 사용하여 웹페이지를 동적으로 생성하는 서버의 프로그램
3JSPHTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹어플리케이션 도구

Servlet & JSP는 응답속도가 빠르기 때문에 많은 곳에서 사용되고 있다.

Spring MVC 애플리케이션을 사용하기 위해서 spring-webmvc 의존성을 사용한다

3. 프로젝트 구조도

인텔리제이 스크린샷

지속성 또는 DAO 개발의 좋은 예시처럼 각자의 이름에 맞는 package 안에 클래스가 들어있다.
프로젝트 구조도에서 MVC를 찾아 볼 수 있다

modelviewcontroller
HelloWorldhelloworld.jspHelloWorldController

4. Spring 구성 - AppConfig.java

자바를 사용하여 Spring Bean을 구성

Bean 이란?

  • Spring container에 의해 관리 되는 자바 객체
package net.javaguides.springmvc.helloworld.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

/**
 * @author Ramesh Fadatare
 */

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "net.javaguides.springmvc.helloworld" })
public class AppConfig {

	@Bean
	public InternalResourceViewResolver resolver() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setViewClass(JstlView.class);
		resolver.setPrefix("/WEB-INF/views/");
		resolver.setSuffix(".jsp");
		return resolver;
	}

}

@(annotation)의 이름과 의미

이름의미
@Configuration1. @Configuration을 사용하여 Bean을 수동으로 등록할 수 있음
2. Bean을 등록할 때 싱글톤(singleton = 한 번만 작동하게)이 되도록 보장해준다
@EnableWebMvc기본 Spring 구성을 활성화하고 XML인 mvc:annotation-driven/ element도 동등한 기능
@ComponentScanannotation이 부여된 클래스 들을 자동으로 Scan하여 Bean으로 등록해준다

InternalResourceViewResolver

  • InternalResourceViewResolver는 ViewResolver이다. ViewResolver는 경로를 만들어 주는 역할을 해주며 해당 코드에서는 prefix와 suffix를 사용하여 URL 경로를 만들어 주고 있다.
  • 해당 코드에서는 /WEB-INF/views/ 하위에 jsp(.jsp) 페이지로 URL을 나타내고 있으며 코드에서는 helloworld.jsp를 사용하고 있기 때문에 /WEB-INF/views/helloworld.jsp로 URL 경로가 지정될 것이다.

5. Servlet 컨테이너 초기화 - SpringMvcDispatcherServletInitializer.java

package net.javaguides.springmvc.helloworld.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * @author Ramesh Fadatare
 */
public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return null;
	}
 
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class[] { AppConfig.class };
	}
 
	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}
 
}
 

해당 클래스에서는 DispatcherServlet를 정의하고 URL를 매핑시킨다.
AbstractAnnotationConfigDispatcherServletInitializer(DispatcherServlet & ContextLoaderListner를 생성)를 확장하여 (Java로 셋팅한다) SpringMvcDispatcherServletInitializer 클래스를 만든다.

6. Model Class - HelloWorld.java


package net.javaguides.springmvc.helloworld.model;

public class HelloWorld {

	private String message;
	private String dateTime;
    
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getDateTime() {
		return dateTime;
	}
	public void setDateTime(String dateTime) {
		this.dateTime = dateTime;
	}
}

현재 Model( HelloWorld.java )에서는 message와 dateTime의 필드가 있다. Model은 데이터를 세팅해주고 getter, setter 를 사용하여 데이터를 요청, 수정하는 부분을 설정한다. ( lombok을 사용하면 편리하다)

7. Controller Class - HelloWorldController.java

package net.javaguides.springmvc.helloworld.controller;

import java.time.LocalDateTime;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import net.javaguides.springmvc.helloworld.model.HelloWorld;

/**
 * @author Ramesh Fadatare
 */
@Controller
public class HelloWorldController {

	@RequestMapping("/helloworld")
	public String handler(Model model) {
		
		HelloWorld helloWorld = new HelloWorld();
		helloWorld.setMessage("Hello World Example Using Spring MVC 5!!!");
		helloWorld.setDateTime(LocalDateTime.now().toString());
		model.addAttribute("helloWorld", helloWorld);
		return "helloworld";
	}
}

@Controller annotation를 사용하여 Spring에서 Controller를 지정해준다.
@RequestMapping("/helloworld")은 URL에서 /helloworld로 들어오는 주소를 일괄적으로 Mappding시킨다. 하위의 요소들은 /helloworld를 반복하여 작성하지 않아도 된다.

handler 메소드에서는 Model 데이터를 사용하여 massage 와 DateTime에 값을 넣고 model.addAttribute()를 이용해 model에 데이터를 추가한다.
첫번째 파라미터는 jsp파일의 이름(Key 값)이고 두번째 파라미터는 생성한 객체의 이름(Value)다.

8. View - helloworld.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="ISO-8859-1">
    <title>Spring 5 MVC - Hello World Example | javaguides.net</title>
  </head>
  <body>
      <h2>${helloWorld.message}</h2>
      <h4>Server date time is : ${helloWorld.dateTime}</h4>
  </body>
</html>

JSP 사용하여 자바를 사용하여 동적으로 웹페이지를 구성 가능

동적? 정적?
동적 (dynamic) : 상황에 따라서 실시간으로 변하는 성질
정적 (static) : 한번 정해놓으면 변하지 않고 계속해서 유지되는 성질

9. Build + Deploy + Run an application

tomcat을 사용하여 실행

10. 결과 화면


마무리

  • 실습 따라 해보기
  • Spring MVC가 동작하는 흐름 이해
  • 코드 다시 한 번보고 이해하기

참고 자료

https://www.javaguides.net/2018/10/spring-mvc-5-hello-world-example.html
https://blogshine.tistory.com/551
https://gypark-dev.tistory.com/26
https://sunnyroad.tistory.com/21
https://heytech.tistory.com/190

profile
지식을 채워가는 습관 만들기

0개의 댓글