2023. 7. 13. 23:17ㆍ프로그래밍/웹 개발
예전에 Spring boot를 생성할 때는 강의를 참고한 것도 있었지만 별도로 설정할 것들이 많지 않았던 걸로 기억한다.
이번에 배운 내용은 Eclipse에서 Spring legacy project를 생성하는 거였는데 나는 Intellij tool을 쓰다보니 별도로 참고해서
프로젝트를 생성하면서 알게된 것들을 기록해놓고자 한다. 또한 교과서적인 방법이 없다보니 더 어려움을 느꼈던 것 같다.
우선 대략적인 프로젝트 생성 환경은 다음과 같다.
사용 IDE : Intellij Ultimate
운영체제 : Mac Ventura OS 13.x 버전
필자의 경우도 여기저기 블로그를 참고하다 애를 많이 먹었기 때문에 아무래도 처음에는 이 글을 따라한 뒤에 정상적으로 생성을 완료했다면 나중에 본인만의 방법대로 바꿔서 해보는 것을 추천한다. 또한 이 글은 안될 경우를 대비해 너무 자세하다 싶을 정도로 파일의 전체 코드를 복사해서 올려 작성했으니 참고바란다.
1. Maven 프로젝트 생성하기
2. pom.xml에 depency 설정으로 spring framework 추가하기
3. web.xml 설정
4. servlet-context.xml 설정 (intellij에서는 dispatcher-servlet.xml)
5. root-context.xml 설정 (intellij에서는 applicationContext.xml)
6. 서버 설정 (Tomcat)
7. Controller 생성
8. 서버 실행 및 url 매핑에 따른 dispatcher Servlet 정상 동작 여부 확인
1. Maven 프로젝트 생성하기
위와 같이 설정 후 Maven 프로젝트를 생성한다.
2. pom.xml에 depency 설정으로 spring framework 추가하기
프로젝트를 생성하면 기본 계층 구조는 다음과 같을 것이다. pom.xml 파일로 들어가서 다음과 같이 코드를 추가해준다.
* <version>태그의 4.0.4 버전은 굳이 따라하지 않아도 된다. 본인이 원하는 버전을 선택할 것. 그러나 잘 모르겠으면 작성한 글의 방법과 동일하게 진행할 것을 추천
<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>org.example</groupId>
<artifactId>spring_example</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring_example Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml파일에 변경사항이 생기게 되면 우측과 같이 변경사항을 load할 수 있는 버튼이 활성화 된다.
버튼을 누르기 전에 다음과 같이 project strucutre 창을 띄운다.
아직 별다른 library가 추가되지 않았다. 그럼 창을 닫고 위에서 말한 maven loading 버튼을 눌러보자.
혹시 로딩 버튼이 보이지 않는다면 pom.xml을 우클릭 한 후 Reload project를 눌러준다.
Reload가 끝난 후 다시 project Structure창을 띄운 후 lib목록을 확인해보면 내가 pom.xml에 작성한 library가 그대로 추가된 것을 확인할 수 있다! 혹은 아래와 같은 방법으로도 lib를 추가할 수 있다. 여기서 중요한 것은 그냥 시키는 대로 하는 것보다 어떤 식으로 이런 것들이 추가되고 결국엔 서로 다른 액션이 같은 결과를 불러온다는 것을 아는 것이 중요하다고 생각한다.
https://goldfish2679.tistory.com/59
3. web.xml 설정
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>/</url-pattern>
</servlet-mapping>
</web-app>
프로젝트 폴더 / src / main / webapp / WEB-INF 폴더로 들어오게 되면 web.xml파일을 확인할 수 있을 것이다.
해당 파일에 위와 같이 코드 전체를 복사해 붙여넣는다.
Servlet을 xml로 매핑하는 법과 비슷한 원리이다. spring framework에는 dispatcherServlet이 존재하는데 이 서블릿을 url-pattern : / , 즉 모든 경로로 들어오는 HttpRequest(사용자 요청)를 DispatcherServlet으로 보내고 이 서블릿은 우리가 설정한 컨트롤러가 있는 패키지로 간 후에 설정된 url에 해당하는 메서드를 실행할 것이다. 우선은 추가되지 않은 부분이 많으니 여기서 이해하려고 하기보다는 전체적으로 완성된 후 다시 훑어보길 바란다.
* 추가적인 내용 : <context-param> 태그로 contextConfiguration, 즉 context 파일의( servlet-context, applicationContext.xml )로드할 위치를 설정할 수 있다. 현재 applicationContext.xml 파일은 WEB-INF로 지정돼있고 dispathcer-servlet.xml(servlet-context.xml)은 default 경로(WEB-INF)를 참조한다. dispathcer-servlet의 경로를 변경하고 싶다면 다음과 같이 수정하면 된다.
<servlet>
<servlet-name>dispatcher</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>
4. servlet-context.xml 설정 (intellij에서는 dispatcher-servlet.xml)
Eclipse와 Intellij에서는 spring 프로젝트에서 쓰이는 xml파일들을 로딩할때 불러오는 방식이 다른 듯하다. 경로와 파일명을 이 글대로 진행하지 않을 경우에는 web.xml파일에서 경로를 포함한 파일명을 servlet-name 태그에서 수정해줘야 할 것이다.
아무튼 위 코드에서 <param-value>태그에 작성한 경로대로 WEB-INF 디렉토리 내에 applicationContex.xml 파일과 dispatcher-servlet.xml, jsp 폴더 하나를 생성한다.
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
그리고 dispathcer-servlet.xml파일에 위 코드를 추가한다.
annotation-driven태그는 Controller에서 작성한 어노테이션을 찾기 위한 태그이고 bean태그의 ViewResolver는 사용자가 url로 jsp파일명만 입력해도 프로젝트 경로를 알아서 찾은 후에 해당 페이지를 보여주게끔 해주는 객체이다. bean태그를 이용해 작성되는 것들은 모두 객체라고 생각하면 된다.
5. root-context.xml 설정 (intellij에서는 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
</beans>
applicationContext.xml 파일에는 위와 같이 코드를 추가한다.
root-context.xml 파일은 spring이 처음 실행될 때 확인해야하는 기본적인 xml파일로써 spring에서 쓰이는 bean객체를 생성하기 위해 쓰이는 파일이며 어노테이션을 이용해 bean객체를 생성한다면 별로 작성할 코드가 없는 파일이기도 하지만 그래도 처음에 빌드하고 로딩할 때에는 분명히 필요한 파일 중 1개이기 때문에 추가해줘야 한다.
6. 서버 설정 (Tomcat)
deployment 탭에서 artifact를 생성해준다.
server탭에서 configure을 통해 local pc에 있는 apache-tomcat 폴더 경로를 잡아준다.
tomcat 설정에 대한 조금 더 자세한 정보는 아래 글을 참고.
https://goldfish2679.tistory.com/51
7. Controller 생성
main 폴더 아래에 java 디렉토리를 생성한다. 그리고 그 디렉토리안에 package를 생성하고 java 클래스를 생성한다. 이 때 폴더의 색깔이 파란색으로 되지 않는다면 우클릭 후 다음과 같이 source root로 설정한다. 아까 전에 설정한 dispatcher-servlet.xml에서 base package를 controller로 설정했는데 바로 이 controlle가 패키지명 controller를 뜻한다.
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {
@RequestMapping("/aa")
public String main(){
return "index";
}
}
Main Controller에는 다음과 같이 java 코드를 작성한다. 만약 어노테이션이 인식되지 않는다면 library가 제대로 인식되지 않는다는 것이므로 library가 잘 추가됐는지 확인하기 바란다.
8. 서버 실행 및 url 매핑에 따른 dispatcher Servlet 정상 동작 여부 확인
모든 설정이 끝났다면 server를 실행시킨다. (java source버전이 5이기 떄문에 수정하라는 compile에러가 발생할 수 있다. 에러메시지 그대로 구글링을 하면 해결 가능할 것이다)
설정한 url로 접속했을 때 정상적으로 index.jsp 파일을 불러오는 것을 확인할 수 있다.
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[spring] 웹 서버에서 img를 로드하지 못하는 문제 해결 (0) | 2023.07.24 |
---|---|
[Spring] log4j.xml 추가하기 (콘솔창에서 로그내역 확인하기) (0) | 2023.07.15 |
[IntelliJ] add framework support 시에 spring이 보이지 않는 문제 (0) | 2023.07.13 |
[Mybatis]페이지 무한로딩 문제 해결 (0) | 2023.07.10 |
[Intellij] 웹 프로젝트에 라이브러리 경로 적용(WEB-INF에 lib의 jar파일이 적용되지 않는 문제 해결) (0) | 2023.07.05 |