2010년 1월 20일 수요일

[오라클/시노임]oracle synonym

내가 운영중인 채팅사이트 조이팅스토리에 테이블과 관련해서 무언가를 하려니....
시노임이 좀 문제가 되었다...
시노임으로 해결할 수도 있지만...
요게 더 편리한 듯.... ALTER SESSION SET CURRENT_SCHEMA=유저; (제일 아래... 설명)



동의어
다른계정의 테이블을 불러올때 사용
보안, 권한문제,긴이름을 짧게하여 사용 등등

문법
CREATE SYNONYM 시노님명
FOR 유저명.테이블명

유저 생성.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



 생성된 유저에 테이블 생성
이미지를 클릭하시면 원본크기로 보실수 있습니다.

생성된 테이블에 데이터 입력
이미지를 클릭하시면 원본크기로 보실수 있습니다.


SYS 계정에서 TEST_SYNONYM 이라는 SYNONYM 생성.
이미지를 클릭하시면 원본크기로 보실수 있습니다.


SCOTT 계정에서 시노님명을 select 하면 검색 할수 있다.
하지만 테이블로 존재하는것은 아니다.
 이미지를 클릭하시면 원본크기로 보실수 있습니다.









test_synonym 에 대한 scott 계정의 권한주기



sys 계정으로 다음과 같은 권한 부여
이미지를 클릭하시면 원본크기로 보실수 있습니다.



scott으로 와서 select와  insert 해본다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.





 다시 sys 계정에서 scott의  select 권한을 취소한다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



그러면 더이상 scott 계정으로 test_synonym을 select 할수 없게된다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.


GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON 테이블명 TO 사용자
GRANT ALL PRIVILEGES ON 테이블명  TO 사용자명

출처: http://www.cyworld.com/jokercokr2/2513686



---------------------------------------------------------------------------------------------------------
뽀나스

** Synonym 생성 문법 **
**[ Syntax ]*************************************************
* CREATE [PUBLIC] SYNONYM synonym_name
* FOR object_name
*************************************************************

- Public : 모든 사용자가 접근 가능한 시노님을 생성 합니다.
              Public Synonym의 생성 및 삭제는 DBA만이 할 수 있습니다.

                                                                                                                                      
※ scott USER의 emp테이블을 test USER가 사용하는 예제

1. 먼저 scott/tiger USER로 접속해서 test USER에게 emp테이블을 조작할 권한을 부여합니다.

SQL> GRANT ALL ON emp TO test;
         권한이 부여되었습니다.

test user에 대하여 scott의 emp테이블을 조작할 수 있는 권한을 부여 합니다.
권한이 있어야 select하거나 update, insert할 수 있습니다.

2. test USER로 접속해 동의어를 생성합니다.

SQL> connect test/test

SQL> CREATE SYNONYM scott_emp FOR scott.emp;
시노님이 생성되었습니다.

scott USER가 소유하고 있는 emp테이블에 대해 scott_emp라는 일반시노님을 생성 했습니다.
scott 사용자의 emp테이블을 test사용자가 scott_emp라는 동의어로 사용 합니다.

-- 시노님을 이용한 쿼리
SQL> SELECT empno, ename FROM scott_emp;

-- 일반 테이블을 쿼리
SQL> SELECT empno, ename FROM scott.emp;
이 두쿼리의 결과는 같습니다.

   EMPNO ENAME
-------- ---------
    7369 SMITH
    7499 ALLEN
    7521 WARD
    7566 JONES
    7654 MARTIN
    7698 BLAKE
          15 개의 행이 선택되었습니다.

                                                                                                                                      
** 동의어 삭제 **

SQL> DROP SYNONYM scott_emp;
시노님이 삭제 되었습니다.

SQL> SELECT empno, ename FROM scott_emp;
라인 1에 오류:
ORA - 00942 : 테이블 또는 뷰가 존재하지 않습니다.

                                                                                                                                      
[출처] 9. 오라클 객체(4) [SYNONYM]|작성자 요요



------------------------------------------------------------------------------------------------------------
뽀나스

oracle 다른 계정에서 synonym이나 username 지정 없이 table query 하기.


대부분의 오라클 운영자는 '/as sysdba' 나 system 계정으로 작업을 합니다.
모니터링 중 특정 user에서 대해 수행되는 sql의 이상 등을 발견하는 경우 가끔 해당 sql을 직접 수행해 보는 경우가 있는데, v$sqltext 등에서 잡아온 sql을 그대로 수행하면 에러가 당연히 발생합니다.

해당 sql의 table list가 몇개 안될 경우 table 명 앞에 username을 지정하면, 수행은 가능하지만 귀찮기도 하고 어찌되었던 sql이 변경되 버리고 말죠.

또 다른 sql에서 권한이 있는 table을 수행할 경우에도 table의 각각의 username을 설정해야 합니다.
그게 아니라면 synonym을 따로 만들어 줘야 합니다.

이러한 경우 간단히 CURRENT_SCHEMA의 설정으로 이 모든 귀찮은 것을 해결할 수 있습니다.
CURRENT_SCHEMA는 현재 수행되는 SCHEMA환경을 지정한 SCHEMA로 변경해 줍니다.



SQL> CONNECT SCOTT/TIGER;
SQL> GRANT SELECT ON EMP TO JAMES;
SQL> CONNECT JAMES/TIGER;
SQL> SELECT COUNT(*) FROM SCOTT.EMP;
SQL> SELECT COUNT(*) FROM EMP;

SELECT COUNT(*) FROM EMP
                                       *
ERROR at line 1:
ORA-00942: table or view does not exist


위의 경우 당연히 에러가 발생하게 됩니다.
그러면 synonym이나 username을 추가 지정없이 수행하려면 다음의 CURRENT_SCHEMA를 SCOTT으로 지정해 줍니다.


SQL> CONNECT JAMES;
SQL> ALTER SESSION SET CURRENT_SCHEMA=SCOTT;
Session altered.

SQL> SELECT COUNT(*) FROM EMP;
COUNT(*)
10
...

출처: http://energ.tistory.com/141

방장은 누규? 채팅사이트 조이팅스토리를 운영하며 마케팅, 사업 등에 관심이 많은 철이


---------------------------------------------------------------------------------------------------------------
뽀나스

mom이라는 사용자의
A, B, C 라는 테이블을 사용하기 위해

다른 사용자들은 mom.A, mom.B 등으로 사용하는데

A, B 로 바로 쓸수 있게 하는

synonym을 일괄 생성하는 방법

================
sqlplus 로 접속해서

 spool make_synonyms.sql
SELECT 'create public synonym ' || table_name || ' for ' || table_name || ';'
  FROM user_tables;
spool off

@make_synonyms

================

다른 방법은 current schema를 쓰는 방법

alter session set current_schema=scott;

==================

USER_B에게 USER_A.sample의 select 권한 부여
GRANT SELECT ON USER_A.sample_table TO USER_B;



http://www.dude.co.kr




P 이경철님의 파란블로그에서 발행된 글입니다.

오라클[Oracle] CLOB

내 채팅사이트 조이팅스토리에 CLOB를 사용해야할 상황이 생겼따...ㅡ,.ㅡb
html source를 저장해둬야하는 상황이 발생된 것이지비.... 물론 4000byte가 넘어간다! 썅!!!.... ㅠ.ㅜ
해결방법은 당근 있다... 기억이 가물가물하던차.... 인터넷을 뒤져보니 누군가가 잘~ 정리해두었더군... ㅋㅋ
땡스얼랏해요~ ^0^/



Oracle 을 사용하다 보면 가장 귀찮은 것 중의 하나가 CLOB 사용이다.

꼭 Clob가 아니더래도 1000자 이상의 Varchar를 사용하면

PreparedStatement 의 setString()을 사용하면 안되고, setCharacterStream()을 사용하여 처리하는 좀 귀찮은 과정을 거쳐야 한다.

업데이트 시에는 기존 CLOB데이터를 없애고 다시 넣어주어야 하는 등 불편하다.

게다가 몇몇 JDBC 버전은 CLOB 부분에 버그를 가지고 있어 clob insert시 17410 error code를 만나기도 한다.

이런경우 Hibernate와 같은 라이브러리를 사용하면 Oracle JDBC의 버그(?) 에 무방비 상태로 노출된다.

아무튼.. 이런 Oracle JDBC의 불편한 점을 개선해 보고자 어떤 멋진넘이 JdbcOraWrapper 라는걸 만들었다.
http://l3x.net/imwiki/Wiki.jsp?page=Main

사용법은 매우 간단하다. 일단 oracle jdbc 의 jar함께 JdbcOraWrapper.jar를 classpath에 넣구

Conncetion URL을 jdbc:oracle_clob:thin:... 로 변경해 주면 된다.

이넘이 해주는 내용은 간단한데, 기본적으로 Oracle JDBC를 전부 Wrapping  한다 .

그중 핵심은 JdbcOraWrapperPreparedStatement 인데, PreparedStatement 를 구현하여 기본적인 PreparedStatement 의 기능을 모두 수행하고,

setString(int index, String str) 내에서 str의 length()를 비교하여 4000 이상이면 setClob 를 사용하고, 아니면 setString을 사용하도록 되어 있다.

아무튼... 오라클 컬럼이 clob 더라도 걍 setString 으로 데이터가 자~알 들어간다.

근데 문제가 하나 있다.

내부적으로 길이 체크를 str.length() 로 하는데, 이게 한글도 길이를 1로 체크하므로,

str이 4000보다 작아도 실제 데이터 크기는 4kb를 넘을 수 있다는 것이다.

이런 케이스가 발생하면, 4000보다 적다고 판단되어 oracle jdbc의 setString을 호출하는데

실제 oracle jdbc의 preparedStatement에서는 크기 오버 에러를 내버리는 것이다.

이 부분을 str.getBytes().length 로 변경해야 다국어를 사용하는 경우 문제가 없어진다.

이런 문제점을 수정하여 jar파일을 다시 만들었다.

oracle jdbc를 wrapping만 할뿐, 다른처리를 하지 않아서, 이넘과 함께 원하는 oracle jdbc 버전을 사용하면 clob를 매우 편하게 사용할 수 있을 것이다.

----------------------------------------------------------------------------------------------------------
주의할점
아래같은 함수에서 java.sql.Clob 을 oracle.sql.CLOB으로 casting하는부분에서 

class casting exception이 계속 발생합니다. 

뭐가 문제일까요

 public void writeClob(Clob clob, char[] buffer, int nSize) throws SQLException {
  
  //  Get Output stream from Clob locator
  Writer clobWriter = (Writer)((oracle.sql.CLOB) clob).getCharacterOutputStream();
  try{ 
   // Open a stream to read  Clob Data
   clobWriter.write(buffer,0,nSize);
   clobWriter.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }
    
 }
제목 : Re: 당연한듯...
글쓴이: 이원영(javaservice) 2005/11/03 11:55:48 조회수:324 줄수:17
java.sql.Clob는 oracle.sql.CLOB으로 당연히 캐스팅 될 수 없습니다.

Oracle 10g JDBC Driver부터는 표준 JDBC 2.0 API인 java.sql.Clob를 지원합니다. 따라서,
10g라면 가급적 오라클 종속적인 oracle.sql.CLOB를 사용치 마시고 java.sql.Clob만 사용하세요.

그 이하의 버전이라면 어쩔 수 없겠지만,...

PS: 굳이 oracle.sql.CLOB를 사용하려면 꺼내올 때부터 CLOB을 꺼내와야지요.
 JDBC 2.0 표준(Oracle 10g 이상)
   java.sql.Clob clob = rs.getClob(...);
 Oracle 종속적인 CLOB 타입
   oracle.sql.CLOB clob = ((oracle.sql.OralceResultSet)rs).getCLOB(...);

끝으로 프로시저로 사용하는 법...
오라클의 VARCHAR 타입은 4000이 MAX이다.
그나마도 실제로 올려보믄 1500자 내외에서 짤려버린다.
방법은 있지만 일반적으로 파일이나 이미지 업뎃할때 사용하는 CLOB 타입으로 해결두 가능하다.
4GB까정...
간단하게 예제만으로도 충분하리라 본다.



[INSERT 예제..]
-- PLSQL 프로시저로............
CREATE OR REPLACE PROCEDURE TCNWEB.p_upt_freeboard
(
      p_subject   IN  WB_FREEBOARD.FREE_SUBJECT%TYPE       -- 제목
    , p_contents  IN  WB_FREEBOARD.FREE_CONTENTS%TYPE      -- 내용
    , p_parents   IN  WB_FREEBOARD.FREE_PARENTS%TYPE       -- 댓글일 경우
    , p_user      IN  WB_FREEBOARD.FREE_USER%TYPE
)
IS
   v_clob  CLOB;
  
BEGIN
 
  IF p_contents IS NOT NULL THEN
 
    INSERT INTO WB_FREEBOARD(FREE_SUBJECT, FREE_CONTENTS, FREE_PARENTS, FREE_USER)
                      VALUES(p_subject, EMPTY_CLOB(), p_parents, p_user)
                   
    RETURNING FREE_CONTENTS INTO v_clob;
 
    DBMS_LOB.WRITE(v_clob, LENGTH(p_contents), 1, p_contents);
   
    COMMIT;
   
  END IF;
 
END p_upt_freeboard;



SQL에서 사용한다믄...
EXEC p_upt_freeboard('테스트6', '다시한번2', '', 'aaaa');



[SELECT 예제..]


SELECT SEQ_NUM
     , FREE_SUBJECT
     , DBMS_LOB.SUBSTR(FREE_CONTENTS, DBMS_LOB.GETLENGTH(FREE_CONTENTS), 1)
  FROM WB_FREEBOARD

뽀나스..........
JDBC를 이용해서 CLOB 데이터를 쓰실 때 아래 예제처럼 하세요.
Connection 얻어오는 방법은 일반적인 JDBC 사용법을 가정했습니다. 혹시라도 모르시겠으면 웹에서 검색을 해보세요. 예제가 많이 나옵니다.

String sql = "insert into some_table values (?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);

pstmt.setInt(1, 100);
pstmt.setCharacterStream(2, new StringReader(some_string, some_string.length());
pstmt.setString(3, "aaa");
pstmt.execute();


읽을 때에는 아래 함수를 이용하세요. 편하게 쓰느라 제가 만들어둔 함수입니다.

    public static String readClobData(Reader reader) throws IOException {
        StringBuffer data = new StringBuffer();
        char[] buf = new char[1024];
        int cnt = 0;
        if (null != reader) {
            while ( (cnt = reader.read(buf)) != -1) {
                data.append(buf, 0, cnt);
            }
        }
        return data.toString();
    }
CLOB 데이터를 읽는 방법은 아래와 같습니다.

ResultSet rs = some select result;
String clobString = readClobData(rs.getCharacterStream("clob_column"));

http://www.dude.co.kr

P 이경철님의 파란블로그에서 발행된 글입니다.

2010년 1월 11일 월요일

FCKEDITOR 세팅 및 사용법

방장은 누규? 채팅사이트 조이팅스토리를 운영하며 마케팅, 사업 등에 관심이 많은 철이
 
 
아래강좌는 open.net 에서 퍼온글입니다. ^^;
 
#######################################################################################################
새해 복~ 많이 받으세요~
이번 강좌는 FCKeditor의 구성설정에 대해 간단히 알아보려고하는데요 아마도 FCKeditor관련해서는 마지막 강좌가 될 것 같네요.
 
강좌소스는 역시 지난번에 사용했던 웹사이트로 진행하겠습니다. 이미 지난번 강좌에서 FCKeditor를 설치하고 사용했는데요, 필요에 따라서 설정을 변경해야 하는 일이 생기게 됩니다. 스킨을 바꾸고, 툴바도 바꾸고, 이모티콘도 추가하고, 한글폰트도 넣고 등등... 그럼 먼저 구성파일이 어떻게 생겼는지 한번 봅시다~
우리는 웹루트의 fckeditor라는 폴더에 설치를 했는데 이 폴더 안에 fckconfig.js라는 파일이 바로 그것입니다. 열어보면 라이센스가 써있고 각종 설정들이 쭉~~ 있고, 중간중간 주석도 간간히 보이지만 영어라 패스~ 이 파일을 직접 수정해도 되고 따로 자기만의 파일을 사용해도 되는데 우리는 후자로 해보겠습니다. 그럼 먼저 fckconfig.js를 다른 이름으로 복사합니다. MyConfig.js라고 이름을 지었습니다.
 
[그림1]

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 
구성파일로 MyConfig.js를 사용한다고 FCKeditor한테 알려줘야 되겠죠? 원래의 fckconfig.js를 열어서 처음으로 나오는 설정이 바로 이것입니다.
 
[소스코드1 - fckconfig.js]
 
FCKConfig.CustomConfigurationsPath = '/fckeditor/MyConfig.js';
WriteLineNumber('L_FCK_4_S1', 'S_FCK_4_S1');
 
이제 MyConfig.js를 입맛에 맞게 고쳐서 쓰면 되겠습니다.

스킨바꾸기
에디터의 스킨을 바꿔보겠습니다. 기본적으로 /fckeditor/editor/skins안에 default, office2003, silver등 3가지가 들어 있습니다. silver로 바꿔보겠습니다. 45번째줄 정도에 보면~
 
[소스코드2 - MyConfig.js]
 
FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/silver/' ;
WriteLineNumber('L_FCK_4_S2', 'S_FCK_4_S2');
 
참 쉽조잉~ 스타일이 맘에 안든다면 기본 스타일을 참고로 직접 만들어 사용하면 되겠습니다.

에디터에 기본 포커스
에디터가 로드 되었을때 커서가 편집창에 위치하도록 포커스를 설정해 보겠습니다. 82번째줄 정도에 보면~
 
[소스코드3 - MyConfig.js]
 
FCKConfig.StartupFocus = true ;
WriteLineNumber('L_FCK_4_S2', 'S_FCK_4_S2');
 

툴바셋 만들기
툴바에 너무나도 많은 버튼들이 나열되어 있는데 원하는 버튼만 추려서 간단하게 사용하면 좋겠죠. 그래서 원하는 툴바셋을 여러개 만들고 필요에 따라 선택해서 사용하면 되겠습니다. 101번째줄 정도에 보면~
[그림2]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
'default'라는 툴바에는 모든 버튼이 다 들어 있고, 'basic'는 아주 단순합니다. 이 녀석을 복사해다가 이름을 바꾸고 원하는 버튼만 나열하면 되겠습니다. []는 버튼그룹을 짓고 '/'는 줄바꿈이 되겠습니다. 그래서 'MyToolBarSet'이라고 한줄짜리로 만들어 보죠.
 
[소스코드4 - MyConfig.js]
 1 




FCKConfig.ToolbarSets["MyToolbarSet"] = [
    ['Bold', 'Italic', 'Underline', 'StrikeThrough', 'FontSize', 'TextColor', 'BGColor', 'RemoveFormat'],
    ['Blockquote', 'Link', 'Unlink', 'Image', 'Smiley', 'SpecialChar'],
    ['About']
];
WriteLineNumber('L_FCK_4_S4', 'S_FCK_4_S4');
 
[소스코드5 - mytoolbarset.aspx]
 
<FredCK:FCKeditor ID="FCKeditor1" runat="server" ToolbarSet="MyToolbarSet" />
WriteLineNumber('L_FCK_4_S5', 'S_FCK_4_S5');
 
[그림3]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 

Enter 모드 바꾸기
편집창에서 Enter를 누르면 기본적으로 P태그가 만들어집니다. 우리는 보통 Enter를 누르면 줄만 바뀌는게 익숙하기 때문에 P태그는 불편한감이 있습니다. 그래서 Shift+Enter를 누르면 P태그가 아닌 BR태그로 줄바꿈이 되는데 보통 사용자들은 이런 기능을 잘모르고 불편하게 생각할 수도 있습니다. 그래서 Enter를 사용자들에게 익숙하게 동작하도록 Enter와 Shift+Enter를 바꾸겠습니다. 위에서 했던 툴바셋 아래에 보면~
 
[소스코드6 - MyConfig.js]
 1 

FCKConfig.EnterMode = 'br' ; // p | div | br
FCKConfig.ShiftEnterMode = 'p' ; // p | div | br
WriteLineNumber('L_FCK_4_S6', 'S_FCK_4_S6');
 
이제 Enter를 누르면 BR태그가 먹히고, Shift+Enter를 누르면 P태그가 먹히게 됩니다. 줄바꿈태그로 br대신 div를 사용해도 됩니다.
 

글꼴 추가하기
FCKeditor가 외국에서 만든거다 보니 글꼴선택에 한글글꼴이 없습니다. 그래서~ 한글글꼴을 추가해보도록하죠~ 글꼴은 세미콜론(;)으로 구분해주면 됩니다.
 
[소스코드7 - MyConfig.js]
 
FCKConfig.FontNames = '맑은 고딕; 돋움; 굴림; 궁서; 바탕; Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
WriteLineNumber('L_FCK_4_S7', 'S_FCK_4_S7');
 
[그림4]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 
웹이라는 환경을 생각해서 일반적으로 운영체제에 포함되어 있는 글꼴을 추가해야 겠죠.
 

팝업다이얼로그 배경 바꾸기
에디터의 몇몇 기능은 팝업다이얼로그를 띄워서 동작하게 되는데, 팝업다이얼로그 뒷배경의 색깔과 불투명도를 바꿀수 있습니다. 기본값은 흰색에 불투명도 50%로 되어 있는데 이걸 녹색에 불투명도 30%로 해보겠습니다. 구성파일의 거의 마지막으로 내려와 보면~
 
[소스코드8 - MyConfig.js]
 1 

FCKConfig.BackgroundBlockerColor = '#00FF00' ;
FCKConfig.BackgroundBlockerOpacity = 0.30 ;
WriteLineNumber('L_FCK_4_S8', 'S_FCK_4_S8');
 
[그림5]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 

파일업로드/파일탐색기
고맙게도 에디터에 파일업로드 기능과 파일탐색기가 들어있습니다. 요것도 사용해봅시다. 탐색기와 업로드로 사용할 서버측 언어를 선택합니다. 우리는 ASP.NET을 사용하므로 'aspx'라고 주면 되겠네요. 그 아래로 탐색기와 업로드를 사용할지 여부를 설정하면 되겠습니다.
 
[소스코드9 - MyConfig.js]
 1 








10 
11 
12 
13 
14 
var _FileBrowserLanguage = 'aspx' ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = 'aspx' ; // asp | aspx | cfm | lasso | perl | php | py
FCKConfig.LinkBrowser = true ;
...
FCKConfig.ImageBrowser = true ;
...
FCKConfig.FlashBrowser = true ;
...
FCKConfig.LinkUpload = true ;
...
FCKConfig.ImageUpload = true ;
...
FCKConfig.FlashUpload = true ;
...
WriteLineNumber('L_FCK_4_S9', 'S_FCK_4_S9');
 
이걸로 다 된게 아니고, 추가로 해줘야 될게 더 있습니다. 서버환경에 맞게 connector를 구성해야 합니다. /fckeditor/editor/filemanager/connectors에 보면 각 언어별로 폴더가 들어 있습니다. aspx폴더도 보이네요. 이 폴더 안에 config.ascx를 열어서 사용자인증, 업로드폴더등을 설정합니다.
 
[소스코드10 - config.ascx]
 1 



private bool CheckAuthentication()
{
    return true; //인증시스템에 따라 인증확인 성공하면 true, 아니면 false를 리턴하도록 작성.
}
WriteLineNumber('L_FCK_4_S10', 'S_FCK_4_S10');
 
업로드 폴더 위치나 나머지 설정들은 public override void SetConfig()를 보시면 충분히 알 수 있습니다. 각자 해보세요.
이제 에디터에서 이미지나, 플래쉬, 링크등의 버튼을 눌러 팝업다이얼로그를 열어 "서버보기"버튼과 "업로드"탭이 잘 되는지 확인해봅시다.
 
[그림6]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 

이모티콘 바꾸기
위지윅에디터의 기능중 가장 많이 사용될것이라 생각되는 이모티콘! FCKeditor에는 기본적으로 MSN메신저의 이모티콘이 들어 있습니다. 이것 말고 좀더 크고 움직이는 이모티콘을 사용하고 싶다면? 그까이꺼 대충~ 해봅시다. 먼저 이쁜 이모티콘이 있어야 하는데... 인터넷에 찾아보면 어렵지 않게 무료 이모티콘을 구할 수 있습니다. 역쉬 무료가 쵝오♬♬♬ 우리 사이트의 링크페이지에도 무료이모티콘사이트 몇개 올려놨으니 한번 방문해보세요.
자, 이모티콘을 구했다면 /fckeditor/editor/images/smiley 폴더에 my라는 폴더를 만들고 이 안에 이모티콘을 복사합니다. 파일이름은 1.gif~4.gif까지 총 4개.
 
[그림7]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 
이제, MyConfig.js로 돌아와서 이모티콘 폴더 위치와 파일 이름을 고쳐줍니다.
 
[소스코드11 - MyConfig.js]
 1 





FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/my/' ; //폴더 위치
FCKConfig.SmileyImages = ['1.gif', '2.gif', '3.gif', '4.gif'] ; //파일 이름
//아래는 이모티콘 팝업다이얼로그설정
FCKConfig.SmileyColumns = 2 ; //가로 이모티콘 개수
FCKConfig.SmileyWindowWidth = 320 ; //팝업다이얼로그 너비
FCKConfig.SmileyWindowHeight = 210 ; //팝업다이얼로그 높이
WriteLineNumber('L_FCK_4_S11', 'S_FCK_4_S11');
 
[그림8]
이미지를 클릭하시면 원본크기로 보실수 있습니다.
 

이상, 준비한 4편의 FCKeditor강좌를 모두 마쳤습니다. 깊이있는 내용 없이 간단하게 FCKeditor사용방법에 대해 알아 봤는데, 여러분에게 도움이 되었는지 모르겠네요. 강좌와 관련된 궁금한 점이나 잘못된 점 등등 의견 있으시면 댓글, 포럼, Email(도움말/운영자에게)을 이용해 주세요. 열심히 강좌를 읽어주신 분들께 감사드리고 더 좋은 내용의 강좌로 만나 뵙도록 하겠습니다. 감사합니다

[출처] FCKEDITOR 세팅|작성자 자근

 

 

 

 

 

 

 



P 이경철님의 파란블로그에서 발행된 글입니다.

Prototype&dojo 간략한 사용법

Prototype

구할 수 있는 곳 : http://prototype.conio.net/

사용법

<head>
...
<script type="text/javascript" src="prototype.js"> </script>
..
</head>


요청 보내기

var request = new Ajax.Request(
    url,
    {
        method: 'get',
        parameters: 'phone=21293829&name=Mary',
        onSuccess: updatePage,
        onFailure: reportError
}


응답 처리(성공시)

function updatePage(request) {
    var response = request.responseText;
}


Dojo

구할 수 있는 곳 : http://dojotoolkit.org/

사용법

<head>
...
<script type="text/javascript" src="dojo.js"> </script>
...
<script language="JavaScript" type="text/javascript">
    dojo.require("dojo.io.bind"); // 필요한 Dojo 패키지를 실행합니다.
</script>
...
</head>


요청 보내기

var arguments = {
    url: 'lookupCustomer.php',
    method: 'GET',
    content: 'phone=21293829&name=Mary',
    error: reportError,
    load: updatePage
}
dojo.io.bind(arguments);

응답 처리(성공시)

function updatePage(type, value, evt) {
    var response = value;
}


http://www.dude.co.kr

P 이경철님의 파란블로그에서 발행된 글입니다.

흰둥씨의 DWR강좌

방장은 누규? 채팅사이트 조이팅스토리를 운영하며 마케팅, 사업 등에 관심이 많은 철이

 

 
흰둥이’s DWR 강좌

 

 

강좌라기 보단, IBM 기술문서를 번역하려다, 사용자의 이해를 좀 쉽게 도모하고저(?) 별도의 매뉴얼로 작성합니다. 그리 어려운 개념이 아니며 자바스크립트만 이용할 수 있다면 어플리케이션의 큰 변경 리스크 없이 간간히 적용하기에 좋습니다. 지금부터라도 한번씩 자신의 어플리케이션에 간단하게 나마 적용해 보시기 바랍니다. 사용자가 매우 좋아할 까요.. ^_^

 

아약스의 기본 개념은 여기서 언급하지 않습니다. 관련자료가 워낙 많기 때문에 참조할 문서가 많으실 겁니다. 못찾겠다면 이문서를 일단 보세요.

(http://cafe.naver.com/ArticleRead.nhn?clubid=10068252&menuid=&listtype=A&boardtype=L&page=&articleid=1577)

 

DWR(Direct Web Remoting) 은 서버사이드 빈과, 자바스크립트, 그리고 DWR 서블릿으로 구성되어 있는 아파치 라이센스를 가진 라이브러리 입니다. 용어에서 보실수 있듯이 말그대로 서버에 존재하는 클래스를 마치 로컬에서 호출하듯이 사용하게 해주는 겁니다. RMI와 흡사하지요? , DWR은 서버의 자바클래스와, 클라이언트의 자바스크립트 의 원격호출기능을 정의합니다. 서버에 Cart 라는 클래스가 있고, getCartItem이란 메서드가 있다면, 클라이언트의 스크립트 상에서 똑 같은 객체명 Cart.getCartItem() 으로 호출하여 반환값을 사용할 수 있는겁니다.

 

 물론, 이러한 로직은 Ajax를 이용해 처리되는데요. 우리는 아약스를 위한 XMLHttpRequest등의 개체에 전혀 신경쓸 필요가 없다는게 장점입니다. DWR이 다 알아서 제너레이션을 해주거든요. Ajax 코딩해 보신분들은 이것이 매우 번거롭고 귀찮다는걸 아실겁니다. ^_^ .. DWR의 구성요소를 잠깐 살펴볼까요?

 

DWR 서블릿 : 일종의 맵퍼? 후킹? 뭐 그런의미의 DWR만의 컨트롤러 예요. 물론 내용은 신경쓰실 필요 없구요. 라이브러리만 연결해 놓으시고, 초기로딩시 올라올 수 있게 몇몇 설정만 간단히 해주시면 됩니다. 주요기능은 스크립트 자동 제너레이션이나, 데이터 이동등의 역할을 하는 컨트롤러 예요.

 

서버사이드 빈 : 서버와 클라이언트 사이를 오고갈 빈즈예요. DWR이 서버에 있는 빈을 자바스크립트로 자동 변환작업 을 해주어, 클라이언트 스크립트에서 마치 자신의 클래스를 쓰는마냥 서버의 각종 value들을 획득할수 있게 합니다. 우리가 실제로 작성해야 하는 것들입니다.

 

자바스크립트 : DWR에 매우 유용한 스크립트 라이브러리를 포함합니다. 예를들자면 테이블에 열을 삭제/추가해주거나, 변수접근을 용이하게 해주거나 하는따위의 유틸들이죠. 프로토타입(http://particletree.com/features/quick-guide-to-prototype/)을 아신다면 쉽게 이해가 가실겁니다.

이걸 사용하면 스크립트에 들어가는 공수가 매우 줄어든답니다.

백문이 불여일견! 다 필요없고 실제 사용예제로 바로 들어가겠습니다. 이론보단 실전 ^_^

 

일단, 예제파일을 아래에서 받으세요.

이 예제는 간단히 쇼핑몰을 구현한 것이구요. 전체 쇼핑 리스트와 자신의 카트, 그리고 검색 및 카트에 추가하기 등이 지원되는 매우 간단한 예제예요. 이해하기 편하실 겁니다.

(http://www.ibm.com/developerworks/views/download.jsp?contentid=98221&filename=j-ajax3dwr.zip&method=ftp&locale=worldwide)

예제파일을 받으면 아래와 같이 구성되 있는걸 확인하실 수 있습니다.

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

Lib 밑에는 dwr.jar 파일이 들어있습니다. 이파일은 위에서 설명드렸던 dwr 서블릿들이예요.

반드시 필요하겠죠?

Src 에는 서버빈 2개와 Util, DAO가 들어있습니다.

Web 엔 웹 인터페이스가 들어있는데, 파일 하나입니다. 매우 간단하죠? ^^

Ant 를 이용해 배포하시거나, 수동으로 하시거나 자신의 배포 환경에 적당히 배포하시기 바랍니다.

저같은경우엔, 이클립스에 아래와 같이 만들었습니다. (! 예제는 JDK5.0 으로 코딩되어 있으니 주의하시기 바랍니다.)

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

자 이제 모두 제 위치에 적당히 배포하셨다면, 설정부분을 하나씩 확인하겠습니다.

1. web.xml 설정

   - 이곳엔 dwr invoke 설정과 모든 dwr관련 리소스에 대한 맵핑을 선언합니다.

<servlet>

    <servlet-name>dwr-invoker</servlet-name>

    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>

    <init-param>

      <param-name>debug</param-name>

      <param-value>true</param-value>

    </init-param>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>dwr-invoker</servlet-name>

    <url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

 

uk.ltd.getahead.dwr.DWRServlet -> 이녀석이 주요 핵심 컨트롤러 겠죠? 내용이 궁금하시면 들여다 보시구요. 맵핑은 /dwr/ 하위로 들어오는 모든 클래스에 대한 맵핑이네요?

 

2. dwr.xml

- 이건 파일명대로 dwr에 대한 별도 설정입니다. 물론 DWRServlet에서 참조하겠죠?

- 아래에 xml 내용에 설명을 붙여놓았으니 참조하세요~

<dwr>

  //최상위 노드입니다.

<allow>

  //create onvert 엘리먼트 2개를 설정합니다.

  //create 는 서버의 클래스 인스턴스를 생성하고자 할 때 설정합니다.

  //converter 는 빈과 자바스크립트 사이의 맵핑을 선언합니다.

    <create creator="new" javascript="Catalogue">

       //새로운 디폴트 생성자로 인스턴스를 생성하고, 클라이언트 스크립트에선 Catalogue라는 이름으로 접근이 가능하게 합니다.

      <param name="class" value="developerworks.ajax.store.CatalogueDAO"/>

      //실제 생성되는 클래스 명이죠?

      <include method="getItem"/>

      <include method="findItems"/>

      //클라이언트 스크립트에서 사용할 수 있는 (공개하는) 메서드 명 선언입니다.

    //이렇게 해놓으면 클라이언트에선 Catalogue.getItem() 식으로 직접 호출이 가능하게 됩니다.

    //메서드 명들을 보시면 무슨일을 할는지 대충 감이 오시죠? 자세한건 서버 클래스에서 계속~

    </create>

    <create creator="new" scope="session" javascript="Cart">

      <param name="class" value="developerworks.ajax.store.Cart"/>

      <include method="addItemToCart"/>

      <include method="getFormattedTotalPrice"/>

      <include method="getCart"/>

    </create>

    <convert converter="bean" match="developerworks.ajax.store.Item">

      <param name="include" value="id,name,description,formattedPrice"/>

    </convert>

    <convert converter="bean" match="developerworks.ajax.store.Cart">

      <param name="include" value="simpleContents,formattedTotalPrice"/>

    </convert>

  </allow>

</dwr>

 

3. 이제 dwr.xml 에 선언되 있는 각종 클래스들의 내용을 보실까요?

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

자 메인 DAO가 있구요. 아이템을 아이디로 가져오거나, 특정 표현식으로 검색을 할수 있는 메서드가 있네요. , Cart 라는 빈은 자신의 쇼핑가방이죠? 카트에 아이템을 추가할 수 있고, 내용과 현재까지의 총가격등을 조회할 수 있게 되어있네요? 간단하지요?

실제 내용은 다운받은 예제 클래스 파일을 참조하세요. 위에 있는 클래스명과 공개되는 메서드들이 dwr.xml 에 설정되 있는걸 알수있습니다.

 

4. . 이제 설정은 모두 끝났구요. 이제 클라이언트에서 스크립트를 통해 직접 사용해 주시면 되겠습니다.

 

먼져, 서버용으로 생성한 Catalog CatalogDAO등에 대한 자동생성된 자바스크립트를 확인하셔야 하는데요. Default web.xml에서 맵핑해놓은 url /dwr/* 으로 접근하시면 dwr.xml 에 설정되어 있는 상태와 자동생성될 .js 파일들을 확인하실 수 있습니다.

웹브라우져에서 http:host/web-app/dwr/ 로 접근해보시면 아래와 같은 화면이 나옵니다.

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

 

화면에 보시면 Cart Catalogue 가 링크되어있지요? 이 두개의 파일은 위에서 dwr.xml 에 설정해 놓으신걸 기억하실 겁니다. 이제 특정 링크를 클릭해보세요.

그럼 아래와 같이 세부 정보가 표시됩니다.

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

링크에 표시된 것 처럼 url 을 사용하고자 하는 html 이나 jsp 에서 그대로 이용하시면 됩니다.

물론 이 js 는 동적으로 생성되는것이라 실제 디렉토리엔 안보일꺼예요. 바로 이 js Cart 라는 객체를 스크립트에서 접근할 수 있게 만들어 주는 셈이죠.

이제 다운받은 쇼핑몰 예제의 index.html shopping.js 파일을 확인해 보겠습니다.

 

Index.html 에선 아래와 같이 js 들을 사용하고 있지요?

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

여기서 Catalogue Cart dwr 에서 생성해준 서버클래스에 해당하는 분들이구요.

engine.js util.js 는 기본제공되는 dwr 엔진과 유틸이랍니다. (같은거 물론 두번 사용하실 필요 없겠지요? ^^)

그리고, 마지막에 shopping.js 는 직접 코딩하실 내용입니다.

이제 shopping.js 를 확인해 볼까요?

 

 

Shopping.js 에는 onload 시 초기 로드될 펑션이 정의되있습니다.

window.onload = function() {

  // Update Cart state from session

Cart.getCart(displayCart);

-> Cart 란 개체를 사용하고 있지요? 게다 getCart란 메서드도 호출하고 있구요.

-> 물론, shopping.js 내의 어디에도 해당 객체와 메서드는 없습니다. 이건 Cart.js 내에 있구요.

-> Cart.js 는 서버의 Cart 클래스를 DWR이 제너레이션 해준 스크립트죠?

-> 대충 감이 오실겁니다. 그럼 인자로 displayCart 는 무엇일까요?

-> 바로 콜백(callback)입니다. Cart.getCart 가 반환하는 Cart 를 스크립트 내의 displayCart 펑션으로 받아서 처리하라. 라는 것입니다. 물론, dwr.js 내에 convert 에서 각 빈들을 잘 맵핑해놓아서 dwr이 반환값을 알아서 스크립트에 맞게 컨버트 해줍니다.

$("searchform").onsubmit = searchFormSubmitHandler;

-> 첨보는 표현식이죠? 스크립트 문법이 아니구요. Dwr util 스크립트에서 제공해주는 펑션입니다. 풀어서 쓰면 d0cument.form.searchform.onsubmit 정도가 되겠네요.

-> onsubmit 을 내부 펑션으로 치환하는거죠?

}

 

이부분만 제대로 이해가 가셨다면, 이제 원리 다 이해하신겁니다. 어때요? 쉽지요?

우리는 서버에 Cart 란 클래스를 자바로 만들어놓고, dwr에 설정해놓으면, 클라이언트에선 위와같이 cart.getCart 식으로 곧바로 호출하여 결과값을 화면내에 다이나믹하게 반영하는겁니다.

물론, 서버의 cart.getCart 를 호출할때엔, Ajax를 사용함으로 페이지 리로딩이 일어나지 않습니다.

(이게 ajax를 사용하긴 하는건가? 하고 의구심이 들지요? 직접 실행해보세요~)

 

그외 클라이언트에서의 처리부분은 모두 스크립트가 담당합니다.

그럼 콜백함수인 displayCart 부분을 쫌 살펴볼까요?

 

 

function displayCart(cart) {

 

  // Clear existing content of Cart

  var contentsUL = $("contents");

contentsUL.innerHTML="";

-> contents 내부 HTML을 모두 제거합니다.

 

  // Loop over cart items

  for (var I in cart.simpleContents) {

    -> 스크립트 개체로 변환된 cart 를 가지고 루프를 돌면서..

    -> 카드 표시부분에 아이템을 하나씩 채워 넣습니다.

    // Add a list element with the name and quantity of each

    var li = d0cument.createElement("li");

    li.appendChild(

             d0cument.createTextNode(cart.simpleContents[I] + " x " + I)

                  );

    contentsUL.appendChild(li);

-> 마지막으로 총 가격을 갱신합니다.

  var totalSpan = $("totalprice");

  totalSpan.innerHTML = cart.formattedTotalPrice;

}

 

끝으로, 카트에 아이템을 추가하실 땐, 위처럼 매번 서버에 반영하고 다시 자신의 카트를 조회하고 하면 서버에 접근이 너무 많이 가겠죠? 클라이언트에 캐시 개념을 두시면 쉽게 해결하실 수 있습니다. 일단 스크립트로만 작업해놓고, 나중에 반영하면 되겠죠?

 

중요한건 이러한 개념을 응용해서 나름대로 써먹는 거죠. 간단한 히스토리 콤보를 지금 한번 생각해서 만들어 보세요. ~

지금까지 허접한 DWR 간단 사용 강좌 였습니다. ^______^

 

감사합니다.

출처: http://cafe.naver.com/javalove.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1588

 

 

 

 



P 이경철님의 파란블로그에서 발행된 글입니다.