[java] 인텔리제이 무료 버전으로 스프링5 MVC개발하기(Maven)

개요top

돈 많은 회사의 직원 분들은 그저 회사에 인텔리제이 얼티밋을 사달라고 하면 해결될지 모르겠지만 우리 같은 서민은 그게 쉽지 않습니다. 다행히 무료버전인 community 에디션이 있죠!

사실 검색을 한참하고 영상이나 자료를 한참 뒤져도 어딘가 이빨이 빠져있거나 옛날 자료인 경우가 대부분이라 최신 버전으로 깨끗하게 설정된 튜토리얼을 찾지 못했습니다. 어쩔 수 없이 차근차근 정리하면서 이 글을 쓰게 되었습니다.

최신 버전(2018.1.1)의 인텔리제이 커뮤니티 에디션을 이용해 차근차근 스프링 5.0 MVC 개발환경을 셋팅해가겠습니다.

1. 다운로드top

https://www.jetbrains.com/idea/download/에 가서 최신버전의 인텔리제이 커뮤니티 버전을 다운로드하여 설치합니다.

2. 빈 프로젝트 생성top

위의 메뉴에서 새로운 프로젝트를 생성하세요.

이어서 뜨는 대화창에서 왼쪽의 Maven을 고르고 SDK는 1.8이상으로 고르시고 Next로 갑니다.

메이븐용 GroupId와 ArtifactId, Version을 적당히 적어주고 Next~

프로젝트 물리 경로를 적당히 잡아주고 Finish 합니다!

3. pom.xml 설정top

Maven프로젝트는 결국 모든걸 Maven으로부터 받아 셋팅하므로 Maven을 셋팅하는 것이 기본입니다. 우선 프로젝트를 만들고 나면 우측하단에 다음과 같은 팝업이 떠있을 것입니다.

귀찮으니까 쿨하게 Enable Auto-Import 를 눌러주세요. 이제 본격적으로 프로젝트 루트에 있는 pom.xml을 편집할 차례입니다. 이 pom.xml을 프로젝트를 생성하고 나면 기본적으로 열려있습니다만 만약 닫으셨다면 아래 경로에서 여시면 됩니다.

열려진 pom.xml은 다음과 비슷하게 거의 아무 내용이 없는 기본 값 상태일 것입니다.

<?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>com.bsidesoft</groupId>
    <artifactId>springMVC5test</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

여기에는 그저 기본적인 프로젝트 정보만 있습니다. 여기에 스프링 의존성을 차근차근 적어줘야 합니다. 머 차근차근이고 나발이고 걍 아래거 카피해서 덮어쓰세요.

<?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>
    <packaging>war</packaging>
    <groupId>com.bsidesoft</groupId>
    <artifactId>bsspring</artifactId>
    <version>0.1</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.5.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>servlet-api</artifactId>
            <version>3.0-alpha-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>
</project>

관심 있으신 분들을 위해 차근차근 해설해보겠습니다.

먼저 실행하기 전에 패키징하는 옵션으로 war를 줬습니다.

dependencies에는 다음과 같은 모듈을 다운받습니다.

  1. spring-webmvc 5.0.5 – 주인공 스프링 MVC입니다. 이 글 작성 시 최신 버전인 5.0.5입니다.
  2. jsp 2.2 – 표준 뷰인 jsp 2.2입니다. jsp나 서블릿은 서버측을 사용하게 되므로 provided 옵션이 들어가 있습니다.
  3. servlet 3.0 – 서블릿 3.0 알파입니다. 웹플럭스는 서블릿 안쓰지만, 스프링 5.0이라도 MVC는 서블릿이니까요.
  4. jackson 2.9.5 – json을 처리하기 위한 잭슨입니다.

이제 빌드 옵션을 살펴보겠습니다.

  1. maven컴파일러 3.6에 자바 SDK 1.8으로 셋팅되어있습니다(10은 애노태이션 에러납니다)
  2. jetty 9.4.9 – 개발 시에는 가볍고 편리한 제티를 사용하고 있습니다. 사실 너무 오래 톰캣을 써와서 다른 걸 쓴 적이 없는데, 최범균님의 4.0책에서 제티를 쓰시길래 저도 적극적으로 개발 프로젝트에서 제티로 셋팅했습니다.

이게 끝입니다. 아까 자동임포트 옵션을 켰으므로 pom.xml을 붙여넣기 하시면 잠시 후 다운로드를 받고 있을 것입니다.

4. 서블릿 스캐폴딩top

제티를 위해 기본적인 폴더 구조를 잡아줍니다. 다음 스크린샷처럼 폴더를 생성해주세요.

주의할 점은 src/main/webapp 이 되도록 잡아야 한다는 점입니다.

5. web.xml 생성top

webapp과 그 밑에 WEB-INF 폴더까지 만들었다면 이제 WEB-INF안에 web.xml을 만들 차례입니다.

이 파일은 제티서버가 서블릿 컨테이너로서 작동하기 위한 기본 설정을 나타냅니다. 여기에는 아래 내용을 복사하세요.

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
         version="3.0">
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </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>

간단히 내용을 살펴보면

  1. spring이란 이름으로 서블릿을 등록하고
  2. 루트경로(/)를 이 서블릿에 매핑해준다.
  3. 루트 이하 모든 URL에 UTF-8인코딩을 적용한다.

고작 이 정도입니다. 더 복잡한 셋팅은 나중에 서블릿 설정에 따라 추가해가시면 됩니다.

6. spring – servlet.xml 생성top

spring이라는 이름으로 서블릿을 등록한 경우 이 서블릿에 대한 자세한 설정을 추가로 해야 하는데, 아무런 인자를 주지 않은 경우의 기본값은 ‘이름-servlet.xml’ 입니다. 이름을 spring으로 주었으니 ‘spring-servlet.xml’ 을 WEB-INF에 추가해줍니다.

일단 파일을 추가했으면 아래 내용을 붙여 넣습니다.

<?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:default-servlet-handler/>
    <context:component-scan base-package="com.bsidesoft.springMVC5test"/>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

이 내용도 관심있는 분들을 위해 간략히 요약하겠습니다.

  1. MVC의 애노태이션을 사용한다 – 클래스에 애노태이션을 선언한 걸로 MVC셋팅을 갈음할 수 있게 합니다.
  2. 컨트롤러가 매핑되지 않은 요청을 기본핸들러로 보내줍니다.
  3. 애노태이션 스캔 범위를 지정합니다.
  4. 여기에서의 뷰리졸버는 jsp를 처리하기 위해 생성되었습니다. 주의할 점은 반드시 id가 viewResolver여야한다는 점입니다.
  5. 뷰리졸버 설정해서 prefix를 /view/로 설정했으므로 앞으로 모든 view는 webapp/view에 들어가야 합니다.

7. Main컨트롤러 제작top

6번에서 애노태이션 스캔 범위를 com.bsidesoft.springMVC5test 로 지정했습니다. 이 패키지에 다음과 같이 Main 클래스를 하나 만듭니다.

위의 경로에서 클래스를 생성하면 나오는 대화창에 아래와 같이 적습니다.

이제 아래와 같이 클래스가 생성되었을 겁니다.

아래 내용을 붙여 넣으세요.

package com.bsidesoft.springMVC5test;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
public class main {
    @RequestMapping(value="/")
    public String index(Model model){
        model.addAttribute("test", "1234");
        return "index";
    }

    @RequestMapping(value="/json", produces = "application/json")
    @ResponseBody
    public Object json(){
        Map<String, String> m = new HashMap<>();
        m.put("test", "1234");
        return m;
    }
}

간략히 설명하겠습니다.

  1. index는 /에 매핑되며 모델의 test키에 1234를 넣고 index뷰를 호출합니다.
  2. /json은 해시맵에 test키로 1234를 넣어 json을 반환합니다.

이 컨트롤러가 정상적으로 작동하려면 index라는 뷰가 있어야합니다.

8. index.jsp 만들기top

컨트롤러가 호출할 index.jsp를 폴더와 함께 생성해주세요.

webapp폴더에서 오른버튼으로 file만들 때 위처럼 걍 서브경로 포함으로 생성하시면 아래와 같이 만들어집니다.

이제 아래 내용을 옮겨주세요.

<%@ page contentType="text/html; charset=utf-8"%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
${test}
</body>
</html>

이로서 기본적인 스프링MVC를 위한 준비가 다 끝났습니다.
마지막으로 실행을 시킬 수 있어야겠죠.

8. 실행설정top

상단 메뉴에서 Run>Edit Configuration으로 들어갑니다. 나오는 대화창의 좌상단 +를 눌러 maven을 선택해줍니다.

일단 선택하고 나면 우측에 대화창이 새롭게 표시되는데 아래와 같이 두 군데를 작성해 주세요.

이름에 jetty, Command line쪽에 jetty:run 이면 끝입니다. ok눌러서 저장합니다. 이제 프로젝트를 실행합니다.

9. 실행 및 구동 확인top

상단 툴바의 실행버튼이나 메뉴의 Run>Run ‘jetty’ 를 이용해 실행해봅시다. 얼추 아래와 같은 실행 로그를 봐야합니다.

9080포트에서 제티가 실행 중이라는 메세지죠. 이제 브라우저를 열어 http://localhost:9080으로 접속합니다.

잘 보이시나요? localhost:9080/json도 접속해보죠.

문제없습니다!

결론top

무료 버전의 인텔리제이에서 간단히 스프링5 MVC에 대한 기본 설정을 잡아 실행해봤습니다. 처음 시작하시는 분들에게 많은 도움이 되시길 바랍니다.