[Spring] Intellij로 Spring MVC Web 프로젝트 생성 방법 (Tomcat 서버, Log4j, Model and View 객체 설정)

딱지의겨울

·

2021. 6. 4. 13:14

👾 개발 환경

- 운영체제: macOS BigSur
-  도구: IntelliJ IDEA ULTIMATE (2020.3 ver)
-  프레임워크: Spring + Maven
-  데이터베이스: Oracle

-  서버: Tomcat

 

1️⃣  프로젝트 생성

(1) 'New Project'  'Maven' 프로젝트 선택  'Create from archetype' 항목 체크 → 'webapp' 항목 체크 후 확인

[그림 1.1] Maven webapp 프로젝트 선택

(2) 프로젝트 이름  > 사용할 Maven 지정 후 Finish. 생성 후 pom.xml 이 자동으로 생성된다. 

[그림1.2] Maven webapp 프로젝트 생성 직후 디렉토리 화면 

(3) main/java, resource 폴더가 생성이 안돼있어서 main 폴더 내에 java 디렉토리/resource 디렉토리를 추가했다. 디렉토리 추가를 클릭하면 Maven Source Directories 라고 아래에 뜨는데 거기에 java 폴더 선택 후 생성했다. 

[그림1.3] New Directory 할 때 아래에 뜨는 Maven Source Directories
[그림 1.4] java 폴더 생성 후 화면

(4) 프로젝트 폴더 우클릭 > Add Framework Support > Spring MVC 선택후 추가 

[그림 1.5] Spring MVC 프레임워크 추가
[그림 1.6] Spring Framework 추가 후 생성된 context file

 

 2️⃣  pom.xml  의존성 설정

- Spring, junit, lombok, log4j, servlet, oracle JDBC 등 필요한 라이브러리 의존성 설정 후 maven build 한다. 

<?xml version="1.0" encoding="UTF-8"?>

<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.spdev</groupId>
  <artifactId>spring-test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>spring-test Maven Webapp</name>

  <properties>
    <java-version>1.8</java-version>
    <org.springframework-version>5.2.3.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${org.springframework-version}</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>${org.aspectj-version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${org.slf4j-version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>${org.slf4j-version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${org.slf4j-version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
      <exclusions>
        <exclusion>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
        </exclusion>
        <exclusion>
          <groupId>javax.jms</groupId>
          <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jdmk</groupId>
          <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jmx</groupId>
          <artifactId>jmxri</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <compilerArgument>-Xlint:all</compilerArgument>
          <showWarnings>true</showWarnings>
          <showDeprecation>true</showDeprecation>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

 

3️⃣ log4j 설정

로그를 남기기 위해 사용할 log4j.xml 파일을 resources 폴더에 생성.

📌log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration>
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p: %c - %m%n"/>
        </layout>
    </appender>
    <logger name="org.springframework.core">
        <level value="info"/>
    </logger>
    <logger name="org.springframework.beans">
        <level value="info"/>
    </logger>
    <logger name="org.springframework.context">
        <level value="info"/>
    </logger>
    <logger name="org.springframework.web">
        <level value="info"/>
    </logger>

    <!-- Root Logger -->
    <root>
        <priority value="info"/>
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>

[그림 3.1] log4j.xml 파일 위치

 

4️⃣ Controller 추가 및 설정

(1) web.xml 에서 survlet-mappingurl-pattern/ 로 변경

[그림 4.1] web.xml의 url pattern / 로 변경한 화면

(2) java 폴더에 패키지 생성 > Controller 클래스 추가

[그림 4.2] controller 위치한 패키지 및 컨트롤러 파일 디랙토리

(3) ViewResolver를 위한 views 폴더 추가: /WEB-INF/views/ , index.jsp 파일 이동

[그림 4.3] views 폴더에 index.jsp 파일 위치

📌index.jsp

- Model and View 객체가 ${} (EL 표현식)을 읽어오지 못할 때 isELIgnored 설정을 Fasle 해주면 됨.

<%@page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <%@ page isELIgnored="false" %>
        <title>${title}</title>
    </head>
    <body>
        <h2>${content}</h2>
    </body>
</html>

 

(4) dispatcher-servlet.xml에 component-scan 설정, view 폴더 설정 추가

- mvc:annotation-driven Annotation 활성화

- context:component-scan component packcge 지정

- view resolver 폴더와 파일 형식 지정

- beans 에 각각 추가한 속성에 대한 링크는 꼭 빼먹지 말고 추가시키기. 선언 안되어있으면 "일치하는 와일드 카드 문자가 엄격하게 적용되지만 '----' 요소에 대한 선언을 찾을 수 없습니다." 라고 계속 오류 난다 🥲

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/> <!-- Annotation 활성화 -->
    <context:component-scan base-package="org.sample.controller"/> <!-- Component Package 지정 -->

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

 

(5) SampleController 클래스 작성

📌SampleController.java 

package org.sample.controller;

import lombok.extern.log4j.Log4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@Log4j
public class SampleController {

    @RequestMapping("/")
    public ModelAndView index(){
        log.info("index controller start!!");
        
        ModelAndView mav = new ModelAndView();
        mav.addObject("title", "Spring Test");
        mav.addObject("content", "Hello World!!");
        mav.setViewName("index");
        
        return mav;
    }
}

 

5️⃣ Tomcat 서버 설정 

(1) 화면 오른쪽 상단 'Add Configurations...' 클릭

[그림 5.1] Add Configuration 클릭

(2)  'Templetes' → 'Tomcat Server'  'Local'  'Configure' 선택 후 Tomcat 저장되어있는 경로 지정

[그림 5.2] Tomcat Local > Configure 클릭
[그림 5.3] Tomcat 경로 지정

(3) Tomcat에 현재 프로젝트 추가 

-  화면 오른쪽 상단 'Add Configurations...' → 상단 + 버튼 (Add New Configuration) 클릭

[그림 5.4] + 버튼( Add new configuration )클릭

- Tomcat Server  Local 클릭

[그림 5.5] Tomcat Server > Local 클릭

- 이름 지정

- Deployment tab > + 버튼 클릭 > 현재 프로젝트 선택

- Application Context: / 로 수정

[그림 5.6] Tomcat Deployment 설정

(4) Tomcat 설정 완료 후 화면 상단에 추가된 모습

[그림 5.7] Tomcat 설정 완료 후 화면

 

6️⃣ 실행 

- ${title}, ${content} 데이터가 전달이 된  것을 확인할 수 있다. 

[그림 6.1] 실행하면 뜨는 화면

- Log4j 실행 로그 확인

[그림 6.2] Log4j 사용해서 찍은 log 잘 동작하는 것 확인