여니의 프로그래밍 study/Spring & Spring Boot

[Spring] 스프링 mvc 시작하기 (Chapter 9)

여니's 2023. 11. 23. 22:30

 

참고 자료 : 초보 개발자를 위한 스프링5 프로그래밍 입문

 


<Chapter9. 스프링 MVC 시작하기>

1. 프로젝트 생성

 

> 스프링을 사용하는 이유는?

: 스프링이 지원하는 웹 MVC 프레임워크 때문이다. 

 

 

> 스프링은 자바 기반의 프레임워크로

자바로 작성된 애플리케이션을 효과적으로 

개발할 수 있도록 도와주는 도구나 프레임워크이다.

 

즉 자바로 집을 지을 때

그 집을 좀 더 효율적으로 지을 수 있도록 하는 도구가

바로 스프링!

 

 

> 이클립스 내에 스프링 프레임워크를 사용하는 과정

 

1. 프로젝트 생성 

2. 스프링 라이브러리 추가

3. 사용자의 요청을 처리하는 컨트롤러 작성

4. 의존성 주입

5. XML 또는 어노테이션 설정

6. 서버에 배포

 

스프링 프레임워크의 핵심인 의존성 주입, 설정관리, 컨트롤러 등의

기능을 활용하여 웹 애플리케이션을 개발하고 실행할 수 있음

 

 

> Maven Archetype > Name 수정

> Archetype 클릭 

 

Maven Archetype은

Maven 프로젝트의 템플릿이나 모범사례를 정의하는

일종의 프로젝트 템플릿을 의미함. 

 

 

Create 클릭

 

 

SpringMVC (프로젝트명) > 마우스 오른쪽 버튼 클릭 > 

Add Frameworks Support 클릭 > Spring이 있어야하지만

없으니 다른 방법으로 시도

 

 

 

SpringMVC (프로젝트명) > 오른쪽 마우스 버튼 클릭 > 

Open Module Settings > Libraries

> Maven junit 위쪽에 있는 + 버튼 클릭 >

From Maven 클릭 >

spring-mvc 입력 후 검색버튼 클릭

 

 

 

------....

이렇게 진행하고

Add Frameworks Support 클릭했는데..

그래도 안된다...

원인은 바로 커뮤니티 버전이어서...

 

 

그래서 커뮤니티 버전을 삭제하고

얼티메이트 버전으로 다시 다운로드하였다..

 

 

 

인텔리제이 얼티메이트 버전을 다운로드 받고

JDK 를 11 버전으로 다운로드 받는다

 

https://code-lab1.tistory.com/256

 

맥북(macOS) m1 자바(JDK 17) 다운로드 하기

맥북 m1 자바(JDK 17) 다운로드 Intel 맥북의 경우는 상관 없지만, m1은 Oracle Java 11버전을 지원하지 않는다. 따라서 Oracle Java가 아닌 다른 Java를 설치하는 식으로 Java를 사용했다. 하지만 Java 17버전 부

code-lab1.tistory.com

 

오라클 홈페이지에서..

 

 

 

11 버전을 설치하고

터미널을 열어 java --version을 입력하였으나

여전히 21..... ㅂㄷㅂㄷㅂㄷㄷ

 

그래서 구글링해보니

버전을 변경해줘야한다고 함.

 

https://studee.tistory.com/85

 

[Spring] Mac os에 Java 11과 IntelliJ 설치

JAVA 설치 1. https://www.oracle.com/kr/java/technologies/javase-jdk11-downloads.html 이동 2. macOS Installer의 jdk 다운로드 - JDK : Java Development Kit 자바로 소프트웨어를 개발할 수 있도록 기능을 담을 패키지 3. 오라클

studee.tistory.com

 

 

자바 11버전으로 변경되었음을 확인!

 

 

 

JDK... 클릭

 

 

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

 

위 주소까지 들어온 후에 Open 버튼 클릭

 

 

 

Create 버튼 클릭하면 아래와 같이 화면이 뜨게 된다. 

 

 

 

이제 Spring을 설치하려고

프로젝트 오른쪽 버튼 클릭 >

Add Framework Support 탭을 찾아보았으나

사라졌다...

 

윈도우에서는 잘 뜬다는데

맥에서만 난리..

 

맥에서는 단축키를 통해 검색해야 실행이 가능하단다..

Cmd + Shift + A > Add Framework Support 검색하여 실행

 

 

 

Java EE > Web 클릭 후 OK 버튼 클릭

 

 

 

Web 폴더가 생성되었음을 확인할 수 있다.

 

 


 

src/main/java

> 비즈니스 로직

 

src/main/web

> HTML, CSS, JS, JSP .. 

 

src/main/web/WEB-INF

> Web.xml

 

src/main/web/WEB-INF/view >

메이븐이나 그레이들 프로젝트

 

> jar 파일은 pom.xml/build.gradle 파일의 의존을 통해 지정하고

컴파일된 결과는 target 폴더나 build 폴더에 위치한다. 

따라서 WEB-INF 폴더 밑에 Lib 폴더나 classes 폴더를 생성할 필요가 없다.

 

 

pom.xml에서

<packaging>의 기본값은 Jar

서블릿/jsp를 이용한 웹 어플리케이션을 개발할 경우

war 값으로 줘야한다.

(war : web application archieve)

 

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springProject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springProject</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

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

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.2-b02</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>11</source>
          <target>11</target>
          <encoding>utf-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

 

 

pom.xml 내용 수정 후 Maven Update 진행

 


 

2. 이클립스 톰캣 설정

 

Run > Edit Configurations > 

 

 

Add new > Tomcat server > local 클릭

 

 

 

아래의 주소에서 톰캣 버전을 선택하여 

다운로드 해줍니다.

 

https://tomcat.apache.org/download-90.cgi

 

Apache Tomcat® - Apache Tomcat 9 Software Downloads

Welcome to the Apache Tomcat® 9.x software download page. This page provides download links for obtaining the latest version of Tomcat 9.0.x software, as well as links to the archives of older releases. Unsure which version you need? Specification version

tomcat.apache.org

 

맥북은 Core > tar.gz 다운로드!

 

압축 폴더로 다운로드 되기 때문에

압축을 풀어줍니다.

 

 

그리고 Server > Configure 에서

압축을 푼 폴더를 선택 후 OK

 

 

 

Application context > /로 변경한다. 

디폴트값은 /프로젝트명으로 설정되어있다.

 

톰캣에서 웹 애플리케이션의 컨텍스트 경로는 (Context path)

해당 애플리케이션이 웹 서버에 배포될 때의 URL 경로를 나타낸다. 

 

애플리케이션의 루트 경로를 사용하고 싶을 땐

컨텍스트 경로를

/로 변경한다. 

 

/로 변경을 하는 이유는 3가지가 있다.

1. 루트 경로에서 직접 접근 가능

: 애플리케이션은 웹 서버의 루트 경로에서

직접 접근할 수 있다.

(http://localhost:8080/)

 

2. 간결한 URL

 

3. 웹 서버 설정 간소화

: 웹 서버에서 가상 호스트를 설정할 때

루트 경로로 직접 접근하는 것이

설정을 단순화할 수 있다. 

 

 


 

3. 스프링 MVC를 위한 설정

1) 스프링 MVC 설정

 

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc // 스프링 MVC 설정 활성화
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/view/", ".jsp");
    }
}

 

 

@EnableWebMvc

> 스프링 MVC를 사용하는데 필요한 기본적인 구성을 설정해줌

 

WebMvcConfigurer 인터페이스

> 스프링 MVC의 개별 설정을 조정할 때 사용함

 

 

 

2) 스프링의 DispatcherServlet 설정

> 스프링 MVC가 웹 요청을 처리하려면

DispatthcerServlet을 통해

웹 요청을 받아야한다.

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>dispatcher</servlet-name> <!--Dispatcher 이름 등록-->
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextClass</param-name> <!-- contextClass 초기화 파라미터 설정 (AnnotationConfigWebApplicationContext) -->
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name> <!-- contextConfiguration 초기화 파라미터의 값을 지정함 -->
            <param-value> <!-- 스프링 설정 클래스 목록을 지정한다 -->
                config.MvcConfig
                config.ControllerConfig
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup> <!-- 톰캣 같은 컨테이너가 웹애플리케이션 구동 시 이 서블릿을 함께 실행하도록 설정 -->
    </servlet>

    <servlet-mapping> <!-- 모든 요청을 DispatcherServlet이 처리하도록 서블릿 맵핑 -->
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>encodingFilter</filter-name> <!-- 인코딩 처리 필터 설정 -->
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

 

 

DispatcherServlet은 초기화하는 과정에서

contextConfiguration 초기화 파라미터에 지정한 설정 파일을 이용하여

스프링 컨테이너를 초기화한다. 

 

 

3) 코드 구현

- 클라이언트의 요청을 알맞게 처리할 컨트롤러

 

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

@Controller
public class HelloController {

    @GetMapping("/hello") // 메서드가 처리할 요청 경로를 지정함
    // /hello 경로로 들어온 요청을 hello() 메서드를 이용하여 처리한다고 설정함
    public String hello(Model model, @RequestParam(value="name",required=false) String name) {
        model.addAttribute("greeting","안녕하세요" + name);
        return "hello";
    }
}

 

 

- Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달할 때 사용함

- @RequestParam 어노테이션은 HTTP 요청 파라미터의 값을 

메서드의 파라미터 값으로 전달할 때 사용한다. 

name 요청 파라미터의 값을 name 파라미터에 전달함

 

@RequestParam(value="name",required=false) String name

 

 

value="name" > 요청 파라미터의 이름

즉 클라이언트가 전송한 HTTP 요청에서 

name이라는 이름의 파라미터값을 가져와서

메서드의 name 매개변수에 값을 할당한다.

 

 

required=false > 

해당 파라미터가 반드시 요청에 포함되어야하는지에 대한 여부

요청 파라미터를 메서드의 name 매개변수에 바인딩하며

만약 해당 파라미터가 요청에 없으면 name 변수는 Null로 설정된다.

(요청이 없더라도 오류가 발생하지 않음)

 

 

하지만 required=true로 설정하면

해당 파라미터가 반드시 요청에 포함되어야 하며

요청에 해당 파라미터가 없을 경우 예외가 발생함

 

 

? 컨트롤러란?

: 웹 요청을 처리하고 그 결과를 뷰에 전달하는 스프링 빈 객체이다. 

@GetMapping, @PostMapping 어노테이션과 같은

요청 매핑 어노테이션을 이용하여

처리할 경로를 지정해줘야 한다.

 

 

컨트롤러 구현 후

해당 컨트롤러를 스프링 빈으로 등록해줘야한다

 

package config;

import org.springframework.context.annotation.Bean;

public class ControllerConfig {

    @Bean
    public HelloController helloController(){
        return new HelloController();
    }
}

 

 

하지만 cannot find symbol class HelloController 에러가 나서

확인해보니 클래스 import가 되어 있지 않아서

자동 Import 설정 셋팅해줌

 

 

 

 

- 처리 결과를 보여줄 JSP

> 컨트롤러가 생성한 결과를 보여줄 뷰 코드 생성

 

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
    <html>
    <head>
        <title>Hello</title>
    </head>
    <body>
    인사말: ${greeting}
    </body>
</html>

 

 

위와 같이 yeony라는 값을 클라이언트로부터 받아

컨트롤러를 통해 뷰에 표출하기 성공

 

 

 

404에러가 나서 경로를 확인해보니

경로가 제대로 지정되어 있지 않아서 발생했던 문제

 

 

Web Resource Directory 확인해보기*