문홍의 공부장

[IntelliJ] IntelliJ Community 에서 Spring MVC 환경 구축 본문

개발/tools

[IntelliJ] IntelliJ Community 에서 Spring MVC 환경 구축

moonong 2020. 3. 15. 18:50
반응형

IntelliJ에서 Spring MVC 환경을 세팅해보려 한다. 

IntelliJ Ultimate 버전은 Spring을 제공하기 때문에, maven으로 프로젝트 생성 후 Add framework 옵션에서 Spring framework를 선택하면 손쉽게 스프링 환경을 구축할 수 있다. 하지만 내가 이용하는 것은 Community 버전.. 커뮤니티 버전은 스프링을 제공하지 않기 때문에, 손수 한땀 한땀 환경 구축을 해주어야 한다. 

아래 포스팅은 Spring Maven으로 환경 구축하는 내용을 정리해 보았다. 

1. Maven Project 생성 

Project SDK: java jdk 버전이 바르게 설정되어 있는지 확인 후 Next. 

2. 프로젝트 생성 초기 모습

pom.xml이 단촐하게 생성되는 모습이다. 

  • GroupId: 자신의 프로젝트를 식별해주는 고유 아이디 (프로젝트에서 컨트롤하는 도메인 이름과 동일하게 입력)
  • ArtifactId: 버전정보를 생략한 이름(jar). 프로젝트 이름과 동일하게 입력한다. 

아래 경고창에서 Enable Auto-import 를 클릭하여 자동으로 임포트 받는다. 

 

3. pom.xml 설정

pom.xml 에 디펜던시를 주입해준다. 우선 스프링을 위한 가장 기본적인 디펜던시만 설정해주도록 한다. DB 연동을 위한 세팅은 이 이후에 추가할 예정. 

서버는 톰캣을 이용하려고 했는데, 톰캣은 Ultimate 버전에서만 지원이 되는지라.. 톰캣을 자주 써서 어떻게든 톰캣으로 함 해보려고 찾아봤는데 도저히 방법을 찾지 못했다. 대신 jetty 를 이용했다.  

서버 실행 시 인코딩에 대한 에러가 뜬다면 아래 properties 를 하나 더 추가해주면 된다. 

<?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.example</groupId>
    <artifactId>SpringTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
    	<!-- 기본 세팅 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.9.v20180320</version>
                <configuration>
                    <httpConnector>
                        <port>9080</port>
                    </httpConnector>
                    <scanIntervalSeconds>0</scanIntervalSeconds>
                    <webApp>
                        <contextPath>/</contextPath>
                    </webApp>
                </configuration>
            </plugin>

        </plugins>
    </build>

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

 

3. 기본적인 폴더 구조 생성

이 역시 Ultimate 버전에서는 자동으로 생성되는 부분이다. 여기서 몇 번 시행착오를 겪고 있으면 아 차라리 살까.. 하는 생각이 절로 든다. 그래도 참을성을 가지고 한 번 해보자 ^_ㅠ

우선 기본적으로 환경 설정 xml 파일들을 모은 WEB-INF 디렉토리와, View 를 위한 jsp 파일을 모아둘 view 디렉토리만 생성했다. 이미지 파일 등을 모아둘 resource 폴더 역시 추가적으로 생성할 예정이다.  

경로: /src/main/webapp/WEB-INF/

 

 

4. web.xml 설정

spring 이라는 이름으로 서블렛을 등록하고, pram-value로 기본 환경설정 파일인 spring-context.xml 을 넣어주었다. 추가적으로 읽어줘야 할 xml 파일이 생긴다면 여기에 추가시켜주면 된다. 

url 패턴은 / 으로 들어오는 모든 것을 매핑할 수 있도록 설정하였다. 

또한, 인코딩 필터를 추가하여 데이터가 UTF-8 형태로 읽힐 수 있도록 하였다. 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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 https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</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>

 

5. spring-context.xml 설정 

컴포넌트를 스캔할 수 있도록 <context:component-scan> 에 베이스 패키지로 테스트 패키지를 입력하였다. 

resource 접근 위치는 사실 지금은 필요 없지만, 나중을 위해 설정해두었다. 

마지막으로, ViewResolver 에 profix 설정하여 파일 위치를 지정하여 주고, 해당 위치에 있는 .jsp 파일을 읽어들일 수 있도록 suffix 설정하였다.  

<?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"
           xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
           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">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    <context:component-scan base-package="com.test.springTest"/>

    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>
 
 <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- JSON 설정 -->
    <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
        <property name="contentType" value="text/html; charset=UTF-8"/>
    </bean>

    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="0"/>
    </bean>
</beans>

 

6. Controller 설정

MVC의 Controller 부분을 만들 차례다. 간단하게 .jsp 파일을 반환하는 경우와 json 으로 객체를 반환하는 경우 두 가지를 테스트 해보겠다. 

@Controller
public class Main {
    @RequestMapping(value="/")
    public String index(Model model){
        model.addAttribute("test", "Hello world! This is Spring MVC project by using IntelliJ");
        return "index";
    }

    @RequestMapping(value="/json", produces = "application/json")
    @ResponseBody
    public Object json(){
        Map<String, String> map = new HashMap<>();
        map.put("test", "Hello world!(/json) This is Spring MVC project by using IntelliJ");
        return map;
    }

}

 

7. index.jsp 생성 

리턴받을 index.jsp 파일을 간단하게 생성한다. 

여기서 또 Community 버전의 문제점. 커뮤니티 버전은 jsp 파일을 지원하지 않는다.. 뭐, 지원 안된다고 해서 아예 돌아가지 않는 건 아니라 경고창은 그냥 무시하고 진행해도 되기는 하다. 다만 지원이 안되다보니 태그마다 구분해주는 (색깔 같은..) 게 없다보니 가독성은 좀 떨어진다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>index</title>
</head>

<body>
    ${test}
</body>

</html>

 

8. Run Configuration 설정

이제 진짜 마지막 단계다!! Run- Edit Configuration에서 실행 설정을 추가하자. 

 

왼쪽 상단의 + 클릭 - Maven 선택하면, 아래와 같은 창이 뜬다. 여기에 이름은 jetty, 커맨드라인은 jetty:run 이라고 설정하면 끝!!  

 

9. 실행

오케이 버튼을 누르고 나오면 우측 상단에 jetty 실행을 위한 configuration 이 추가된 것을 확인할 수 있다. 초록색 화살표로 run 하거나, shift + F10 단축키를 통해 실행 ! 

 

아래와 같이 Jetty Server가 성공적으로 시작되고, 웹 페이지도 정상적으로 돌아가는 것을 확인할 수 있다. 

반응형