스프링 프로젝트를 생성하고 초기 환경 세팅을 하는데 시간이 걸린다고 했다. 나는 전자정부프레임워크로만 세팅해봤고, 회사에서 기본으로 제공하는 파일에다가 세팅을 해봐서 아예 처음부터 스프링 프로젝트를 생성해서 세팅해본 적이 없다. 그래서 이번에 세팅해보고 내용을 정리하러 왔다.
스프링 프로젝트를 생성하는 방법은 크게 2가지가 있다.
- Dynamic Web Project를 통해 MVC 패턴을 만들어주는 방법
- STS에서 제공하는 Spring Legacy Project의 Spring MVC Project를 사용하는 방법
STS(Spring Tool Suite) : 이클립스 기반 스프링에 최적화된 IDE
즉, 스프링에 최적화된 이클립스 (이클립스 + Spring Framework plug-in)
두 가지 방법으로 만들어보자
이클립스 먼저 설치해줘야한다.
설치방법은 여기서 참고👻
📍 [Tool]이클립스 설치 방법
개발환경
IDE : Eclipse 2021-12 (4.22)
JAVA : JDK 1.8
WAS : Apache Tomcat 8.5
Project Explorer에서 오른쪽 마우스 > NEW > Project > Web > Dynamic Web Project 선택 후 이름을 정해주자
Dynamic Web Project는 maven 설정을 따로 해줘야 한다.
프로젝트 오른쪽 마우스 > configure > Convert to Maven Project
해주면 pom.xml이 생성됨
근데 적다보니 의문이 생겼다. maven설정을 왜 해주는거지?
그래서 알아보고 왔다. 📍 [Spring] maven을 쓰는 이유
pom.xml에 스프링 프레임워크 의존성을 추가해주자.
추가한 라이브러리는 spring-web과 spring-webmvc이다.
스프링 프레임워크는 약 20개의 모듈이 있다고 한다. 이 중 필요한 모듈만 가져다 쓰면 된다.
웹 계층은 4개의 모듈로 구성되어 있다.
spring-web : 멀티파트 파일 업로드, 서블릿 리스너 등 웹 관련 기능을 제공한다.
spring-webmvc : Web-Servlet 모듈이라고도 함, Spring MVC, REST 서비스 구현을 포함한다.
spring-socket : 웹 소켓 구현을 지원한다.
spring-webmvc-portlet : 포틀릿을 사용한 MVC구현을 제공한다.
Group Id 를 적어줌(프로젝트명과 그대로 했다)
6. pom.xml이 생성되었으면 project 태그 안, build 태그 밑에 dependencies태그를 추가해준다. dependencies의 뜻은 의존성인데, 이 안에 추가하는 라이브러리의 의존성을 관리해주겠다는 것이다.
https://mvnrepository.com/ 이곳에서 복붙해오면 된다. spring web 검색하면 주루룩 나올 것이다.
[spring web]
[spring web mvc]
7. dependency를 추가해주고 프로젝트 오른쪽 마우스 > Maven > Update Project를 해주면 스프링 프로젝트로 바뀐다고 했다.
8. 근데 난 안바꼈다.
아니 왜..
짠
10. web.xml 최초 모습이다. 내용을 수정해주자.
11. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>board_dynamic</display-name>
<!-- ===listener 생성===(datasource, service, dao 등 Controller와 공유하는 Bean들이 들어있음.) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--
[ContextLoaderListener]
- WAS 구동 시 web.xml을 읽을 때 초기셋팅작업 해주는 역할
(WAS 구동순서 : server.xml -> web.xml -> ~)
- 스프링에서 제공하는 클래스 중 하나, ContextLoader와 ServletContextListener를 상속함
- 스프링 설정파일을 읽기 위해 필요
- 그래서 context-param 태그로 contextConfigLocation이라는 파라미터(=매개변수=그냥 변수를 만드는거임)에
스프링 설정파일 위치를 지정해준다.
-->
<!-- 공통으로 사용할 의존성 설정 파일(applicationContext.xml==root-context.xml)의 위치를 담는 파라미터 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/applicationContext.xml</param-value>
</context-param>
<!-- ===DispatcherServlet 생성===(Controller, ViewResolver, hanlderMapping) -->
<servlet>
<!-- 이 서블릿 이름대로 (서블릿이름)-servlet.xml 파일을 DispatcherServlet으로 삼음 -->
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextLoader가 아래 위치의 설정 파일을 읽어서 이 파일을 DispatcherServlet으로 만든다. -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/dispatcher-servlet.xml</param-value>
</init-param>
</servlet>
<!-- .do로 끝나는 url의 요청을 받아서 DispatcherServlet에서 처리한다. -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- ===Filter 생성===(encodingFilter) -->
<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>*.do</url-pattern>
</filter-mapping>
<!-- 전달하기 위한 변수
* <context-param>
- 전역변수 지정, 모든 서블릿 사용 가능( = <servlet> 밖에서 독립적으로 쓸 수 있음)
* <init-param>
- 지역변수 지정, 특정 서블릿 사용 가능( = <servlet> 안에서만 쓸 수 있음)
-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
Help > Eclipse Marketplace 로 들어간다.
sts를 검색하고 두 번째 Spring Tools 3 Add-On for Spring Tools4~를 설치해준다.
동의해주고 Finish
하면 STS가 쭉 설치가 된다~~
설치가 끝났다.
스프링 프로젝트로 바꼈다 ^^
14. 다시 config 파일에 오른쪽마우스 > Other 누르면 Spring 폴더가 잘 뜬다. 스프링 빈 설정 파일(Spring Bean Configuration File)을 선택하고 파일 이름은 applicationContext.xml
applicationContext.xml : 공통으로 사용할 의존성 설정 파일(스프링 설정 파일)
초기 화면이다.
15. applicationContext.xml 하단에 보면 Source, Namespaces ... 탭들이 있다. Namespaces 탭에서 beans, context, mvc를 체크해준다.
설정파일에서 사용할 것들이다.
그러면 몇 줄이 추가가 된다.
applicationContext에 모델 정보를 주기 위해서 먼저 src/main/java 폴더 안에 패키지를 만들어 줬다.
내용은 아래와 같다.
<?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.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- model에 대한 정보 -->
<context:component-scan base-package="com.matcha.mvc"> <!-- 패키지명을 넣어준다. -->
</context:component-scan>
</beans>
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!-- 어노테이션 활성화 -->
<context:annotation-config/>
<!-- view의 경로, 확장자를 정해주는 부분 : DispatcherServlet이 이 경로를 따라서 컨트롤러가 날린 뷰의 이름에 해당하는 뷰가 있는지 찾아봄. -->
<!-- ViewResolver 생성 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- model에 대한 정보 -->
<context:component-scan base-package="com.matcha.mvc">
</context:component-scan>
</beans>
잘뜬다.
java.lang.exceptionininitializererror
&&
an error has occurred. see error log for more details. could not initialize class Could not initialize class com.thoughtworks.xstream.converters.collections.PropertiesConverter
구글에 검색해보니 스프링버전과 자바 버전이 맞지 않아서 생긴 오류라고 함.
해결방법은
1. installed jres > 11버전 이상 java 를 선택
2. eclipse.ini 파일의 -vm 부분에 11버전 이상 java 위치로 수정
3. 이클립스 빌드 혹은 껐다가 다시 켬
순서로 했더니 해결됐다.
Eclipse 2020-06 까지는 java8 이 호환되지만 2020-09 부터는 java11 호환이라고 했다. 그래서 11버전을 설치하려고 했는데 문득 11버전을 전에 설치했던 기억이 났다.
혹시 몰라서 자바 버전을 확인해봤는데 환경변수에는 11버전으로 되어있었다
11이 깔려있었군아
추가 설치작업 없이 installed JREs에서 jdk1.8로 돼있던걸 zulu11로 바꿔줬다.
Spring MVC Project를 이어서 만들어보자.
패키지 명을 지정해준다.
생성해주자마자 바로 스프링 프로젝트로 만들어진다.
근데 home.jsp에서 에러가 났다.
c태그에서 에러가 났다. 에러메시지는 jstl 라이브러리를 찾을 수 없다고 했다.
(+)2022.06.28
java.sun.com 돼있는걸 Java.sun.com으로 수정하면 간단히 해결된다.
java => Java
그래서 jstl 라이브러리를 추가하기 위해 아까 spring-webmvc 라이브러리를 추가해줬던 그 사이트에 들어갔다.
pom.xml의 dependencies 안에 추가해줬더니 오류가 사라졌다.
실행이 잘 됐다~!
소스코드
MVCDao.java
package com.matcha.mvc.dao;
import org.springframework.stereotype.Repository;
@Repository
public class MVCDao {
public String sayHello() {
return "안녕하시렵니까";
}
}
MVCService.java
package com.matcha.mvc.service;
public interface MVCService {
String sayHello() throws Exception;
}
MVCServiceImpl.java
package com.matcha.mvc.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.matcha.mvc.dao.MVCDao;
import com.matcha.mvc.service.MVCService;
@Service
public class MVCServiceImpl implements MVCService {
@Autowired
private MVCDao mvcdao;
@Override
public String sayHello() {
System.out.println(mvcdao.sayHello()+"================================");
return "안녕하시렵니까";
}
}
MVCController.java
package com.matcha.mvc.web;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.matcha.mvc.service.MVCService;
@Controller
public class MVCController {
@Autowired
MVCService mvcservice;
@RequestMapping("/index.do")
public String sayHello(Model model) throws Exception {
model.addAttribute("Hello", mvcservice.sayHello());
return "index";
}
}
📌참고
https://datamoney.tistory.com/160
https://velog.io/@dhffkvm_718/Dynamic-web-Project-Spring-legacy-Project-%EC%B0%A8%EC%9D%B4
https://lkt01010.tistory.com/174
라이브러리 https://wordbe.tistory.com/entry/Spring-Java-Spring-%EA%B8%B0%EB%B3%B8
잘보고 갑니다 !!