IT story/Spring

[Spring 강의] L01 Hello_Spring

jason719 2016. 12. 13. 22:52

2016. 12. 13. (Tue)

[Spring 강의] L01 Hello_Spring

JSP Project가 끝나고 오늘부터 Spring 수업이 시작되었다.

그리고 기존 JSP 때와 다른 점을 비교해가면서 jsp page 호출 하는 법,

Parameter 받아오는 법 등을 배워보았다. 

JAVA, JSP에 이어 SPRING까지 모든 것이 다 중요하지만,

실무에서 Spring이 제일 많이 쓰인다고 하니..

오늘부터 마음을 다시 잡고 매일매일 배운 내용을 포스팅하고 

잘 배워봐야겠다!! 


1. STS 설치

이제 이클립스를 벗어나 새로운 프로그램을 사용하나 싶었지만, 
STS는 이클립스에 스프링 기능이 추가된 거 뿐이었다..ㅋㅋ
그래도 익숙한 GUI환경에서 작업을 하는 것은 나쁘지않다.
설치 방법은 PASS 하겠다.

2. l01_hello_spring project 생성 

Package Explorer에서 우클릭 하고
JSP 때 지겹게 만들던 Dynamic web project가 아닌
Spring Legacy Project를 생성한다. 
(Templates는 Spring MVC Pattern 선택)

Project를 생성하면 아래와 같이 뭐가 많이 생긴다.

맨 밑에 pom.xml에서 설정이 필요하다. 

상세설명은 주석을 참고하자

아래의 예제를 살펴보자

ex) pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?xml version="1.0" encoding="UTF-8"?>
<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.spring</groupId>
    <artifactId>l01_hello</artifactId>
    <name>l01_hello_spring</name>
    <packaging>war</packaging>
    <version>1.0.0-BUILD-SNAPSHOT</version>
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.1.7.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>
    <!-- 대소문자 구분이 안되는 표기를 사용하는 이유는 Maven에 있다. 
        pom.xml을 메이븐 설정 -> 메이븐 프로젝트라 부른다. 
        라이브러리를 사용하기 위해 다운받아서 WEB-INF/lib 폴더에 넣었던 것을 
        pom.xml 설정으로 자동으로 다운 받게 되는 구조가 Maven이다. 
        기존의 웹프로젝트도 구조가 다른 이유는 메이븐 프로젝트이기 때문이다.
        pom.xml은 대소문자를 구분하지 않는다. 그래서 대부분의 이름을 "_" 표기로 한다.
        메이븐은 lib 폴더를 
    -->
    <!-- artifactIdsms 메이븐이 배포될때 설치될 장소, context-path로 지정 -->
    <!-- java 버전 바꾸는 방법
        1. Project Facets의 java를 1.8
        2. Java Compiler의 Java Build Path를 jdk1.8로 수정
        3. pom.xml의 java를 1.8로 수정
     -->
     <!-- spring mvc는 나온지가 5~7년 전 버전 때문에 너무 구버전이라 설정을 다시해야한다.
         메이븐이 지원하는 Spring Framework-version은 4. 때데 너무 하위 버전이라 오류를 일으킬 수 있다.
         스프링에서 mvc 프레임워크로 지원하는 메이븐은 4.1.7이 최적이다.
         4.2.8, 4.3.4(3.~4.) 메이븐을 지원 안함.
         
      -->
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                 </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
                
        <!-- AspectJ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>    
        
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>
 
        <!-- @Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
                
        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    
        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>        
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
 
cs

그리고 servlet-context.xml 도 살펴보자

상세설명은 주석을 참고하자

ex) servlet-context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.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.xsd">
 
 
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
    <!-- @Controller의 위치를 찾아서 Servlet 경로를 지정해준다.
         이 때 context:component-scan으로 지정한 위치의 객체만 찾는다.
         이 프로젝트의 Controller(HttpServlet)의 위치는 com.spring.l01_hello가 가지는
         class들 중에 @Controller가 있는 class다.
     -->
 
 
    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
 
 
    <!-- servlet에서 WEB-INF 이하의 폴더에 있는 JSP 문서를 찾도록 돕는 기술
         JSP 문서는 배포 파일이지만 서버언어가 포함되어 있다.
         기존의 프로젝트는 webContent(webapp) 이하에 view를 두고 있어서 서버의 경로가 노출될 위험이 있다.
         서버의 경로가 노출되면 해커에게 파일 업로드 공격을 당할 수 있다.
         이것을 막기 위해 view의 위치를 WEB-INF 이하에 둔다.
         WEB-INF 이하 경로는 외부에서 접근할 수 없다.
         -> 내부에서도 접근하기 힘들다.
         때문에 내부(서블릿, controller)에서 접근하기 위한 기술로 ViewResolver를 사용한다.
     -->
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    <!-- context:component-scan context 기술이고
         해당 패키지 이하의 class를 객체화하고 DI 컨테이너에서 사용할 수 있다.
         servlet-context.xml에서는 context:component-scan으로 @Controller 위치를 가지고
         annotation-driven으로 해당 객체를 스캔(servlet으로)한다.
     -->
    <context:component-scan base-package="com.spring.l01_hello" />
    
    
    
</beans:beans>
cs

HomeController.java에서 추가 설명을 보자

ex) HomeController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.spring.l01_hello;
 
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
/**
 * Handles requests for the application home page.
 */
//@Controller DispatcherServlet class를 의존성 주입한다.
//DispatcherServlet은 아파치 lib인 HttpServlet과 동일하다.
//@Controller를 해서 extends HttpServlet과 동일한 역할을 한다.
 
//servlet-context.xml에서 context:component-scan을 이용해서
//@Controller가 있는 패키지 이하 클래스를 객체로 가지고 
//annotation-driven으로 @Controller 이하에 있는 @RequestMapping를 검사 후 url을 등록한다.
@Controller
public class HomeController {
    //HomeController는 프로젝트 생성시 자동으로 만들어지는 컨트롤러(서블릿)이다.
    //SPRING은 모든 VIEW를 경로로 들어내는 것을 싫어한다.
    //가령 webConten(wepapp) 이하에 index.jsp를 만들어도 /로 인식할 수 없도록 하고 있다.
    //그래서 context-path 호출시 초기에 호출되는 상태를 ㅁ만든 것이 HomeController이다.
    
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        
        String formattedDate = dateFormat.format(date);
        
        model.addAttribute("serverTime", formattedDate );
        
        return "home";
    }
    
}
 
cs

주석에도 설명이 있듯이 스프링은 나온지 조금 시간지나서 설정을 해줄게 많다.

잊어버리지 않도록 잘 기억해두자!!

1. pom.xml에서 Java version 1.6 에서 1.8로 수정한다. 그리고 Spring-framework version을 4.1.7.RELEASE로 설정!!

2. JAVA BUILD PATH에서 JavaSE-1.8 설정

3. Java Compiler 에서 Java 1.8 설정

4. Project Facets 에서 Java 1.8 설정


Server를 실행해보자! 

지금까지와는 다르게 프로젝트 폴더를 선택 후 실행을 누르면 아래와 같이 뜬다.


Run on Server를 선택하고 실행하면 Home.jsp 화면이 실행되는 것을 확인할 수 있다.