Spring MVC에 네이버 검색 API 적용하기:)
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^
+
파일들은
요렇게 저장되어있습니당