$res.setHeader("Pragma", "no-cache");
$res.setHeader("Cache-Control", "no-cache");
$res.setHeader("Expire", "0");
response 객체에다가 이렇게 설정
[출처] 벨로시티(velocity)에서 브라우저 캐쉬없애기|작성자 삽지리
$res.setHeader("Pragma", "no-cache");
$res.setHeader("Cache-Control", "no-cache");
$res.setHeader("Expire", "0");
response 객체에다가 이렇게 설정
[출처] 벨로시티(velocity)에서 브라우저 캐쉬없애기|작성자 삽지리
2007년 정보통신공무원교육원에서 전산담당 공무원을 대상으로 진행된 웹 접근성 전문교육 중 2일차 과정입니다.
한국정보문화진흥원 주최로 2006년 11월 29일에 진행된 웹 접근성 준수 실무 세미나의 발표 자료
최종수정일 : 2007.05.27 00:03 |
Windows계열이다보니 GUI환경으로 Display를 해줘야 하는 상황이라 그래픽카드의 문제도 위와 같은
상황으로 연결되지 않나 싶습니다.
설마 했는데 정말 이것으로 해결이 되더군요..
위와 같이 원격지 서버에 접속한 화면을 볼 수 있다.
퍼옴: http://infomercial.tistory.com/143
[출처] MS 2003 Server-원격데스크탑 연결 |작성자 마니
CSS 파일을 여러개로 나누는 경우 HTTP 요청이 늘어나서 웹페이지 전송속도에 좋지 않은 영향을 주게 되므로 파일의 수는 최소한으로 유지합니다. 사이트 루트 디렉토리에 /css/ 폴더를 생성하고 전역에 쓰이는 파일의 이름은 default.css 으로 지정합니다.
아래와 같이 정형화 된 요소들에 대한 네이밍은 'id/class 선언규약'에 따릅니다. 단, 아래 예는 되도록 복잡한 상황을 재현한 것으로서 특히 #wrap, .colgroup과 같은 그룹핑은 필수적이지 않다면 제외하는 것이 바람직 합니다. 동일한 의미를 지닌 id/class 가 복수로 존재해야 하는 경우 선택자 뒤에 숫자를 붙여서 확장합니다. 예제보기.
.nav01 (X) 클래스 이름을 이용한 스크립트 작성시 1~9까지 예외적으로 "0"을 추가해야 하므로 구현 이슈 발생
.nav1 (O)
(△) .more 라는 클래스 이름을 더 이상 사용할 수 없음
.more {...}
(O) .more 라는 클래스 이름을 여러번 재 사용할 수 있음
.section .more {...}
.aside .more {...}
.gnb fieldset{border:none;} (△) 전역 스타일을 특정 영역에 종속시켜 재 사용성이 떨어짐
fieldset{border:none;} (O) 보통의 경우 fieldset을 이용하여 border를 표현하지 않으므로 어떤 선택자에도 종속시키지 않음
아래 제시된 종류의 이미지 이름들은 각각의 목적에 맞는 형태로 사용될 수 있도록 예약되어 있습니다. 아래 표현들은 다른 목적으로 사용하거나 독창적인 형태로 변형하여 사용하지 않습니다. "*" 표시는 해당 이미지의 의미나 상태를 가장 잘 표현할 수 있는 단어로 치환하거나 또는 생략할 수 있습니다. 네이밍의 순서는 '대분류-중분류-소분류' 또는 '형태-의미-상태' 순입니다. 동일한 용도의 이미지가 여러개인 경우 마지막 단어에 숫자를 붙여서 다르게 네이밍 합니다.
분류 | 예약어 | 설명 | 권장표현 | ||
---|---|---|---|---|---|
형태 | 형태+의미+상태 | ||||
제목 | h*_* | h_* | 불특정 레벨의 제목 | 제목 태그로 마크업되는 이미지 요소. | 전경 |
h1_* | 제목 1 | ||||
h2_* | 제목 2 | ||||
h3_* | 제목 3 | ||||
h4_* | 제목 4 | ||||
h5_* | 제목 5 | ||||
h6_* | 제목 6 | ||||
문장 | p_* | p_* | 문장 | 통상 p 요소로 마크업되는 이미지 형태의 텍스트. | 전경 |
네비게이션 | gnb_* | gnb_* | 글로벌 | 네비게이션 목적의 버튼 또는 탭. | 전경 |
lnb_* | lnb_* | 로컬 | |||
snb_* | snb_* | 사이드 | |||
탭 | tab_* | tab_* | 탭 | gnb, lnb, snb에 포함되지 않으며 탭으로 분류되는 버튼 또는 버튼의 배경. | 전경/배경 |
버튼 | btn_* | btn_list_* | 목록 | 모든 종류의 버튼. | 전경 |
btn_read_* | 읽기 | ||||
btn_write_* | 쓰기 | ||||
btn_modify_* | 수정 | ||||
btn_delete_* | 삭제 | ||||
btn_reply_* | 답변 | ||||
btn_cancel_* | 취소 | ||||
btn_search_* | 검색 | ||||
btn_find_* | 찾기 | ||||
btn_registeration_* | 등록 | ||||
btn_confirm_* | 확인 | ||||
btn_submit_* | 전송 | ||||
btn_upload_* | 업로드 | ||||
btn_download_* | 다운로드 | ||||
btn_install_* | 설치 | ||||
btn_file_* | 파일 | ||||
btn_stop_* | 정지 | ||||
btn_play_* | 실행 | ||||
btn_prev_* | 이전 | ||||
btn_next_* | 다음 | ||||
btn_up_* | 위로 | ||||
btn_down_* | 아래로 | ||||
btn_zip_* | 우편코드찾기 | ||||
btn_go_* | 페이지 이동 | ||||
btn_refresh_* | 새로고침 | ||||
btn_open_* | 열기 | ||||
btn_close_* | 닫기 | ||||
btn_zoom_* | 확대 | ||||
btn_reduction_* | 축소 | ||||
btn_spread_* | 펼치기 | ||||
btn_unfold_* | 접기 | ||||
btn_lock_* | 잠금 | ||||
btn_unlock_* | 해제 | ||||
박스 | bx_* | bx_*_top | 상단 | 상자의 선과 모서리 표현. | 배경 |
bx_*_mid | 중앙 | ||||
bx_*_btm | 하단 | ||||
bx_*_lt | 좌상단 | ||||
bx_*_rt | 우상단 | ||||
bx_*_lb | 좌하단 | ||||
bx_*_rb | 우하단 | ||||
블릿 | bu_* | bu_square | 사각 | 의미를 포함하지 않는 장식적 bullet/icon 표현. | 배경 |
bu_circle | 원형 | ||||
bu_arrow | 화살 | ||||
bu_star | 별 | ||||
아이콘 | ico_* | ico_num* | 숫자 | 의미를 포함하는 장식적 icon 표현. | 전경 |
ico_english_* | 영문 | ||||
ico_korean_* | 한글 | ||||
ico_japanese_* | 일어 | ||||
ico_chinese_* | 중어 | ||||
ico_attention | 주의 | ||||
ico_up | 상향 | ||||
ico_down | 하향 | ||||
ico_point_star | 별점 | ||||
ico_star | 별 | ||||
ico_new | 신규 | ||||
ico_update | 업데이트 | ||||
ico_reply | 댓글 | ||||
ico_target_blank | 새창 | ||||
선 | line_* | line_h | 수평 | 보통 콘텐트를 구분하기 위한 목적의 실선 또는 점선. | 배경 |
line_v | 수직 | ||||
line_s | 슬래시 | ||||
line_bs | 역슬래시 | ||||
line_h_dot | 수평 점선 | ||||
line_v_dot | 수직 점선 | ||||
배경 | bg_* | bg_body | 전체 | 블릿, 버튼, 선 종류 이외의 배경처리 이미지. 보통 일러스트. | 배경 |
bg_head | 상단 | ||||
bg_container | 콘테이너 | ||||
bg_spot | 스팟 | ||||
bg_footer | 풋터 | ||||
bg_lnb | 로컬 네비게이션 | ||||
상태변화 | *_off *_over *_on |
tab_*_off | 비활성 | 비활성/오버/활성 상태에 대한 표현. | 전경/배경 |
tab_*_over | 오버, 포커스 | ||||
tab_*_on | 활성 | ||||
광고 | ad_* | ad_* | 광고 | 모든 종류의 배너 광고. | 전경 |
임시 | @* | @thumb | 썸네일 | 통상 DB에서 불러오게되는 임시 이미지 요소. | 전경 |
@photo | 사진 | ||||
@ad | 광고 |
Velocity의 Developer's Guide를 따라하면서 정리해본것 입니다.
Download(다운로드)
우선 Velocity 배포본을 다운로드 받는다.
그리고 Ant 를 다운받는다.
Dependencies(의존성)
개발을 위해서는 Java 2 Standard Edition SDK (Software Development Kit)이 필요하고,
Velocity를 실행시키기 위해서는 Java 2 Standard Edition RTE (Run Time Environment)이 필요하다.(물론 RTE 대신에 SDK를 사용하는것도 가능하다.)
Velocity는 다음 세가지의 패키지에 의존성을 가지고 있다.
Jakarta Commons Collections - 반드시 필요함.
Jakarta Avalon Logkit - 선택적이지만 Velocity에서 파일기반의 logging을 위해서는 필요하다.
Jakarta ORO - 선택적이지만 org.apache.velocity.convert.WebMacro 템플릿 변환 툴을 사용하기 위해서는 필요하다.
이 패키지들은 build/lib 폴더안에 넣거나 classpath에 추가하면 된다.
How Velocity Works(Velocity는 어떻게 움직이는가)
Velocity를 사용하여 어플리케이션이나 서블릿을 개발할 때는 보통 다음과 같은 과정을 거친다.
1. Velocity의 초기화
2. Context 객체의 생성
3. Context에 사용자의 데이터 객체(data objects)를 추가한다.
4. 템플릿을 선택한다.
5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.
code로 이 과정을 표현하면 다음과 같다.
이 파일은 org.apache.velocity.app.Velocity.java 인데, 실제 자신이 어플리케이션을 개발할 때에도 이러한 패턴으로 작성하면 된다.
import java.io.StringWriter;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
Velocity.init(); // 1.Velocity의 초기화
VelocityContext context = new VelocityContext();
// 2.Context의 생성
context.put( "name", new String("Velocity") );
// 3. Context에 사용자의 데이터 객체(data objects)를 추가한다.
Template template = null;
try {
template = Velocity.getTemplate("mytemplate.vm");
// 4. 템플릿을 선택한다.
} catch( ResourceNotFoundException rnfe ) {
// couldn't find the template
} catch( ParseErrorException pee ) {
// syntax error : problem parsing the template
} catch( MethodInvocationException mie ) {
// something invoked in the template
// threw an exception
} catch( Exception e ) {}
StringWriter sw = new StringWriter();
template.merge( context, sw );
// 5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.
figure 1. velocity의 작동 과정의 예
The Context(컨텍스트)
Velocity에서 Context 라는것은 가장 핵심의 요소면서, 시스템의 부분들사이에서 데이터를
손쉽게 이동시킬 수 있는 일종의 컨테이너(Container)다.
즉, 이말은 Context가 실제 Java Layer와 Template Layer간의 데이터를 주고 받을 때, 그 운반체의 역할을 한다는 말과 같다.
Context는 Java의 Map과 같은 형태를 취한다. key-value의 쌍으로 구성되기 때문에,
Java에서 일반적으로 사용되는 Map을 다룰때와 같이 다루면 된다.
Velocity Template Language(밸로시티 템플릿 언어)
VTL은 Template에서 사용되는 Velocity 고유의 언어를 의미한다.
실제 Template파일을 열어서 코드를 보면 따로 설명을 하지 않아도 충분히 이해할 수 있을만큼 간단한 형태를 보여준다.
example중에서 app_example1의 example.vm을 열어보면 다음과 같은 코드를 볼 수 있다.
## This is an example velocity template
#set( $this = "Velocity")
$this is great! but it's so hard.
#foreach( $name in $list )
$name is great!
#end
#set( $condition = true)
#if ($condition)
The condition is true!
#else
The condition is false!
#end
figure 2. template의 예
References(참조형)
variables(변수) - Velocity에서 변수는 다음과 같이 $를 먼저 쓰고 그 뒤에 식별자를 적어주는 방식으로 사용한다.
$foo
property(특성) - 프로퍼티도 다음과 같이 $다음에 식별자를 쓰고, 마침표(.)후에 다시 식별자의 형태로 사용한다.
$foo.name
method(메소드) - 메소드도 역시 $다음에 식별자를 쓰고, 마침표(.)후에 호출할 메소드의 이름을 적는다.
$foo.getName()
Directives(지시형)
#set - reference의 값을 설정한다.
#if/elseif/else - 조건문 제어
#foreach - 반복문 제어
#include - velocity로 파싱(parsing) 되지 않은 파일의 출력
#parse - velocity로 파싱(parsing) 된 파일 출력
#stop - template 엔진의 정지
#macro - 반복적으로 사용할 vm 정의
Comment(주석)
## - 한줄짜리 주석
#* ... *# - 여러줄짜리 주석
The Examples(예제)
Velocity 배포본의 디렉토리 구조는 다음과 같다.
figure 3. velocity 배포본의 디렉토리 구조
일단 실제 Velocity의 소스를 볼 수는 없고 Velocity가 무엇인지 맛부터 보는것이 좋을것이다.
그래서 필요한것이 바로 examples를 이용하는 것이라고 볼 수 있겠다.
우선 앞서 다운받은 Ant가 설치가 되어있어야 한다. Ant의 설치는 별다른게 아니라
압축을 풀고, 자신이 원하는 위치에 이 Ant디렉토리를 위치시킨 다음에
classpath에 ANT_HOME의 이름으로 Ant디렉토리를 등록시켜주면 된다.
(물론 path에 %ANT_HOME%\bin도 추가해줘야한다.)
콘솔창을 이용하여, build 디렉토리로 이동해서
ant examples 명령어를 주면 무언가 작업이 일어난다.
(win98은 실행창에서 command를, nt,2000,xp는 cmd를 입력하면 콘솔창이 뜬다.)
이 명령어가 하는 일은 examples 폴더에 있는 모든 파일을 컴파일 해주는 역할을 한다.
우선 가장 손쉬운 예제부터 보도록 하자.
앞서 얘기가 나온 app_example1부터 살펴보자.
figure 4. 예제 app_example1의 디렉토리 구조
이 예제를 실행시켜보면 다음과 같은 화면이 출력된다.
네이버 |
최초작성일 : 2005-02-22 최종수정일 : 2005-02-23
이번에는 웹어플리케이션 예제를 한번 분석해보려고 합니다. 다음번에는 이 예제를 조금 더 발전시켜보는 방향으로 해보죠
일단 velocity에서 제공해주는 예제중에서 forumdemo라는 예제를 분석해보도록 하겠습니다. 기능은 간단한 forum의 기능을 제공해주는 작은 어플리케이션입니다. 물론 DB는 사용하지 않습니다. 이 어플리케이션은 다음과 같은 폴더 구조를 가지고 있습니다.
우리가 중요하게 봐야할 곳은 template폴더의 vm들과 WEB-INF/web.xml, WEB-INF/conf/velocity.properties 그리고 소스파일들이지요.
template은 명칭 그대로 템플릿을 모아둔 폴더 입니다. list.vm은 message들의 목록을 출력할 때 쓰이는 템플릿이고, reply.vm은 해당 message에 reply할 때 사용되는 템플릿이며, view.vm은 해당 message와 그 하위의 reply들을 화면에 출력할 때 사용되는 템플릿입니다.
일단 예제를 한번 돌려보면서 해보는게 좋겠지요? 이전에 ant examples를 했다면 아마도 forumdemo도 모두 컴파일이 되어 있을겁니다. (안하셨다면 이전 게시물을 참고하시기 바랍니다.) 이 forumdemo폴더 자체를 tomcat이설치된폴더/webapp 밑으로 복사를 합니다. (물론 ant를 이용하여 자동으로 deploy해도 되겠지만 지금은 일단 복사하는 방법을 선택합니다.)
tomcat을 기동하고, 브라우저창에 http://localhost:8080/forumdemo 를 입력하시면 다음과 같은 화면이 나옵니다. 아무거나 클릭을 해볼까요?
당황스럽게도 404에러, 즉 페이지를 찾을 수 없다는 에러가 나는데, 이것은 web.xml에서 servlet을 mapping시켜주지 않아서 생기는 현상입니다.
WEB-INF/web.xml 파일에 다음을 추가시켜 줍니다. <servlet-mapping>
자 tomcat을 재시작 시킨후에 다시 한번 아무 메뉴나 클릭해봅시다.
이번에는 500에러가 나타납니다. 왜그럴까요? 에러로그를 잘 살펴보시면 template을 가져오지 못했기 때문에 에러를 발생시킨것을 알 수 있습니다. 이것도 역시 WEB-INF/web.xml파일이 잘못되어 있어서 발생하는 현상입니다. <init-param> 를 다음과 같이 바꿔줍니다.
<init-param>
다시 tomcat을 재시작한 후에 클릭해보면 제대로 나오는것을 확인 할 수 있습니다. 일단 예제가 돌아가기 시작하고 있으니 이제 실제적으로 이 어플리케이션을 분석해보도록 하겠습니다.
이 어플리케이션은 모든 서블릿요청은 org.apache.velocity.demo.ControllerServlet 이 담당합니다. get방식으로 parameter를 받아서 그에 해당하는 action을 org.apache.velocity.demo.action 하위의 클래스들로 실행시켜주는 것이지요.
ControllServlet.java (import는 생략했습니다.)
public class ControllerServlet extends VelocityServlet { * tomcat과 같은 servlet 2.2 이상의 지원하는 container에서 가능하다고 하네요. if ( propsFile != null ) // 설정파일을 load합니다. 500에러가 발생했던 이유가 여기에 있는거지요. // 내부적으로는 org.apache.velocity.properties로 정의되어 있었는데, // web.xml에서는 properties로 정의되어 있었기때문에 찾지못해서 에러가 발생했던 것이죠. /** */ // 설정파일에 정의되어있는 resource loader(차후에 다시 얘기나옵니다.)의 경로(path)를 찾아서 실제 경로로 바꾸어 다시 정의합니다. [file.resource.loader.path = /template] String path = p.getProperty("file.resource.loader.path"); if (path != null) // 역시 설정파일에 정의되어있는 runtime.log의 경로를 실제 경로로 바꾸어 다시 설정합니다. [runtime.log = /forumdemo_velocity.log] if (path != null) return p; /** * @param VelocityServlet에서 생성된 Context * @return template try // template의 이름을 받아옵니다. return template; * 각 command는 org.apache.velocity.demo.action의 하위의 클래스들에 구현되어 있습니다. * exec메소드에 각 command가 담당한 부분에 대한 처리가 들어있습니다. * 메세지들을 context에 담는다던지하는 것들 말이지요... /** * VelocityServlet의 error메소드를 override하여 사용합니다. */ StringBuffer html = new StringBuffer(); StringWriter sw = new StringWriter(); html.append( sw.toString() );
|
네이버 |
최초작성일 : 2005-02-23 최종수정일 : 2005-02-25 이번엔 command 클래스들과 om패키지를 조금 살펴볼까 합니다. 이전에 말했듯이 command의 구현체들은 org.apache.velocity.demo.action 패키지안에 있습니다. command.java의 경우에는 하위 command들을 위한 abstract class(추상클래스)입니다. 우선 ListCommand를 살펴보겠습니다. 생각보단 짧죠? public class ListCommand extends Command // 나중엔 이 변수에 담길 template의 이름을 DB에서 가져오거나 parameter로 받으면 되겠죠? // 생성자겠지요? 간단하지 않습니까? 사실상 이녀석이 하는 일은 context에 db클래스에서 뽑아낸 정보들을 담는역할밖에 없으니까요. 이 역할자체는 나머지 command 클래스들에서도 공통적으로 나타납니다. (당연한거겠지요-_-;;) PostCommand.java를 한번 살펴보겠습니다. 다른곳이라곤 exec메소드 뿐입니다.(이 역시 당연한거겠죠?) public String exec( Context ctx ) // 변수에 넘겨받은 값들을 정의합니다. // 메세지 객체를 만들고 앞에서 설정한 변수를 이 객체에 담습니다. // Database 클래스에 메세지객체를 저장합니다. // 메세지를 저장한 후에 보여줄 화면을 List로 정의하고 있기 때문에 // list를 생성하여 context에 담습니다. Object[] list = ForumDatabase.listAll(); ListCommand에서는 말씀드렸던것처럼 db클래스에서 데이터를 가져오는 역할을 했습니다. PostCommand의 경우에는 메세지를 작성할 때 사용하는 클래스인데, 기본적으로 parameter로 받은 정보들을 message객체에 set하고 그것을 db클래스에 저장하는 역할을 하고 있습니다. 나머지 클래스들도 같은 방법으로 동작하고 있기 때문에 추가적인 설명은 하지 않겠습니다. Command클래스의 이름으로 대충 파악하실수 있을꺼라 생각합니다. org.apache.velocity.demo.om 패키지에 있는 두 클래스가 실제적으로 persistence layer를 맡고 있습니다. Message 클래스는 설명이 필요 없는 Bean 클래스입니다.(실제 소스를 보시면 아시겠지만 set/get만을 하고 있는 클래스입니다) 한가지 특이할만한 점이라고 하면, 한 메세지에 달리는 덧글들은 해당하는 메세지가 가지고 있다는 것입니다. 이는 소스에서 살펴보실수 있듯이 Reply을 Vector형태로 가지고 있기 때문에 가능하게 되는 것입니다. 바로 이 부분이죠. private Vector replies = null; ForumDatabase는 HashTable에 사용자가 작성한 메세지를 key/value 방식으로 담고 있습니다. 따라서 클래스가 하는 작업은 HashTable에 메세지를 넣고, 빼고, 리스트 정도가 있습니다. ForumDatabase.java public class ForumDatabase */ message.setId( nextNumber ); // 메세지의 key값으로 설정합니다. */ */ // HashTable에서 넘겨받은 key으로 해당하는 메세지를 찾아서 반환합니다. |
웹사이트 개발시에 필요한 문서 목록입니다. 해당 문서목록의 의견,문제점,궁금하신 점은 Q&A게시판에 올려주십시요. 공유를 원하는 유용한 웹개발문서를 받고 있습니다. 많이 많이 여기로 보내주세요.(다양한 업종의 스토리보드와 제안서 강추) Q : 파일 다운로드시 한글파일의 경우 다운로드 되지 않거나 글자가 깨집니다. |
원문 : http://kkamagui.springnote.com/pages/585605
개발자라면 한번쯤 소스 관리에 대해서 고민해 봤을 것이다. 특히나 수정이 잦은 프로그램이라면 더욱 더 버전 관리가 중요한데, 이걸 일일이 폴더나 날짜별로 관리하다가는 낭패를 보기 십상이다. 그래서 버전관리 프로그램을 사용하는데, 대표적인 것으로 소스세이프(Source Safe), CVS, Subversion 있다.
윈도우 프로그래머라면 소스세이프가 굉장히 유용한데(Visual Studio를 설치하면 자동으로 깔리므로... ㅡ_ㅡa..), 사용해보니 속도가 무지 느리고 VC 또한 한참 뒤에 뜨게하는 무시무시한 단점이 있어서 다른 것을 찾다가 서브버전을 선택하게 되었다.
서브버전의 장점은 인터넷에 잘 나오므로 굳이 이야기하지 않겠고, 실제 윈도우 버전 설치 및 설정에 대해서 알아보자.
서브버전 서버를 설치한다면서 왜 클라이언트를 설치하는 것일까? 그것은 서버 설치후 나머지 작업을 편리하게 할 수 있기 때문이다.
서브버전 클라이언트는 http://tortoisesvn.net/downloads 에서 다운 받을 수 있다.
<Tortoise 서브버전 클라이언트>
클라이언트 설치는 간단하다. 무조건 "Next" 버튼을 눌러서 완료를 하면 알아서 다 해준다.
<Tortoise 서브버전(Subversion) 클라이언트 설치>
설치 후 탐색기에서 오른쪽 버튼을 클릭했을 때 아래와 같은 메뉴가 뜨면 정상적으로 설치된 것이다.
<설치 완료>
서브버전의 윈도우용 설치 파일은 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 에서 찾을 수 있다. 위 사이트로 이동하면 아래와 같은 화면을 볼 수 있는데, 최신버전의 설치 파일을 다운받아서 설치하도록 하자.
<서브버전 서버 파일 다운로드>
설치 과정은 아주 간단하다. 윈도우 인스톨 파일을 더블클릭해서 기본 옵션으로 설치하면 된다. "Next" 를 계속해서 클릭하여 완료하자.
<인스톨 화면>
--------------------------참고----------------------------------------
참고..서버 설치후 서버가 시작되었는지 윈도우 서비스에서 확인한다.
윈도우 재시작을 하지 않고 그냥 진행했을 경우...서브버전 서비스가 실행이 안되어서 삽질했음
--------------------------참고 끝------------------------------------
서버 설치가 끝났으니 데이터를 저장할 폴더를 생성해야한다. 저장소는 하드디스크의 특정 폴더로 하면 되고, 임의의 이름으로 선택 가능하다. 일단 D:\Repository로 해서 생성하자.
<저장소 생성>
서브버전 서버를 서비스로 등록하여 윈도우 부팅시에 자동으로 실행되도록 하자. 윈도우 서비스 등록은 sc.exe 프로세스로 등록가능하다. cmd.exe를 실행해서 아래와 같이 입력하도록 하자.
<서비스 등록>
아래는 서브버전 서비스를 등록하고 서비스를 해제하는 명령이다.
별다른 문제가 없다면 성공적으로 등록했다는 메시지가 출력될 것이다.
서브버전은 TCP 3690 포트와 UDP 3690 포트를 사용한다. 윈도우 방화벽 및 Anti-Virus의 방화벽을 해제하도록 하자.
아래는 윈도우 방화벽에서 포트를 추가하는 방법이다. TCP와 UDP 각각 등록해서 모두 가능하도록 하자.
<방화벽 해제>
이제 서버 설정이 끝났으니 실제로 소스 또는 데이터를 관리할 저장소(Repository)를 생성해야 한다. 서브버전 관련 데이터는 D:\Repository 에 저장하기로 했으므로 하위 폴더에 저장소를 생성하자.
cmd.exe 를 실행한 뒤 D:\Repository 폴더로 이동하여 아래와 같이 입력한다.
위의 파란색으로 표시된 test를 유의해서 보자. test 대신에 생성을 원하는 폴더명으로 바꿔서 입력하면 된다.
아래는 위의 명령을 실행한 후 결과 화면이다.
<저장소 생성>
Tortois Subversion 클라이언트를 설치했다면 좀더 편한 방법으로 생성할 수 있다. 아래는 Tortoise Subversion 클라이언트를 통해 생성하는 방법이다.
<저장소 생성>
D:\Repository 폴더에 생성할 저장소 이름(Test)의 폴더를 미리 생성한 후 Tortoise Subversion 클라이언트에서 "Create repository here"를 클릭하면 된다.
파일 시스템을 선택하는 다이얼로그가 뜨면 "Native filesystem(fsfs)"를 선택한 후 OK를 눌러서 생성하면 된다.
저장소를 생성하고 나면 아래와 같은 폴더와 파일들이 생긴다.
<저장소 폴더 상태>
이 중에서 접근 권한을 제어하기위해서는 2개의 파일을 손봐야 하는데 다음 항목을 보자
위와 같이 파일을 수정한 다음 저장한다.
위와 같이 ID = Password의 형태로 입력한 뒤 저장하면 된다.
테스트 방법은 간단하다. 탐색기에서 오른쪽 버튼을 눌러서 표시되는 메뉴에서 "Repo-Browser" 를 클릭하여 아래와 같은 창이 뜨면 서브버전 서버가 설치된 주소와 저장소 이름을 같이 입력해주면 된다.
<Repo-browser 메뉴>
이제 주소와 저장소의 이름을 입력하자. 주소를 kkamagui.egloos.com, 그리고 저장소를 test라고 가정하고 입력하면 아래와 같이 될 것이다.
<서브버전 주소 입력>
"OK" 버튼을 누르면 실제 서버에 접속해서 저장소 정보를 얻어오는데, 아래와 같은 화면이 표시될 것이다. 실제로 정상적으로 접속이 된다면 "test" 항목 아래에 아무것도 표시되지 않을 것이지만 문제가 발생한다면 아래와 같이 에러메시지가 표시될 것이다.
<Repo-Browser 실행-에러발생>
위와 같은 에러 메시지가 표시되면 처음 단계부터 설정을 다시 한번 확인하자. 아무런 에러 메시지가 없다면 정상적으로 설치된 경우이므로 열심히 Check-out, commit, update를 반복하면 된다.
서브버전 서버가 설치되어있어야 꼭 소스 버전 관리가 가능한 것일까? "답은 그렇지 않다" 이다.
Tortoise Subversion 클라이언트를 설치했다면 로컬에 저장소를 만들고 file:/// 키워드로 접근하여 소스 버전을 관리하는 것이 가능하다.
위의 "2.4 저장소(Repository) 생성" 부분을 참고해서 로컬에 Tortoise를 이용하여 저장소를 생성하자. 그리고 파일들을 수정해서 특정 유저만 접근가능하도록 수정하자.
위의 "3.간단한 서브버전(Subversion) 서버 테스트" 부분을 참고하여 "Repo-browser"를 실행하고 주소에 아래와 같이 입력한 후 OK를 누르자.
정상적으로 실행되면 아래와 같은 화면이 표시될 것이다.
<Repo-browser 실행>
아무런 에러가 없으므로 정상적으로 실행되었음을 알 수 있다. 이렇게 함으로써 서버를 설치하지 않고도 로컬에서 소스 버전관리를 할 수 있다.
소스를 컴파일해서 나오는 object 파일이나 기타 필요없는 부산물들은 버전관리를 할 필요가 없다. 그런 파일들을 일일이 수작업으로 제외하기는 상당히 귀찮은 작업인데, 다행이 Tortoise에서 이것을 편리하게 할 수 있는 옵션이 있다.
"Settings" 메뉴에 가면 아래와 같은 화면이 표시된다. 여기에 "Global Ignore Pattern" 항목에 무시할 파일의 확장자나 파일명을 입력하면 된다.
<확장자 및 파일명 입력>
이로서 그 지긋지긋하게 느린 소스세이프(SourceSafe)에서 벗어날 수 있게 되었다(이렇게 좋을 수가... ㅜ_ㅜ). 소스 버전 관리를 통해 프로젝트를 보다 효율적으로 관리하고 협업의 능률을 최대한 활용하자. @0@)/~~!!
http://blog.naver.com/mazinggaa?Redirect=Log&logNo=130023412047
(쉬프트 정보통신 - 가우스) http://member.shift.co.kr/gauce01.html
(투비 소프트 - 마이플랫폼) http://www.tobesoft.com/new/html/PID&Demo/index.html
(컴스퀘어 - 트러스트폼) http://www.comsquare.co.kr/product/feature.asp
(엘라스틱웨어 - 엔리치클라이언트) http://www.elasticware.com/kr/map.cgi/EnRichClient
_________________________________________________________________________________________________________________________________________________
1. x-internet은 예전 아키텍처에 문제가 있어서 등장했다고 한다. 그렇다면 예전 아키텍처는 어떤문제가 있었나 ?
클라이언트/서버 방식 : 개발자를 위한 개발환경과 최상의 UI기능 구현, 단 덩치가 크고 시스템적으로 유지보수가 어렵다.
WEB 방식 : 시스템 유지보수가 쉬운대신 노가다식 개발환경과 취약한 UI 및 기능성 정리하면 예전 아키텍처는 시스템 유지보수가 쉬우면 개발환경이나 기능성이 취약하고 개발환경이나 기능성이 막강하면 덩치가 커서 유지보수가 어려웠다. 등의 장단점의 차이가 분명했다.
2. 그래서 x-internet 의 등장배경은?
C/S 방식과 WEB 방식의 단점을 극복하기 위해 등장했다.
3. 그럼 명칭이 애매모호한 x-internet의 정의와 장점은 무엇인가?
정의에서 무언가 새로운 개념이 나올것 같았는데 정의는 단순했다.
"x-internet이란 Web 아키텍처와 C/S 아키텍처의 한계를 극복하고 장점만을 수용하기 위한 새로운 인터넷 아키텍처를 의미한다."
단순하게 말해 Web 과 C/S의 장점을 뽑아 새로만든 아키텍처가 x-internet 이라고 한다. 그리고 조금더 들어가면 두가지 뜻이 더 있다.
eXecutable Internet(실행 가능한 인터넷)
- 인터넷 통신과 XML 을 기반으로, 빠르고 작은 모듈들을 사용하여 C/S와 같은 UI를 사용자에서 보여줄수 있는 환경을 말한다.
eXtended Internet(확장된 인터넷)
- 개발환경의 확장성
- 외부모듈과의 인터페이스 확장성
- 멀티 OS를 지원
다시 말해 "WEB과 C/S의 장점만을 골라, C/S와 같은 기능을 인터넷과 XML을 기반으로 가볍고 빠르게 서버에서 사용자에게 제공 하고,
편리한 개발환경과 외부 모듈과의 연동을 통해 확장하기 쉬운 구조를 가진 아키텍처가 x-internet 이다."
라고 정의 할수 있다.
이렇게 x-internet 의 정의가 곧 장점이라고 보면 될것 같다.
4. x-internet은 어떻게 구현하지?
x-internet 에는 대략 3가지 요소가 있다고 정리해 보았다.
- 개발자 : 개발자는 화면과 로직을 개발하여 서버에 올려놓는다.
- 서버 : 서버에서는 각종 화면과 로직과 데이터를 저장하고 사용자의 요청을 다른 서버 로직(JSP,EJB 등) 과 연동하여 처리한다.
- 클라이언트 : 클라이언트는 x-internet 을 사용하기 위한 전용 브라우저, 자동업데이터 등의 구성요소를 설치한다.
서비스 흐름은 사용자가 전용 브라우저로 HTTP 프로토콜등을 통해 서버로 서비스를 요청하면 서버는 화면 XML, 로직 스크립, 데이터 등을 사용자의 전용브라우저로 내려보내고 전용브라우저는 화면 XML 등을 파싱하여 사용자에게 C/S스럽게(?) 보여주는 흐름이다.
5. x-internet 관련 제품 사용효과
정말 효과가 있을까?
우리 회사 : 편리한 개발환경과 확장가능한 구조로 인해 개발 생산성 향상, C/S스럽게(?) 기능을 제공해도 WEB처럼 손쉬운 유지보수 가능,
한마디로 돈은 적게 들이면서 사용자에게 고급스러운 기능 제공 가능하여 사용자의 충성도가 향상되는등의 여러 효과가 있어서
초기 도입/구입 비용이 상쇄 가능할 것이다.
사용자 : 인터넷 HTML상에 구현된 기능의 제약에서 벗어나 C/S 스러운(?) 고급스러운 기능 체험 으로 서비스 만족도가 향상될것이다
6. x-internet 도입이 성공할려면
x-internet 의 장점이 정말 장점이 되야 한다.
- 편리한 개발환경이 정말 편리해야 한다. 처음 개발환경 익힐때 오래걸리고 어느 부분은 오히려 불편하면 곤란하다.
- 확장이 쉽고 유지보수가 정말 편해야 한다. 이런 장점 설명한 제품, 프레임워크가 많지만 막상 자랑대로 되는게 별로 없었다.
- 사용자가 문구 그대로 고급스러운 기능을 써야 한다. 고급스럽다는 기능은 기능도 다양하지만 속도도 빨라야 하는것을 말한다. 기능만 좋고 속도가 느리다면 이것도 문제가 되지 않을까
이 정도로 정리해보았다. 진짜 중요한건 x-internet 을 아는것 보다는 이것을 어떻게 잘써야 x-internet 이 지향하는 효과를 볼수 있을까 를 생각해봐야 되는것 같다.
<클라이언트 기술간의 비용과 생산성 비교>
클라이언트 기술은 과거 메인프레임 시대의 터미널, 클라이언트/서버 환경의 팻 클라이언트, 웹 기반 시스템의 씬 클라이언트로 발전해 왔다.
[그림 1]에서 보듯 클라이언트/서버 환경의 팻 클라이언트, 웹 기반 시스템의 씬 클라이언트로 넘어가면서 애플리케이션에 대한 총비용은 줄어 들었으나(이 부분이 바로 배포에 소요되는 비용이다) 개발 생산성은 오히려 낮아졌다. 즉 서버 측이 더 복잡해지고 유지보수하기 어려워진 것이다. 이제 스마트 클라이언트 기술은 팻 클라이언트가 가진 장점과 씬 클라이언트가 가진 경제성을 동시에 추구할 수 있게 해준다.
[그림 1] 애플리케이션 총비용과 사용자의 생산성 (출처:almnetworks.co.kr)
[출처] X-internet |작성자 hyejin_han
예전에 선배에게 배운적있었는데.. 그때는 이렇게 프로그램을 죽도록 하게될 지 몰랐기에..
흘려들었었던.. 그 스킬..
암튼.. 다시 알게되서 무지 기쁘다!! ^_______^
아래와 같이 윈도우 탐색기에서 오른쪽 버튼을 눌러 해당 경로로 도스커맨드창을 여는 방법이다.
< 설 정 방 법 >
먼저 [시작] - [실행] (윈도우키 + R) 에서 "regedit"를 입력하여 레지스트리 편집기를 띄운다.
레지스트리 편집기를 띄운후 다음의 경로로 이동한다.
"HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell"
"shell" 키에서 오른쪽 버튼을 클릭한 후 "새로만들기 -> 키"를 선택.
그러면 "shell" 아래에 폴더형태로 "새 키 #1"가 생성된다.
이 키의 이름을 "Dos Command"로 바꾼다. (물론 이름은 원하는대로 ^^;)
오른쪽을 보면 "기본 값"이 있는데, 이 값을 더블클릭하여 키의 값을 "Command(&Q)"로 바꾼다.
여기서 &Q는 단축키를 지정하는 방법이다.
새로 생성한 "Dos Command"에서 오른쪽 버튼을 눌러서 "새로만들기 -> 키"를 또 생성.
이 키의 이름은 "command"로 하였다.
새로 생성된 키의 기본값을 더블클릭하여 값을 "cmd /k" 로 바꾼다.
< 마지막 확인 >
자~ 이제.. 탐색기를 띄워 아무 디렉토리에서나 오른쪽 버튼을 클릭해 보자.
방금 만든 "Command(Q)"라는 명령이 보일 것이다.
클릭하면 바로 그 경로로 도스커맨드창이 열린다.
ㅋㅑ~ 정말 편리한 방법이지 않은가!! ^^
------------------------------------------
odly75님의 내용을 참고하여 작성하였습니다~
[출처] Visual Studio 2005 IDE Tip / 단축키|작성자 양이양이
1. 파일 읽어올 때 한글 깨지지 않게 불러오기
Text1.Text = System.IO.File.ReadAllText("경로", System.Text.Encoding.Default)
2. 어플리케이션 경로 구하기
vb6.0: app.path -> vb2005: My.Application.Info.DirectoryPath
[출처] Visual Studio(Visual Basic) 2005 tip|작성자 이승수
The Apache Velocity project introduces an alternative syntax to the familiar JSP expressions and scriptlets. Resin's extension allows the use of Velocity-style syntax in JSP files. The Velocity-style syntax is transformed into JSTL standard tags.
The syntax is based on expressions like
and scriptlets with . Because the alternative syntax avoids the brackets which fill JSP pages, it can make pages more readable and therefore more maintainable.Because Resin's Velocity-style syntax is transformed to the JSTL tag library, all JSTL expressions are allowed.
<% int count; %> <h3>A sample <%= count %></h3> <% if ("foo".equals(request.getParameter("a"))) { %> <h3>Foo!</h3> <% } else { %> <h3>Bar!</h3> <% } %> |
The same JSP file could be written in Velocity-style as follows. The jsp:directive is required because JSP pages use strict JSP syntax by default.
<jsp:directive.page velocity='true'/> #{ int count; }# <h3>A sample ${count}</h3> #if ("foo" == params.a) <h3>Foo!</h3> #else <h3>Bar!</h3> #end |
The choice between the two is a matter of preferences. An advantage of the velocity style is that expressions and scriptlets avoid using brackets. In large pages, sorting out the HTML or XML from the JSP syntax can become confusing.
Enabling velocity-style syntax |
Velocity-style syntax can either be enabled on a per-JSP page with
or in the web-app with the <jsp> tag:
<jsp:directive.page velocity='true'/> ... |
<web-app> <jsp velocity='true'/> ... </web-app> |
expressions |
Expressions are enclosed between "${" and "}", for example '${count}' and '${count + 15}'.
The '${...}' syntax is equivalent to '
#{ '.
${ }
|
scriptlets |
Scriptlets use the '#{ ... }#' syntax. This is entirely equivalent to '<% ... %>'. (Note, Velocity does not have this syntax because it creates its own language instead of escaping to Java.)
#{
}#
|
#{ String key = request.getParameter("key"); if (key.equals("")) { response.sendError(500, "Bad key"); return; } }# ... |
if statements |
The velocity-style syntax directly supports if statements. The syntax is
#if (expr1) ... #elseif (expr1) ... #else ... #end |
The expressions can be any JSTL expression. The if statement is transformed into:
<c:choose> <c:when test="${}"> ... </c:when> <c:when test="${ }"> ... </c:when> <c:otherwise> ... </c:otherwise> </c:choose> |
foreach statements |
The velocity-style syntax directly supports iteration with a foreach statements.
#foreach (var in expr) ... #end |
This style of foreach is transformed into the following:
<c:forEach items="${}" var=" "> ... </c:forEach> |
An example use might be the following:
<jsp:page.directive velocity='true' import='java.lang.*'/> #{ ArrayList list = new ArrayList(); list.add("foo"); list.add("foobar"); pageContext.setAttribute("list", list); }# #foreach (value in list) <li>${value} #end |
The velocity-style syntax also supports integer iteration.
An example might be the following:
<jsp:page.directive velocity='true'/> #foreach (value in [3..9]) <li>$value #end |
웹에서 처럼 Java application 에서 velocity 를 사용한다.
그러면 화면(로그) 구성 로직을 vm 에 옮기고 변화가 많지않은 부분을 java 로 코딩하여
컴파일을 해 놓으면 어떤 로직에 수정이 가해졌을 때 재 컴파일 없이 properties 처럼
Vm 파일만 수정하면 된다. 활용여하에 따라서 효과적이고 유지보수와 개발의 편리성을
제공할수 있을 것 같다.
필요한 jar : commons-collections-3.2.jar, commons-lang-2.3.jar, velocity-1.5.jar,
velocity-dep-1.4.jar, velocity-tools-1.3.jar, velocity-tools-generic-1.4.jar,
velocity-tools-view-1.1.jar
jdk : 1.4
java 소스 상에서 사용하기 위해선 다음과 같은 절차를 따른다.
1: Velocity.init() 메서드를 사용하여 엔진을 초기화 한다.
2: VelocityContext 객체를 생성하는데 이곳에 넘길값을 셋팅한다.
3: method와 properties 를 다루는데 사용하는 Template 객체를 생성한다.
이 객체에 velocity 파일위치를 파라미터로 넘겨주면 리턴값으로 Template 객체를넘겨준다.
그리고 이 Template 객체에 VelocityContext 를 넘겨주면된다.
Velocity.init();
Template template=Velocity.getTemplate("./src/velocity/conditionals/if.vm");
VelocityContext context = new VelocityContext();
Writer writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer);
소스를 컴파일 하게 되면 console 에 vm 에 대한 로그는 나타나지 않는다.
Velocity.log 파일을 자동으로 만들어 컴파일에 대한 내용을 출력한다.
1. 주석 사용
## 로 시작하면 한 줄 코멘트
#* 로 시작하고 *#로 끝나면, 여러 줄 코멘트
#** 로 시작하고 *#로 끝나면, 블록 코멘트.
2. 레퍼런스
$(variable) : 컨텍스트에서 제공되는 변수에 대한 레퍼런스
$(variable.property) : 속성에 대한 레퍼런스
$(cariable.method(arg)) : 메소드에 대한 레퍼런스
예)
$date.format("yyyy-MM-dd", $createTime)
3. 디렉티브
#set : 레퍼런스의 값 설정
#if/#elseif/#else : 조건문 제어
#foreach : 객체 리스트에 댛란 반복 제어
#include : 벨로시티로 파싱되지 않은 로컬 파일 출력
#parse : 벨로시티로 파싱된 로컬 템플릿 출력
#stop : 템플릿 엔진의 동작 정지
#macro : 반복적으로 사용될 VM(velocimacro)
예)
*. set
#set ($val = 1234567)
*. if/elseif/else
#if( $foo == $bar ) -> 등치 연산자
#if( $foo == 42 )
#if( $foo == "bar" )
#if( !$foo ) -> Boolean NOT
*. foreach
$allPages가 List나 Array인 경우
#foreach( $page in $allPages)
$page
#end
$allPages가 Map이나 Hashtable일 경우
#foreach( $key in $allPages.keySet())
$key -> $allPages.get($key)
#end
*. include
Velocity에 의해 파싱되지 않는 로컬 파일(들)을 렌더링
#include ("a.html")
*. parse
Velocity에 의해 파싱되는 로컬 템플릿을 렌더링
#parse ("me.vm")
*. macro
편리한 함수를 만들어서 사용 가능함
#**
* General purpose date formatter. Need to be careful of whitespace.
* @param dateFormat Date format to be used (see java.text.SimpleDateFormat).
* @param date Date object to be formatted (see java.util.Date).
*#
#macro(formatDate $dateFormat $date )
$utils.formatDate($date, $dateFormat)
#end
4. toolbox.xml(Velocity Tool)을 활용한 사용자 정의 오브젝트의 사용
toolbox.xml에 사용자 정의 클래스를 적용하여 vtl에서 사용할 수 있다. getXX(), setXX(), isXX() 형태로 정의되었을 경우 가능
예)
*. Date Tool
org.apache.velocity.tools.generic.DateTool class를 추가함
$date.format("yyyy-MM-dd HH:mm:ss", $myDate) -> 2008-06-03 19:11:09
*. Number Tool
org.apache.velocity.tools.generic.NumberTool class를 추가함
$number.format("currency", $val) -> ₩1,234,567
$number.format("integer", $val) -> 1,234,567
*. Escape Tool
org.apache.velocity.tools.generic.EscapeTool를 추가함
$javascript -> I'm Mimul
$esc.javascript($javascript) -> I\'m Mimul
Thank you for accepting the OTN License Agreement; you may now download this software. |
Microsoft Windows |
Linux |
Solaris |
HP |
|||||||||
Oracle WebLogic Server 10.3 - Net Installer Oracle WebLogic Server 10.3 - Package Installer |
x86: 39 MB File1 x86: 742 MB File1 |
x86: 42 MB File1 x86: 748 MB File1 |
SPARC: 47 MB File1 SPARC: 463 MB File1 |
Itanium: 8 MB File1 Itanium: 473 MB File1 |
Mandatory for 10.3 Net/Package Installers: - Security Advisory - Apache Plug-ins zip - Instructions |
|||||||
Oracle WebLogic Server 10.0 MP1 Oracle WebLogic Server 9.2 MP3 |
x86: 688 MB File1 x86: 636 MB File1 |
x86: 695 MB File1 x86: 639 MB File1 |
SPARC: 636 MB File1 SPARC: 598 MB File1 |
Oracle WebLogic SIP Server 3.1 |
x86: 371 MB File1 |
x86: 379 MB File1 |
Documentation Library |
All | |||||||||||
Additional Fusion Middleware Downloads | ||||||||||||
Microsoft Windows |
Linux |
Solaris |
||||||||||
Oracle Coherence |
All versions | |||||||||||
Oracle JRockit |
All versions |
Oracle WebLogic Operations Control |
All versions |
There are 1 nested errors:
weblogic.management.ManagementException: [Management:141266]Parsing Failure in c1. JEUS 5.0 깔끔하게 삭제
(프로그램 추가/제거에서 삭제 후 C:\TmaxSoft 폴더 직접 삭제)
2. WebLogic 설치 (계속 Next 눌러서 설치)
-> install 이 시작 됨
-> Install XML Spy 과 Run QuickStart 체크 해제 후 Done
▶▶▶ 설정 하기 ◀◀◀
Configuration Wizard 실행
-> Create a new WebLogic configuration
-> Basic WebLogic Server Domain
-> Express
-> 패스워드 입력 : 12345678 (최소 8자)
-> Development Mode / Bea Supplied SDKs (Sun SDK 1.4.1)
-> Create 클릭
User Project -> mydomain -> Start Server 실행
http://localhost:7001/console 접속
(아이디 weblogic / 비번 12345678)
C:\bea\user_projects\domains\mydomain\applications 에 webtest 폴더 만들기
(webtest가 루트가 됨)
webtest 폴더 밑에 WEB-INF 폴더 생성
WEB-INF 폴더 밑에 classes, lib, src 폴더 생성(총 3개)
* 폴더 구조 *
webtest ─ WEB-INF ─ classes
└ lib
└ src
web.xml, weblogic.xml 를 WEB-INF폴더에 카피 후 내용 지우기
<< web.xml 내용 >>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
</web-app>
<< weblogic.xml 내용 >>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 7.0//EN"
"http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd" >
<weblogic-web-app>
</weblogic-web-app>
C:\bea\user_projects\domains\mydomain\startWebLogic.cmd 문서 열기
38번 라인 수정 -> set PRODUCTION_MODE=false
▶▶▶ 테스트 하기 ◀◀◀
webtest 폴더 밑에 index.html 생성
서버 재시작
http://localhost:7001/webtest/index.html
Error 404--Not Found 메세지가 뜨면 성공
▶▶▶ Console로 접속해서 설정 하기 ◀◀◀
http://localhost:7001/console 접속
Web Application Modules 클릭
Deploy a new Web Application Module... 클릭
applications 클릭
webtest 체크 후 Target Module 클릭
Deploy 클릭
http://localhost:7001/webtest/index.html 접속 후 페이지 뜨면 성공
▶▶▶ context-root 추가하기 ◀◀◀
<< weblogic.xml 내용 >>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 7.0//EN"
"http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd" >
<weblogic-web-app>
<context-root>/</context-root>
</weblogic-web-app>
※ http://localhost:7001/webtest 로 접속하던 것을
http://localhost:7001/ 로 접속 가능함
▶▶▶ Servlet 테스트 하기 ◀◀◀
시작 > 실행 > cmd
C:\bea\user_projects\domains\mydomain 디렉토리로 이동
.\setEnv.cmd 실행 (WebLogic 환경에 맞춰서 컴파일 하는 명령어)
서블릿 파일 작성 후 WEB-INF 밑 src 폴더에 저장
C:\bea\user_projects\domains\mydomain\applications\webtest\WEB-INF\src 디렉토리로 이동
javac -d ..\classes HelloWorldServlet.java (컴파일)
▶▶▶ web.xml 에 서블릿 맵핑 하기 ◀◀◀
<< weblogic.xml 내용 (추가) >>
<web-app>
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>examples.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
- 서버 재시작 -
http://localhost:7001/hello (접속)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
DB연결 부분은... 알아서 해석해주세요 ㅡㅡ;; 너무 빨라서 정리를;;
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
-jdbc-
Connection Pools
Configure a new JDBC Connection Pool...
디비타입 - 오라클
디비드라이버 - 오라클스 드라이버 씬
네임 - OracleConnectionPool
디비네임 - XE
127.0.0.1
1521
scott
tiger
tiger
continue
create deploy
///////////////////////////////////////
Data Sources
Configure a new JDBC Data Source
네임 - OracleDataSource
jndi네임 - XE
[출처] WebLogic 설치 및 환경설정법 (KITRI이공계전문가연수과정A반) |작성자 김성진
[시스템운영] WAS/WebServer | LECTURE | |
[첨부파일 다운로드] 1. lecture0201_1_3_WebLogic Platform 8.1 Installation Guide and so on.doc (4539KB) |
간혹 Jeus에서도 잘 돌던 JSP가 Tomcat에서 500번 에러가 나는 경우가 있는데
대부분의 경우 JSTL을 사용하는 경우이다.
대략 다음과 같은 형태다.
메시지를 자세히 보면 이런 내용이 나온다.
According to TLD or attribute directive in tag file, attribute value does not accept any expressions
요컨데 expression language를 사용할 수 없다는 것
이 내용으로 구글링을 해보면 이런 내용이 나온다.
참고: http://forum.java.sun.com/thread.jspa?threadID=683007&messageID=9423383
내용인 즉 expression을 사용하려면 JSTL 1.1을 써야한다는 내용이 많다.
Struts 1.3.8에 포함된 JSTL은 1.0.2 였기 때문에
일부러 J2EE SDK가 포함된 Sun AppServer를 다운 받아 appserv-jstl.jar 로 교체를 해봤다.
그래도 마찬가지 현상..
대략 글을 더 살펴보니 이런 솔루션이 나온다.
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 를 쓰지말고
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> 를 쓰라는 것
결과는 잘 나온다.
그런데 Jeus에서도 나오는게 Tomcat에서 저렇게 해야만 한다는게 못내 섭섭하다.
그래서 더 내용을 살펴보니
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 요걸로 하면 다 된단다.
결과는 다음과 같다.
잘 나온다.
결국 다른 패치 없이 Tomcat 5 이상에서 Struts 1.3.8 만가지고 JSTL 사용 이상 없다.
다행다행 >ㅁ<
이 사이트의 프로젝트에서는 소프트웨어 구성 관리(SCM) 도구를 사용하여 버전을 관리할 수 있습니다. SCM에서는 CVS를 대체할 향상된 도구로 설계된 공개 소스 버전 관리 도구인 Subversion을 사용합니다. 대부분의 CVS 사용자는 처음이라도 Subversion을 쉽게 사용할 수 있습니다. Subversion을 처음 사용하는 경우라면 실전 경험을 통해 사용법을 익히는 것이 좋습니다. 이 가이드는 빠른 속도로 익힐 수 있도록 도와줍니다.
Subversion은 클라이언트 서버 시스템입니다. Subversion 저장소는 프로젝트 웹 서버에서 관리합니다. 사용자의 시스템에서 실행되는 Subversion 클라이언트는 인터넷을 통해 Subversion 서버와 연결됩니다. 이 사이트에서 호스팅되는 프로젝트를 위해 Subversion 서버에 접근하려면 로컬 컴퓨터에 Subversion 클라이언트가 있어야 합니다. 거의 모든 플랫폼에서 클라이언트를 사용할 수 있습니다. Subversion 프로젝트 다운로드 페이지에서 해당 운영 체제에 적합한 클라이언트를 다운로드할 수 있습니다.
어떤 이들은 개발 과정에서 Subversion 명령줄 클라이언트인 svn을 사용하지만, 그래픽 인터페이스를 선호하는 사용자에게는 TortoiseSVN이 적합합니다. 이 가이드에서는 명령줄 Subversion에 대한 지침만 제공합니다.
단계별로 학습하는 경우라면 Version Control with Subversion을 사용하는 것이 좋습니다. 이 사이트에 수록된 도움말 정보 중 상당수는 이 완성된 설명서에서 발췌된 것입니다. Subversion에 대한 추가 정보 및 최신 정보는 Subversion Project 웹 사이트에서 확인하십시오.
Subversion과 CVS의 명령을 비교해 보려면 "Crossover" Guide for CVS Users를 참조하십시오. 프로젝트에서 Subversion을 가장 효과적으로 활용하는 데 도움이 될 팁은 Subversion 최고의 실행 사례를 참조하십시오.
재시작해야 하는 이유는 TortoiseSVN이 통합되는 Windows 탐색기가 시스템을 재시작하지 않으면 갱신될 수 없기 때문입니다.
참고 - TortoiseSVN은 운영 체제 단계의 응용프로그램입니다.
Subversion은 부분적인 DeltaV 서버로서, 일반적으로 Subversion 클라이언트와 같은 DeltaV 클라이언트로부터의 쓰기 요청만 승인합니다. 현재 CEE의 최신 Subversion에서는 "자동 버전 관리(autoversioning)"라는 기능을 지원합니다. 자동 버전 관리가 활성화되면 일반적인 WebDAV 클라이언트는 곧바로 Subversion 저장소에 쓸 수 있으며, 서버는 해당 커밋을 자동으로 수행합니다.
따라서 사용되는 WebDAV 클라이언트 유형에 따라 기술자가 아닌 사용자도 Subversion 클라이언트의 사용법을 학습하지 않고서도 버전 관리의 이점을 누릴 수 있습니다. Subversion 저장소를 대상으로 작업 중임을 인식하지 않은 채로 파일 생성, 편집, 이름 변경, 복사 및 삭제와 같은 작업을 일상적으로 수행할 수 있습니다.
Microsoft Word나 Dreamweaver와 같은 독립형 응용프로그램을 비롯하여 저장소가 네트워크 폴더처럼 마운트될 수 있는 완전한 파일 시스템 구현까지 매우 다양한 WebDAV 클라이언트를 사용할 수 있습니다. 대부분의 최신 운영 체제에서는 제한적인 수준 이상의 WebDAV 기능이 기본적으로 제공됩니다. 다양한 WebDAV 클라이언트에 대한 자세한 내용은 설명서의 이 절을 참조하십시오.
CollabNet 프로젝트에서 이 기능을 활성화하려면
이 기능을 활성화하기에 앞서 Subversion 설명서에서 이 기능의 부작용에 대해 확인해야 합니다. 특히 WebDAV 클라이언트에서 수행하는 커밋은 비기술적인 일반 로그 메시지가 있습니다. 또한 WebDAV 클라이언트는 많은 쓰기 작업을 수행하는 편이므로 다량의 커밋 이메일이 생성될 수 있습니다.
자동 버전 관리 기능에 대한 자세한 내용은 Subversion 설명서의 부록 C를 참조하십시오.
IDE(Integrated Development Environment)
IDE(Integrated Development environment)는 사용자가 단일 개발 환경에서 컴파일, 테스트 및 디버깅과 같은 작업을 수행할 수 있는 어플리케이션이라고 할 수 있습니다. 모든 작업에 대해 별도 어플리케이션을 다운로드할 필요 없이 동시에 모든 작업을 수행할 수 있습니다. IDE(Integrated Development Environment)의 한가지 예로 Eclipse를 들 수 있습니다.
Eclipse에 관한 도움말
Eclipse는 다양한 기능을 갖춘 플랫폼을 제공하여 매우 잘 통합된 도구를 개발할 때 사용하는 전문 소프트웨어 개발 프로젝트입니다. 또한 Eclipse는 오픈 소스 개발 프로젝트입니다. Eclipse에 대한 자세한 내용은 다음 사이트에서 찾을 수 있습니다.
http://www.eclipse.org/eclipse/faq/eclipse-faq.html#about_8.
Subclipse는 Eclipse용 플러그인입니다. Subclipse는 Subversion을 Eclipse와 통합합니다. Subclipse 플러그인을 사용하면 이 플러그인이 Subversion의 모든 기능을 Eclipse에 추가하기 때문에 Subversion을 별도로 다운로드할 필요가 없습니다. Eclipse는 다양한 기능을 갖춘 플랫폼을 제공하여 매우 잘 통합된 도구를 개발할 때 사용하는 전문 소프트웨어 개발 프로젝트로 오픈 소스입니다.
Eclispse에 대한 자세한 내용은 http://www.eclipse.org/eclipse/faq/eclipse-faq.html#about_8를 참조하십시오.
플러그인은 http://subclipse.tigris.org에서 다운로드할 수 있으며, 사용자는 Eclipse를 사용하여 Subclipse도 다운로드할 수 있습니다.
Subclipse를 사용하여 Subversion 코드 저장소에 대한 작업을 수행할 수 있습니다. 다음 절차는 Subclipse에서 버전 관리 저장소를 구성하는 방법을 설명합니다.
컴포넌트가 설치되었으면 Eclipse 기본 창으로 이동합니다.
또한 Subclipse를 사용하여 갱신 및 원상 복귀와 같은 다른 작업을 수행할 수 있습니다.
Subclipse에 대한 질문이 있을 경우 다음 주소의 Subclipse 사이트를 방문하십시오.
이 사이트에는 FAQ 섹션, 플러그인의 갱신에 대한 정보 및 기타 Subclipse와 관련된 상세 내용이 있습니다.
개요.. |
소스세이프(Source Safe)보다 좋은 버전관리 프로그램 Tortoise SVN 을 소개해드립니다.
홈페이지 : http://tortoisesvn.net/
버전관리를 통한 소스 관리의 중요성 |
프로그래머, 개발자라면 반드시 소스의 버전관리를 해야 합니다. (선택이 아니라 필수입니다.)
소스관리 소프트웨어를 사용하는 대표적인 이유는 다음과 같습니다.
- 백업
- 팀 프로젝트 (팀원과 공통 소스 개발)
- 잘못 만들어진 소스 복구
저(Kyuseo) 역시 예전에는 MS 사의 소스세이프(Source Safe)를 10년 가까이 사용하였으나 최근 3년간 Tortoise SVN을 사용해본 결과 이제는 소스세이프를 사용하는 프로젝트는 손까락도 대기 싫습니다. 업무 효율상 20%~30% 이상 이득을 보았다고 생각합니다.
특히 프로그래머, 팀장님들은 꼭!!! SVN 을 적극 활용하시기를 권해드립니다.
tortoise( 터틀스, 거북이) SVN 을 사용해야하는 이유 |
- 2명 이상의 작업자가 코드 수정이 가능
- 지능적인 자동 Marge
- 무료 공개 소스 프로그램
- 지속적인 업데이트
- 한글 지원
- 탐색기 기반
- 모든 프로그램 호환 (소스코드 뿐만이 아니라 그래픽, 기획자도 사용하기 편리함)
- 프로그램의 안정성
- 세세한 옵션 조정 가능
- 전폭적인 업데이트 로그 관리
스크린샷 |
1. 저장소를 생성한다. ex) d:\RepositoryDir\Project1 에 생성 !
3. 프로젝트 폴더로 가서 필요한 부분의 파일과 폴더를 임포트한다.
* 주의할 것은 eclpise 로 테스트 해보았는데.. 자칫 모든 것을 한꺼번에 import 하게 되면 컴파일러가 .svn또는 _svn 폴더로 인하여 에러를 나타내는 경우가 있으므로 컴파일러에 맞추어서 import를 해준다.
ex)) Project1\res\layout, Project1\res\value, Project1\src\ 폴더와 하위 파일들을 임포트하였다.
5. 관련 파일에 관련된 디렉토리 생성.
7. 관련 디렉토리를 생성해주고, 관련 파일들을 체크 아웃을 해줘서 저장소에 있는 것을 그 곳에 복사시켜준다.
* 복사할 때에 _svn 폴더가 생기기 때문에 그 폴더가 생겨도 지장(컴파일러 에러) 없는 곳에다가 체크 아웃을 시켜준다.
8. 소스 하나만 바뀔 때에는 업데이트를 이용해주는 것이 적은 용량을 사용하므로 빠르다.
9. 프로그램이 많이 바뀔 때마다 커밋을 해주어서 적절한 코멘트와 함께 수정한 내역을 알려서 프로젝트에서 바뀐 부분을 알수 있게 해준다.
10. 파일 하나만 바뀌는 경우에는 업데이트 명령어를 해서 그 파일 하나만 저장소에서 빼와서 복사시킨다. 빠른 속도로 바꿀 수 있는 장점이 있다.