TIL

[IntelliJ] MacOS에서 IntelliJ 로 스프링 MVC 프로젝트 만들기

무모한 폴라베어 2021. 1. 16. 18:10

 

IntelliJ IDEA

 

Spring Framework

 

 

처음 Java를 통한 웹 개발을 배웠을 때 흔히 사용하는 Eclipse를 사용했는데 선생님이 IntelliJ를 극찬하셔서 접하게 되었다. IntelliJ의 사용경험이 적어서 장단점을 잘 모르지만 혼자 개발 공부를 할 때는 IntelliJ를 사용하려고 했는데 이거 사용법이 만만치 않았다. 흔히 사용하는 스프링은 설정이 반이다 라는 말이 있을 정도로 초기 설정이 까다로운데 새로운 IDE로 하려니 쉽지 않았다. 오랜 시간 들여서 마침내 성공한 거라 기록하기로 했다. 

 

 

목표 : IntelliJ 로 Spring MVC 프로젝트를 만들고 Tomcat 서버와 연결해서  Hello World 출력하기

 

 

개발환경 : macOS Big Sur 11.1

사용 툴 : IntelliJ IDEA 2020.3.1

사용언어 : Java 1.8

사용 서버 : Tomcat 9.0.34

 

 

 

 

1. 새로운 프로젝트를 만들어준다. 

 

 

 

 

 

 

 

2. Maven 프로젝트로 설정해준다.

 

프로젝트를 만들면서 정말 많은 블로그들을 찾아봤지만, 이 부분은 많이 갈리는 것 같다. 대부분 왼쪽 선택창에서 Spring으로 선택해주면 하위 메뉴로 Spring MVC 가 나와서 그렇게 많이 초기에 설정하시던데 글을 쓴 시점이 옛날이어서 그런지 내 IntelliJ 버전이 달라서 그런지 난 찾을 수 없어서 어쩔 수 없이 Maven으로 만들어 주기로 했다. Maven으로 만들어서 버전 관리를 해줄 것이다.

 

 

 

 

 

 

Name 에는 자기가 원하는 프로젝트의 이름을 입력하면 되고 (ArtifactId 랑 같다.) GroupId 에는 보통 회사 도메인 같은 것을 주로 작성한다고 한다. 처음에 왜 항상 앞에 com 이란 단어를 붙이나 했더니 알고 보니 company의 com이었다. 난 개인 프로젝트 이기 때문에 내가 작성하고 싶은 대로 작성했다. 하지만 가급적 목적이나 용도에 맞게 작성하는 것이 좋다. 가장 밑의 Version 은 자동으로 작성되는데 SNAPSHOT 은 개발 버전을 의미한다고 한다. 딱히 건드릴 이유가 없어서 그대로 놔뒀다.

 

 

 

 

 

 

 

설정을 완료하면 나오는 첫 번째 화면이다. 

 

 

 

 

 

 

 

4. 프로젝트 이름에서 우클릭을 해서 Add FrameWork Support를 선택해준다,

 

처음에 Maven 프로젝트로 만들었지만 우리의 목표는 Spring MVC 프로젝트를 만드는 것이다. 그래서 수동으로 라이브러리를 추가해준다.

 

 

 

 

 

 

 

2021년 1월 기준으로 자동으로 Spring MVC 5.2.3. 버전을 다운로드하여준다. 버전은 나중에도 얼마든지 바꿀수 있으므로 일단 Intelli가 자동으로 설정해준 버전을 클릭하면 알아서 다운받아 줄 것이다.

 

 

 

 

 

 

 

다운로드가 끝나면 왼쪽 메뉴에 lib 폴더와 web 폴더가 생긴 것을 볼 수 있다. Eclipse를 썼을 때 lib 폴더가 각종 jar 파일을 넣었고

web 폴더는 webapp이란 이름이었는데 views 파일과 Spring 설정 파일들을 관리하는 폴더였다. 비록 IntelliJ를 사용하지만 개발환경은 

익숙한 Eclipse처럼 변경해서 진행할 것이다. 추측이긴 하지만 자바 백엔드 개발자를 준비하는 사람이면 Eclipse로 입문해서 intelliJ 같은 다른 IDE 툴로 넘어가지 않을까 싶다. 왜냐면 Eclipse는 무료지만 IntelliJ는 학생 신분이라면 구매하기 부담스러운 금액이기 때문이다.

 

 

 

 

 

 

 

위에서 말한 대로 폴더 이름과 새로운 폴더를 생성하는 단계이다.

web폴더를 더블클릭 -> WEB-INF에서 우클릭 -> new -> directory를 선택해도 되고

WEB-INF에서 command + n를 누르고 All 탭에서 directory를 검색하고 스크린숏에 보이는 메뉴를 눌러줘도 된다.

IntelliJ는 단축키를 활용하면 더 효율적으로 사용할 수 있다길래 단축키를 활용하는 습관을 들이려고 노력하는 중이다.

 

 

 

 

 

 

 

스크린샷 처럼 spring 디렉토리와 appServlet디렉토리를 만들어주고 applicationContext.xml 와 dispatcher-servlet.xml을 아래로 옮겨준다. 설정 파일이 한 곳에 있는 것이 더 깔끔하고 관리하기도 쉽다고 생각해서 한 곳으로 모아줬다. 이대로 모아놓는 것을 원하지 않는다면 굳이 할 필요는 없다. 

두 개의 파일을 드래그해서 옮겨도 되지만, 

 

 

 

 파일을 선택한 다음  fn + F6를 통해서 옮길 수도 있다. 디렉터리를 만들지 않은 상태에서 스크린샷처럼 입력하면 IntelliJ가

자동으로 만들어준다. IntellJ가 편하다는 말이 조금씩 와 닿는 중이다.

참고로 Eclipse에서

applicationContext.xml root-context.xml

dispatcher-servlet.xml servlet-context.xml 란 이름으로 만들어진다.

 

 

 

 

 

 

 

 

 

 

 

5. Java 버전 설정을 해준다. 

 

총 3군데에서 설정을 해줘야 한다. 맥에서 가장 상단에 보이는 메뉴에서 File - Project Structure을 선택해줘도 되고 프로젝트를 클릭한 상태에서  command + ;  를 눌러줘도 설정할 수 있다. 

 

 

 

원래는 pom.xml도 이것저것 추가해야 하지만 오늘의 목표는 "Hello World 출력하기" 이기 때문에 추가하지 않는다.

 

<?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">
    <!--  root-context / applicationContext  -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/applicationContext.xml</param-value>
    </context-param>


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--  servlet-context / dispatcherServlet  -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!-- encoding filter -->
    <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>

 

 

6. web.xml을 수정해준다.

 

 

주요 부분을 설명하자면, 

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/applicationContext.xml</param-value>
    </context-param>

이 부분을, 

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/applicationContext.xml</param-value>
    </context-param>

 

이런 게 바꿔준다.

 

아까 디렉토리를 바꿔준 부분을 등록하는 부분이다. 원하는 대로 바꿔주면 된다.

 

 

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

이 부분을,

    <!--  servlet-context / dispatcherServlet  -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

 

이렇게 바꿔준다.

 

<servlet>과 <servlet-mapping> 은 세트로 작성해야 한다. 서블릿을 작성하고 매핑까지 해줘야 하기 때문이다.

 

 

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/dispatcher-servlet.xml</param-value>
        </init-param>

 

<servlet> 태그 안의 <Init-param>을 통해서 아까 설정해준 dispatcher-servlet.xml의 위치를 작성해준다.

<filter> 부분은 한글을 볼 수 있게 해주는 인코딩 설정 부분이다.

 

 

 

 

 

<?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">

    <!-- This tag registers the DefaultAnnotationHandlerMapping and AnnotationMethodHandlerAdapter beans that are required for Spring MVC  -->
    <mvc:annotation-driven />
    
    <!-- This tag allows for mapping the DispatcherServlet to "/" -->
    <mvc:default-servlet-handler />

    <!-- Process annotations on registered beans like @Autowired... -->
    <context:annotation-config/>

    <!-- 컴포넌트 스캔 -->
    <context:component-scan base-package="com.test.controller" />

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

 

 

7. dispatcher-servlet.xml을 수정해준다.

 

 

component-scan의 base-package 부분은 src -> main -> java 밑에 원하는 package를 생성하고 그 이름을 넣으면 된다.

spring에게 이 패키지부터 탐색해서 시작한 부분부터 컴포넌트 클래스를 스캔하여 Bean으로 등록하라고 알려주는 부분이다.

<viewResolver>에서 작성한 대로 WEB-INF 밑에  views 디렉토리를 만들어준다. 

 

 

 

 

 

package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/hello")
    public String home(){

        return "index";
    }
}

HomeController.java

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Hello World!</title>
  </head>
  <body>

    <h1>Hello World</h1>


  </body>
</html>

index.jsp

 

8. 기본 컨트롤러와 WEB-INF 밑에  views 디렉토리를 만들고 jsp파일을 만든다.

 

 

 

 

 

이제 Tomcat을 연결하는 부분이다. 나는 공부할 때부터 사용했던 9.0.34 버전을 사용했다.

 

 

 

 

 

먼저 project structure에서 Artifact를 먼저 만들어준다. Maven을 통해서 만들어진 결과물을 베포 하는 파일을 설정하는 부분인데 개발지식이 적기도 했고 새로운 IDE를 사용해서 오류가 굉장히 많이 났다. 개발자의 기본소양은 로그를 보고 에러를 분석하는 능력이라던데 기본이지만 항상 에러는 어렵고 항상 원인을 찾기 힘들다. 아직까지 왜 제대로 동작을 안 했는지 이유는 모르지만 최소한 어떻게 하면 제대로 동작하는지 알았으니까 이걸로 된 걸까..?

 

 

 

 

Artifact 작성 완료.

 

 

 

 

 

이제 Tomcat과 연결해준다.

 

 

 

 

Templates 메뉴를 따라서 쭉 내려가다 보면 Tomcat Server가 보일 것이다. (TomEE Server 아님!!!)

우리는 Local에서 돌릴 것이기 때문에 Local까지 선택해준다.

 

 

 

 

여기까지 잘 따라 했다면 Artifact가 없다는 메시지가 뜰 것이다. 바로 이때 위에서 만들어준 것을 등록해줘야한다. 

 

 

 

 

+ 를 눌러서 추가해주거나 혹은 fix 버튼을 눌러서 아까 만들어 준것을 그대로 추가해준다. application context에는 컨트롤러에서 정의해준 대로 hello를 url에 추가해주면 index가 나오게 작성해줬기 때문에 기존의 것을 지우고 / 를 추가해준다. 

 

 

 

 

 

다 추가해준 다음 Build 해주고 실행시키면 아까 작성한 index.jsp 가 나올 것이다!