# Spring Legacy (IntelliJ)

Eclipse에서 spring framework를 이용한 웹 개발을 할 때는&#x20;

STS(Spring Tool Suite)의 도움을 받는 것이 일반적

원래 Spring framework는 STS의 도움 없이도 maven을 통해 환경 구축이 충분히 가능하다.&#x20;

&#x20;하지만 IntelliJ에서는 그런 기능이 존재하지 않는다.&#x20;

다만 상대적으로 eclipse 사용자가 더 많아 eclipse의 STS를 기반으로 시작하는 포스팅이 대부분



우리는 STS 등의 extension이나 Plugin에 의존하지 않고 순수 maven 을 활용해&#x20;

Spring framework를 사용해볼 것



추후에는 [https://start.spring.io/](https://start.spring.io/)  를 통해 쉽게 만들 수 있음



Spring framework는 처음에 진입장벽이 있는 편

많은 설정들과, 그 원리를 이해하기 위한 배경지식이 필요함.&#x20;

특히 여러 플러그인들을 사용하거나 STS로 설정을 해서 시작하면&#x20;

스프링의 기본원리에 대해서 이해하지 못한 채 단순히 사용할 수 만 있는 상태가 됨



STS 등의 extension이나 plugin에 의존적이지 않고 순수하게 maven을 활용하여

spring framework 를 시작해볼 것임



### \*Spring Legacy&#x20;

* 레거시 시스템이란?

&#x20;레거시 시스템은 오랜 기간 동안 운영되어온 시스템으로, 과거에 개발된 기술과 방법론을 사용하여 개발되었습니다. 이러한 시스템은 주로 업무 로직이 복잡하고 유지보수가 어렵다는 특징이 있습니다.

레거시 시스템은 새로운 요구사항에 대한 대응이 어렵고, 확장성이 제한적일 수 있습니다.



* 스프링 프레임워크와 레거시 시스템&#x20;

스프링 프레임워크는 레거시 시스템의 개발과 유지보수를 지원하기 위한 다양한 기능을 제공합니다. 스프링은 DI 와 AOP 등의 개념을 도입해 레거시 시스템의 코드를 분리하고 유연성을 높여 줍니다.



* 스프링 부트의 등장과 차이점

스프링 부트는 스프링 프레임워크를 기반으로 한 개발환경 구축 도구입니다. 스프링 부트는 레거시 시스템의 설정과 배포를 간편하게 관리할 수 있도록 도와줍니다. 스프링 부트는 자동 설정과 내장 서버 등의 기능을 제공해 개발자가 별도의 설정 없이도 간단히 애플리케이션을 실행, 배포 할 수 있습니다. 이를 통해 생산성을 향상시키고 개발 시간을 단축 할 수 있습니다.&#x20;





### 1. 프로젝트 생성

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FFEXNHhVH7xwE82E1NMKO%2FScreenshot_4.png?alt=media&#x26;token=c1a6d5a3-ced8-4028-a886-a80e8f338e1a" alt=""><figcaption></figcaption></figure>

새택프로젝트선택 후 프로젝트의 이름과 location 설정

고급 설정 클릭 후&#x20;

그룹 ID 변경 후 아티팩트 ID 확인 후 생성!



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F0b1VG5pzvdAsv9ALs2M0%2FScreenshot_5.png?alt=media&#x26;token=757e57c3-4eda-4533-9440-13b79f89614b" alt=""><figcaption></figcaption></figure>

지정한 그룹 ID에 따라서 java 아래에 패키지가 생성됨

pom.xml 이 잘 생성되었는지 확인!



### 2.   pom.xml 설정

pom.xml에 내용 추가 후 maven reload

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FUovI0COnbWr42nz9VKgS%2FScreenshot_8.png?alt=media&#x26;token=93d4bb0a-e3f9-4216-bf4a-f6681d855d62" alt=""><figcaption></figcaption></figure>



```xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.springframework-version>6.1.0</org.springframework-version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
</dependencies>
```



### 3. 프로젝트 구조 설정



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FkduAAqlMfHAOiqf6zbgd%2FScreenshot_10.png?alt=media&#x26;token=8718368e-43fc-461b-aad2-17210fcee501" alt=""><figcaption></figcaption></figure>

모듈 선택에서 spring\_test 선택 후 확인 버튼 클릭



아티팩트 추가

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FMiztLnUiSmLq7i7xWr98%2FScreenshot_12.png?alt=media&#x26;token=e82e6e34-4ea5-409a-bbbf-fab3b45fe7ef" alt=""><figcaption></figcaption></figure>

spring\_test 모듈 선택 후 확인 버튼 클릭!



이후 적용 버튼 클릭하면



web/WEB-INF/web.xml 파일 생성 됨





### 4. web.xml 설정

```xml
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/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>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
 </servlet-mapping>
```



해당 코드를 추가하면 param-value에 빨간색 글씨로 에러표시가 나는데 이는 해당 파일을 생성하지 않았기 때문이다.

web\WEB-INF\spring 디렉토리를 추가하고 applicationContext.xml, dispatcher-servlet.xml 이라는 이름의 spring config 파일 2개를 생성한다.



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2Ft6NdOq860D3NTMCQgeHM%2FScreenshot_15.png?alt=media&#x26;token=274b7b42-c16e-474b-82ac-c036584d4483" alt=""><figcaption></figcaption></figure>

dispatcher-servlet.xml 에 다음 코드 추가

```xml
<mvc:annotation-driven/>

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

<context:component-scan base-package="com.it.spring_test"/>
```





이 코드를 추가하면 xml 태그에 빨간색 글씨와 줄과 함께 에러 표시가 난다.

&#x20;이때 IntelliJ의 기능을 이용해 xml namespace를 추가해주면 편하다.&#x20;

사진과 같은 팝업이 뜨거나 에러 표시가 난 코드에 커서를 두고 Alt + Enter를 눌러보자.



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FDpXvVOF9z4yTNpWUhczD%2FScreenshot_16.png?alt=media&#x26;token=1ae09912-3959-4be7-b731-fe0c1b276022" alt=""><figcaption></figcaption></figure>

그럼 자동으로 xmlns:mvc 가 생성된 것을 확인할 수 있다. context namespace도 마찬가지로 추가해준다.

context의 spring\_test는 아래의 컨트롤러 생성 시 경로 생성하면 에러 사라짐



파일 추가 후 module 에서 Spring 추가&#x20;

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FbZItZFFTVorS6AGCuPuo%2FScreenshot_1.png?alt=media&#x26;token=d7707dd2-ca66-45f3-9636-ba1e978d11ee" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FhdC1BdfYdlouIFxRDqY7%2FScreenshot_2.png?alt=media&#x26;token=e99814c4-7705-46c1-a14e-4863236a97ca" alt=""><figcaption></figcaption></figure>

### 5. 화면 추가

#### 5-1 Controller 추가&#x20;

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FgbKT05qsDcYuqKK6JUfx%2FScreenshot_22.png?alt=media&#x26;token=4ce526e2-7672-48b6-9dc8-1548bfd23cce" alt=""><figcaption></figcaption></figure>

it 패키지 아래에 spring\_test 경로 생성 후 해당 경로에 HomeController.java 파일 생성

```java
@Controller
public class HomeController {
    @RequestMapping("/")
    public String index(Model model){
        model.addAttribute("data", "Hello, Spring from IntelliJ! :)");
        return "index";
    }
}
```

컨트롤러 내용 변경&#x20;



#### 5-2 view 생성

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FJ5PQ0AOZtXqgVc96OpaB%2FScreenshot_18.png?alt=media&#x26;token=8e660307-b423-4b0b-9280-dcd8f563844c" alt=""><figcaption></figcaption></figure>

WEB-INF 아래에 views 패키지 생성 후 해당 경로에 index.jsp 생성&#x20;



### 6. 톰캣 설정

### Spring 6.0, Boot 3.0에서 달라지는 점

#### Spring 5.x -> 6.0 달라지는 점

* Java 17기반으로 변경
* 일부 Java EE API 지원 종료
* XML이 점차적으로 Spring에서는 사라지게 될 것
* RPC 지원 종료
* 새로운 AOT 엔진 도입 (밑에 설명 추가)
* @Inject 같은 JSR에서 지원하던 어노테이션들이 jakarta.annotation 패키지의 어노테이션으로 변경
* HttpMethod가 enum에서 class로 변경
* Jakarta EE 9+로의 마이그레이션으로 인한 변경
  * Hibernate ORM 5.6.x 버전부터 hibernate-core-jakarta 사용
  * javax.persistence에서 jakarta.persistence로 변경
  * Tomcat 10, Jetty 11, Undertow 2.2.14 (undertow-servlet-jakarta도 포함)으로 업그레이드 필요
  * javax.servlet에서 jakarta.servlet으로 변경 필요 (import)



그래서 톰캣 버전을 10 버전으로 버전업&#x20;

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F8l09fwb1TRJvF46Bamok%2FScreenshot_3.png?alt=media&#x26;token=a25132cb-e914-494a-994c-0be47b0cb34f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FQnMonyEiil2u2FPaeCjv%2FScreenshot_20.png?alt=media&#x26;token=0f33c395-c6c7-4442-a340-f3158d77f0a5" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FxsugrEfYyRPkoqgrJXEc%2FScreenshot_21.png?alt=media&#x26;token=8be94c79-9dc2-4197-a45f-88e874429d12" alt=""><figcaption></figcaption></figure>

톰캣 local 추가 후 설정

VM option 및 port 설정&#x20;

배포 탭에서 아티팩트 추가 후 애플리케이션 컨텍스트 수정&#x20;



### 7. 실행

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FvMKdDik6ZEPyUmygv31h%2FScreenshot_4.png?alt=media&#x26;token=c2e826b5-4a57-4348-be3e-240cd2554808" alt=""><figcaption></figcaption></figure>
