Spring MVC 

네이버 검색 API 적용하기




안녕하세요 

오늘은 어제에 이어

Spring MVC에 네이버 책 검색 API를 적용한 웹페이지를 만들어보겠습니당! 




Dynamic Web Project를 선택 후 

Next 버튼 Next버튼 클릭 후 web.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
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Spring-naver-book</groupId>
  <artifactId>Spring-naver-book</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
            <groupId>net.sf.sociaal</groupId>
            <artifactId>xmlpull-xpp3</artifactId>
            <version>3.0.0.20130526</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
    </dependencies>
  
</project>
cs


pom.xml에 

dependencies를 세팅해주세요! 


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
<?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" id="WebApp_ID" version="3.1">
  <display-name>Spring-naver-book</display-name>
  <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>
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <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>/*</url-pattern>
   </filter-mapping>
</web-app>
cs



web.xml에 

dispatcher과 루트컨테이너 설정을 해주고 

dispatcher-servlet.xml 파일과 applicationContext.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
package model;
 
public class Book {
    private String title;
    private String link;
    private String image;
    private String author;
    private String price;
    private String discount;
    private String publisher;
    private String pubdate;
    private String isbn;
    private String description;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getDiscount() {
        return discount;
    }
    public void setDiscount(String discount) {
        this.discount = discount;
    }
    public String getPublisher() {
        return publisher;
    }
    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }
    public String getPubdate() {
        return pubdate;
    }
    public void setPubdate(String pubdate) {
        this.pubdate = pubdate;
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "Book [title=" + title + ", link=" + link + ", image=" + image + ", author=" + author + ", price=" + price
                + ", discount=" + discount + ", publisher=" + publisher + ", pubdate=" + pubdate + ", isbn=" + isbn
                + ", description=" + description + "]";
    }
    
}
 
cs

model 패키지를 만들고 

Book클래스를 생성해줍니다 


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
package service;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
 
import org.springframework.stereotype.Service;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
 
import model.Book;
 
@Service
public class NaverBookService {
    private static String clientID = "";
    private static String clientSecret = "";
 
    //display ==> 몇개 출력
    //start==>몇번쨰부터 (item)
    public List<Book> searchBook(String keyword, int display, int start){
        List<Book> list = null;
        try {
            URL url;
            url = new URL("https://openapi.naver.com/v1/search/"
                    + "book.xml?query="
                    + URLEncoder.encode(keyword, "UTF-8")
                    + (display !=0 ? "&display=" +display :"")
                    + (start !=0 ? "&start=" +start :""));
 
            URLConnection urlConn = url.openConnection();
            urlConn.setRequestProperty("X-Naver-Client-Id", clientID);
            urlConn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
            
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(
                    new InputStreamReader(urlConn.getInputStream()));
            //Test에서 했던 방식은 DOM방식이기때문에? 
            //그래서 이렇게 해도 된다?!??!??!? 
            
            
            
            int eventType = parser.getEventType();
            Book b = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                case XmlPullParser.END_DOCUMENT: // 문서의 끝
                    break;
                case XmlPullParser.START_DOCUMENT:
                    list = new ArrayList<Book>();
                    break;
                case XmlPullParser.END_TAG: {
                    String tag = parser.getName();
                    if(tag.equals("item"))
                    {
                        list.add(b);
                        b = null;
                    }
                }
                case XmlPullParser.START_TAG: {
                    String tag = parser.getName();
                    switch (tag) {
                    case "item":
                        b = new Book();
                        break;
                    case "title":
                        if(b != null)
                            b.setTitle(parser.nextText());
                        break;
                    case "link":
                        if(b != null)
                            b.setLink(parser.nextText());
                        break;
                    case "image":
                        if(b != null)
                            b.setImage(parser.nextText());
                        break;
                    case "author":
                        if(b != null)
                            b.setAuthor(parser.nextText());
                        break;
                    case "price":
                        if(b != null)
                            b.setPrice(parser.nextText());
                        break;
                    case "discount":
                        if(b != null)
                            b.setDiscount(parser.nextText());
                        break;
                    case "publisher":
                        if(b != null)
                            b.setPublisher(parser.nextText());
                        break;
                    case "pubdate":
                        if(b != null)
                            b.setPubdate(parser.nextText());
                        break;
                    case "isbn":
                        if(b != null)
                            b.setIsbn(parser.nextText());
                        break;
                    case "description":
                        if(b != null)
                            b.setDescription(parser.nextText());
                        break;
                    }
                    
                }
                }
                eventType = parser.next();
            }
            
            
            
            
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
}
 
 
cs



service 패키지를 만들고 

NaverBookService클래스를 생성해줍니당 


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
package controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import service.NaverBookService;
 
@Controller
public class BookController {
    @Autowired
    private NaverBookService service; 
    
    //키워드가 있을때도 있고 없을때도있음 
    //있을때는 가져가고 없을때는 안가져가고 
    @RequestMapping("bookList.do")
    public ModelAndView bookList(@RequestParam(required=false)String keyword){
        ModelAndView mav = new ModelAndView();
        
        if(keyword !=null)
        {
            mav.addObject("bookList",service.searchBook(keyword,10,1));
        }
        mav.setViewName("bookList");
        return mav;
    }
}
 
cs


controller패키지에 

BookController클래스를 만들어줍니다 


keyword가 있을때도 있고 없을때도 있기때문에 

@RequestParam(required=fasle)String keyword로 받아옵니다 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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"
    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.1.xsd">
    <context:component-scan base-package="controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>
 
</beans>
 
cs


dispatcher-servlet.xml 을 작성해줍니다 


1
2
3
4
5
6
7
8
9
10
<?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"
    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.1.xsd">
    <context:component-scan base-package="service"/>
 
</beans>
 
cs


applicationContext.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <center>
        <form action="bookList.do">
            <input type="text" name="keyword" >
            <input type="submit" value="검색">
        </form>
        
    </center>
    <table>
        <tr>
            <td colspan="7" width="100%" bgcolor="pink"></td>
        </tr>
        <c:forEach items="${bookList}" var ="b">
            <tr>
                <td rowspan="2"><img src="${b.image}"></td>
                <td rowspan="4" width="800">"${b.title}"</td>
                <td width="200">${b.author}</td>
            </tr>
            <tr>
                <td width="200">${b.price }</td>
                <td width="200">${b.discount }</td>
                <td width="200">${b.publisher }</td>
                <td width="200">${b.pubdate }</td>
                <td width="200">${b.isbn }</td>
            </tr>
            <tr>
                <td colspan="7">${b.description}</td>
            </tr>
            <tr>
                <td colspan="7" width="100%" bgcolor="pink"></td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
cs



그리고 

bookList.jsp 화면단을 만들어주면!! 

끄으으으읕! 



결과화면은 !!!

두두구둑두구 





프로젝트 선택후 

Run as -> Run on server 를 하면 

404 에러가 뜹니다 



bookList.do를 입력하면 

검색할 수 있는 화면이 뜨는 것을 확인 할 수 있습니다. 





java를 쓰고 검색하면 

java가 들어가있는 책이 모두 검색되는것을 확인할 수 있습니당^0^ 







+

파일들은 

요렇게 저장되어있습니당 





네이버개발자센터 


OPEN API XML 파싱 


(SAX방식)





XML이란 

트리구조의 데이터를 단순히 텍스트형태로 나타낸 것 



XML 파싱방법에는 두가지가 있습니다. 

DOM 파싱 / SAX 파싱 

DOM: 메모리에 모두 로드한 후 파싱/ 빠름/ 메모리사용량이 많음 

SCM : 순차적으로 읽어가며 파싱 / 메모리 사용량이 적고 / 미래를 모르기 떄문에 여러 기능에 제한 



-> 현재는 JSON을 많이 씁니다.

이유는 XML이 무겁고........................기타 여러가지 이유로! 







EClipse에서 

JAVA project를 생성하고 

MAVEN Project로 설정해줍니당 


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
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>NaverBookAPI</groupId>
  <artifactId>NaverBookAPI</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
  <dependencies>
      <dependency>
        <groupId>net.sf.sociaal</groupId>
        <artifactId>xmlpull-xpp3</artifactId>
        <version>3.0.0.20130526</version>
    </dependency>
  </dependencies>
</project>
cs


XML 파싱하기 위해서 

pom.xml에 다음과같은 dependency를 설정해줍니다.


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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
 
public class Test {
    public static void main(String[] args) throws Exception{
 
        String clientID="";
        String clientSecret = "";
        URL url = new URL("https://openapi.naver.com/v1/search/book.xml?query=java");
        
        URLConnection urlConn=url.openConnection(); //openConnection 해당 요청에 대해서 쓸 수 있는 connection 객체 
        
        urlConn.setRequestProperty("X-Naver-Client-ID", clientID);
        urlConn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
        
        BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
        
        String data="";
        String msg = null;
        while((msg = br.readLine())!=null)
        {
//            System.out.println(msg);
            data += msg;
        }
        
        List<Book> list = null//결과데이터 담을 리스트 
//        System.out.println(data); //응답받은 xml문서 xml문서로부터 내가 원하는 값 탐색하기(xml 파싱)
         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
         XmlPullParser parser = factory.newPullParser(); //연결하는거 담고 
         parser.setInput(new StringReader(data));
         int eventType= parser.getEventType();
         Book b = null;
         while(eventType != XmlPullParser.END_DOCUMENT){
             switch(eventType){
             case XmlPullParser.END_DOCUMENT://문서의 끝 
                 break;
             case XmlPullParser.START_DOCUMENT:
                 list = new ArrayList<Book>();
                 break;
             case XmlPullParser.START_TAG:{ //무조건 시작하면 만남 
                 String tag = parser.getName();
                 switch(tag){
                 case "items"//items가 열렸다는것은 새로운 책이 나온다는것 
                     b = new Book();
                     break;
                 case "title":
                     System.out.println(parser.nextText());
                     break;
                 }
                 break;
             }
         }
             eventType =parser.next();
    
    }
    for(Book book:list)
        System.out.println(book);
    }
}
 
cs



         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
         XmlPullParser parser = factory.newPullParser(); //연결하는거 담고 
         parser.setInput(new StringReader(data));


xml을 파싱하기 위해 XmlPullParser클래스를 사용합니당 

그리고 데이터를 읽습니다. 


int eventType= parser.getEventType();

위의 소스는 

코드의 시작과 끝을 알려주는것을 의미합니다 


문서가 끝나지 않을때까지 반복합니다 


END_DOCUMENT : 문서의 끝

START_TAG : 태그의 시작 

END_TAG: 태그의 끝

TEXT : 태그의 시작과 끝 사이에 나타남


하지만


XmlPullParser는 순차적으로 문서를 읽어가면서 이벤트를 발생시켜서 

뒤로 돌아가지못하는 문제를 발생합니다. 

그래서 이를 해결하기 위해 

START_TAG 이벤트가 발생하면 임시변수에 Tag값을 저장 

저장된 Tag값을 확인하여 적절한 변수에 값을 넣어야합니당 



XmlPullParser.START_Tag와 XmlPullParser.END_TAG에서는 getName() 사용 

XmlPullParser.TEXT에서는 getText()사용 

사용하지 않으면 null값을 반환 



실행하면 

위와같이 title이 출력되는 것을 확인 할 수 있습니다. 





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
 
public class Book {
    private String title;
    private String link;
    private String imag;
    private String author;
    private String price;
    private String discount;
    private String publisher;
    private String pubdate;
    private String isbn;
    private String description;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getImag() {
        return imag;
    }
    public void setImag(String imag) {
        this.imag = imag;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getDiscount() {
        return discount;
    }
    public void setDiscount(String discount) {
        this.discount = discount;
    }
    public String getPublisher() {
        return publisher;
    }
    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }
    public String getPubdate() {
        return pubdate;
    }
    public void setPubdate(String pubdate) {
        this.pubdate = pubdate;
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "Book [title=" + title + ", link=" + link + ", imag=" + imag + ", author=" + author + ", price=" + price
                + ", discount=" + discount + ", publisher=" + publisher + ", pubdate=" + pubdate + ", isbn=" + isbn
                + ", description=" + description + "]";
    }
    
}
 
cs


네이버 개발자 센터의 출력결과를 보고 

Book클래스를 만들어줍니다. 



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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
 
public class Test {
    public static void main(String[] args) throws Exception{
      
        String clientID="";
        String clientSecret = "";
        URL url = new URL("https://openapi.naver.com/v1/search/book.xml?query=java");

        
        URLConnection urlConn=url.openConnection(); //openConnection 해당 요청에 대해서 쓸 수 있는 connection 객체 
        
        urlConn.setRequestProperty("X-Naver-Client-ID", clientID);
        urlConn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
        
        BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
        
        String data="";
        String msg = null;
        while((msg = br.readLine())!=null)
        {
//            System.out.println(msg);
            data += msg;
        }
        
        List<Book> list = null//결과데이터 담을 리스트 
//        System.out.println(data); //응답받은 xml문서 xml문서로부터 내가 원하는 값 탐색하기(xml 파싱)
         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
         XmlPullParser parser = factory.newPullParser(); //연결하는거 담고 
         parser.setInput(new StringReader(data));
         int eventType= parser.getEventType();
         Book b = null;
         while(eventType != XmlPullParser.END_DOCUMENT){
             switch(eventType){
             case XmlPullParser.END_DOCUMENT://문서의 끝 
                 break;
             case XmlPullParser.START_DOCUMENT:
                 list = new ArrayList<Book>();
                 break;
             case XmlPullParser.END_TAG:{
                 String tag = parser.getName();
                 if(tag.equals("item")){
                     list.add(b);
                     b = null;
                 }
             }
                 
                 
             case XmlPullParser.START_TAG:{ //무조건 시작하면 만남 
                 String tag = parser.getName();
                 switch(tag){
                 case "item"//item가 열렸다는것은 새로운 책이 나온다는것 
                     b = new Book();
                     break;
                 case "title":
                     if(b!=null)
                         b.setTitle(parser.nextText());
                     break;
                 case "link":
                     if(b!=null)
                         b.setLink(parser.nextText());
                     break;
                 case "image":
                     if(b!=null)
                         b.setImag(parser.nextText());
                     break;
                 case "author":
                     if(b!=null)
                         b.setAuthor(parser.nextText());
                     break;
                 case "price":
                     if(b!=null)
                         b.setPrice(parser.nextText());
                     break;
                 case "discount":
                     if(b!=null)
                         b.setDiscount(parser.nextText());
                     break;
                 case "pubdate":
                     if(b!=null)
                         b.setPubdate(parser.nextText());
                     break;
                 case "isbn":
                     if(b!=null)
                         b.setIsbn(parser.nextText());
                     break;
                 case "description":
                     if(b!=null)
                         b.setDescription(parser.nextText());
                     break;
                 }
                 break;
             }
         }
             eventType =parser.next();
    
    }
    for(Book book:list)
        System.out.println(book);
    }
}
cs




(->네이버 책 검색 API 저장되어있는 예시입니다! 

네이버 개발자센터 개발가이드에 있습니다 )





eventType에 따라 실행하게 됩니다. 

문서가 시작되면 

ArrayLIst를 만들고 

item이 입력되면

새로운 Book 을 생성하고 

순서대로 

book의 title, link등을 넣어주게됩니당 


태그가 끝날 때 

배열에 book을 넣어주고 

다시 Book은 null로! 

-> 새로운 것을 받아서 읽고 그래야되니까요! 





for문을 돌려서 출력을 하면 

위와같이 나옵니다:) 





네이버 개발자 센터 


OPEN API 이용하기  


(기본 자바를 활용한 검색 API) 




네이버 로그인을하고 

네이버 개발자센터를 들어갑니다:) 




들어가면 위와같은 화면을 볼 수 있습니다.

API소개에서 

필요한 API를 고르시면 됩니다. 

저는 검색 API를 사용해보겠습니다.





검색 API를 선택하고 

오픈 API 이용 신청을 누릅니다. 





애플리케이션 등록 (API 이용 신청)화면이 나옵니다 

개개인에 맞게 작성 및 선택해주시면 됩니다. 

저는 TEST용도로 

애플리케이션 이름: API 배우기 

카테고리선택: 교육

이용목적 : 비로그인 오픈 API 

오픈API이용권한 신청: 검색 

비로그인 오픈 API서비스 활용: 웹서비스 활용에 적어주고 

휴대폰 인증을 완료한 후 

이용약관을 동의하고 등록하면 

끝!




그럼 

clientID 와 clientSecret 정보를 확인 할 수 있습니다 

따로 clientID와 clientSecret를 복사해두세요!

(복사를 못했어도 내 애플리케이션에서 확인 가능합니다) 








개발가이드에서 

준비사항, API 기본정보, 요청변수, 출력결과, 에러코드, 예시를 볼 수 있습니다.




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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
 
public class Test {
    public static void main(String[] args) throws Exception{
        //java코드로 특정 url에 요청보내고 응답받기
        //기본 자바 API를 활용한 방법
 
        String clientID=""//네이버 개발자 센터에서 발급받은 clientID입력
        String clientSecret = "";        //네이버 개발자 센터에서 발급받은 clientSecret입력
        URL url = new URL("https://openapi.naver.com/v1/search/book.xml?query=java"); //API 기본정보의 요청 url을 복사해오고 필수인 query를 적어줍니당! 
        
        URLConnection urlConn=url.openConnection(); //openConnection 해당 요청에 대해서 쓸 수 있는 connection 객체 
        
        urlConn.setRequestProperty("X-Naver-Client-ID", clientID);
        urlConn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
        
        BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
    
        String msg = null;
        while((msg = br.readLine())!=null)
        {
            System.out.println(msg);
        }
    }
}
 
cs



eclipse로 돌아와서 

Java project를 하나 생성합니다. 

클래스 생성 후 

다음과 같이 소스를 작성합니다. 


String clientID = " 자신의 clientID"를 적어주시면됩니다. 

clientSecret도 마찬가지예요!


url은 API의 기본 정보의 요청URL을 적어주시면 됩니다. 

이때!

요청변수에 query가 필수이기 때문에 

꼭 적어주셔야합니당 



그럼 실행을 하면 

java에 관한 책 정보가 출력된답니다~ 



하지만 

지금 사용한 

기본 자바 API를 이용한 방법은 잘 사용하지 않는다고 합니다 



다음엔 외부 라이브러리를 이용한 API사용방법을 알아보도록하겠습니당~ 





책검색 api의 url에 적절한 파라미터를 세팅해 요청을 보내고 xml형식으로 돌아오는 응답을 잘 읽어서 원하는 정보 추출 


자바코드로 어떻게 url에 요청을 보내고 응답을 읽을수 있는지 

xml문서에서 원하는 값을 어떻게 획득할 수 있는지지 



java코드로 특정 url에 요청보내고 응답받기


Client ID와 Client Secret 복사를 해두고!!  


query는 필수! 


-> 잘 사용하지 않는 방법입니당





Spring MVC 


회원관리 시스템 구축 



오늘은

 지난번에 했던 

Spring MVC 루트컨테이너 등록하기에 이어  회원관리 웹 사이트를 구축해보겠습니당!


화면 구성 


- 로그인 페이지 : 아이디와 비밀번호를 입력하고 로그인 요청이나 회원가입 요청을 할 수 있음 


- 메인 페이지 : 로그인한 사용자의 정보를 출력 

    이 페이지에서 로그아웃요청과 모든회원보기페이지요청, 회원수정페이지 요청을 할 수 있음


- 회원가입 페이지: 회원 정보를 입력하고 가입신청을 할 수 있음 


- 모든 회원 정보 보기 페이지: 모든 회원들의 정보를 열람할 수 있음 


- 회원 수정 페이지: 현재 로그인한 회원의 정보를 수정 할 수 있음 





사용자가 보낼 수 있는 요청들 


- main.do : 메인페이지를 달라는 요청


- loginForm.do :로그인 페이지를 달라는 요청


- login.do:로그인처리를 해달라는 요청(id, pw가 파라미터)


- logout.do : 로그아웃해달라는 요청


- join.do : 회원가입 처리를 해달라는 요청 (회원정보들이 파라미터) 


- memberUpdateForm.do : 회원 수정 폼을 달라는 요청


- memberUpdate.do : 회원 수정 처리를 해달라는 요청


- memberList.do : 모든 회원보기 페이지를 달라는 요청 







먼저 

설정파일부터 

세팅하겠습니당! 



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
<?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" id="WebApp_ID" version="3.1">
  <display-name>Spring_member</display-name>
  <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>
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener
    <context-param>
        <param-name>contextConfiguration</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param
</web-app>
cs


web.xml에 

servlet을 설정해줍니당 

이름은 

dispatcher로 해서 따로 이름변경코드는 안적었습니당! 

ContextLoaderListener을 사용해서 

루트컨테이너로!


1
2
3
4
5
6
7
8
9
10
11
12
13
<?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"
    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.1.xsd">
    <context:component-scan base-package="controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>
</beans>
 
cs


dispatcher-servlet.xml을 설정해주고요! 

context-scan을 사용해서 

쭉 읽어들일 수 있도록! 


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
<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
 
    <context:component-scan base-package="service"/>
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost/xe"></property>
        <property name="username" value="root"></property>
        <property name="password" value="mysql"></property>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="mapperLocations" value="classpath*:dao/mapper/**/*.xml"></property>
    </bean>
    <bean id="memberDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        <property name="mapperInterface" value="dao.IMemberDao"></property>
    </bean>
 
</beans>
 
cs


applicationContext.xml(루트컨테이너설정) 

annotation방식으로 사용하기 위해 service패키지를 스캔하는것입니당 

dataSource는 DB접속

sqlSessionFactory는 sqsl커넥션연결

memberDao는 매핑시켜줍니당 


 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package commons;
 
public class Constant {
    public static class Board{
        public static String NUM="num";
        public static String NAME="name";
        public static String PASS="pass";
        public static String CONTENT="content";
        public static String EMAIL="email";
        public static String READCOUNT="readCount";
        public static String WRITEDATE="writedate";
        public static String TITLE="title";
        
    }
    public static class Member{
        public static String NAME="name";
        public static String USERID="userid";
        public static String PWD="pwd";
        public static String EMAIL="email";
        public static String PHONE="phone";
        public static String ADMIN="admin";
    }
}
 
cs



우선 commons 패키지에 

Constant 클래스 내에 

Board와 Member를 만들어줍니당 



1
2
3
4
5
6
7
8
9
10
11
12
13
package dao;
 
import java.util.HashMap;
import java.util.List;
 
public interface IMemberDao {
    public int insertMember(HashMap<String, Object> params);
    public int updateMember(HashMap<String, Object> params);
    public int deleteMember(String id);
    public HashMap<String, Object> selectOne(String id);
    public List<HashMap<String, Object>> selectAll();
}
 
cs


dao 패키지내에 

IMemberDao 인터페이스를 만들어줍니당 


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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.IMemberDao">
    <insert id="insertMember" parameterType="java.util.HashMap">
        insert into member values(
        #{name}, #{userid}, #{pwd}, #{email}, #{phone},#{admin})
    </insert>
    <update id="updateMember" parameterType="java.util.HashMap">
        update member set
        name = #{name}, pwd = #{pwd},
        email = #{email}, phone = #{phone}, admin = #{admin}
        where userid = #{userid}
    </update>
    <delete id="deleteMember" parameterType="String">
        delete from member where userid = #{userid}
    </delete>
    <select id="selectOne" parameterType="String" resultType="java.util.HashMap">
        select * from member where userid = #{userid}
    </select>
    <select id="selectAll" resultType="java.util.HashMap">
        select * from member
    </select>
</mapper>
 
cs


dao 패키지내에 

mapper패키지를 만들어주고 

memberMapper.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
package service;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import commons.Constant;
import dao.IMemberDao;
 
@Service
public class MemberService {
    @Autowired
    private IMemberDao memberDao;
 
    
    public String getData(){
        return "I am a boy";
    }
    public List<HashMap<String, Object>> selectAll() {
        return memberDao.selectAll();
    }
 
//    public void joinMember(String id, String pwd, String pwd_Check, String name, String email, String phone, String admin){
//        HashMap<String, Object> params = new HashMap<String,Object>();
//        
//        if(pwd.equals(pwd_Check))
//        {
//            params.put(Constant.Member.USERID, id);
//            params.put(Constant.Member.PWD, pwd);
//            params.put(Constant.Member.NAME, name);
//            params.put(Constant.Member.EMAIL, email);
//            params.put(Constant.Member.PHONE, phone);
//            params.put(Constant.Member.ADMIN, admin);
//            memberDao.insertMember(params);
//        }
//        
//    }
    
    public void joinMember(HashMap<String, Object> params){
        
        if(params.get("pwd").equals(params.get("pwd_CHECK")))
        {
            memberDao.insertMember(params);
        }
    }
    
    
    public boolean login(String id, String pwd){
        HashMap<String, Object> result = memberDao.selectOne(id);
        if(result == null)
            return false;
        else 
        {
            String oPwd = (String) result.get(Constant.Member.PWD);
            if(oPwd==null)
                return false;
            else{
                if(oPwd.equals(pwd))
                    return true;
                else
                    return false;
            }
            
        }
    }
    
    //회원 한명의 정보를 가져다주는 
    public HashMap<String, Object> getMemberInfo(String id){
        return memberDao.selectOne(id);
    }
    
    public void memberUpdate(HashMap<String, Object> params){
 
        if(params.get("pwd").equals(params.get("pwd_CHECK")))
        {
            HashMap<String, Object> record = memberDao.selectOne((String)params.get(Constant.Member.USERID));
            record.putAll(params); //원래있던거에 내가 받은걸로 수정
            memberDao.updateMember(record);
        }
    }
}
 
cs


service 패키지내에 

MemberService를 만들어줍니당 


위의 소스를 보시면

 주석처리한것처럼해도 되지만

HashMap을 이용하면 더 편리하기 때문에 HashMap을 이용했습니당 

또한 

update할 때 

admin값도 업데이트할 수 있도록 

record를 사용한것을 알 수 있습니당! 




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
package controller;
 
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.http.HttpSession;
 
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 org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import service.MemberService;
//서비스주입받아서
//받은 리퀘스트를 처리하기에 피룡한 서비스의 메소드를 호출해서 결과 획득 
//결과 데이터랑 적절한 페이지 세팅해서 
//모델엔뷰 리턴 
@Controller
public class MemberController {
    @Autowired
    private MemberService service;
 
    @RequestMapping("test.do")
    public ModelAndView dummy(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("attr",service.getData());
        mav.setViewName("test");
        return mav;
    }
    @RequestMapping("memberList.do")
    public ModelAndView dummy2(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("memberList",service.selectAll());
        mav.setViewName("selectAll");
        return mav;
    }
//Spring MVC컨트롤러에서 사용할 수 있는 반한유형 종류 
//데이터와 패키지의 정보가 둘다 있는 경우
//-ModelAndView()
//데이터에 대한 정보만 있는 경우
//Model or Map
//페이지에 대한 정보만 있는 경우 
//String 
//둘다 없는 ㅕㅇ우
//void 
 
    @RequestMapping("loginForm.do")
    public String loginForm(){
        return "loginForm";
    }
 
    @RequestMapping("joinForm.do")
    public void joinForm(){
        
    }
    
    
    //응답할페이지에 대한 정보가 없는 경우는 (void, Model, Map 경우)  
    //받은 url에서 . 이하를 제외한 문자열을 페이지 정보로 사용함 
    //    ex)joinForm.do -> joinForm
    
    
    //join.do는 회원정보 데이터들을 파라미터로 받아서 
    //디비에 저장하고, loginForm.do로 리다이렉트 해줘야됨
//    @RequestMapping("join.do")
//    public String join(String id, String pwd, String pwd_Check, String name, String email, String phone, String admin){
//        
        //System.out.println("id");
        //파라미터가 잘 들어오는지 확인! ㅋㅋ
        //파라미터 이름이 똑같아야함 uid로 하면 없으니까 null값이 뜸 
        //@RequestParam("id") String uid id라는 파라미터의 값을 uid매개변수에 넣어주셈!
        //required, value, defaultValue의 속성값이 있는데 
        //required값이 true일 경우 해당 파라미터가 없으면 요청처리 못함 
        //defaultValue는 해당 파라미터 값이 들어오지 않았을 경우 
        //지정한 디폴트 값으로 변수값 대체 
        // id, pwd, pwd_Check, name, email, phone, admin의 파라미터들이 있음     
        
//        service.joinMember(id, pwd, pwd_Check, name, email, phone, admin);
//        return "redirect:loginForm.do";
//        //리다이렉트하는 방법
//    }
    
    @RequestMapping("join.do")
    public String join(@RequestParam HashMap<String, Object> params)
    {
        System.out.println(params);
        service.joinMember(params);
        return "redirect:loginForm.do"
    }
    
//    @RequestMapping("login.do")
//    public String login(HttpSession session,String id, String pwd){
////    성공 실패에 따라 리다이렉트 방향 결정
//        //session사용은 매개변수에 session참조변수를 두면 자동으로 들어옵니다 
//        //login.do처리를 완성하세요 
//        //로그인 성공이면 main.do 리다이렉트
////        //로그인 실패이면 loginForm.do 리다이렉트
//        if(service.login(id, pwd)){
//            session.setAttribute("userid", id);
//            return "redirect:main.do";
//        }
//        else{
//            return "redirect:loginForm.do";
//        }
//    
//    }
    
    @RequestMapping("login.do")
    public ModelAndView login(HttpSession session,String id, String pwd){
//    성공 실패에 따라 리다이렉트 방향 결정
        //session사용은 매개변수에 session참조변수를 두면 자동으로 들어옵니다 
        //login.do처리를 완성하세요 
        //로그인 성공이면 main.do 리다이렉트
//        //로그인 실패이면 loginForm.do 리다이렉트
        ModelAndView mav = new ModelAndView();
        if(service.login(id, pwd)){
            session.setAttribute("userid", id);
            mav.setViewName("redirect:main.do");
        }
        else{
            //return "redirect:loginForm.do";
            mav.setViewName("redirect:loginForm.do");
        }
        return mav;
    
    }    
    
    @RequestMapping("main.do")
    public String main(Model model,HttpSession session ){
        String userid = (String) session.getAttribute("userid");
        if(userid == null)
            return "redirect:loginForm.do";
        else{
//            model.addAllAttributes(service.getMemberInfo(id))<= Map을 통채로 싣기 
//            model.addAttibute(arg0); <= 모델 객체를 통채로 싣기 
//            model.addAttribute(arg0, arg1); <=키 값 지정 하나의 데이터 싣기 
            model.addAllAttributes(service.getMemberInfo(userid));
            return "main";
        }
 
        
    }
    @RequestMapping("logout.do")
    public String logout(HttpSession session){
//        session.invalidate();
        session.removeAttribute("userid");
        return "redirect:loginForm.do";
        
    }
    @RequestMapping("memberUpdateForm.do")
    public String memberUpdateForm(Model model,HttpSession session){
        String userid = (String) session.getAttribute("userid");
        if(userid == null)
            return "redirect:loginForm.do";
        model.addAllAttributes(service.getMemberInfo(userid));
        return "memberUpdateForm";
    }
    @RequestMapping("memberUpdate.do")
    public String memberUpdate(@RequestParam HashMap<String, Object> params){
        service.memberUpdate(params);
        return "redirect:main.do";
    }
    
    
 
}
 
cs


그리고 

controller패키지내에  MemberController를 만들어줍니당 



ModelAndView를 이용할 수 있고 

String, void, Model, Map등 

다양한 방법을 알 수 있도록 여러가지 방법을 써봤습니당 



but 

팀 개발할때는 

하나로만 하는게 좋겠쬬!??!??! ?





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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원가입</title>
</head>
<body>
    <center>
        <h1>회원가입 페이지</h1>
 
        <form action="join.do">
            <table>
                <tr>
                    <td>아이디</td>
                    <td><input type="text" name="userid" ></td>
                </tr>
                <tr>
                    <td>비밀번호</td>
                    <td><input type="password" name="pwd"></td>
                </tr>
                <tr>
                    <td>비밀번호 확인</td>
                    <td><input type="password" name="pwd_CHECK" ></td>
                </tr>
                <tr>
                    <td>이름</td>
                    <td><input type="text" name="name" ></td>
                </tr>
                <tr>
                    <td>이메일</td>
                    <td><input type="text" name="email" ></td>
                </tr>
                <tr>
                    <td>연락처</td>
                    <td><input type="text" name="phone" ></td>
                </tr>
                <tr>
                    <td>관리자번호</td>
                    <td><input type="text" name="admin" ></td>
                </tr>
 
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="가입하기"><input type="reset" value="다시작성"></td>
                </tr>
            </table>
 
        </form>
    </center>
</body>
</html>
cs



joinForm.jsp 입니당 


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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <center>
        <form action="login.do">
            <table>
                <tr>
                    <td width="150px" align="center">아이디 :</td>
                    <td width="150px" align="center">
                        <input type="text" name="id">
                    </td>
                </tr>
                <tr>
                    <td width="150px" align="center">비밀번호 :</td>
                    <td width="150px" align="center">
                        <input type="password" name="pwd">
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="로그인">
                    </td>
                </tr>
            </table>
        </form>
    </center>
</body>
</html>
cs


loginForm.jsp 입니당


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Main Page </title>
</head>
<body>
    <h2>회원 전용 페이지</h2>
    ${userid}님으로 로그인 하셨습니다.<br>
    ${name }님 환영합니다<br>
    연락처 : ${phone }<br>
    이메일 : ${email }<br>    
    <input type="button" value="로그아웃" onclick="location.href='logout.do'">  
    <input type="button" value="모든회원보기" onclick="location.href='memberList.do'">
    <input type="button" value="회원수정페이지" onclick="location.href='memberUpdateForm.do'">
    
</body>
</html>
cs

main.jsp 입니당


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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원 수정 </title>
</head>
<body>
<body>
    <center>
        <h1>회원정보 수정 페이지</h1>
 
        <form action="memberUpdate.do">
            <table>
                <tr>
                    <td>아이디</td>
                    <td><input type="text" name="userid" value="${userid }" ></td>
                </tr>
                <tr>
                    <td>비밀번호</td>
                    <td><input type="password" name="pwd"></td>
                </tr>
                <tr>
                    <td>비밀번호 확인</td>
                    <td><input type="password" name="pwd_CHECK" ></td>
                </tr>
                <tr>
                    <td>이름</td>
                    <td><input type="text" name="name" value="${name }" ></td>
                </tr>
                <tr>
                    <td>이메일</td>
                    <td><input type="text" name="email"  value="${email }"></td>
                </tr>
                <tr>
                    <td>연락처</td>
                    <td><input type="text" name="phone"  value="${phone }"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="수정하기"><input type="reset" value="다시작성"></td>
                </tr>
            </table>
 
        </form>
    </center>
</body>
</body>
</html>
cs


memberUpdate.jsp 입니당


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:forEach var="member" items="${memberList }">
        ${member.name } , ${member.userid} <br>
    </c:forEach>
</body>
</html>
cs

selectAll.jsp 입니당 




이러면 화면 구성까지 완료!






그렇다면

요렇게 되어있어야 

정상! 




+

데이터베이스는 

아래와 같습니당! 






Spring MVC 


루트컨테이너 등록하고 사용하기:)  



1. Dynamic Web Project를 생성합니다. 

프로젝트 이름을 주고 

Next 버튼을 선택 후 

web.xml 체크박스를 선택 후 Finish를 선택! 



2. Configure -> Convert to Maven Project를 선택해서 

완료버튼을 클릭해줍니당



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
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Spring_member</groupId>
  <artifactId>Spring_member</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
 
 
     <dependencies>
  
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
    </dependencies>   
  
  
</project>
cs


3. pom.xml에 

디펜던시 세팅해줍니다

(spring core, context, web, webmvc, jdbc, aop, mybatis, mybatis-spring, mysql)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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" id="WebApp_ID" version="3.1">
  <display-name>Spring_member</display-name>
  <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>
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>
cs


4. web.xml에 dispatcherServlet을 서블릿으로 등록 

*.do에 대해서 처리하도록 서블릿 매핑 



1
2
3
4
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
cs


+

만약 

경로와 설정파일의 이름이 다르다면 이렇게 !! 


+

항상

마지막에 

<load-on-startup>1</load-on-startup>

써줘야함

중간에써주면안됨! 

안써줘도상관은없지만!! 


1
2
3
4
5
6
7
8
9
10
11
12
13
<?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"
    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.1.xsd">
    <context:component-scan base-package="controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>
</beans>
 
cs



5. dispatcherServlet이 사용할 스프링 설정파일 생성 

(Spring Bean Configuration FIle)

controller패키지에 대해서 컴포넌트 스캔

internalResourceViewResolver등록 

(prefix는 jsp파일을 모아놓은 폴더경로

suffix는 jsp파일들의 확장자로)






루트컨테이너 등록하고 사용하기:)  


루트컨테이너 등록하는 방법

1. web.xml에 컨텍스트 로더 리스너를 등록 

2. /WEB-INF/applicationContext.xml이름으로 스프링 설정 파일 작성



web.xml에 ContextLoaderListener클래스를 리스너로 등록하면 

/WEB-INF/applicaitonContext.xml을 설정파일로해서 스프링컨테이너를 하나 빌드하고 

해당 컨테이너를 모든 서블릿 컨테이너가 공유할 수 있도록 세팅! 



1
2
3
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
cs


1. 아까 설정해 둔 web.xml에 

위의 내용 추가! 


1
2
3
4
    <context-param>
        <param-name>contextConfiguration</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param
cs


+

만약

applicationContext.xml 파일명을 바꾸고싶을경우는 

<param-value></param-value> 사이에 원하는 설정파일 경로와 이름을 작성하면 됨! 





applicationContext.xml은 

서비스단 이하를 빈으로 등록

(datasource, sqlSessionFacotry, mapperFactoryBean(Dao), services클래스(컴포턴트스캔),트랜잭션 매니저 등) 



dispatcher-servlet.xml은 

서블릿컨테이너 

여기에는 mvc구성요소들 

컨트롤러(컴포넌트스캔) 


1
2
3
4
5
6
7
8
9
10
11
12
package service;
 
import org.springframework.stereotype.Service;
 
@Service
public class MemberService {
    public String getData(){
        return "I am a boy";
    }
}
//@Component: 이 에노테이션이 달려있는 클래스는 컴포넌트 스캔에 의해서 빈으로 등록이됨 
//그때의 빈의 아이디의 첫글자는 소문자 
cs


2. MemberService를 만들어줍니당 



1
2
3
4
5
6
7
8
9
10
11
<?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"
    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.1.xsd">
 
    <context:component-scan base-package="service"/>
    
</beans>
 
cs


3. 루트컨테이너인 

applicationContext.xml에

MemberService를 빈으로 등록! 


 

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
package controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import service.MemberService;
//서비스주입받아서
//받은 리퀘스트를 처리하기에 피룡한 서비스의 메소드를 호출해서 결과 획득 
//결과 데이터랑 적절한 페이지 세팅해서 
//모델엔뷰 리턴 
@Controller
public class MemberController {
    @Autowired
    private MemberService service;
    @RequestMapping("test.do")
    public ModelAndView dummy(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("attr",service.getData());
        mav.setViewName("test");
        return mav;
    }
 
}
cs



4. MemberController만들고 

service참조변수에 루트컨테이너에 등록되있는 

MemberService빈 객체를 주입 


@Autowired 사용! 


test.do에서 

서비스객체의 getData 함수호출의 결과를 attr에 싣고 

test.jsp를 뷰페이지로 지정



1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${attr }
</body>
</html>
cs




5. jsp폴더내

test.jsp를 만들어줍니당! 




6. 이렇게 파일을 만드셨으면! 

실행을 해보겠습니당! 




7. 실행하면 404에러가 뜨지만

test.do를 입력하면

위와같은 

I am a boy를 출력할 수 있습니다~ 










+ 알아둬야할 사항


@Component의 아들들!

@Controller, @Service, @Repository

-> 모두 @Component의 아들들 

-> 그러므로 컴포넌트 스캔에의해 빈등록됨 

@Controller -> hanlderMapping 추가됨 


그래서 MemberController.java에서는 

@Component가 아닌 

@Controller을 씀 


이유는 

@Component를 쓰면 

HandlerMapping기능이 없기 때문에 

아마 조회가 안되는 일이 발생 


@Controller은 

HandlerMapping기능이 있어서 

Controller알아서 찾을 수 있도록!? 

여튼 그런 기능! 






Spring MVC 예제  


(annotation 방식) 





1. new -> other -> Dynimic Web Project 선택 후 

Next 버튼 클릭 후 

체크박스 선택 후 

프로젝트를 생성해줍니당! 




2. Maven Project로 등록을 해줍니다 


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
<?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" id="WebApp_ID" version="3.1">
  <display-name>0616</display-name>
  <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>
  
  
  <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>*.do</url-pattern>
  </servlet-mapping>
  
  
</web-app>
cs

3. Spring_mvc2 프로젝트에서 

WebContetn 폴더 내 

WEB-INF의 web.xml에 

servlet를 등록해줍니당 



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
package controller;
 
import java.util.Date;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class MyController {
 
    @RequestMapping("hello.do")
    public ModelAndView hello(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("msg","Hello World");
        mav.setViewName("hello");
        return mav;
    }
    @RequestMapping("whatTime.do")
    public ModelAndView whatTime(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("time",new Date());
        mav.setViewName("whatTime");
        return mav;
    }
    
}
 
cs




4. controller 패키지내 

MyController 클래스를 생성 


@Controller의 아들로써 빈으로 등록되게 함 

Request를 받아 처리하는 컨트로러써 인식 


처리하고 싶은 요청 url을 에노테이션에 
함수 내용에서는 처리하고자하는 로직을 처리 후 
데이터와 뷰의정보를 세팅해서 리턴해줍니다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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"
    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.1.xsd">
    
    <context:component-scan base-package="controller"></context:component-scan>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>
</beans>
 
cs



5. servlet설정파일을 생성해주고 

(WEB-INF)파일안에 생성! 

파일이름은 

(자신의 ${servlet-name}-servlet.xml 이라는 이름규칙을 설정파일로 사용)

dispatcher-servlet.xml 생성해주고 


위와같이 만들어줍니당! 



 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>

+

요부분은 

MyController.java에서 

"jsp/hello.jsp"파일이름을 

hello라고만 쓰게 하려고 

써둔것입니당! 



1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${msg}
</body>
</html>
cs


1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${time}
</body>
</html>
cs




6. WebContent 폴더 내에 

jsp폴더를 생성 후 

hello.jsp 와 whatTime.jsp를 생성해줍니당! 




7. 위의 사진과 같이 구성된 것을 확인 할 수 있습니다! 





8. Spring_mvc2 프로젝트의 

Run As -> Run on Server클릭 후 Finish 버튼을 눌러주세요! 







9. 톰캣이 실행되면 

404 에러가 뜬다고 

당황 NO! 

hello.do 

또는 

whatTime.do 

작성해주시면됩니당~ 





오늘도 열공열공~ 




Spring MVC 예제  


(xml에 따로 등록하는 방식) 


1. New -> other -> Web -> Dynamic Web Project를 선택합니다. 



2. 프로젝트 이름을 정하고 Next 버튼을 클릭합니다 



3. Next 버튼을 끝까지 누르고나서 

체크박스를 클릭한 후 Finish버튼을 선택합니다



4. 0616으로 프로젝트 생성하면 

위와 같은 화면이 나옵니다 



5. Maven Project로 설정해줍니다




6. 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
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Spring_mvc1_ex</groupId>
  <artifactId>Spring_mvc1_ex</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
    <dependencies>
  
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
 
        
    </dependencies>  
    
</project>
 
cs


7. pom.xml에 

core, context, web, webmvc를 넣어줍니다 

www.mvnrepository.com

검색하시면됩니당! 




8. 7까지 완료하고나면 

Maven Dependencies에 파일을 확인 할 수 있습니다 


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
<?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" id="WebApp_ID" version="3.1">
  <display-name>0616</display-name>
  <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>
  
  
  <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>*.do</url-pattern>
  </servlet-mapping>
  
  
</web-app>
cs


9. web.xml에 servlet을 설정해줍니다.

dispatcher이름은 원하는 이름으로 적어주면됩니다. 

servlet-mapping으로

*.do 요청을 처리 


<servlet-class>org.s~~~ </servlet-class>

: 스프링에서 만들어둔 DispatcherServlet 클래스명으로 작성 

<load-on-startup>1</load-on-startup>

여러가지 servlet 중 요걸 처음으로 읽어라! 실행하라 라는 의미




10. DispatcherServlet이 사용할 스프링설정 파일 생성 


기본적으로 DispatcherServlet은 WEB-INF안에 

자신의 ${servlet-name}-servlet.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
package controller;
 
import java.util.Date;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
 
public class WhatTimeController implements Controller{
 
    @Override
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub
        //어떤 데이터를 가지고 어느 jsp로 보낼지를 결정 
        //기존 방법, 직접 리퀘스트객체에 setAttribute하고 
        //직접 리퀘스트 객체를 이용해 특정 jsp페이지로 포워드했음
        
        ModelAndView mav = new ModelAndView();
        Date date = new java.util.Date();
        mav.addObject("date",date);
        mav.setViewName("jsp/whatTime.jsp");
        
        
        return mav;
    }
 
}
 
cs


11. src 안에 controller 패키지를 생성하고 

controller 패키지 안에 

WhatTimeController 클래스를 생성합니다:) 



1
2
3
4
5
6
7
8
9
10
11
12
13
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id"handlerMapping"
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
 
     <bean class="controller.WhatTimeController" name="/whatTime.do"></bean
 
 
</beans>
 
cs


12. 위에서 만들어 둔 

dispatcher-servlet.xml 

설정파일ㅇ ㅔ

controller.WhatTimeController 를 bin 등록해둡니당! 





13. 프로젝트 선택 후 

Run As -> Run on Server 클릭하면 

HTTP Status 404 에러가 뜹니다 


여기서 

whatTime.do라고 작성하면 



14. 현재시간이 출력됩니당:) 

끝! 

Spring MVC 

MVC 패턴 기반 웹 개발 프레임워크 



Spring MVC 구성 주요 컴포넌트 


DispatcherServlet : 모든 요청을 최초로 받아들이는 역할 (Front Controller)


Controller :  요청을 실제로 처리하는 역할


HandlerMapping : 클라이언트 요청 처리할 Controller를 찾는 작업 처리 


View : 응답하는 로직을 처리


ViewReslover:  응답할 View를 찾는 작업을 처리


ModelAndView : 컨트롤러의 처리 결과로써 응답에 사용할 데이터와 뷰에 대한 정보 집합 



Spring MVC 흐름 



1. DispatcherServlet이 요청을 수신 

* 단일 Front controller servlet 

* 요청을 수신하여 처리를 다른 컴포넌트에 위임

* 어느 컨트롤러에 요청을 전송할지 결정


2. DispatcherServlet은 HandlerMapping에 어느 컨트롤러를 사용할 것인지 문의


3. DispatcherServlet은 요청을 컨트롤러에게 전송하고 컨트롤러는 요청을 처리한 후 결과 리턴

*비즈니스 로직 수행 후 결과 정보(Model)가 생성되어 JSP와 같은 뷰에서 사용됨


4. ModelAndView를 생성하여 DispatcherServlet에 리턴


5. ModelAndView 정보를 바탕으로 ViewResolver에게 View 요청


6. View는 결과정보를 사용하여 화면에 표현함 

Eclipse에서 Spring Framework 구축 



1. 화면 상단 Help-> Eclipse Marketplace 선택





2. SPring 프레임워크를 사용하기 위해서 

Eclipse Marketplace에서 STS 검색 

Spring Tool Suite (STS) for Eclipse 3.7.3.RELEASE 설치




3. New -> Java Project 





4. 0613이라는 이름으로 프로젝트 생성 





5.  프로젝트 생성 후 

Configure -> Convert to Maven Project를 선택 






6. Maven Project로 등록을 하고 나면 

0613프로젝트 앞에 M이라고 쓰여있는것을 확인! 




7. pom.xml 파일을 선택 후 

아래 pom.xml을 선택



8. pom.xml에 내용 추가


저는 일단 spring-core, spring-context만 추가했습니다.

그 외에 필요한 소스는 아래 홈페이지에서 검색 후 소스를 가져오시면됩니당^0^ 

www.mvnrepository.com




9. pom.xml을 저장하면 

0613프로젝트에 

Maven Dependencies가 생긴것을 확인 할 수 있습니다. 





Eclipse에서 Spring Framework를 구축했습니당!! 






스프링프레임워크(Spring Framework)

 

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 스프링(Spring)이라고도 불림 

 

스프링프레임워크의 구성




  • Spring Core
    Spring 프레임워크의 근간이 되는 IoC(또는 DI) 기능을 지원하는 영역을 담당
    BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원
  • Spring Context
    Spring Core 바로 위에 있으면서 Spring Core에서 지원하는 기능외에 추가적인 기능들과 좀 더 쉬운 개발이 가능하도록 지원
    또한 JNDI, EJB등을 위한 Adaptor들을 포함
  • Spring DAO
    지금까지 우리들이 일반적으로 많이 사용해왔던 JDBC 기반하의 DAO개발을 좀 더 쉽고, 일관된 방법으로 개발하는 것이 가능하도록 지원
    Spring DAO를 이용할 경우 지금까지 개발하던 DAO보다 적은 코드와 쉬운 방법으로 DAO를 개발하는 것이 가능
  • Spring ORM
    Object Relation Mapping 프레임워크인 Hibernate, IBatis, JDO와의 결합을 지원하기 위한 기능 
    Spring ORM을 이용할 경우 Hibernate, IBatis, JDO 프레임워크와 쉽게 통합하는 것이 가능
  • Spring AOP
    Spring 프레임워크에 Aspect Oriented Programming을 지원하는 기능이다. 이 기능은 AOP Alliance 기반하에서 개발
  • Spring Web
    Web Application 개발에 필요한 Web Application Context와 Multipart Request등의 기능을 지원
    또한 Struts, Webwork와 같은 프레임워크의 통합을 지원하는 부분을 담당
  • Spring Web MVC
    Spring 프레임워크에서 독립적으로 Web UI Layer에 Model-View-Controller를 지원하기 위한 기능
    지금까지 Struts, Webwork가 담당했던 기능들을 Spring Web MVC를 이용하여 대체하는 것이 가능하다. 또한 Velocity, Excel, PDF와 같은 다양한 UI 기술들을 사용하기 위한 API를 제공

스프링프레임워크의 특징


1. 경량 컨테이너로 자바 객체를 직접 관리 

   각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하고 스프링으로부터 필요한 객체를 얻어올 수 있음 


2. POJO(Plain Old Java Object)방식의 프레임워크 

   기존에 존재하는 라이브러리 등을 지원에 용이 


3. 제어 반전 지원

   필요에 따라 스프링에서 사용자의 코드를 호출


4. 의존성 주입 지원

   각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결 


5. 관점 지향 프로그래밍

   트랜잭션, 로깅, 보안과 같은 여러모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리 


6. 영속성과 관련된 다양한 서비스 지원

   ex) ibatis, Hibernate 등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스 제공


7. 높은 확장성




더 자세한 정보는 아래를 참고해주세요!

Spring 프레임워크 소개와 IoC 및 Spring IoC의 개념 

위키백과(스프링프레임워크)


+ Recent posts