봄이 시작되는 가정의 달 5월을 맞이하여 KSUG도 새로운 마음으로 시작합니다.
그 첫번째 세미나에 여러분을 초대합니다.

날짜 : 2012년 05월 19일(토) 오전 11시 ~ 오후 2시 (3시간)
장소 : 토즈강남점
참가비 : 만원 (실제 참석율을 높이기 위한 목적이며, 참석시 다시 돌려드립니다.)
- 입금계좌 : 우리은행 1002-529-504921 예금주 이재일
- 참가신청 후 2일이내에 입금 부탁드립니다. 2일이 경과하면 대기자분께 참여기회가 넘어가게 됩니다.

각 세션은 25분씩 진행되며, 2세션마다 10분간 휴식시간이 있습니다.

(1) 스프링 시작하기 (고종봉) : 25분
- 스프링을 처음 시작하시는 분들을 위한 스프링 소개 시간

(2) 현장에서의 스프링 환경구축 사례 (최영목) : 25분
- 스프링 프레임워크가 현장에서 실제로 어떤 구성으로 구축되었는지 실제 프로젝트 사례를 소개 

(3) 스프링 MVC에서 web request 여행 (양완수) : 25분
- 요청에서 응답까지 스프링 mvc에서의 동작을 이해

(4)스프링은 지금 (박용권) : 25분
 스프링 3.1의 기능 소개와 MVC 변경사항에 대한 내용을 전달

(5) 토론 (정상혁) : 1시간
- 스프링에 대한 다양한 주제에 대해서 토론

신청은 아래 링크에서 하실 수 있습니다.


저작자 표시 비영리 동일 조건 변경 허락
Posted by 스쿨쥐

Trackback Address :: http://www.ksug.org/trackback/166 관련글 쓰기

댓글을 달아 주세요

  1. 이승호 2012/05/15 09:59 Address Modify/Delete Reply

    음... 참여자 분들 입금이 다 되었나요? ㅠㅠ

    스프링~ 쉬운듯 힘든 스프링~ 3번 너무 듣고 싶은데요.~~~

  2. 11 2012/05/18 10:11 Address Modify/Delete Reply

    내일이군요!!! 기대됩니다...

  3. 황병한 2012/05/18 19:09 Address Modify/Delete Reply

    항상 조기 품절이네요^^ 포스트에 올라오겠죠 좋은 강의들 참여의 폭을 넓혀주세요^^ 좋은 시간 보내세요

지난 4월 12일에 KSUG 번개 모임이 있었습니다.


번개의 가장 큰 목적은 그동안 큰 일을 도맡아서 수고를 해주신 박성철님께서 고종봉님께 큰 일꾼을 책임을 정식으로 이양하기 위한 이취임식을 진행하는 것이었습니다.


ㄹㄹㄹ

[큰 일을 덜게되신 박성철님의 밝은 미소 +_+]


참여해주신 분들이 모두 축하해주셨고, 고종봉님께서는 앞으로 KSUG를 이끌어나갈 방향을 제시하시면서 많은 분들의 기대감을 높여주셨습니다. 또한 박성철님께서도 고문으로 계속 활동하시면서 고종봉님께서 KSUG를 이끌어나가는 데 도와주시기로 하셨습니다.


이번 모임에서 고종봉님의 의견을 간략하게 정리하면 다음과 같습니다.

1. 커뮤니티를 활성화하기 위해서 다양한 수단을 많이 도입하겠다. (다양한 채널, 자유로운 모임 구성 등)

2. 전문성을 살리기 위해서 레퍼런스 번역을 추진하겠다.

3. 기존 운영진에게 많은 권한을 위임하여 운영진에게도 자유롭게 추진할 수 있도록 하겠다.


그리고 5월에 있을 KSUG 세미나에 대한 토론도 오갔습니다. 세미나 일정 및 내용, 발표자 등에 대해서 다양한 의견이 오갔으며, 이 부분에 있어서 박성철님께서 많은 의견을 주셨습니다.


마지막으로 객체지향, 스프링에 대한 기술적인 의견을 자유롭게 토론할 수 있는 시간이 있었습니다.



오랜만에 다들 기술적인 토론덕에 대화는 더 활발해졌으며, 어느덧 정해진 2시간이 모두 지나가게 되었습니다. 모임이 끝난 후 간단한 커피타임을 즐기면서 개인적인 이야기도 많이 하였고, 다들 즐거운 마음으로 모임을 즐기신 것 같습니다.


앞으로 KSUG의 많은 발전을 기대해봅니다.


참고로 장소 협찬은 지난번과 동일하게 구글코리아에서 지원해주셨습니다. 감사합니다. (장소 후원: 구글 코리아 http://goo.gl/P57iM)


ps. 강남점 토즈 4층을 이용했는데 개인적으로는 알바생분이 괜찮았습니다. 흠흠 -_-;;; 참고하시길...


저작자 표시 비영리 동일 조건 변경 허락
Posted by 스쿨쥐

Trackback Address :: http://www.ksug.org/trackback/165 관련글 쓰기

댓글을 달아 주세요





‎[공지] KSUG 벙개모임 합니다.

부담 없이 모여서 얼굴보는 자리가 되었으면 합니다. ^^; (간단한 신규 운영진 소개도 있을 예정입니다.)

이번주 목(4/12) 저녁 8시 강남입니다. 

참석 가능하신 분들, (그룹스 메일링이나 페이스북을 이용해) 손 들어주세요~!! (댓글로 남겨주세요)

감사합니다.ㅎ


장소/시간 공지드립니다. 
토즈 강남점(2호점 아니죠.ㅎ) 8시입니다. 모임이름은 KSUG입니다. 간단한 음료와 간식은 있겠지만 식사하고 오시는걸 추천드립니다. (일찍 오신 분들끼리 식사하셔도 좋구요.ㅎ )
참가의사 아직 안밝히셨더라도 시간 되시면 편하게 오시기 바랍니다.
감사합니다. 내일 뵙겠습니다.^^

장소 후원: 구글 코리아 http://goo.gl/P57iM

Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/164 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/dcdb9f31bb489590


안녕하세요. 

이클립스 헬리오스 

아파치 CXF 2.4 

톰캣 6.x 

기존에 만들어진 웹서비스 소스가 있는데, 여기에다 메소드를 좀 추가하고 싶은데 기존 프로젝트로는 웹서비스 생성할 때 자꾸 에러 

가 떠서 아주 새로 프로젝트를 만들고 기존 소스 코드를 가져왔습니다. 웹서비스 생성은 잘 되는데요. 기존 프로젝트에서 생성되어 

진 wsdl과 제가 생성한 wsdl의 네임스페이스가 다르게 지정이 되네요. 프로젝트명과 소스는 기존 서비스랑 완전히 동일한 구조 

에 모든 클래스 이름도 같고 모델 클래스와 서비스 클래스에 메소드만 2개 더 추가를 했습니다. 

Project name: clientServices 

Interface: CcahClientServicesSEI 

Service Class: CcahClientServicesImpl 

CcahClientServicesImpl.java를 가지고 웹서비스를 생성했습니다.  생성된 네임스페이스는 이렇습니다. 

기존 프로젝트: <wsdl:definitions name="DaoImplService" 

신규 프로젝트: <wsdl:definitions name="CcahClientServicesImplService" 

이렇게 다르구요. wsdl를 비교해 봐도 중간 중간 다른 부분이 많은데,  동일한 프로젝트 환경에서 웹서비스를 생성했다면 

wsdl도 동일한 구조이어야 되지 않나요? 왜 그런지 잘 모르겠습니다. 혹시 어떤 부분을 체크해야 하는지 알려주시면 감사하겠습니 

다.


기존에 생성된 wsdl과 신규wsdl을 첨부합니다. 포트이름은 자바소스에서 어노테이션 값을 변경하여 일치시켰습니다. 하지만 나머 

지는 많이 달라 보입니다. 

OLD: 

<?xml version="1.0" encoding="UTF-8"?> 

<wsdl:definitions name="DaoImplService" targetNamespace="http:// 

dao.clientServices.ccah.lodestone.com/" xmlns:wsdl="http:// 

schemas.xmlsoap.org/wsdl/" xmlns:tns="http:// 

dao.clientServices.ccah.lodestone.com/" xmlns:xsd="http://www.w3.org/ 

2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 

  <wsdl:types> 

    <xs:schema elementFormDefault="unqualified" 

targetNamespace="http://dao.clientServices.ccah.lodestone.com/" 

version="1.0" xmlns:tns="http:// 

dao.clientServices.ccah.lodestone.com/" xmlns:xs="http://www.w3.org/ 

2001/XMLSchema"> 

<xs:element name="addEmergencyCoords" type="tns:addEmergencyCoords"/> 

<xs:element name="addEmergencyCoordsResponse" 

type="tns:addEmergencyCoordsResponse"/> 

<xs:element name="addMediaNote" type="tns:addMediaNote"/> 

<xs:element name="addMediaNoteResponse" 

type="tns:addMediaNoteResponse"/> 

<xs:element name="addMobileMessage" type="tns:addMobileMessage"/> 

<xs:element name="addMobileMessageResponse" 

type="tns:addMobileMessageResponse"/> 

<xs:element name="deviceContactAdded" type="tns:deviceContactAdded"/> 

<xs:element name="deviceContactAddedResponse" 

type="tns:deviceContactAddedResponse"/> 

<xs:element name="deviceEventAdded" type="tns:deviceEventAdded"/> 

<xs:element name="deviceEventAddedResponse" 

type="tns:deviceEventAddedResponse"/> 

<xs:element name="getAdHocJourneyPlan" type="tns:getAdHocJourneyPlan"/ 


<xs:element name="getAdHocJourneyPlanResponse" 

type="tns:getAdHocJourneyPlanResponse"/> 

<xs:element name="getVersion" type="tns:getVersion"/> 

<xs:element name="getVersionResponse" type="tns:getVersionResponse"/> 

<xs:element name="gpsPing" type="tns:gpsPing"/> 

<xs:element name="gpsPingResponse" type="tns:gpsPingResponse"/> 

<xs:element name="verifyDeviceConfiguration" 

type="tns:verifyDeviceConfiguration"/> 

<xs:element name="verifyDeviceConfigurationResponse" 

type="tns:verifyDeviceConfigurationResponse"/> 

<xs:complexType name="deviceContactAdded"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element minOccurs="0" name="googleId" type="xs:string"/> 

<xs:element minOccurs="0" name="action" type="xs:string"/> 

<xs:element minOccurs="0" name="title" type="xs:string"/> 

<xs:element name="deleteAssociatedJourneys" type="xs:boolean"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="deviceContactAddedResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" 

type="tns:deviceActionAddedEvent"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="deviceActionAddedEvent"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence/> 

</xs:extension> 

</xs:complexContent> 

</xs:complexType> 

<xs:complexType abstract="true" name="resultBase"> 

<xs:sequence> 

<xs:element name="errorCode" type="xs:int"/> 

<xs:element minOccurs="0" name="errorMsg" type="xs:string"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="getAdHocJourneyPlan"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element minOccurs="0" name="passwordHash" type="xs:base64Binary"/> 

<xs:element minOccurs="0" name="fromGoogleContactId" type="xs:string"/ 


<xs:element minOccurs="0" name="toGoogleContactId" type="xs:string"/> 

<xs:element name="fromLat" type="xs:double"/> 

<xs:element name="fromLong" type="xs:double"/> 

<xs:element name="toLat" type="xs:double"/> 

<xs:element name="toLong" type="xs:double"/> 

<xs:element minOccurs="0" name="optimize" type="xs:string"/> 

<xs:element name="arriveBy" type="xs:boolean"/> 

<xs:element name="wheelchair" type="xs:boolean"/> 

<xs:element name="maxWalkDistance" type="xs:int"/> 

<xs:element minOccurs="0" name="mode" type="xs:string"/> 

<xs:element minOccurs="0" name="typeOfDay" type="xs:string"/> 

<xs:element minOccurs="0" name="timeOfDay" type="xs:string"/> 

<xs:element minOccurs="0" name="toDisplayName" type="xs:string"/> 

<xs:element minOccurs="0" name="fromDisplayName" type="xs:string"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="getAdHocJourneyPlanResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" 

type="tns:adHocJourneyResponse"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="adHocJourneyResponse"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence> 

<xs:element name="fromLat" type="xs:double"/> 

<xs:element name="fromLong" type="xs:double"/> 

<xs:element name="toLat" type="xs:double"/> 

<xs:element name="toLong" type="xs:double"/> 

<xs:element minOccurs="0" name="urlQuery" type="xs:string"/> 

<xs:element minOccurs="0" name="jsonResonse" type="xs:string"/> 

<xs:element name="otpResponseInMillis" type="xs:long"/> 

</xs:sequence> 

</xs:extension> 

</xs:complexContent> 

</xs:complexType> 

<xs:complexType name="gpsPing"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element minOccurs="0" name="passwordHash" type="xs:base64Binary"/> 

<xs:element minOccurs="0" name="mobilePhone" type="xs:string"/> 

<xs:element minOccurs="0" name="imsi" type="xs:string"/> 

<xs:element minOccurs="0" name="imei" type="xs:string"/> 

<xs:element name="latitude" type="xs:double"/> 

<xs:element name="longitude" type="xs:double"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="gpsPingResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" type="tns:gpsPingResult"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="gpsPingResult"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element name="latitude" type="xs:double"/> 

<xs:element name="longitude" type="xs:double"/> 

<xs:element maxOccurs="unbounded" minOccurs="0" 

name="journeySyncDetails" nillable="true" type="tns:journeySyncDetail"/ 


<xs:element maxOccurs="unbounded" minOccurs="0" name="systemSettings" 

nillable="true" type="tns:systemSetting"/> 

</xs:sequence> 

</xs:extension> 

</xs:complexContent> 

</xs:complexType> 

<xs:complexType name="journeySyncDetail"> 

<xs:sequence> 

<xs:element name="JourneyId" type="xs:long"/> 

<xs:element minOccurs="0" name="JourneyName" type="xs:string"/> 

<xs:element minOccurs="0" name="JourneyDescription" type="xs:string"/> 

<xs:element minOccurs="0" name="JourneyData" type="xs:string"/> 

<xs:element minOccurs="0" name="JourneyNotes" type="xs:string"/> 

<xs:element name="JourneyActive" type="xs:boolean"/> 

<xs:element minOccurs="0" name="StartLoiName" type="xs:string"/> 

<xs:element minOccurs="0" name="StartLoiDescription" type="xs:string"/ 


<xs:element minOccurs="0" name="StartLoiType" type="xs:string"/> 

<xs:element minOccurs="0" name="StartLoiGoogleContactId" 

type="xs:string"/> 

<xs:element minOccurs="0" name="StartLoiGoogleAddressId" 

type="xs:string"/> 

<xs:element minOccurs="0" name="EndLoiName" type="xs:string"/> 

<xs:element minOccurs="0" name="EndLoiDescription" type="xs:string"/> 

<xs:element minOccurs="0" name="EndLoiType" type="xs:string"/> 

<xs:element minOccurs="0" name="EndLoiGoogleContactId" 

type="xs:string"/> 

<xs:element minOccurs="0" name="EndLoiGoogleAddressId" 

type="xs:string"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="systemSetting"> 

<xs:sequence> 

<xs:element minOccurs="0" name="name" type="xs:string"/> 

<xs:element minOccurs="0" name="value" type="xs:string"/> 

<xs:element minOccurs="0" name="type" type="xs:string"/> 

<xs:element minOccurs="0" name="binaryValue" type="xs:base64Binary"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="addMediaNote"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element minOccurs="0" name="mediaTitle" type="xs:string"/> 

<xs:element minOccurs="0" name="mediaTag" type="xs:string"/> 

<xs:element minOccurs="0" name="mediaType" type="xs:string"/> 

<xs:element minOccurs="0" name="mediaData" type="xs:base64Binary"/> 

<xs:element minOccurs="0" name="googleCalendarId" type="xs:string"/> 

<xs:element name="deviceNoteId" type="xs:int"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="addMediaNoteResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" type="tns:addMediaNoteResult"/ 


</xs:sequence> 

</xs:complexType> 

<xs:complexType name="addMediaNoteResult"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence/> 

</xs:extension> 

</xs:complexContent> 

</xs:complexType> 

<xs:complexType name="addEmergencyCoords"> 

<xs:sequence> 

<xs:element minOccurs="0" name="userName" type="xs:string"/> 

<xs:element minOccurs="0" name="passwordHash" type="xs:base64Binary"/> 

<xs:element minOccurs="0" name="mobilePhone" type="xs:string"/> 

<xs:element minOccurs="0" name="imsi" type="xs:string"/> 

<xs:element minOccurs="0" name="imei" type="xs:string"/> 

<xs:element name="latitude" type="xs:double"/> 

<xs:element name="longitude" type="xs:double"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="addEmergencyCoordsResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" 

type="tns:addEmergencyCoordsResult"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="addEmergencyCoordsResult"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence/> 

</xs:extension> 

</xs:complexContent> 

</xs:complexType> 

<xs:complexType name="getVersion"> 

<xs:sequence/> 

</xs:complexType> 

<xs:complexType name="getVersionResponse"> 

<xs:sequence> 

<xs:element minOccurs="0" name="return" type="tns:getVersionResult"/> 

</xs:sequence> 

</xs:complexType> 

<xs:complexType name="getVersionResult"> 

<xs:complexContent> 

<xs:extension base="tns:resultBase"> 

<xs:sequence> 

<xs:element minOccurs="0" name="Title" type="xs:string"/> 

<xs:element minOccurs="0" name="Vendor" type="xs:string"/> 

<xs:element minOccurs="0" name="Version" ...


글이 기나까 많이 잘리네요. 

NEW: 

<?xml version="1.0" encoding="UTF-8"?> 

<wsdl:definitions name="DaoImplService" targetNamespace="http:// 

dao.clientServices.ccah.lodestone.com/" xmlns:wsdl="http:// 

schemas.xmlsoap.org/wsdl/" xmlns:tns="http:// 

dao.clientServices.ccah.lodestone.com/" xmlns:xsd="http://www.w3.org/ 

2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 

  <wsdl:types> 

    <schema xmlns="http://www.w3.org/2001/XMLSchema"> 

<import namespace="http://dao.clientServices.ccah.lodestone.com/" 

schemaLocation="ccahclientservicesimpl_schema1.xsd"/> 

</schema> 

  </wsdl:types> 

  <wsdl:message name="getAdHocJourneyPlanResponse"> 

    <wsdl:part name="parameters" 

element="tns:getAdHocJourneyPlanResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addMediaNote"> 

    <wsdl:part name="parameters" element="tns:addMediaNote"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="deviceEventAddedResponse"> 

    <wsdl:part name="parameters" 

element="tns:deviceEventAddedResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="gpsPing"> 

    <wsdl:part name="parameters" element="tns:gpsPing"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="getVersionResponse"> 

    <wsdl:part name="parameters" element="tns:getVersionResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addNote"> 

    <wsdl:part name="parameters" element="tns:addNote"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="loginCcahUserByUserNameResponse"> 

    <wsdl:part name="parameters" 

element="tns:loginCcahUserByUserNameResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="verifyDeviceConfiguration"> 

    <wsdl:part name="parameters" 

element="tns:verifyDeviceConfiguration"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addMobileMessageResponse"> 

    <wsdl:part name="parameters" 

element="tns:addMobileMessageResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addNoteResponse"> 

    <wsdl:part name="parameters" element="tns:addNoteResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="deviceEventAdded"> 

    <wsdl:part name="parameters" element="tns:deviceEventAdded"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addEmergencyCoordsResponse"> 

    <wsdl:part name="parameters" 

element="tns:addEmergencyCoordsResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addMobileMessage"> 

    <wsdl:part name="parameters" element="tns:addMobileMessage"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="deviceContactAdded"> 

    <wsdl:part name="parameters" element="tns:deviceContactAdded"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="getAdHocJourneyPlan"> 

    <wsdl:part name="parameters" element="tns:getAdHocJourneyPlan"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addMediaNoteResponse"> 

    <wsdl:part name="parameters" element="tns:addMediaNoteResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="loginCcahUserByUserName"> 

    <wsdl:part name="parameters" 

element="tns:loginCcahUserByUserName"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="gpsPingResponse"> 

    <wsdl:part name="parameters" element="tns:gpsPingResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="addEmergencyCoords"> 

    <wsdl:part name="parameters" element="tns:addEmergencyCoords"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="verifyDeviceConfigurationResponse"> 

    <wsdl:part name="parameters" 

element="tns:verifyDeviceConfigurationResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="deviceContactAddedResponse"> 

    <wsdl:part name="parameters" 

element="tns:deviceContactAddedResponse"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:message name="getVersion"> 

    <wsdl:part name="parameters" element="tns:getVersion"> 

    </wsdl:part> 

  </wsdl:message> 

  <wsdl:portType name="CcahClientServicesSEI"> 

    <wsdl:operation name="deviceContactAdded"> 

      <wsdl:input name="deviceContactAdded" 

message="tns:deviceContactAdded"> 

    </wsdl:input> 

      <wsdl:output name="deviceContactAddedResponse" 

message="tns:deviceContactAddedResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="getAdHocJourneyPlan"> 

      <wsdl:input name="getAdHocJourneyPlan" 

message="tns:getAdHocJourneyPlan"> 

    </wsdl:input> 

      <wsdl:output name="getAdHocJourneyPlanResponse" 

message="tns:getAdHocJourneyPlanResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="gpsPing"> 

      <wsdl:input name="gpsPing" message="tns:gpsPing"> 

    </wsdl:input> 

      <wsdl:output name="gpsPingResponse" 

message="tns:gpsPingResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addMediaNote"> 

      <wsdl:input name="addMediaNote" message="tns:addMediaNote"> 

    </wsdl:input> 

      <wsdl:output name="addMediaNoteResponse" 

message="tns:addMediaNoteResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addEmergencyCoords"> 

      <wsdl:input name="addEmergencyCoords" 

message="tns:addEmergencyCoords"> 

    </wsdl:input> 

      <wsdl:output name="addEmergencyCoordsResponse" 

message="tns:addEmergencyCoordsResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="getVersion"> 

      <wsdl:input name="getVersion" message="tns:getVersion"> 

    </wsdl:input> 

      <wsdl:output name="getVersionResponse" 

message="tns:getVersionResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addNote"> 

      <wsdl:input name="addNote" message="tns:addNote"> 

    </wsdl:input> 

      <wsdl:output name="addNoteResponse" 

message="tns:addNoteResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="verifyDeviceConfiguration"> 

      <wsdl:input name="verifyDeviceConfiguration" 

message="tns:verifyDeviceConfiguration"> 

    </wsdl:input> 

      <wsdl:output name="verifyDeviceConfigurationResponse" 

message="tns:verifyDeviceConfigurationResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="loginCcahUserByUserName"> 

      <wsdl:input name="loginCcahUserByUserName" 

message="tns:loginCcahUserByUserName"> 

    </wsdl:input> 

      <wsdl:output name="loginCcahUserByUserNameResponse" 

message="tns:loginCcahUserByUserNameResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addMobileMessage"> 

      <wsdl:input name="addMobileMessage" 

message="tns:addMobileMessage"> 

    </wsdl:input> 

      <wsdl:output name="addMobileMessageResponse" 

message="tns:addMobileMessageResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="deviceEventAdded"> 

      <wsdl:input name="deviceEventAdded" 

message="tns:deviceEventAdded"> 

    </wsdl:input> 

      <wsdl:output name="deviceEventAddedResponse" 

message="tns:deviceEventAddedResponse"> 

    </wsdl:output> 

    </wsdl:operation> 

  </wsdl:portType> 

  <wsdl:binding name="DaoImplServiceSoapBinding" 

type="tns:CcahClientServicesSEI"> 

    <soap:binding style="document" transport="http:// 

schemas.xmlsoap.org/soap/http"/> 

    <wsdl:operation name="deviceContactAdded"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="deviceContactAdded"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="deviceContactAddedResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="getAdHocJourneyPlan"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="getAdHocJourneyPlan"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="getAdHocJourneyPlanResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="gpsPing"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="gpsPing"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="gpsPingResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addMediaNote"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="addMediaNote"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="addMediaNoteResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addEmergencyCoords"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="addEmergencyCoords"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="addEmergencyCoordsResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="getVersion"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="getVersion"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="getVersionResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="addNote"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="addNote"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="addNoteResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="loginCcahUserByUserName"> 

      <soap:operation soapAction="" style="document"/> 

      <wsdl:input name="loginCcahUserByUserName"> 

        <soap:body use="literal"/> 

      </wsdl:input> 

      <wsdl:output name="loginCcahUserByUserNameResponse"> 

        <soap:body use="literal"/> 

      </wsdl:output> 

    </wsdl:operation> 

    <wsdl:operation name="verifyDeviceConfiguration"> 

      <soap:operation soapAction="" style="document"/> 

...


죄송합니다. WSDL이 길어서 엉뚱하게 잘려서 OLD와 NEW가 바뀌었네요. 


WSDL을 자동생성하면 자동생성 도구와 버전에 따라 다른 결과가 나올 수 있습 

니다. 

이를 보장하려면 정확히 동일한 상황에서 생성하셔야 하는데 어떤 요소가 해 

당 도구에 영향을 주는지 확실치 않으니 결국 WSDL 자동 생성은 동일한 결과 

를 보장받을 수 없다고 보시는 편이 맞습니다. 

java2wsdl을 쓰셨는지 eclipse의 기능을 쓰셨는지 모르겠지만 일단 자동생성 

을 해서 사용중이라면 다시 생성하지 마시고 수정 사항을 수작업으로 반영하 

시라고 조언해드리고 싶습니다. 

참고로, 스프링 웹 서비스(http://www.springsource.org/spring-web- 

services)라는 프로젝트가 있습니다. 이 프로젝트는 계약 선행 개발(또는 계 

약에 의한 개발)이라는 개념을 따르는데, 이 개념은 간단히 말해 WSDL을 계약 

문서로 보고 WSDL을 수작업으로 만든 후에 이 계약 사항을 기준으로 (자바) 

코드를 자동 또는 수작업으로 만들어 애플리케이션을 개발하도록 합니다. 

WSDL은 웹 서비스 제공자와 소비자 사이의 계약문서이므로 이를 동일한 결과 

가 보장되지 않는 자동 생성으로 만들면 계약으로서 의미가 없다고 보는 거죠. 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/163 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/51b06efb99fbf45e


DAO(Repository)에서 발생한 예외를 Service에서 처리해야 할 지 아니면 Controller에서 처리해야 할 지 

의문입니다. 

아래 코드는 저 나름대로 예외 처리를 한 코드 입니다. 

MemberDAO에서 중복 예외를 발생 시켜 Controller에서 처리를 합니다. 

DuplicateMemberException는 DuplicateKeyException을  의미 있는 uncheck 

exception 으로 전환 하기 위해 만든 Exception입니다. 

먼저 Member가 중복인지 아닌지 select로 검사 할 수 있지만 저는 중복을 예외를 처리하려고 했습니다. 

즉, 중복 Member는 존재하지 않는다는 비즈니스 로직을 예외로 처리하는 것입니다. 

궁금한 점은 controller에서 비지니스 로직적인 것을 controller에서 예외처리를 해야 하는지 

 MemberService에서 또 try catch문으로 예외를 잡아서 처리하여 의미 있는 예외를 controller로 

throws 하거나 

아니면 return value를 true/fase 로 변경해야 하는 건지 궁금합니다. 

제 생각은 controller에서 예외처리를 하면 MemberService 쪽이 깔끔한(나이스)한 코드가 되어 좋아 보입니다. 

다른 예외 전략(처리)가 있다면 답변 부탁 드립니다. 

==============   Controller 에서 예외처리   ==================== 

==========  MemberDAO   ============================= 

@Override 

public void insertMember(Member member) throws 

DuplicateMemberException { 

   try { 

      sqlMapClientTemplate.insert("member.insertMember", member); 

   } catch (DuplicateKeyException e) { 

      throw new DuplicateMemberException(e); 

   } 


==========  MemberService   ============================= 

@Override 

public void registMember(Member member) { 

   memberDAO.insertMember(member); 


==========  MemberController   ============================= 

@RequestMapping("/member/registmember.do") 

public String registMember(Member member) { 

   try { 

      memberService.registMember(member); 

      return "main" 

   } catch (DuplicateMemberException e) { 

      return "/member/viewregistmemberform"; 

   } 


==============   service에서 예외처리   ==================== 

==========  MemberService  ============================= 

@Override 

public boolean registMember(Member member) { 

    try { 

      memberDAO.insertMember(member); 

      return true; 

   } catch (DuplicateMemberException e) { 

      return false 

   } 


==========  MemberController   ============================= 

@RequestMapping("/member/registmember.do") 

public String registMember(Member member) { 

  if(memberService.registMember(member) { 

    return "main"; 

  } else { 

    return "viewregistmemberform"; 

  } 


개인적으로는 @Controller에 try … catch 문이 나오는 것이 옳지 않다고 생각합니다. 

Validator를 이용하여 검증을 서비스 계층으로 이동시키더라도 컨트롤러에서 BindingResult를 이용해 에러 결과를 뽑아보는 

방식이 에러처리에도 더욱 적절할 듯 싶네요. 

<form:errors>같은 스프링 EL문법도 사용가능해지구요. 


저두 try catch가 controller에 있는게 보기 좋지 않습니다. 

Validation은 값(value)검증만 하는 것이라 생각했는데 

Exception 처리도 하는거 군요. 

view(jsp)와 controller 사이에 값 검증만 해봐서 확 와닿지 않아서 그런데 

Validator로 Exception 처리하는 참조 사이트든가 처리하는 흐름만 좀 알려주 주시면 정말 감사 하겠습니다. 


이 경우에는 컨터롤러에서 예외를 처리하는 쪽이 적절하다고 봅니다. 

MemberDAO에서는 DB Access 관련 예외인 DuplicateKeyException를 도메인 예 

외인 DuplicateMemberException로 잘 바꿔서 서비스에서 넘겼는데 

DuplicateKeyException 자체가 이미 구현 기술 의존성을 숨긴 추상화한 된 예 

외이나 도메인의 스프링 의존성도 줄인다는 관점에서는 의미 있는 작업 같습니다. 

MemberService에서 메서드 시그니처에 throws DuplicateMemberException를 추 

가해서 명문화했으면 좋았겠습니다. 

MemberController의 try-catch는 프레임워크 차원에서도 처리할 수 있지만 공 

통사항이 아니라 특정 업무의 워크플로에 해당하므로 컨트롤러에서 흐름을 제 

어하는 편이 좋다고 생각합니다. 

저는 왜 두 경우를 두고 고민하시는지 이해하지 못하겠네요. 서비스에서 처리 

하면 어떤 이득이 있는 거죠? 코드량이 늘었을 뿐 아니라 서비스의 반환값이 

어떤 의미인지 알려면 javadoc 같은 문서를 봐야만 분명해지는 번거로움까지 

생겼는데요. 


음.. 저는 약간 생각이 다릅니다. 

개발자의 성향이나 전체 프레임워크 플로워에 따라서 다르겠지만 

되도록이면 Controller에서는 Exception 처리를 하지 않는 편이 좋다고 봅니다. 

제 경우에는 

View - Controller - Validation Logic- Business Logic - DAO 

이런식으로 많이 프로그래밍을 합니다. 

약간의 코드가 증가되기는 하지만 

전체적인 코드의 복잡도나 재활용면에서도 더 효율적으로 프로그래밍을 작성할 수 있는것 같습니다. 

(물론 Class의 양이 많이 늘어나기는 하지만^^;;) 


조금 더 자세히 설명을 드리자면.. 

Validation Logic 부분은 Controller에서 로직을 처리하는 과정에서 필요한 데이터를 처리하는 부분입니다. 

데이터를 원하는 형태로 가공한다던지.. 실제로 Repository단까지 내려가지 않고 데이터를 거르는 부분입니다. 

그리고 Exception 처리는 Controller에서 되도록이면 하지 않는 편이라는 말은.. 

오류를 처리하는 logic을 따로 작성하여 사용한다는 말입니다. 

Controller에서 처리해도 상관없지만 *개인적으로는 너무 복잡하거나 지저분한 코드를 싫어해서*^^;; 

오류가 발생하면 오류를 따로 처리하고 처리할 수 없는 경우는 View단으로 정보를 던저거나 합니다. 

(처리한다는건 해당 오류를 페이지에 보이지 않고 정상적으로 처리하는 과정을 말합니다) 

저처럼 하는 방법도있다는 걸 참고하시라고 말씀드리는겁니다.^^;; 


저는 Controller에서 try catch 문이 들어 가서 좋지 않다기 보다는 

 Business Logic이 들어 가는게 아닌가해서 그렇게 생각 했습니다. 

Business Logic이 변경되면 Controller가 변경되는거 아닌가 해서요. 

Controller는 DispatcherServlet가 Service에 맵핑하는 중간 역할이라 생각 하고 있습니다. 

2번째 방법은 true/false 합니다. 

만약 Business 로직이 Member 중복을 허용으로 바뀌면 Controller는 변경이 없을수 있겠죠(?) 

Exceptoin 처리 전략을 프레임 워크로 해결 할 수 있다면 if else 또한 사라질 수 있지 않을 까 했습니다. 

이 방법은 저의 개인적인 생각입니다. 저두 지금 현재 구글링 하며 자료들을 찾고 있는 중이에요.. 


저같은 경우는 익셉션 처리를 SimpleMappingExceptionResolver 를 상속받아 

CustomSimpleMappingExceptionResolver 를 구현하여 예외처리를 한곳으로 모았습니다. 

예외는 예외상황별로 runtime 익셉션을 상속받아 정의하였구요. 

헤더타입(Accept)에 따라 결과(예외코드 및 오류 메시지)처리를 하였습니다. (html, json, xml) 

간혹 라이브러리에서 checked exception을 발생하는 메소드 같은 경우는 wrapping하여 runtime익셉션을 

발생하도록 하였습니다. 

위구조에서는 Controller에서는 try{} catch{} 문이 필요없구요. 서비스나 다오 레이어에서는 상황에 따라 있을 

수 있지만 public method에서는 가독성을 위해서 지양하고 있습니다. 

물론 예외가 아닌 정상플로우로 진행시켜야 하는 경우에는 컨트롤러에서 try catch가 필요할수도있겠으나 아직까지 그런 경우는 

없었습니다.(이 경우는 controller 보다는 서비스 레이어에서 처리하는게 낫지 않을까 생각합니다. 


아 덧붙이면 이성현님 말씀대로 예외 발생은 모두 서비스단에서 하고 있습니다.(비즈니스 예외) 

저도 비즈니스 로직을 어디에 두어야 하나, (컨트롤러?, 서비스?, 컨트롤러 + 서비스?) 고민이 많았습니다. 

현재는 사이트 성격에 따라 좀 달라질수 있다고 생각하여 그부분에서는 자유도를 두고 있습니다. 

하지만 동일한 사이트에서는 일관성있어야 겠죠. 


대충 비슷한 의미이긴 한데요. 

요세 리팩토링에 심취해 있다보니. 살짝 코드가 변하는게 눈에 보이네요. 

저라도 처음에는 Controller단에서 try{} catch(){}로 자연스럽게 DuplicateMemberException로 처리를 

했을거 같습니다. 하지만, 다른 컨트롤러에서도 같은 방식으로 try {}catch(){}로 로 감싸줬다면. 중복이 

발생하니 MemberService 에 메소드는 throws로 DuplicateMemberException선언이 되어 자연스럽게 흘러가지 

않았을까 하네요. 

딱히 이건 이렇게 하라는것보다는 자연스럽게 어디다 놓으면 좋을지 정해지는면 되는게 아닌가 싶습니다. 


원론적인,, 그리고 실제로도 좋은 설계가 될 수 있을 (것으로 생각하는) 개념을 말씀 드리면, 

DAO, Service, Controller 모두 각 단에서 적잘한 예외 처리를 해야 한다고 생각합니다. 

DAO에서는 DB Access가 주요 관심사항이니까, 

duplicated key가 발생하면,, (이건 DB 제약에 따라 발생하겠죠?) DuplicatedKeyException을 던지는게 

적절하다 보구요. 

Service 에서는, DAO의 DuplicatedKeyException을 받아서 DuplicatedMemberException을 

던져야 되구요. 

(!! DB, DAO 관점에서는 key가 중복된거지,, 걔가 멤버인지,, 머시기인지는 모르는게 맞다고 봅니다. 걔가 멤버고,, 멤버는 

중복되면 안된다는 스펙은 서비스 로직에 해당된다고 봅니다.) 

그리고, Controller에서는,, 서비스 로직 처리 중에 예외가 발생했으니,, 컨트롤러 단의 예외 처리를 

해야 한다고 봅니다.. 기본적으로 예외가 발생하지 않는게 정상 플로우고,, 예외가 발생하면 발생 

예외별로 메시지를 표시한다고 하면, 

==========  MemberController   ============================= 

@RequestMapping("/member/registmember.do") 

public String registMember(Member member) { 

try { 

  memberService.registMember(member); 

} catch(DuplicatedMemberException dme) { 


  alertAndReturn("이미 등록된 회원입니다."); // 화면 alert 처리 

} catch(Exception e) { 


  alertAndReturn("처리 중에 오류가 발생했습니다."); // 화면 alert 처리 

 return "success"; 



spring mvc는 ExceptionResolver가 있잖아요(다른mvc모델도 비슷한게 있던데...). Controller에서는 

의미있는 Exception을 던지면 그만이죠. 그래야 내 Exception답지!! 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/162 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/7ecd8ad6f74dee6d


안녕하세요 

Spring 과는 무관한 질문이지만 문의 드립니다.^^ 

jira 에서 버전관리 기능연동(ex. cvs/FishEye..)처럼, 웹 어플리케이션 상에서 게시판에 문서를 첨부했을 때 

버전관리기능을 구현해야 하는데 연동이 가능한지 모르겠습니다. 

MS의 Share Point 에서도 버전관리 기능이 있더라구요. 

SVN과 연동이 된다면 가장 좋겠습니다. 

비슷한 구현 경험이 있으신분들의 조언을 듣고자 합니다. 

감사합니다. 



화면(jsp)에서 서버로 파일을 업로드하면 해당 파일을 svn커넥터 api로 svn서버로 전송할수 있습니다. 

전송 후(commit) 화면에 commit된 파일을 보여주면 되죠. 당연 버젼관리 되구요 

문제는 화면을 다 만들어줘야겠죠. 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/161 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/fdca8c380e66e28b


웹로직을 이클립스에서 연동하여 테스트 중입니다 몇일간 너무나 헤매여서 지하철에서 답답한맘 이기지못하고 남깁니다 

maven으로 그냥 war로 빌드하여 웹로직 콘솔에서 디플로이하면 잘됩니다 

하지만 이클립스 서버탭에서 해당모듈을 디플로이하면 ClassNotFoundExcept 이 떨어집니다 

몇일헤맨끝에 workspace 아래 plugin 쪽에 아래 .beabuild.txt 라는파일이 실제 소스위치를 매핑하고 있다는건 알아냈습니다 

근데 이상하게 거기에 jar 파일들은 하나도 등록안되어있네요.. 그것때매 클래스를 못찾는것같은데 .. 

같은 프로젝트를 체크아웃받은 동료pc의 그파일에는 필요한 jar들이 모두 매핑이되어 있더군요 

물론 저랑 이클립스 웹로직 메이븐로컬리파지터리 위치 등이 약간씩 다릅니다만.. 

어떤 이유일까요???


이클립스에서 SpringMVC 테스트(JUnit) 환경 구축하기 <http://springmvc.egloos.com/438345> 

제가 예전에 했던 고민들이네요. 


답만 말하자면 프로젝트 - 특성 - Deployment Assembly에 

Maven Dependencies가 추가되있는지 확인해보세요. 


강종욱님이 설명하신 내용이 정리된 불로그네요 

http://beans9.tistory.com/m/103 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/160 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/f2ba3cd10abedd3b


안녕하세요. 

스프링 시큐리티 3.1버전으로 프로젝트를 진행중인데 모르는부분이 생겨 질문드립니다. 

권한이 없는 URL로 접근할경우 로그인페이지로 이동하게 되있는데 

여기서 로그인한뒤에 좀전의 권한이 없었던 URL로 다시 보낼려면 어떻게 해야되나요?? 

시큐리티는 너무어려운거 같아요.ㅠㅠ 

도움좀 부탁드려요. 


오래간만에 답변을 올려 봅니다. 

우선 해결 방안을 올리기 전에 저는 security 를 조금 수정해서 사용하고 있음으로 감안하고 들어 주십시요. 

하지만 해결 아이디어 정도는 드릴수도 있을것 같아서 글을 올립니다. 

1. 권한이 없어서 login page로 전달할때 이전 request를 pageContext에서 가지고 있을 것입니다. 

login page로 이동할때 최초 request를 유지하고 있을 경우 해당 request의 정보에서 

좀전에 요청한 url을 다시 받을수 있겠죠... 

2. 권한없는 page에서 login page로 이동할때 redirect: 하지 않고 forward: 하면. 

브리우져의 url에는 최초에 요청한 url이 그대로 남아 있습니다. 

해당 정보를 활용해도 되겠죠.. 

그럼 도움이 되었기를 바랍니다. 


먼저 답변달아주셔서 감사합니다! 

제가 아직 시큐리티를 다루는게 미숙해서 

뭔가 아~! 하면서도 어떻게 해야될지를 모르겠어요. 

좀더 설명을 붙여서 다시한번 질문드리겠습니다. 

<form-login login-page='/common/user/login.do' 

     login-processing-url="/j_spring_security_check" 

     default-target-url='/common/user/login_success.do' 

     authentication-failure-url="/common/user/login.do?error=1" 

     always-use-default-target='true' /> 

시큐리티 설정을 이렇게 해놨습니다. 

http://localhost:8080/center/main.do ( 허용 ) 

http://localhost:8080/center/report/report.do (미허용) 

메인페이지에서 report.do 링크를 클릭하게되면 권한이 없는페이지라서 

설정에 있는 /common/user/login.do 가 호출되는데 

request에 있는 referer를 뽑아봐도 report.do 가 아닌 main.do 를 가지고있습니다. 

위의 설정처럼 해서는 중간에 인증이 불허된 report.do의 정보를 가져오는건 안되는건가요? 


default-target-url='/common/user/login_success.do' 값과 

always-use-default-target='true' 값을 제거하시면 원하시는 행동을 할거에요. 


오전에 출근하자마자 테스트해봤는데.. 

형민님이랑 용권님 방법을 동시에 적용하면 될거같기도 한데.. 

또 막혀버렸어요ㅠ_ㅠ 

먼저 용권님이 얘기주신데로 하니 로그인이후에 제가 원한 이전페이지로 돌아가긴하는데 

default-target-url='/common/user/login_success.do' 

제가 위의 저쪽 메서드에서 필요한정보를 session을 등록해놨는데 

그부분만 처리가 되면될거같아요.. 

형민님이 얘기주신 이전 페이지의 정보를 login_success.do에서 가져오는 방법을 찾아내던지 

용권님이 얘기주신 방법을 사용하면서 로그인성공시의 이벤트를 잡아서 세션을 추가해주면 되지않을까라고 고민을하면서 

답변을 작성할려구 들어왔어요. 

감사합니다 


로그인완료 후 저렇게 처리 하지 마시고 

                <form-login login-page="/main/loginPage" login-processing-url="/ 

login" 

                                        always-use-default-target="false" 

                                        authentication-success-handler-ref="authenticationSuccessHandler" 

<-- 이부분 

                                        authentication-failure-url="/main/loginFailure"/> 

저렇게 authentication-success-handler-ref 이부분을 등록해 주세요 

<beans:bean id="authenticationSuccessHandler"  class="클래스 위치 "/> 

이 클래스 내용은 

public class CustomAuthenticationSuccessHandler extends 

SavedRequestAwareAuthenticationSuccessHandler implements 

AuthenticationSuccessHandler{ 

         public void onAuthenticationSuccess(HttpServletRequest 

request, HttpServletResponse response, Authentication authentication) 

throws IOException, ServletException { 

                // 로그인 완료후 처리할 내용 

                super.onAuthenticationSuccess(request, response, authentication); 

        } 


이런식으로 클래스를 만들어 주시면 

따로 저런식으로 사용 안하셔도 로그인 완료 후 처리가 됩니다. 

SavedRequestAwareAuthenticationSuccessHandler 이걸 상속 받으시면 완료 후 이전 URL로 이 

동합니다. 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/159 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/0023153d66518893


ant의 javac로 컴파일하여 생성된 class파일과 로컬  이클립스에서 컴파일 된 class 파일이 서로 사이즈가 다른 현상이 있어 

질문 올립니다. 

모든 class파일의 사이즈가 다른 것이 아닌 특정 클래스 몇 개들이 사이즈가 다르네요. 

이상한 점은 다른 사이즈를 가진 class 파일을 decompile 했을 때 안의 코드는 동일하며 그렇다고 jvm버전이 다른 것도 

아닙니다. 

okjsp에 문의 해봤더니 debug 옵션을 주면 그럴 수도 있다고는 하셨는데 debug 옵션 및 기타 다른 옵션들을 모두 삭제하고 

테스트를 해봐도 동일한 현상이 발생하네요. 

혹시 이런 현상에 대해서 경험해 보신 분 계시면 답변 좀 부탁드리겠습니다. 

*ant javac 설정 내용* 

<target name="build"> 

                <echo message="|-------------------------------------------------------------| " /> 

                <echo message="| BUILD START                                                 | " /> 

                <echo message="|-------------------------------------------------------------| " /> 

                <copy todir="${app_home_dir}" overwrite="true"> 

                        <fileset dir="${project_home}/WebContent"> 

                                <include name="**/*.jsp" /> 

                                <include name="**/*.xml" /> 

                                <include name="**/*.jar" /> 

                        </fileset> 

                </copy> 

                <copy todir="${app_home_dir}/WEB-INF/classes" overwrite="true"> 

                        <fileset dir="${project_home}/conf"> 

                                <exclude name="**/.svn" /> 

                        </fileset> 

                </copy> 

                <javac 

                        target="${java.target}" 

                        debug="on" 

                        nowarn="true" 

                        deprecation="off" 

                        listfiles="true" 

                        failonerror="true" 

                        srcdir="${project_home}/src" 

                        destdir="${app_home_dir}/WEB-INF/classes" 

                        encoding="${java.compile.encoding}" 

                        includeantruntime="false"> 

                        <include name="**/*.java" /> 

                        <classpath> 

                                <path refid="common_classpath" /> 

                                <fileset dir="${app_classpath}/WebContent/WEB-INF/lib"> 

                                        <include name="*.jar"/> 

                                </fileset> 

                        </classpath> 

                </javac> 

        </target> 


eclipse는 ecj라는 증분(incremental) 자바 컴파일러를 따로 가지고 있습니 

다. 변경된 소스와 이에 관련된 소스만 추적해서 컴파일하는 컴파일러인데 

javac와 동일한 결과가 나오지 않을 수도 있어요. 최적화 알고리즘이 다를테 

니까요. 


저도 옛날에, 개발자 한명이 Eclipse에서 컴파일해서 서버로 배포하던 시절에, Eclipse의 컴파일 결과와 javac로 한게 

달라서 신기해했던 경험이 있습니다.. 

정확히 어떤 문제였는지는 가물가물한데, 찾아보니 serialVersionUID 관련해서도 문제가 생길수 있다고 하네요. 

http://wiki.eclipse.org/FAQ_Why_does_the_Eclipse_compiler_create_a_di... 



Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/158 관련글 쓰기

댓글을 달아 주세요

http://groups.google.com/group/ksug/browse_thread/thread/f58db839ea38e311


was나 서버데몬을 죽이지 않고 로그파일을 초기화하기 위해 

cp /dev/null > log_file 

혹은 

cat /dev/null > log_file 

이런거 하는 경우가 있는거 같은데... 

이거 안전한 행위인지.. 궁금하네요. 

예전에 잠깐 어디선가 테스트해본적 있었던거 같은데(어떤 os에서 어떤 데몬이 만들어내는 로그인지 기억이 안남 ^^) 

실제 파일은 초기화가 되는데 파일사이즈는 원래 사이즈를 그대로 가지고 있었던 기억이 있는데... 

혹시 경험 있으신 분들 있나요? 


파일사이즈 0로 만들기위해 자주 사용하는 방식입니다. 문제 없어요. 

cp -f /dev/null log_file 

From. Ted Cho. 


null copy는 물리적인 디스크 사용 율 (du )을 줄일 수는 없으나 , 로그파일의 내용은 줄일수 있습니다. 

결론적으로 로그는 0바이트로 보이나 물리적인 디스크 사용율은 프로세스를 내려야만 처리가 됩니다 

그래서 was 기동을 nohup 으로 기동하고, 주기로 로그를 로테이션합니다(펄 이용) 


물리적 디스크의 기존사용하는 어드레스를 가지고 있으며 0부터 기존 어드레스까지는 못쓰게 하면서 기존이후 부터남긴다고 하네요 ^^* 

즉, 널카피는 내가 지금 까지 온 거리를 제외하고 현재 위치부터 0으로 다시 시작하는거죠 ^^* 비유가 이상하지만 쩝 .... 

간단히 df -k, du -k 한결과 기록 후 

null copy 하구 

다시 df -k, du -k 해보시면 

실제 파일사이즈는 0으로 되나 du -k 값은 다름을 아실 수 있을 겁니다 ^^* 

물론 모든 OS 에서 검증한 내용은 아닙니다. 

그래서 저 같은경우는 로그는 전혀 다른 디스크 볼륨으로 주기 로테이션 하도록 합니다 ^^* 

WAS의 로그 full 로 인한 문제가 없도록 위함입니다 ^^* 도움이되셨길 .... 





Posted by 머큐짱

Trackback Address :: http://www.ksug.org/trackback/157 관련글 쓰기

댓글을 달아 주세요