[Spring MVC] IntelliJ에서 Project 생성하기

    반응형
    이 글은 더블에스 Devlog 블로그를 참고하여 정리한 내용을 바탕으로 작성한 글입니다.
     

    IntelliJ에서 Spring MVC Project 생성하기 - 더블에스 Devlog

    IntelliJ에서는 STS(Spring Tool Suite)처럼 Spring MVC Project를 생성하는 방법이 따로 존재하는 것 같지 않다. 구글링을 통해 참고한 내용들을 바탕으로 직접 IntelliJ에서 Spring Mvc Project를 생성하는 과정을

    walbatrossw.github.io

    오늘은 인텔리제이에서 Spring MVC 프로젝트를 생성하고 초기 설정하는 과정을 정리해보려 합니다.

    스프링 프로젝트 초기 세팅에 대해 찾아보니 대부분의 자료들이 이클립스를 바탕으로 설명하는 글과 영상들이 많았습니다. 저는 인텔리제이를 사용하고 싶었는데 인텔리제이는 spring configuration 파일을 매핑하는 과정 등이 쉽지 않아서 위 글을 참고하여 인텔리제이 스프랑 프로젝트 생성 방법을 정리해보았습니다.

    1. Maven module 생성

    1. File > New > Modules를 선택하여 새로운 모듈을 생성합니다.

    2. Archetype은 maven-archetype-webapp을 선택하고 GroupId와 ArtifactID를 지정한 후, Create 버튼을 누릅니다.

    그러면 위 이미지처럼 메이븐 프로젝트가 빌드되는 것을 확인하실 수 있습니다.

    2. Spring Framework 추가

    1. 생성한 모듈을 우클릭한 후, add framework support...를 선택합니다.

    2. Spring MVC를 선택합니다.

    그러면 아래처럼 lib에 필요한 jar 파일들이 다운로드되고, xml파일과 기본 경로들이 생성됩니다.

     

    3. 스프링 config 설정

    1. 디렉토리 설정

    • spring configuration 파일을 따로 디렉토리를 생성하여 관리하기 위해 기본 경로 설정을 약간 변경하겠습니다. dispatcher-servlet.xmlapplicationContext.xmlWEB-INF 디엑토리 밑에 spring-config 디렉토리를 생성하여 이동시켜줍니다.
    • 자바 코드와 테스트 코드, resource가 위치할 디렉토리를 생성하고 role을 정의합니다.
      인텔리제이에서 새롭게 디렉토리를 생성할 때 동시에 role을 지정할 수도 있고, 디렉토리를 먼저 만들고 Mark Director as를 선택하여 role을 지정할 수 있습니다.
      src/main/java, src/main/resources, src/test/java, src/test/resources 4개의 디렉토리를 만들어줍니다.

    src
     ├── main
     |    ├── java
     |    ├── resourecs
     |    └── webapp
     |           ├── resources
     |           └── WEB-INF
     |                 ├── spring-config
     |                 └── views
     └── test
          ├── java
          └── resources
    pom.xml

    기본적인 디렉토리 설정을 마치면 위와 같이 세팅됩니다.

    2. pom.xml

    pom.xml은 Project Object Model의 약자로 Maven의 빌드 정보를 담고 있는 파일입니다. (Maven은 자바 프로젝트를 관리하는 툴로, pom.xml 파일을 이용해서 빌드에 필요한 라이브러리를 자동으로 다운로드하고 pom.xml에 지정된 옵션대로 자동으로 빌드해줍니다.) pom.xml에는 다음과 같은 태그들이 있습니다.

    • <project> : Maven의 XML 네임스페이스를 지정
    • <modelVersion> : Maven의 model Version
    • <groupId> : 그룹 ID태그 
    • <artifactId> : 아티팩트ID 태그 
    • <version> : 버전명 태그
    • <packaging> 패키징 형식을 지정하는 태그
    • <name> : 프로젝트의 이름
    • <url> : Maven의 url
    • <properties> : 프로젝트 관련 속성
    • <parent> : pom.xml의 상속에 관련된 태그
    • <dependencies> : 프로젝트가 의존하는 라이브러리들의 정보

    (참고: https://coding-hyeok.tistory.com/47)

    저는 propertiesdependencies, plugins 태그들의 내용을 수정하겠습니다.

    • <properties> 태그 안에 java, spring, aspectj, slf4j의 버전을 명시해줍니다.
    <properties>
      <java-version>1.8</java-version>
      <org.springframework-version>4.3.12.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> 태그 들로 빌드에 필요한 라이브러리를 추가해 줍니다.
    <dependencies>
    
        <!--Spring-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>${org.springframework-version}</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${org.springframework-version}</version>
          <exclusions>
            <!-- Exclude Commons Logging in favor of SLF4j -->
            <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>
    
        <!-- AspectJ -->
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>${org.aspectj-version}</version>
        </dependency>
    
        <!-- Logging -->
        <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.15</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>
          <scope>runtime</scope>
        </dependency>
    
        <!-- @Inject -->
        <dependency>
          <groupId>javax.inject</groupId>
          <artifactId>javax.inject</artifactId>
          <version>1</version>
        </dependency>
    
        <!-- Servlet -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>4.0.1</version>
          <scope>provided</scope>
        </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.13.2</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.4</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter</artifactId>
          <version>RELEASE</version>
          <scope>test</scope>
        </dependency>
        
      </dependencies>
    • <build> 태그 안에 플러그인을 추가합니다.
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <compilerArgument>-Xlint:all</compilerArgument>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>org.test.int1.Main</mainClass>
            </configuration>
        </plugin>
    </plugins>

    3. web.xml

    web.xml은 DD(Deployment Descriptor: 배포 설명자)라고 불리는 웹 어플리케이션 설정 파일입니다. DD는 웹 어플리케이션 실행 시 메모리에 로드됩니다. 즉, web.xml은 웹 어플리케이션을 실행시킬 때 함께 올라가야할 설정들을 정의해놓은 파일입니다.

    web.xml을 다음과 같이 작성해줍니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
        <display-name>Archetype Created Web Application</display-name>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-config/applicationContext.xml</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/spring-config/dispatcher-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>

    4. applicationContext.xml, dispatcher-servlet.xml

    applicationContext.xml은 프로젝트를 진행하면서 수정하고, 지금은 dispatcher-servlet.xml에만 mvc 관련 설정을 추가하도록 하겠습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
           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/>
    
        <!--정적자원 매핑-->
        <mvc:resources mapping="/resources/**" location="/resources/" />
    
        <!--viewResolver 설정-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--기본패키지 설정-->
        <context:component-scan base-package="com.hellomygreenworld.ex00"/>
    
    </beans>

    5.log4j.xml

    src/main/resources에 로그 관련 설정 파일인 log4j.xml파일을 생성하여 다음 코드를 추가합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
        <!-- Appenders -->
        <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>
    
        <!-- Application Loggers -->
        <logger name="com.doubles.mvcboard">
            <level value="info" />
        </logger>
    
        <!-- 3rdparty Loggers -->
        <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>

    4. Tomcat 서버 설정

    1. Run > edit configurations > tomcat server > local을 선택합니다.

    2. Server 탭에서 configure...을 클릭해 tomcat 디렉토리를 넣어주고, port 설정을 해줍니다. (저는 기본 포트인 8080을 그대로 넣어주었습니다.)

    3. Deployment 탭에서 artifact를 war과 war exploded를 모두 추가해줍니다.

    5. 기본/테스트 packages와 views 디렉토리 생성

    앞세어 dispatcher-servlet.xml에 정적자원 매핑과 viewResolver를 설정해주었습니다. 여기에 resources폴더를 매핑하였고, view의 디렉토리는 WEB-INF/views를 매핑시켰습니다. 매핑시킨 디렉토리를 생성합니다.

    1. jsp 페이지가 위치할 WEB-INF/views 디렉토리를 생성합니다.

    2. 정적자원(js, css, 이미지 파일 등)이 위치할 webapp/resources 디렉토리를 생성합니다.

    6. HomeController, home.jsp 작성

    • HomeController
      HomeContoller.java 파일은 dispatcher-servlet.xml에서 설정한 기본 패키지 안에 작성합니다.
    @Controller
    public class HomeController {
    
        @RequestMapping("/")
        public String home(Model model) {
    
            model.addAttribute("greeting", "hello world");
    
            return "home";
        }
    
    }
    • home.jsp
      home.jspviews 디렉토리에 작성합니다.
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Home</title>
    </head>
    <body>
    
    <h2>This is welcome page....</h2>
    
    <p>${greeting}</p>
    
    </body>
    </html>

    서버 구동 후, 다음과 같은 페이지가 나타나면 프로젝트가 제대로 생성된 것입니다!

    반응형

    'Java > Spring' 카테고리의 다른 글

    [Spring MVC] Controller  (0) 2023.01.03
    [Spring MVC] 기본 구조  (0) 2023.01.02
    [Spring] MyBatis와 스프링 연동 (+log4jdbc)  (0) 2023.01.02
    [Spring] JDBC(MySQL) 연결  (0) 2023.01.02
    [Spring] 의존성 주입(DI)  (1) 2022.12.30

    댓글