구글링을 해보니, 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 설정 파일을 업데이트 하면 아래와 같이 필요한 라이브러리가 주입된것을 확인 할 수 있다.

그외에 필요한 라이브러리가 있으면 아래의 링크에서 검색 하여 주입 할 수 있다.
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 |