들어가는 말...
시스템간의 인터페이스에 웹 서비스를 사용하고 있는데,
솔루션을 사용하다보니, 그 Basic 이 궁금해졌다.
자료를 찾아보니 너무 어려웠다.
개념에 대한 내용은 많았지만, 실제 예제로 설명하는 부분은 찾기가 힘들었다.
백문이불여일타....
그중 찾은 것은 유투브에 있는 자료...
영어발음으로 보아.. 인도영화에서 들었던 그 억양...
그 개발자에게 감사하며 여기 예제는 그 내용에 대한 정리와 내 개인적인 공부를 추가한 자료이다.
유투브 영상 주소 - https://www.youtube.com/watch?v=fE1pVSiXNkU
■ 사용 Tool.
STS3(Dynamic Web Project) , java1.8 ( STS4에서는 오류가 발생했음. 아마도 낮은 버전의 이클립스에서 구동될듯하다.
■ 웹 서비스 서버 구축
진행요약 : 이클립스 - Dynamic Web Project - 간단한 클래스 생성 - 웹 서비스 실행 - 최종 내용 확인
1. 이클립스 - Dynamic Web Project 구동
New -> Dynamic Web Project -> Project Name 입력 -> next -> next -> web.xml 체크 -> Finish
2. 간단한 Biz Logic 생성
- 사람 - 이름 , 나이 를 가져오는 너무도 일반적인 샘플
package com.web.people;
public interface PeopleInf {
public String getName();
public int getAge();
}
package com.web.people;
public class People implements PeopleInf {
private String name ="홍길동";
private int age = 30;
@Override
public void setName(String pname) {
this.name = pname;
}
@Override
public String getName() {
return name;
}
@Override
public int getAge() {
return age;
}
}
3. 웹 서비스 생성
이제 작성한 내용을 외부에서 가져다 사용 가능하도록 wsdl 을 생성한다.
People.java - 우버튼 - Web Service - Create Web Service
>>>>>>>>>>> 따라하기....
여기까지 하면,,, 신기하게도 자동으로 뭔가가 막 만들어진다.
그리고, 서버가 구동된 후 아래와 같은 화면을 볼 수 있다.
사실 나 이 화면 보고 감동...
url 은 web.xml 의 url-pattern 을 참고함.
위에서 People (wsdl) 을 클릭하면 wsdl 명세서를 볼 수 있음.
이제는 Client 에게 'localhost:8080/WebServiceServer/services/People?wsdl' url 을 전달하여
웹 서비스 Client 를 생성하도록 하면 됨.
■ 웹 서비스 Client 구축
진행요약 : 이클립스 - java project - Web Service client 실행 - main 함수 생성
프로젝트에 - 우버튼 - New - other - web service client
Next
wsdl URL 입력 - 서버에서 실행했던 그 URL
Next - Finish
위 내용까지 진행하면, 자동으로 뭔가를 생성함.
생성내용 확인 - 이해는 할 수 없지만, 좀 신기함.
▶ wsdl 명세서를 통해 위와 같은 Client 소스를 생성함.
▶ 해당 소스에서 사용할 코드는 Proxy 가 붙은 소스를 사용.
▶ main() 클래스를 생성하여 테스트 진행
Client 테스트도 성공...
그럼 서버도 만들고 , Client 도 만들고.... 끝...
여기서 ...
내가 삽질한 내용..
p.setName("홍길순"); 을 실행하고
p.getName() 을 하면... 당연히 "홍길순" 이 나올줄 알았는데.... 안나옴. 그대로 "홍길동"
한참을 확인 후 발견한 사실....
위 클라이언트에서 메서드를 호출할때마다
서버의 People 생성자가 실행됨.
즉 , 해당 메서드를 클라이언트가 호출할때마다 서버에서는 객체가 새로 생성됨.
이런 이유로 서버의 setName() 이 실행되지 않았던 것임.
따라서, 어떤 값을 parameter 로 넘겨서 그 메서드가 실행하는 것에 영향을 줄수는 있지만,
해당 메서드를 마치고, 새로운 메서드를 호출하여 연결하여 사용은 할 수 없음.