WTP에서 Axis2를 이용한 웹 서비스 구현하기 Part 2: 상품 검색 기능 |
 |


|
CoD 신청자: 이상렬(pcguy7@gmail.com)
CoD 신청 내용: 요즘 이클립스 매력에 푹 빠진 개발자 입니다. WTP 플러그인과, Axis2 를 이용한 자바 기반의 웹서비스를 구현하고 관리하는 방법, WTP 플러그인을 이용한 웹서비스 클라이언트를 구현하고 관리하는 방법을 단순히 데모가 아닌 실프로젝트를 구축한다는 가정 하에 정리해 주었으면 합니다.
|
|
난이도 : 초급
2008년 1월 8일
웹 서비스 구현 시나리오 - 판매 프로세스
이번에 구현하는 시나리오는 판매 프로세스다.
[상품 검색] - [카테고리별 검색] - [물품 주문] - [미배송 상품 리스트 조회] - [배송 완료 전달]
고객은 Axis2Store에서 원하는 상품을 검색, 상품을 주문한다. 배송업체는 배송할 상품들을 조회한 후 물품을 집하한다.
배송업체는 배송을 마치면 Axis2Store에 배송이 끝났다는 내용을 전달한다.
|
위의 시나리오가 완료되는 데 있어 필요한 웹 서비스 기능들을 뽑아 보았다. 보는 관점에 따라 다른 기능이 도출될 수 있음을 유념하기 바란다.
- 상품 관련 기능
- 상품 검색 기능 제공
- 카테고리별 검색
- 배송 관련 기능
- 미배송 상품 목록 조회
- 위치별 분류
- 배송 완료 전달
이 기능들 중에서 상품 관련 기능을 WTP와 Axis2를 이용해 웹 서비스로 구현해 보겠다. 이 글은 판매 프로세스를 단순화하여 웹 서비스를 구현하는 데 목적을 두었기 때문에 모든 판매 프로세스를 설명할 수 없음을 양해 바란다.
웹 애플리케이션 생성
DB 생성
우선 웹 서비스에서 사용할 데이터베이스를 만들어 보자. MySQL콘솔을 실행하고 DB를 만들 수 있게 root 같은 관리자 계정으로 접근하여 아래와 같이 DB를 생성하고 권한을 부여한다. 여기서 설명하는 모든 작업은 MySQL GUI Tools 같은 GUI 도구를 이용해도 무방하다.
conosle> mysql -h localhost -u root -p
Enter password: XXXX
... 중략 ...
mysql> create database axis2store default charset utf8;
mysql> grant all privileges on axis2store.* to axis2store@localhost identified by 'axis2store' with grant option;
... axis2store로 접속한다.
mysql> use axis2store;
mysql> CREATE TABLE `products` (
`id` varchar(50) default NULL,
`name` varchar(100) default NULL,
`category` varchar(50) default NULL,
`cost` int(11) default NULL,
`price` int(11) default NULL,
`description` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
... 중략 ...
|
상품 관련 기능을 웹 서비스로 구축하기에 앞서 'products' 테이블을 만들었다. 나머지 customers, orders 테이블도 비슷하게 만들 수 있다.
예제 빈 객체 생성
앞서 웹 애플리케이션을 생성하고 애플리케이션 내에 빈(bean) 객체 하나를 만들고 그것을 처리하는 Manager 클래스를 만들었다. 비슷한 방법으로 시나리오에서 나온 객체들인 Product, Order를 생성한다. Manager 클래스는 DB 처리 부분을 설명한 후 다시 언급하겠다.
package axis2.store;
public class Product {
private String id;
private int price;
private String description;
public String getId() {
return id;
}
... 중략 ...
public void setCost(int cost) {
this.cost = cost;
}
... 중략 ...
public void setDescription(String description) {
this.description = description;
}
}
|
DB 연결
자바 애플리케이션과 MySQL 간의 인터페이스 연결을 위한 커넥터를 여기에서 다운로드할 수 있다. 압축을 푼 폴더 내의 mysql-connector-java-5.X.X-bin.jar만을 사용하기 때문에 적당한 곳에 두고 커넥터 jar 파일을 클래스 패스에 추가한다. OS 자체에서 클래스 패스를 지정하거나 배포될 톰캣에 사용할 jar를 추가할 수도 있다. 여기선 간단하게 Preferences - Java - Installed JRE에 add External JARs...으로 추가하였다. 데이터베이스와 애플리케이션간의 연결이 잘 되는지 간단한 조각코드를 통해 확인해 본다.
package axis2.store.util;
import java.sql.*;
public class DBConnTest {
DBConnTest() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/axis2store", "axis2store",
"axis2store");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM customers;");
while(rs.next()){
System.out.print(rs.getString(1) + " : ");
System.out.println(rs.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new DBConnTest();
}
}
|
데이터베이스를 연결하여 값을 가져오는 부분은 이미 관련 문서들이 많이 있기 때문에 상세한 설명은 생략하겠다. 콘솔에 입력된 사용자 ID와 이름이 나타나면 문제 없이 연결된 것이다.
|
데이터베이스를 이용한 개발시 잦은 DB 연결 호출의 성능 개선을 위해 데이터베이스 풀링(database pooling)이란 기법을 이용한다. 데이터베이스 풀링이란 DB 연결에 쓰이는 Connection 객체를 미리 생성해 담아 두어 필요할 때 사용하고 사용이 끝난 객체를 다시 반환하는 기법을 말한다. 사용자들이 자신들의 고유한 방법으로 구현한 API도 많이 있다. 이곳에 가면 자카르타에서 진행중인 DB 연결 풀링 프로젝트를 찾아 볼 수 있다.
|
예제 Manager 클래스 구현
Manager 클래스는 시나리오에서 설명한 기능(상품 검색 기능, 미배송 상품 리스트 조회 등)을 담고 있는 클래스다.
ProductManager.java
... 중략 ...
public ArrayList listProducts(String keyword){
ArrayList listProducts = new ArrayList();
Connection conn = DBUtil.getConnection();
Statement stmt;
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM products WHERE name like '%"
+ keyword.toUpperCase().trim() + "%';");
while(rs.next()){
Product product = new Product();
product.setId(rs.getString("id"));
... 중략 ...
product.setPrice(rs.getInt("price"));
product.setDescription(rs.getString("description"));
listProducts.add(product);
}
} catch (SQLException e) {
e.printStackTrace();
}
return listProducts;
}
... 중략 ...
|
위의 listProducts기능은 키워드를 받아 검색한 후 해당 상품들을 ArrayList에 담아 반환하는 메서드다. 비슷한 방법으로 시나리오에 나온 기능들을 추가로 구현할 수 있다. 예를 들어, "SELECT * FROM customers c, orders o WHERE c.id = o.customerId;" 같은 쿼리문을 이용해 구매내역이 있는 OrderManager.listOrderCustomers의 메서드나 가장 많이 주문된 상품의 리스트를 반환하는 메서드 등을 추가로 구현할 수 있다.
|
본 예제에서 몇 가지 안 되는 기능을 위해 Manager 클래스를 만드는 것이 비효율적인 것처럼 보일 수 있으나 좀더 복잡한 시나리오를 구현하거나 Manager들간의 연계가 복잡해진다면 이러한 방법이 효율적이란 것을 느끼게 된다.
|
Manager 클래스 사용 예제
이렇게 만들어진 Manager 클래스를 다음과 같은 방법으로 사용할 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@page import="axis2.store.Product"%>
<%@page import="axis2.store.ProductManager"%>
... 중략 ...
<%
ProductManager manager = new ProductManager();
ArrayList list = manager.listAllProducts();
%>
| ID | Name | Category | Value | Desc. |
<%
for(int i = 0 ; i < list.size() ; i ++){
Product product = list.get(i);
%>
| <%=product.getId() %> | <%=product.getName() %> |
<%=product.getCategory() %> | <%=product.getPrice() %> |
<%=product.getDescription() %> |
<%
}
%>
| |