저번 포스팅에서는 DAO와 지속성 개발에 대한 좋은 예시와 방법에 대하여 알아보았다. 이반 포스팅에서는 IntelliJ에서 Maven build tool을 사용하여 Hello World를 출력하는 Spring MVC 애플리케이션을 만들어 볼 예정이다.
포스팅 1번에서 Spring MVC가 내부적으로 돌아가는 흐름를 배웠다. 그렇다면 Hello World를 출력하기 위해서는 어떤 흐름으로 애플리케이션이 돌아갈까?
<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>
의존성 | 기능 | |
---|---|---|
1 | JSTL | Java 코드를 바로 사용하지 않고 HTML 태그(<>) 형태로 직관적인 코딩을 지원하는 라이브러리 |
2 | Servlet | Servlet은 View 부분과 Control 부분을 분리해서 독립적인 작업을 할 수 있는 기본적인 구조 |
자바를 사용하여 웹페이지를 동적으로 생성하는 서버의 프로그램 | ||
3 | JSP | HTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹어플리케이션 도구 |
Servlet & JSP는 응답속도가 빠르기 때문에 많은 곳에서 사용되고 있다.
Spring MVC 애플리케이션을 사용하기 위해서 spring-webmvc 의존성을 사용한다
지속성 또는 DAO 개발의 좋은 예시처럼 각자의 이름에 맞는 package 안에 클래스가 들어있다.
프로젝트 구조도에서 MVC를 찾아 볼 수 있다
model | view | controller |
---|---|---|
HelloWorld | helloworld.jsp | HelloWorldController |
자바를 사용하여 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;
}
}
이름 | 의미 |
---|---|
@Configuration | 1. @Configuration을 사용하여 Bean을 수동으로 등록할 수 있음 |
2. Bean을 등록할 때 싱글톤(singleton = 한 번만 작동하게)이 되도록 보장해준다 | |
@EnableWebMvc | 기본 Spring 구성을 활성화하고 XML인 mvc:annotation-driven/ element도 동등한 기능 |
@ComponentScan | annotation이 부여된 클래스 들을 자동으로 Scan하여 Bean으로 등록해준다 |
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 클래스를 만든다.
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을 사용하면 편리하다)
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)다.
<%@ 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) : 한번 정해놓으면 변하지 않고 계속해서 유지되는 성질
tomcat을 사용하여 실행
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