Spring에서 Bean의 생성과 Bean들의 관계설정 같은 제어를 담당하는 IoC 오브젝트를 BeanFactory라고 한다.
보통 BeanFactory를 확장한 ApplicationContext를 사용하는데 ApplicationContext는 IoC방식을 따라 만들어진 일종의 BeanFactory라고 생각하면 된다.

BeanFactory의 종류 중 하나 AnnotationConfigApplicationContext
@Configure Annotation을 이용한 Java Code를 설정정보로 사용하려면 AnnotationConfigApplicationContext 를 이용한다.

public class DaoFactory {

   public UserDAO userDAO() {

       return new UserDAO(connectionMaker());

   }

   public ConnectionMaker connectionMaker() {

       return new DConnectionMaker(); // DB 커넥션 오브젝트를 리턴해준다.

   }

}

위와 같은 Factory Class가 있다.
이 Class를 설정정보로 이용하려면 아래와 같은 규칙을 따르면 된다.
- Class 선언 위에 @Configuration 이라는 Annotation을 추가한다.
- 객체(Bean)를 생성해 주는 메소드에는 @Bean이라는 Annotation을 추가한다.

package applicationcontext.factory;


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


import applicationcontext.connectionmaker.ConnectionMaker;

import applicationcontext.connectionmaker.DConnectionMaker;

import applicationcontext.dao.UserDAO;


@Configuration

public class DaoFactory {

   @Bean

    public UserDAO userDAO() {

        return new UserDAO(connectionMaker()); // Bean 생성

    }

   @Bean

    public ConnectionMaker connectionMaker() {

        return new DConnectionMaker(); // Bean 생성

    }

}

 
이제 위 DaoFacory 클래스를 AnnotationConfigApplicationContext 클래스를 이용해 읽어들이고 UserDAO Bean을 가져오는 코드를 만들어 보겠다.

package applicationcontext.test;


import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


import applicationcontext.dao.UserDAO;

import applicationcontext.factory.DaoFactory;


public class UserDAOTest {

    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

        UserDAO dao = context.getBean("userDAO", UserDAO.class);

        System.out.println(dao.toString());

    }

}


=====> applicationcontext.dao.UserDAO@d08633 

 
context.getBean의 첫번째 파라미터 userDAO는 DaoFactory 클래스의 userDao라는 메소드의 이름이다. 
두번째 파라미터 UserDAO.class는 userDAO라는 메소드에서 리턴해주는 class 이다.

실행해보면 정상적으로 Bean을 가져오는 것을 확인해 볼 수 있다. 

스프링을 적용하긴 했지만 그냥 DaoFactory를 직접 사용한 것과 기능적으로 다를게 없다.
오히려 번거로운 준비작업과 코드가 필요하다.
그렇다면 굳이 스프링을 사용하지 않고 그냥 DaoFactory와 같은 오브젝트 팩토리를 만들어서 사용하면 되는게 아닐까?
(@Configure 없는 초기 버전의 Factory클래스 같은 클래스들을 오브젝트 팩토리라고 한다.)
스프링은 DaoFactory와 같은 오브젝트 팩토리만으로는 얻을 수 없는 많은 방법과 기능을 제공해 준다. 


출처 : http://babtingdev.tistory.com/288

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요


DBConnectionMgr.java


객체로 생성후 사용


DBConnectionMgr pool = new DBConnection();

conn = pool.connection(); 으로 연결


다 쓴후 pool.close(conn); 이런식으로 닫음 

끝!

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

포인트

문자형 UTF-8 인코딩 하기
java.net.URLEncoder.encode(L_searchword,"UTF-8")


String encStr = java.netURLEncoder.encode("주식", "UTF-8");

sntStr 결과값 = > %EC%A3%BC%EC%8B%9D




JSP페이지에서 문자열 encoding / decofing처리 부분 예제 >>

<%!
    public static void setCookie(HttpServletResponse response, String name, String value) {
        value = java.net.URLEncoder.encode(value);
        Cookie cookie = new Cookie(name, value);
        cookie.setMaxAge(60*60*24*31); // 31일
        response.addCookie(cookie);
    }
    public static String getCookie(HttpServletRequest request, String cookieName) {
        Cookie [] cookies = request.getCookies();
        String value = "";
        for(int i=0;i<cookies.length;i++) {
            if(cookieName.equals(cookies[i].getName())) {
                value = java.net.URLDecoder.decode(cookies[i].getValue());
                break;
            }
        }
        return value;
    }
%>


사용예 >>

    // 쿠키 확인하기
    String tmpStr = "";
    boolean isHit = false;
    tmpStr = getCookie (request, "blog_grade");
    if ( !tmpStr.equals("") ) {
        if ( tmpStr.indexOf("["+L_postno+"]") > -1) isHit = true;
    }


   //쿠키 없으면 생성하기
   if ( !isHit ) {
        tmpStr += "["+L_postno+"]";
        setCookie (response, "blog_grade", tmpStr);
        // DB 처리.
        Sql="update n2_board set b_hit=b_hit+1 where b_idx="+L_num;
        db.executeQuery (Sql);
    }



출처 : http://edit.tistory.com/entry/JSP한글파라미더-UTF-8처리

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

자바 어플리케이션이든, 웹 어플리케이션이든 메모장이나 TextEditor 를 이용하여 개발하는 것에는 생산성의 한계가 있기 마련입니다. 
코드를 짜고, 컴파일을 한 후 서버를 띄우고, 실행을 해보고...등등 
이런 일련의 과정을 이클립스라는 훌륭한 개발툴의 등장으로 통합적인 개발 환경(IDE)이 제공됨으로써 생산성과 협업에 효율화가 가능해졌습니다. 

여기서 설명할 STS (Spring Tool Suite)는 Spring의 공식 커뮤니티인 Spring Source(http://www.springsource.org/) 에서 이클립스 기반에 Spring 개발에 필요한 여러 플러그인을 통합한 버전으로 메이븐, ROO, vfabric-tc-server 등이 포함된 Spring 어플리케이션 통합 개발 툴입니다. 

일단, Spring Tool Suite 다운로드 로 접근하여 STS를 다운받아 봅니다. 






간단한 소개와 함께 우측 상단에 DOWNLOAD 버튼이 나옵니다. 
클릭 후 이동하는 화면에서는 회원 정보를 입력하거나 다이렉트 다운로드 링크로 이동하여 STS를 다운로드 받을 수 있습니다. 




다운로드 목록에 각 OS별 STS 버전이 명시되어 있습니다. 여기서는 Window 7 64Bit 환경이므로 아래 이미지와 같이 링크를 클릭하여 다운로드 받습니다. 






현재 3.8 버전과 4.2 버전이 존재하며 인스톨러 방식 혹은 ZIP 압축 형태로 제공되는 것을 확인 할 수 있습니다. 
인스톨러 방식은 JDK 위치등을 지정해주고 여러 설치 옵션들을 조정해줄 수 있지만 가장 쉽게 접근 할 수 있는 ZIP 파일을 받아 압축을 풀고 sts-3.2.0.RELEASE 폴더를 복사하여 개별 프로젝트마다 이클립스를 독립적으로 구동시킬 수 있습니다. 

압축을 풀면 아래와 같습니다. 





sts-3.2.0.RELEASE 폴더를 들어가보면 STS.exe 파일이 존재합니다. 더블 클릭하면 이클립스가 실행됩니다. 
그 전에 로컬의 프로젝트 디렉토리 구조를 아래와 같이 만들어보겠습니다. 






추후 다시 설명하겠지만 C 루트에 1.Project라는 폴더를 만들어서 그곳에 관련 개발 프로그램들을 위치 시킬 것입니다. 
C:\1.Project 하위에는 각각 env, Localhome, tools, workspace 를 생성하였습니다. 

env 폴더는 톰캣이나 디컴파일러 등의 개발 환경에 추가적으로 필요한 것들을 위치시킵니다. 
Localhome 은 추후 Tomcat의 서버 디렉토리 형상을 그대로 로컬에 구성해주기 위해 만든 폴더입니다. 
Tools 밑에는 이클립스와 이클립스 관련 설치 플러그인 들이 위치하게 될 것입니다. (실제 이클립스 폴더 안에 플러그인이 들어가지만 차후 개발 환경을 전체 개발팀과 공유할 때는 설치한 플러그인 목록도 따로 제공하는 것이 보기에 좋습니다.) 
workspace는 개발 프로젝트의 실제 Source Location 이 되는 곳입니다. 

이제 다운받은 위치의 sts-3.2.0.RELEASE 폴더를 프로젝트 디렉토리 Tools 밑에 복사하여 넣고 STS.exe를 실행해봅니다. 






Work Space를 선택하는 화면에서 우리가 생성한 C:\1.Project\workspace를 지정해주면 아래와 같이 초기화면 및 대시보드가 나옴을 확인 할 수 있습니다. 




Open Dashboard 를 선택합니다. 






이것으로 로컬에 기본적인 개발환경인 JDK 설정과 Spring STS의 설치가 완료 되었습니다. 


개발툴 구성 TIP
개발환경을 전체 구성하여 개발팀에게 공유해야 할 때에는 JDK를 이클립스 프로젝트 폴더에 포함하여 배포할 수 있습니다. 

  • env 에 Tomcat 을 배포하듯 JDK 압축 파일을 풀어 JDK1.7 폴더를 그대로 묶어서 env 하위에 위치하고 배포합니다.
  • eclipse.ini 파일을 열어 실행 경로를 조정해 줍니다. (여기서는 sts.ini)
  • -vm 옵션을 주어 env 에 위치시킨 JAVA 실행 파일을 지정합니다.



이밖에 이클립스의 실행속도 및 메모리 활용을 위한 옵션도 지정할 수 있습니다. 
아래 두개의 파일을 통해 원본과 수정 후의 ini 파일을 확인 할 수 있습니다. 






STS 가 설치 된 기본 ini 옵션 값들입니다. 






-vm 옵션으로 javaw 실행 파일을 지정해주었고 -vmargs 옵션을 통해 메모리 관련 설정값들을 조정해주었습니다. 

값은 개발 장비의 사양에 따라 유동적입니다. 

  1. -Xverify:none : 클래스의 유효성을 검사를 생략하는 옵션입니다.
  2. -XX:+UseParallelGC : 병렬 가비지 컬렉션을 사용합니다.
  3. -XX:-UseConcMarkSweepGC : 이클립스 GUI의 응답을 빠르게 합니다. .
  4. -XX:PermSize=128M : Permanent Generation 크기를 설정하니다.
  5. -XX:MaxPermSize=128M : 최대 Permanent Generation 크기를 설정합니다.
  6. -XX:NewSize=128M : New Generation 크기를 설정합니다.
  7. -XX:MaxNewSize=128M : New Generation 의 최대 크기를 설정합니다.
  8. -Xms512m : 이클립스가 사용하는 최소 힙 메모리
  9. -Xmx512m : 이클립스가 사용하는 최대 힙 메모리

힙메모리가 균일하게 설정되어 있으면 메모리 사용률이 거의 변동이 생기지 않는다고 알려져 있으나 확실하진 않습니다. 
4기가 이상의 메모리를 사용하는 환경이라면 768m 나 1024m 를 사용해도 무방할 거 같습니다. 

이로써, 기본적인 이클립스 STS 환경 세팅과 실행 옵션까지 정리가 되었습니다. 

Maven 설정 및 Tomcat 설정등은 다음 강좌에서 정리하도록 하겠습니다. 


출처 : http://www.gliderwiki.org/wiki/102

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

UPDATE tablename SET columnname=1;

이런 정확하게 짧고 간결한 코드를 썻는데도 불구하고 


syntax 에러 날때에는 mysql이  safe-updates option 이 걸려있어서다


이걸 출어주면 된다.


SET SQL_SAFE_UPDATES = 0;

이렇게 적용해주면 끝




참고: http://stackoverflow.com/questions/11448068/mysql-error-code-1175-during-update-in-mysql-workbench

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

sql plus에서 하자면 


create table tablename(

b_idx        number,

b_id          varchar2(20)

)


create sequence seq_b_idx 


이렇게 했을것이다 


그런데 SQL Developer 에서는 어떻게 하는지 몰라서 찾다보니





여기서 만든다음에


currval은 current value를 뜻하며 최근값을 말합니다.

nextval은 next value를 뜻하며 현재값에 증분으로 설정한 값(지금은 디폴트로 설정하였기때문에 1)을 더한값을 말합니다.

nextval은 currval과 달리 select할때마다 값이 달라집니다. 확인해보시기바랍니다.

dual 테이블은 가상의 테이블입니다. 

  ※ currval을 출력하기 위해서는 먼저 최초로 nextval이 호출되어야 합니다.


String sql = "INSERT INTO BOARD "+
 
           "(IDX, TITLE, WRITER, REGDATE, COUNT, CONTENT) "+
 
           "VALUES (board_seq.nextval, '"+title+"', '"+writer+"' , sysdate, "+count+", '"+content+"')";


이렇게 value값을 넣어줄때 시퀀스 값을 넣어주면 되더라고요.


참고출처: http://cusmaker.tistory.com/77



Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

jdbc 에서 thin 드라이버로 오라클에 접속할 때는 SID를 알아야 한다.
최근에는 SID로 직접 기술하여 접근하는 것보다는 service name 이라는 것을 tnsname.ora 파일에 지정해 놓고 이것을 사용한다. 아무래도 SID가 공개되는 것이 문제가 될 수 있을 것이다. 

<tnsname.ora 의 작성 예>

PRODDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 152.25.24.15)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL)
    )
  )



서비스명과 인스턴스명과 데이타베이스명과 SID는 서로 비슷한 듯 하면서 약간 다르다.

1. 오라클 데이타베이스명을 확인하는 방법

SELECT NAME, DB_UNIQUE_NAME FROM v$database;

2. 오라클 SID를 확인하는 방법

SELECT instance FROM v$thread;



일반적인 경우 데이타베이스가 하나만으로 구성 되어 있다면 데이타베이스명이 SID가 된다. 하지만 RAC 로 구성하여 데이타베이스 두개가 동시 가동되는 경우라면 이 SID 가 서로 다를 수 있기 때문에 중복 확인해야 한다.

JDBC 로 접속할 때 url 정보 작성 방법 :
    url=jdbc:oracle:thin:@ip주소:포트:SID
   (url=jdbc:oracle:thin:@192.168.20.1:1521:ORCL)

아래의 예제에서 보면 RAC로 묶여 있는 경우 DATABASE NAME 과 실제 INSTANCE NAME 은 서로 다를 수 있다. 데이타베이스명은 ORCL 이지만 인스턴스명은 ORCL1 과 ORCL2 로 이름이 다름.  thin 드라이브 URL 에서는 이 인스턴스명을 사용해야 한다. 

사용자명 입력: system/manager@PRODDB

다음에 접속됨:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
With the Real Application Clusters option

SQL> SELECT NAME, DB_UNIQUE_NAME FROM V$DATABASE;

NAME               DB_UNIQUE_NAME
------------------ ------------------------------------------------------------
ORCL               ORCL

SQL> SELECT INSTANCE FROM V$THREAD;

INSTANCE
--------------------------------------------------------------------------------
ORCL1
ORCL2

SQL>


출처 : http://pangate.com/665

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

0. MySQL 콘솔 접속

MySQL에서 사용자를 관리하려면 root@localhost 아이디로 접속해야 합니다.

$ mysql -uroot -p
Enter password: 비밀번호입력
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16465
Server version: 5.5.28-0ubuntu0.12.04.3 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

1. MySQL 전체 사용자 목록 보기

MySQL에 설치된 전체 사용자를 보려면 명령어로 직접 확인할 수는 없고 mysql 데이테베이스를 선택해 user 테이블의 레코드를 봐야 합니다.

mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT User, Host from user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
|                  | localhost |
| debian-sys-maint | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

MySQL에서 사용자란 “아이디@호스트”의 결합입니다.

여기서 호스트는 MySQL 서버에 접속하는 컴퓨터를 의미합니다. root@localhost 사용자와 root@127.0.0.1 사용자는 서로 다릅니다. localhost와 127.0.0.1 주소는 네트워크상 같은 의미이지만 MySQL은 서로 다른 호스트에서 접속하는 것으로 간주합니다. 이 점은 MySQL의 사용자를 이해하는데 있어 상당히 중요합니다.

Host는 위와 같이 IP 주소이거나 도메인 이름일 수 있습니다. 아니면 % 같은 기호로 모든 호스트를 나타낼 수도 있으며 이 경우 MySQL 서버에 접속할 수 있는 컴퓨터에 제한을 두지 않는다는 의미입니다. 이는 보안상 추천하지 않습니다.

2. 사용자 만들기

test@localhost라는 사용자가 “test” 비밀번호로 접속할 수 있도록 만듭니다.

mysql> CREATE USER test@localhost IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)

3. 사용자에게 데이터베이스 권한 부여

test@localhost 사용자에게 test 데이터베이스 안의 모든 테이블(test.*)에 관한 모든 권한을 부여합니다. 특정 데이터베이스 안의 모든 테이블을 나타내려면 * 문자를 사용합니다.

mysql> GRANT ALL PRIVILEGES ON test.* TO test@localhost;
Query OK, 0 rows affected (0.00 sec)

4. 사용자에 부여된 권한 확인

test@localhost 사용자의 모든 권한을 확인합니다.

mysql> SHOW GRANTS FOR test@localhost;
+---------------------------------------------------------------------------------+
| Grants for test@localhost                                                       |
+---------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY PASSWORD '*94BDCEBE1908' |
| GRANT ALL PRIVILEGES ON `test`.* TO 'test'@'localhost'                          |
+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

5. 사용자에게서 권한 박탈

test@localhost 사용자에게서 test 데이터베이스 안의 모든 테이블에 대해서 모든 권한을 박탈합니다.

mysql> REVOKE ALL PRIVILEGES ON test.* FROM test@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR test@localhost;
+---------------------------------------------------------------------------------+
| Grants for test@localhost                                                       |
+---------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY PASSWORD '*94BDCEBE1908' |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

GRANT ALL PRIVILEGES 명령어를 주기 이전으로 test@localhost 사용자는 아직 로그인이 가능합니다.

만약 위의 USAGE 권한까지 박탈하려면 다음과 같이 명령합니다.

mysql> REVOKE USAGE ON *.* FROM test@localhost;
Query OK, 0 rows affected (0.00 sec)

USAGE 권한이 없으면 로그인이 안 됩니다.

다시 USAGE 권한을 주고 싶다면 아래와 같이 명령해야 합니다.

mysql> GRANT USAGE ON *.* TO test@localhost IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)

6. 사용자 삭제

test@localhost 사용자를 삭제합니다.

mysql> DROP USER test@localhost;
Query OK, 0 rows affected (0.00 sec)

부가적으로 해당 사용자에게 부여된 권한(GRANTS)까지 모두 삭제됩니다. 별도로 권한을 박탈하는 과정을 거칠 필요가 없습니다.

이상 MySQL 데이터베이스에서 사용자 관리하는 방법을 살펴봤습니다. 사용자 생성, 삭제 그리고 권한 부여, 박탈 이렇게 생각할 수 있습니다.

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

부모창에서 링크 클릭시 팝업창에 아래와 같은 스크립트를 넣어주면

팝업창 닫히는 것과 동시에 부모창 페이지가 이동한다.



<script language="javascript">

        alert("수정 되었습니다.");

       opener.parent.location.replace("사이트명");

       self.close();

</script>


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요

MySQL 테이블에 데이터를 넣는 방법 중 csv 파일을 직접 넣는 방법이 있다.


csv 파일과 DB 테이블 구조가 일치하면 아래와 같이 입력하면 된다.



1
2
LOAD DATA LOCAL INFILE "filePath"
INTO TABLE dbName.tableName FIELDS TERMINATED BY ",";



만약 파일의 크기가 크고 테이블에 index가 걸려 있으면 시간이 굉장히 오래 걸릴 수 있다.

그럴 경우에는 아래와 같이 index를 먼저 해제해 주고 파일을 올린 다음 다시 index를 걸면 상당히 빠르게 테이블에 데이터를 넣을 수 있다.


1
2
3
4
ALTER TABLE dbName.tableName DISABLE KEYS;
LOAD DATA local INFILE "filePath"
INTO TABLE dbName.tableName FIELDS TERMINATED BY ",";
ALTER TABLE dbName.tableName ENABLE KEYS;


대략 2GB 정도 되는 파일도 10분 정도로 import가 완료됐다.



만약 csv 파일 구조와 DB 테이블 구조가 다른 경우는 아래 샘플 sql 문 참조해서 import 한다.



1
2
3
4
5
6
LOAD DATA LOCAL INFILE 'file_name'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(column1,column2,column3, ...);

LOAD DATA LOCAL INFILE "c:\\zipcode2014.cvs"

INTO TABLE onepageportfolio.adress FIELDS TERMINATED BY "," optionally enclosed by '"' lines terminated by

 '\n';

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

댓글을 달아 주세요