본문 바로가기
Spring 프레임워크/메모

IntelliJ를 사용한 Spring Framework Project 생성 및 설정

by Hwanii_ 2023. 10. 21.
728x90

구글링을 해보니, 2023년도 초반 까지만 해도 스프링 프레임워크 프로젝트를 생성 하고,

 

프로젝트를 우클릭 하면 Add Framework Support 라는 기능이 있었던 것 같다.

(이 기능을 통해 편하게 pom.xml 설정 파일에 필요한 라이브러리들을 추가 할 수 있었다)

 

더이상 이 기능을 인텔리제이가 지원을 하지 않는듯 해서,

 

인텔리제이로 스프링 프레임워크 프로젝트를 생성 하고 설정 하는 방법을 정리 하려고 한다.

(maven 프로젝트)

(인텔리제이 정보 : IntelliJ IDEA 2023.2.3 (Ultimate Edition)

 

 

 

1. 필요한 것들

 

1) Java JDK

 

2) Apache Tomcat

 

본인의 자바 버전은 11.0.20 이고, 아파치 톰캣 버전은 9.0.76 이다.

 

자바는 아래의 링크에서 다운 받을 수 있다.

 

https://www.oracle.com/kr/java/technologies/downloads/

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

아파치 톰캣은 아래의 링크에서 다운 받을 수 있다.

 

https://tomcat.apache.org/download-90.cgi

 

Apache Tomcat® - Apache Tomcat 9 Software Downloads

Welcome to the Apache Tomcat® 9.x software download page. This page provides download links for obtaining the latest version of Tomcat 9.0.x software, as well as links to the archives of older releases. Unsure which version you need? Specification version

tomcat.apache.org

 

자바 JDK 및 아파치 톰캣을 설치해 준다.

 

2. 새로운 프로젝트 생성

 

 

Maven 원형을 클릭 한다. (영어로는 Maven Archetype)

(한글 플러그인 설치)

 

 

이름 : 프로젝트 이름을 작성 한다.

 

위치 : 프로젝트를 생성할 경로를 작성 한다.

 

JDK : 본인이 설치한 자바 JDK 버전으로 경로를 설정 한다.

 

카탈로그 : 메이븐 아티팩트 (라이브러리 또는 프로젝트 템플릿) 을 선택 한다.

 

카탈로그란 ?

 

더보기

 

인텔리제이에서 메이븐 프로젝트를 설정 할 때, 필요한 라이브러리와 의존성을 찾기 위해

다양한 카탈로그를 활용할 수 있도록 제공 한다.

 

옵션은 아래와 같다.

 

 

내부 : 인텔리제이 자체에 내장된 메이븐 아티팩트 카탈로그 이다.

 

기본 로컬 : 본인 로컬에 저장 하고 있는 메이븐 아티팩트를 사용 할 수 있다.

 

아래의 링크에서 설치 할 수 있다.

 

https://archive.apache.org/dist/maven/

 

Index of /dist/maven

 

archive.apache.org

 

메이븐 중앙 : 일반적인 메이븐 중앙 저장소에서 사용 가능한 아티팩트들을 검색 한다.

메이븐 중앙 저장소는 많은 오픈 소스 라이브러리와 프로젝트가 존재 한다.

 

Archetype : 프로젝트 유형을 선택 한다.

 

일반적으로 maven-archetype-quickstart 또는 maven-archetype-webapp 와 같은 표준 아키타입을 선택 한다.

 

고급 설정 :

 

GroupID - (예시) org.spring.example

 

ArtifactID - (예시) spring_example

 

Version - (예시) 1.0-SNAPSHOT

 

우하단에 생성 버튼을 클릭 하면 프로젝트가 생성 된다.

 

 

BUILD SUCCESS 가 콘솔창에 띄워지면 성공적으로 프로젝트가 생성된 것이다.

 

 

3. pom.xml 에 필요한 라이브러리 추가

 

위에서 언급했던것과 같이 Add Framework support 기능이 사라졌기에 필요한 라이브러리를 직접 추가 해야 한다.

 

우선적으로 추가해야하는 라이브러리는 Spring MVC 이다.

 

 

pom.xml 에 Spring MVC 라이브러리를 추가 하기.

 

본인의 자바 JDK 버전에 맞는 스프링프레임워크 버전을 우선적으로 작성 한다.

 

아래의 링크에서 확인 할 수 있다.

 

https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions

 

Spring Framework Versions

Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.

github.com

 

자바 11 버전은 아래와 같다.

 

 

 

5.2.25.RELEASE 버전으로 명시 했다.

 

 

pom.xml 설정 파일을 업데이트 하면 아래와 같이 필요한 라이브러리가 주입된것을 확인 할 수 있다.

 

 

그외에 필요한 라이브러리가 있으면 아래의 링크에서 검색 하여 주입 할 수 있다.

 

https://central.sonatype.com/

 

Maven Central

Official search by the maintainers of Maven Central Repository.

central.sonatype.com

 

 

기존에 Add Framework Support 기능을 통해 spring-webmvc 를 추가 하면

 

WEB-INF 하위에 applicationContext.xml / dispatcher-servlet.xml이 생성 되는듯 하다.

 

하지만, 라이브러리를 직접 추가 했기에 위의 파일들을 직접 생성해줘야 한다.

 


applicationContext.xml :

applicationContext 생성 시 필요한 설정 정보를 담은 설정 파일

(루트 컨테이너)


dispatcher-servlet.xml :

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 FrontController

 

서버가 켜질 때, 서블릿 컨테이너는 DispatcherServlet 서블릿 클래스를 객체화 (초기화) 한다.

 

이 클래스 내부에 init() 메서드가 스프링 컨테이너를 구동 시킨다.

(init() 메서드는 자동으로 실행 된다)

 

스프링 MVC 구성 요소 중에서 DispatcherServlet 클래스가 유일한 서블릿 클래스 이고 나머지는 일반 자바 클래스 이다.

 

DispatcherServlet 객체는 단독적으로 클라이언트의 요청을 처리 할 수 없다.

 

스프링의 HandlerMapping, Controller, ViewResolver 객체들과 상호 작용 해야만 한다.

 

그래서 위의 객체들을 메모리에 생성 하기 위해서 DispatcherServlet 은 스프링 컨테이너를 구동 한다.

 

 

init() 메서드 내부에서 applicationContext.xml (루트 컨테이너 설정 파일) 을 로딩 하여,

 

XmlwebApplicationContext를 new 하여 스프링 컨테이너를 구동 시킨다.

 

그래야지 HandlerMapping, Controller, ViewResolver 객체들이 메모리에 올라 가게 된다.


web.xml :

모든 web application은 반드시 하나의 web.xml 설정 파일을 가져야 한다. (서블릿 컨테이너)

web.xml 에서 서블릿 매핑 방법, 등의 정보를 설정 한다.

web.xml 설정 파일은 web application 시작시 메모리에 로딩 된다.


 

4. 설정 하기

 

먼저 web.xml 설정 파일에서 아래와 같이 루트 컨테이너 설정 / 서블릿 정의 설정 / 서블릿 매핑 설정을 진행 한다.

 

 

본인은 루트 컨테이너 이름을 applicationContext.xml 로 명시 했고,

 

서블릿 파일 이름을 DispatcherServlet 이라고 정의 했다.

 

<url-pattern> 태그는 어떤 요청에 대해 매핑을 할건지를 명시해 주면 된다.

 

모든 .do 요청에 대해 매핑을 하려면 *.do 라고 작성 하면 된다.


그 다음으로, XML 구성 파일을 클릭 하여 필요한 설정 파일을 생성해준다.

 

 

 

위와 같이 생성 했다.

 

본인은 applicationContext.xml 설정 파일의 위치를 src 하위 main 하위 resources 하위에 생성 했다.

 

applicationContext.xml

<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.spring.biz"/>

</beans>

 

DispatcherServlet-servlet.xml

<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.spring.view.controller"/>

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

</beans>

 

<context:component-scan> 태그를 사용 하여 메모리에 올리기 위한 클래스 경로를 설정 한다.

 

 


src / main 하위에 java 폴더를 생성 한다.

 

 

위의 파란색 java 폴더 아이콘을 클릭 하면자동으로 소스 디렉터리를 생성해준다.

 

프로젝트 클릭 후 f4를 눌러서 확인 할 수 있다.

 

 

이 소스 폴더 내부에 모델과 컨트롤러 관련 패키지를 생성 한다.

 

 

본인은 com 하위에 spring 으로 생성 했고,

 

모델 관련 클래스는 biz 패키지 하위에 각 테이블명 

 

컨트롤러 관련 클래스는 view 패키지 하위에 controller 패키지 하위에 각 컨트롤러명 으로 설정 했다.

(뷰 관련 컨트롤러)

 

MainController 는 아래와 같이 코드를 작성 했다.

 

 

그러면 어디선가 main.do 요청이 왔을 때, 반환값으로 main을 리턴 하고,

ViewResolver에 의해서 DispatcherServlet-servlet.xml 설정 파일에서 설정한 것 처럼

접미사에 .jsp가 붙어서 main.jsp를 찾게 된다. (경로는 prefix)


5. 톰캣 서버 설정 하기

 

 

상단에 설정을 클릭 하여 구성 편집을 들어 간다.

 

 

Tomcat 서버에 로컬을 클릭 한다.

 

 

설치 했던 톰캣 서버 경로를 잡아 준다.

 

 

VM 옵션은 콘솔창에 한글이 깨지기 때문에 작성해 주었다.

 

HTTP 포트는 오라클 기본 포트 넘버가 8080 이라 8088 로 설정해 주었다.

 

 

배포를 클릭 하고, war exploded 를 추가 한다.

 

설정을 잘했으면, 아래와 같이 상단에 톰캣 서버가 추가된것을 확인 할 수 있다.

 


아파치 톰캣과 같은 서블릿 컨테이너의 웰컴 페이지의 디폴트값은 index.jsp 이기 때문에,

처음에 서버를 실행시키면 index.jsp가 열리게 된다.

 

그래서 원치 않으면, web.xml 설정 파일에 아래와 같이 코드를 작성 하여 웰컴 페이지를 변경 할 수도 있다.

 

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

 

하지만, 본인은 디폴트 값인 index.jsp 로 웰컴 페이지를 사용할것이기 때문에 굳이 작성 하지 않았다.


위의 DispatcherServlet-servlet.xml 에서 아래와 같이 경로를 설정했었기에,

 

 

 

WEB-INF 하위에 views 폴더를 생성해준다.

 

views 폴더 내부에 모든 view 관련 .jsp 페이지를 생성 하면 된다.

 

index.jsp가 웰컴 페이지 이기 때문에, 이곳에서 메인페이지로 가기 위한 코드를 작성 하면 된다.

 

 

본인은 response.sendRedirect() 를 사용 했는데, 이는 서블릿 내장 객체를 사용 했기 때문에,

 

이것을 사용 하려면 서블릿 관련 라이브러리를 pom.xml 에 추가해 줘야 한다.

 

꼭 이렇게 할 필요는 없다.

 

 

위와 같이 <jsp:forward page="경로" /> 를 사용 해도 된다.


 


 

글을 마무리 하며

 

스프링 프레임워크를 사용하여 프로젝트를 생성 하려면 인텔리제이보다 이클립스 또는 STS가 적합한듯 하다.

해당 IDE로 스프링 프레임워크 프로젝트를 생성 할 때,

Spring Legacy Project 를 클릭 하여 생성 하면 비교적 간편하게 설정이 가능한듯 싶다.

 

더 쉽고 간단한 방법이 있으면 알려주세요.

 

끝.

 

 

 

 

 


 

 

 

 

 

더보기

 

pom.xml

 

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hwan</groupId>
  <artifactId>app</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>app Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <!-- spring Version -->
    <org.springframework-version>5.2.25.RELEASE</org.springframework-version>
  </properties>

  <dependencies>
    <!-- spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <!-- commons-dbcp -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
    <!-- spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <!-- junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <!-- jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>app</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version> <!-- 사용 하고자 하는 플러그인 버전 명시 -->
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

 

web.xml

 

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

    <display-name>Archetype Created Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>characterEncoding</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>characterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

</web-app>

 

applicationContext.xml

 

<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.spring.biz"/>

    <!-- DataSource -->
    <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
        <property name="username" value="system"/>
        <property name="password" value="1234"/>
    </bean>

    <!-- JdbcTemplate -->
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

 

DispatcherServlet-servlet.xml

 

<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- component-scan -->
    <context:component-scan base-package="com.spring.view.controller"/>

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

</beans>

 

MemberDTO

 

package com.spring.biz.member;

public class MemberDTO {

    private String memberID;    //  아이디
    private int memberAge;  //  나이
    private String memberGender; //  성별
    private Long memberPhone;    //  전화번호
    private String memberName;  //  이름

    public String getMemberID() {
        return memberID;
    }

    public void setMemberID(String memberID) {
        this.memberID = memberID;
    }

    public int getMemberAge() {
        return memberAge;
    }

    public void setMemberAge(int memberAge) {
        this.memberAge = memberAge;
    }

    public String getMemberGender() {
        return memberGender;
    }

    public void setMemberGender(String memberGender) {
        this.memberGender = memberGender;
    }

    public Long getMemberPhone() {
        return memberPhone;
    }

    public void setMemberPhone(Long memberPhone) {
        this.memberPhone = memberPhone;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }

    @Override
    public String toString() {
        return "MemberDTO{" +
                "memberID='" + memberID + '\'' +
                ", memberAge=" + memberAge +
                ", memberGender='" + memberGender + '\'' +
                ", memberPhone=" + memberPhone +
                ", memberName='" + memberName + '\'' +
                '}';
    }

}   //  MemberDTO

 

MemberDAO

 

package com.spring.biz.member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("memberDAO")
public class MemberDAO {

    static final String SQL_INSERT
            = "INSERT INTO MEMBER (MEMBERID, MEMBERAGE, MEMBERGENDER, MEMBERPHONE, MEMBERNAME) VALUES (?,?,?,?,?)";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public boolean insert(MemberDTO memberDTO) {

        Object[] args
                = {memberDTO.getMemberID(), memberDTO.getMemberAge(), memberDTO.getMemberGender(), memberDTO.getMemberPhone(), memberDTO.getMemberName()};

        try {
            int rs = jdbcTemplate.update(SQL_INSERT, args);

            if (rs <= 0) {
                return false;
            }
        } catch (DataAccessException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}   //  MemberDAO

 

MainController

 

package com.spring.view.controller;

import com.spring.biz.member.MemberDAO;
import com.spring.biz.member.MemberDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MainController {

    @Autowired
    MemberDAO memberDAO;

    @RequestMapping(value = "/main.do", method = RequestMethod.GET)
    public String mainPage() {

        System.out.println("log : MainController : mainPage()");

        return "main";
    }

    @RequestMapping(value = "/insertMemberInfo", method = RequestMethod.POST)
    public String insertMemberInfo(MemberDTO memberDTO) {

        System.out.println("log : MainController : insertMemberInfo()");

        memberDAO.insert(memberDTO);

        return "main";
    }

}   //  MainController

 

index.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>

<%--<% response.sendRedirect("main.do"); %>--%>

<jsp:forward page="WEB-INF/views/main.jsp" />

 

main.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>메인 페이지</title>
</head>
<body>

<h2>등록</h2>

<form action="insertMemberInfo.do" method="post">
    <label for="memberID">아이디:</label>
    <input type="email" id="memberID" name="memberID" required><br>

    <label for="memberAge">나이:</label>
    <input type="number" id="memberAge" name="memberAge" required><br>

    <label for="memberGender">성별:</label>
    <input type="text" id="memberGender" name="memberGender" required><br>

    <label for="memberPhone">전화번호:</label>
    <input type="tel" id="memberPhone" name="memberPhone" required><br>

    <label for="memberName">이름:</label>
    <input type="text" id="memberName" name="memberName" required><br>

    <input type="submit" value="등록">
</form>

</body>
</html>
반응형

'Spring 프레임워크 > 메모' 카테고리의 다른 글

[ Spring ] MyBatis 연결 하기 02  (1) 2023.10.02
MyBatis 와 Spring (Boot) 연결 요약  (0) 2023.09.29
[ Spring ] MyBatis 연결 하기 01  (0) 2023.09.27
인터페이스 개념 메모  (0) 2023.09.21
의존 주입  (0) 2023.09.19