[Spring] 스프링(Spring) 프로젝트 생성하기

·2022년 3월 5일
3

Spring

목록 보기
6/7
post-thumbnail

스프링 프로젝트를 생성하고 초기 환경 세팅을 하는데 시간이 걸린다고 했다. 나는 전자정부프레임워크로만 세팅해봤고, 회사에서 기본으로 제공하는 파일에다가 세팅을 해봐서 아예 처음부터 스프링 프로젝트를 생성해서 세팅해본 적이 없다. 그래서 이번에 세팅해보고 내용을 정리하러 왔다.


스프링 프로젝트를 생성하는 방법은 크게 2가지가 있다.

  1. Dynamic Web Project를 통해 MVC 패턴을 만들어주는 방법
  2. STS에서 제공하는 Spring Legacy Project의 Spring MVC Project를 사용하는 방법

Dynamic Web Project

  • 동적페이지를 가지는 웹 애플리케이션을 만들 때 생성하는 프로젝트
  • 일반 웹 애플리케이션 구조 (Web)
  • maven 설정을 추가로 해줘야함.
  • STS plug-in 별도 설치해줘야함.

Spring MVC Project

  • 일반적인 Spring Framework 프로젝트
  • Spring Framework 구조 (Web + maven)
  • STS(Spring Tool Suite)

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


💡 Dynamic Web Project에 MVC 패턴

  1. 서버 설정부터 해준다. 서버 탭에 파란글씨 클릭

  1. 나는 아파치 톰캣 8.5를 쓰니까 8.5 선택, 다운로드 받은 톰캣 파일 선택해줌
    쭉쭉 next하고 finish

  1. 타임아웃도 널널하게 키워줌
    (안키워주면 Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. 오류를 볼 수도 있음)

  1. Project Explorer에서 오른쪽 마우스 > NEW > Project > Web > Dynamic Web Project 선택 후 이름을 정해주자

  2. 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. 근데 난 안바꼈다.
아니 왜..

  1. 당황스럽지만 일단 web.xml부터 만들어주기로 했다. 어떻게 만드냐면
    프로젝트 오른쪽 마우스 > Java EE Tools > Generate Deployment ~~
    클릭 한 번만 해주면 만들어진다.




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>
  1. web.xml에서 지정해준 의존성 설정 파일 applicationContext.xml 파일을 만들어보자. contextConfigLocation 파라미터에 넣어준 위치대로 만들어주자.
    WEB-INF 폴더 안에 config 파일을 만들었다. 오른쪽마우스 > Other 누르고

    Spring 폴더 안에 스프링 빈 설정 파일(Spring Bean Configuration File)을 선택해주자.
    안뜬다.
  2. 아까 pom.xml에 스프링 라이브러리 넣고 maven update했는데도 스프링 프로젝트로 바뀌지 않았고 이번엔 스프링 빈 설정 파일이 있는 Spring 폴더 자체가 안떴다.
    그건 바로 STS plug-in을 설치해주지 않았기 때문. Dynamic Web Project로 만들면 STS를 따로 설치해줘야 한다...

STS 설치방법

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>
  1. DispatcherServlet 역할을 할 dispatcher-servlet.xml 파일도 만들어주자.
    어노테이션 활성화, ViewResolver를 생성해줬다.
    ViewResolver에서 prefix는 접두사, suffix는 접미사이다. Controller는 뷰의 논리적인 이름만 리턴해주는데, ViewResolver가 뷰를 찾으러 갈 때 뷰의 이름 앞 뒤로 얘네들을 붙여서 찾으러 간다.
    prefix에는 뷰 파일이 있는 폴더 위치, suffix에는 뷰 파일의 확장자를 적어줬다.
    내용은 아래와 같다.
<?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>
  1. 다음으로 코드를 작성하기 위해 dao, service, web 폴더를 만들어줬다. 소스코드는 게시글 아래에 있다.

실행결과


잘뜬다.


💡 Spring MVC Project

  1. 프로젝트를 생성한다. New > Other 클릭

    spring검색 > Spring Legacy Project

    Spring MVC Project 선택해주고 프로젝트 이름 적고 Next 클릭


해주면 오류가 뜸

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. 이클립스 빌드 혹은 껐다가 다시 켬
순서로 했더니 해결됐다.

  1. 오른쪽 상단에 검색버튼을 눌러서 installed jres를 검색한다.

Eclipse 2020-06 까지는 java8 이 호환되지만 2020-09 부터는 java11 호환이라고 했다. 그래서 11버전을 설치하려고 했는데 문득 11버전을 전에 설치했던 기억이 났다.
혹시 몰라서 자바 버전을 확인해봤는데 환경변수에는 11버전으로 되어있었다
11이 깔려있었군아

추가 설치작업 없이 installed JREs에서 jdk1.8로 돼있던걸 zulu11로 바꿔줬다.

  1. eclipse.ini파일에 vm 부분도 위 경로에 있는 bin 파일 위치로 바꿔줬다.

  1. 이클립스를 껐다 켜니까 오류가 해결됐다.

  1. Spring MVC Project를 이어서 만들어보자.
    패키지 명을 지정해준다.

  2. 생성해주자마자 바로 스프링 프로젝트로 만들어진다.

  3. 근데 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";
	}
}

👻후기

  1. Dynamic Web Project를 통해 MVC 패턴을 만들어주는 방법
    -> 별거없는 프로젝트였는데도 설정해줘야하는게 많았다.
  2. STS에서 제공하는 Spring Legacy Project의 Spring MVC Project를 사용하는 방법
    -> 중간에 오류가 나서 해결하는데 시간이 좀 뺏겼지만 프로젝트 생성만 하면 대부분이 미리 만들어져 있어서 첫 번째 방법보다는 편했다.


📌참고
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

profile
https://k-ang.tistory.com/ 이전했어요

1개의 댓글

comment-user-thumbnail
2023년 11월 29일

잘보고 갑니다 !!

답글 달기