아이폰 5를 기다리며 3gs를 사용중인데 액정에 왠 점퍼 깃털???? 이 들어가서 먼지나 빼볼겸 분해를 했다.

근데 왠걸 액정 아랫 부분을 깨먹었다.ㅠㅜ

3gs 분해 동영상을 보면 액정을 지렛대처럼 들어 올리는 장면이 있는데 그렇게 따라 했다가 아랫부분이 깨졌다.


문제의 동영상 중 액정 분해 장면....

 


그렇게 따라하다 얻은 결과......  아랫부분이 깨졌다.ㅠㅜ

액정을 날리고 다시 검색하니 그렇게 액정 해먹으신 분들이 있었다.ㅋ 좀 더 검색해볼걸.ㅠㅜ

그래서 분해시에 저렇게 하지 마시고 옆에 부분에 테이프 부분을 때어내고 양쪽 테두리를 벌리시면 쉽게 액정을 분리 낼 수 있습니다.

결국 액정과 배터리를 사서 교체를 했다. 가격이 싸서 정말 다행인듯.ㅋ

그럼 액정 분해시 주의 하시길 바라며...

- 로그인
c:\>mysql -u root -p

- sql 파일 실행
mysql> source c:/sql.sql

- 사용자 확인
mysql> show databases;

- 사용자 전환
mysql> use 사용자네임;

- 테이블 확인
mysql> show tables;

- 테이블 구조 확인
mysql> explain 테이블명;

아이폰이 나와서 그런지 Xcode, iphone SDK 검색어로 가장 많이 들어오시더군요.

그래서 다시 작성합니다. 이전글도 참고 하세요.

http://developer.apple.com/iphone/ (회원가입 후, 다운 가능)

가셔서 Xcode를 다운 받으시면(2010.02.02 날짜로 아래 파일이 최신)

iphone_sdk_3.1.3_with_xcode_3.1.4__leopard__9m2809a.dmg


파일을 다운 받으셔서 실행하시면 (iPhone SDK를 눌러주세요)


그 다음 부터는 그냥 긍정적인 대답을... 그러면


Xcode, SDK 다 설치 됩니다.





Xcode, SDK 따로 설치 할 수 없습니다.(3.1.3 버전)


그리고 /Developer/Applications 에 들어가보시면 Xcode가 있습니다.


 Dock에 갔다 놓고 개발 시작~~~



터미널에서

sudo /Developer/Library/uninstall-devtools  --mode=all 

실행하면 삭제 됩니다.(시간이 좀 걸립니다.)

그리고 Xcode만 냅두고 iphone SDK를 업데이트는 할 수 없다고 합니다. (3.1.3 버전 부터)

그래서 Xcode를 다시 받아서 새로 설치하셔야 합니다. 



■ 개발 순서

먼저 하이버네이트 툴을 설치 한다.

https://www.hibernate.org/ 에서 hibernate tool zip 파일을 다운 받아 압출을 풀고 features, plugins 폴더를 eclipse가 설된 폴더에 복사해 넣는다. 그러면 설치 끝.


1. log4j.xml 파일 만들기, library 파일 lib 폴더에 넣기(하이버네이트와 스프링을 사용하기 위한 기본적인 라이브러리들)



2. hibernate.cfg.xml 파일 만들기

- WEB-INF 폴더에서 새로운 파일 만들기를 클릭하여 Hibernate Configuration 파일을 선택한다.(하이버네이트 툴이 설취되어 있어야만 나타난다.)


- 파일이름 그대로 두고 다음.


- 자신에 맞는 DB를 선택, 설정 하고 넥스트(XE는 오라클 10g EX버전 ) 아래 Create a console configuration 을 체크한다.


- 이 부분은 하이버네이트 perspective 에서 만들 수 있지만 여기서 하면 한번에 다 만들 수 있다.(위에서 Create a console configuration  체크를 해야지만 된다.)


- 그러면 hibernate.cfg.xml 파일이 만들어 진 것을 볼 수 있다.


log4jdbc를 사용하기 위하여 아래와 같이 변경


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">net.sf.log4jdbc.DriverSpy</property>
        <property name="hibernate.connection.password">user01</property>
        <property name="hibernate.connection.url">jdbc:log4jdbc:oracle:thin:@localhost:1521:XE</property>       
        <property name="hibernate.connection.username">user01</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    </session-factory>
</hibernate-configuration>

- Hibernate perspective 로 이동


- 아래 그림과 같이 만들어 진 것을 볼 수 있다.


이제 부터 개발을 시작 한다.











전에 소개 했던 [Programming in Objective-C 2.0] 책에 대해서 좀더 자세히 소개 하기로 하겠습니다.(조금 더 보았기에...;;;)

(사진 출처 : 인사이트)

책을 다 보고 이야기 하는게 제일 좋겠지만, 다른 책으로 넘어가고자 해서 남깁니다.(그래도 꾸준히 볼 겁니다.)

인사이트에서 번역본이 나왔습니다. 제가 가입한 모 카페에서 쓰레기 취급을 받긴 했지만;;;;

아마존에서는 그래도 평이 좋은 책입니다. 그래서 보기 시작한 책이기도 하고요.(평이 안 좋은 글에 저자가 직접 댓글을 남기기도 하였습니다.ㅎㅎ)

번역도 괜찮습니다. '이렇게 번역했네?' 라는 부분도 있지만, 이해도 잘 가고 괜찮습니다.(다른 정말 쓰레기 취급받는 번역서는 아닙니다. 저의 짧은 영어 실력으로 말하기에 민망하지만.ㅋ)

아쉬운 점은, 용어에 대한 설명을 추가적으로 집어넣었으면 더 좋았을 거 갔다는 생각이 듭니다.

이 책을 한마디로 말하자면 '처음 프로그래밍을 배우시는 분이, 처음으로 하는 언어가 Objective-C 일 경우'에 가장 적합한 책인 거 같습니다.

책 처음에도 나오는 말처럼 Objective-C를 배우기 위해 절차지향 언어인 C를 배울 필요 없이, 이 책으로 바로 공부할 수 있게 만들었다고 나옵니다.

그리고 책 내용에도 for 문이나 while 문, C에 대한 내용도 나옵니다.

다른 언어에 능통하시다면 굳이 저 부분을 보지 않아도 될 것입니다. 그래서 C, C++, JAVA를 해오셨던 분이 보신다면 지루할 수 있는 책입니다.

하지만, 처음 언어를 배우고 Objective-C에 대해 자세히 알고 싶으시다면, 지금까지 나온 책 중에서 이 책이 가장 좋은 것 같습니다.

책도 좀 두껍습니다. 맘만 먹고 보면 금방 보겠지만 쉽지 않더군요.ㅎㅎ;;(Beginning Oracle 보다 야는 아니지만ㅎㅎ)

결론적으로 말씀드리면,

iPhone 개발을 하기 위해 Objective-C를 공부하고 싶으신데, 프로그래밍이 처음이시분에게 추천!

다만, 이거 한 권 본다고 iPhone 개발을 할 수 없다는 것! iPhone 관련 책을 같이 보는 것을 추천!

이상입니다.

※주의 : 개인차가 있으니 본인이 직접 보시고 판단하세요!
1. command + shift + 3 : 전체 화면 캡쳐.

2. command + shift + 4 : 마우스가 + 모양으로 바뀜. 마우스를 드래그 해서 원하는 부분만 캡쳐.

3. command + shift + 4, 그리고 space bar 를 클릭 : 마우스가 사진기 모양으로 변함. 원하는 윈도우 창에 갔다 놓고 클릭하면 원하는 윈도우 화면만 캡쳐.

* 추가로 : 윈도우상에서 Print Screen 하는 방법
전체 화면 캡쳐 : fn + Shift + F11
원하는 윈도우 창만 캡쳐 : fn + Shift + Alt + F11

'MacBook' 카테고리의 다른 글

MacBook에 바람입력기 설치하기.  (1) 2009.07.12
맥북 키스킨 만들기 일명 반창고 키스킨.  (1) 2009.07.10
그래픽 카드 드라이버를 제대로 설치했는데도 불구하고 Aero Peek가 제대로 동작하지 않는 경우가 발생했습니다.

작업 표시줄 및 시작 메뉴 속성을 보면(아래 작업표시줄에서 오른쪽 마우스 - 속성 클릭)

Aero Peek 부분에서 체크 부분을 클릭 할 수 없게 나타났습니다.(지금은 되는 상태입니다.)




처음에는 그래픽 카드 드라이버 문제인줄 알고 엄청 삽질 했다는...;;;

해결 방법은 간단 합니다.

Windows 체험 지수를 체크하면 됩니다.;;;;(도데체 이걸 왜 해야하는지ㅡㅡㅋ)

제어판 - 시스템 항목으로 가셔서 하시면 됩니다.

해결~!

struts1을 그대로 사용하는 것이 아니라 개발하기 좀 더 편한 방법으로 커스터마이징 해서 사용해본다.

1. lib 셋팅
생성한 프로젝트의 WEB-INF의 lib 폴더에 설정할 라이브러리 파일을 갖다 넣는다 : struts, log4j, struts-test, junit

- apache, sourceforge 사이트에서 각각 다운로드를 받는다.
Junit은 C:\eclipse\plugins\org.junit_3.8.2.v20090203-1005 에서 junit.jar  파일을 사용한다.

- struts의 lib 폴더안에 있는 라이브러리 파일을 사용한다.

- log4j는 라이브러리와 함께, log4j.properties나, log4j.xml 설정 파일을 src 폴더 아래에 넣는다.

- strutstest는 struts를 WAS를 띄우지 않고 테스트 하기 위해 필요하다. strutstest.jar 파일과 common-collection.jar 파일이 필요하다.



2. 서블릿 설정
web.xml 안에 서블릿을 설정한다.
- 다운 받아 압출을 해제한 struts 폴더 안에 struts-blank 안에 있는 web.xml 에서 복사하거나, Servlet을 하나 만들어서 web.xml 안에 생성하게 하고, 만든 Servlet은 삭제 한다.


/action -> *.do 바꾼다.



<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>


3. struts-config.xml 생성
struts-config.xml을 WEB-INF 아래 만들고 struts-blank 안에 있는 struts-config.xml 파일에서 dtd 설정을 복사해서 넣는다.

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "
http://struts.apache.org/dtds/struts-config_1_3.dtd">

나머지 설정(역시 struts-blank 참조)

<struts-config>
 <!-- 액션 폼 설정 파일 -->
 <form-beans>
 </form-beans>
 
 <!-- 공통 예외처리 -->
 <global-exceptions>
 </global-exceptions>
 
 <!-- 공통 링크 이동 처리 -->
 <global-forwards>
 </global-forwards>
 
 <!-- 액션 설정 -->
 <action-mappings>
 </action-mappings>
 
 <!-- 커스터마이징된 RequestProcessor -->
 <controller>
 </controller>
 
 <!-- 다국어 처리, 에러메시지 -->
 <!--  <message-resources parameter=""></message-resources>-->
 
 <!-- 외부 프레임웍, 라이브러리 연동 -->
 <!--  <plug-in className=""></plug-in> -->
 
</struts-config>



여기까지 작업을 하고, WAS를 띄워서 http://127.0.0.1:8081/struts1/*.do 해서 * 아무이름이나 넣고 접속이 되는지 확인한다. 500에러가 발생할 것이다. 그러면 성공.
그리고 struts-config.xml 에서 아래와 같이 설정하고

<action-mappings>
  <action path="/hello" forward="/hello.jsp"></action>
</action-mappings>


설정을 해주고 http://127.0.0.1:8081/struts1/hello.do 했을 때 hello.jsp 라고 뜨는지 확인한다.

log4j 설정을 해놨다면 콘솔창에 로그가 뜬다.

4. util 패키지 않에 기본적으로 구현할 Action을 추상 클래스로 만들어서 오버라이드 시킨다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public abstract class BasicAction extends Action {
 
protected static Logger logger = Logger.getLogger(BasicAction.class); //log4j 설정
 
 public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("action path" + request.getRequestURI()); //log4j 설정
  
  return executeAction(mapping, form, request,response);
  
 }
 protected abstract ActionForward executeAction(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception;
}

5. struts에서 기본적으로 CRUD가 나오면 DispatchAction을 사용한다.
action을 만들고 테스트 한다.

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
   return null;
 }
 
}

- test 패키지에서 BbsTest.java를 만들어서 테스트 한다. strutstest는 가짜로 request, response를 만들어서 테스트 할 수 있게 해준다. 아래와 같이 작성 하고, Junit으로 테스트 한다.

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent")); //반드시 WebContent가 들어가야 한다. WebContent아래 설정 파일들을 불러 오기 위해
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
    this.actionPerform();
  }
  
  }

6. ActionForm을 안잡고 하는 방법.
ActionForm을 사용 할 경우 상당한 노가다를 해야한다. 그래서 LazyValidatorForm을 사용한다.
이것의 단점은 파라미터 검증을 할 수 없다는 것이다.(그래서 commons의 validation을 적용해서 사용한다.)
ActionForm은 타입이 똑같아야 들어가지만, BeanUtils는 타입이 달라도 들어간다.

- BbsVO 작성

- struts-config.xml 에서 추가.
 <form-beans>
  <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
 </form-beans>


<action path="/bbs"
 type="org.bnk.bbs.BbsAction"
 parameter="method"
 name="lazyForm"
 validate="false"></action> <!-- 검증을 할 수 없으므로 false -->

- BbsAction 추가

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.validator.LazyValidatorForm;
import org.bnk.bbs.vo.BbsCriteria;
import org.bnk.bbs.vo.BbsVO;
import org.bnk.util.VODisplayer;

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  LazyValidatorForm lazyForm = (LazyValidatorForm) form;
  
  BbsVO vo = new BbsVO();
  
  BeanUtils.copyProperties(vo, lazyForm);
  
  logger.info(VODisplayer.display(vo));
  
  return null;
 }
 
 public ActionForward update(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("update.......");
  return null;
 }
 public ActionForward list(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("list.......");
  
  LazyValidatorForm lazyForm =
   (LazyValidatorForm)form;
  
  BbsCriteria cri = new BbsCriteria();
  BeanUtils.copyProperties(cri, lazyForm);
  
  logger.info(VODisplayer.display(cri));
  
  return null;
 }
}

- BbsTest 에서 Junit 으로 테스트

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent"));
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "add");
  
   request.addParameter("title", "게시물제목");
   request.addParameter("content", "게시물내용");
   request.addParameter("writer", "작성자");  
  
   this.actionPerform();
  }
 
  public void testList()throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "list");
   
   request.addParameter("pageNo", "5");
   request.addParameter("keyword", "워드");
   request.addParameter("type", "title");
   this.actionPerform();
  }
}

7. BbsCriteria.java 를 만들어서 파라미터를 수집한다.
LazyValidatorForm은 파라미터를 수집한다. 그래서 페이징 할 때, 파라미터를 던지지 말고 객체를 던져서 사용한다. 만약에 파라미터가 변경이 된다면 다 고쳐야 하지만, 이렇게 따로 만들어 놓으면 여기만 고치면 된다.

- BbsTest에서 testList() 로 테스트 한다.

기본 적으로 이렇게 만들어서 개발을 하고, 여기다가 화면을 붙이면 개발 끝~

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05

eclipse : Galileo
DB : Oracle Database 10g Express Edition

1. Open Perspective를 연다. 오른족 위에 아이콘을 클릭하거나, 메뉴에서 Window - Open Perspective - Other 클릭한다.


2. Database Development을 선택하고 OK 클릭하면 아래와 같이 Data Source Explorer 나온다.


3. Database Connections을 오른족 마우스로 클릭하고 New 선택하면, New Connection Profile 창이 뜬다.


Oracle을 선택하고 Name에서 이름을 정하고 Next 클릭.

4. 아래와 같은 창이 뜨면 New Driver Definition을 클릭한다.



클릭하면 아래와 같은 창이 나타나고, 맞는 오라클을 클릭하면 에러표시가 난다. Jar List 탭으로 이동하여 ojdbc14.jar 파일을 위치를 지정해줘야 한다.



기존의 ojdbc14.jar를 클릭하고 Edit JAR/Zip... 을 클릭한다. 데이터베이스를 설치한 폴더 안에 있는 ojdbc14.jar 파일을 찾아서 선택한다.(ojdbc14_g는 디버깅용)


화면이 아래와 같이 바뀌고 오류가 사라진다. OK 클릭.



5. 화면이 아래와 같이 바뀌고, SID는 XE(XE버전 이므로)로 Host는 127.0.0.1(오라클이 설치된 아이피 주소)로 바꾼다. Oracle에서 사용한 계정의 아이디와 비번을 입력하고 Test Connection을 클릭하여 제대로 연결이 되는지 확인한다.

아래와 같이 변경


연결 확인!


6. Ping succeeded! 창이 뜨면 Finish! 설정 끝! Database Connections 아래 추가한 내용이 나오는지 확인한다.



잠깐! 여기서 설정해줘야 할 것이 있다. 기본적으로 Auto Commit으로 설정되어 있기 때문에 설정을 바꿔야 한다. Preferences - Data Management - SQL Development - SQL Editor - SQL Files/Scrapbooks에서 설정을 변경해야한다.

Type에서 Oracle_10 선택하고 나머지는 설정한 내용대로 선택한다. 그리고 Connection Commit Mode에서 Auto를 Manual로 바꿔줘야 Auto Commit이 안된다.


7. 그림과 같이 오른쪽 마우스를 클릭하여 Open SQL Scrapbook을 선택하고 오르쪽 창에서 Query를 실행하면 결과를 볼 수 있다.(실행 방법은 마우스로 드래그하고 오른쪽 마우스를 누르면 실행 단축 키가 나타난다.)




'DataBase' 카테고리의 다른 글

Oracle Databae 10g Express Edition 에서 HR 계정 사용하기.  (1) 2009.08.13
Oracle DataBase 설치하기.  (0) 2009.08.13
iphone 스터디를 시작 하면서 우선 Objective-C 를 공부하기로 정하고 책을 선정했습니다.

시중에 나온 책이 'Objective-c 맥과 아이폰 애플리케이션 프로그래밍' 이거 한권 밖에 없어서 이 책으로 선정하고 책을 다 보았습니다.

다 보고 느낀 점을 말 하자면....

1. 초보자가 보기에 너무 어렵다는 느낌을 받았습니다.
2. 소스가 별로 없어서 잘 이해가 되지 않습니다.(소스도 어렵습니다. 자세한 설명도 없고)
3. 책 내용도 좋고 많은 메소드에 대한 내용이 나와서 계속 공부하면서 참조를 하면 좋을거 같다고 생각했는데, 이런;; INDEX에 영어 부분이 몇개 없습니다. 그 수많은 영어 메소드들을 일일이 찾아야 하는 불편함이 있습니다.

책 내용이 나쁜건 아닌데 처음 배우는 입장에서 보기에는 좀 그렇습니다.

그래도 객체지향에 대한 설명도 들어있어 그런 부분은 괜찮은것 같습니다.

정말 아쉬운 부분은 찾아보기에서 메소드 이름이 나와있지 않아, 모르는 메소드를 찾아 볼려고 해도 찾기 힘듭니다.
그래도 이 책이 이론적인 설명은 잘해 놓아서 모르는 부분을 찾아 보기에 좋은 책인데, 이 부분으로 인해 반감되는것 같습니다.

Objective-C에 대한 부분이 부족한거 같아서 다른 책을 조금씩 보고 있습니다. 이책이 처음 공부하기에 더 좋은 것 같습니다.

Programming in Objective-C 2.0 이라는 책입니다. 그런데 문제는 아직 번역 본이 없습니다.

(사진출처 : amazon.com)

그런데 그렇게 어렵지 않습니다.^^;;

설명도 잘 되어있고 소스도 많이 있어서 이해하기가 좋습니다.

지금 보니까 Objective-C 책이 한권 더 나왔네요. 이 책은 내용을 보질 못해서 잘 모르겠습니다.

저도 처음 공부하는 입장에서 느낀 점을 말하는 것이니 참고만 하세요.^^

그럼 모두 열공하세요.

■ 추가 : 글 올리고 다음 날 Programming in Objective-C 2.0 번역서가 나왔네요;;;
어떻게 번역이 되어있을지 궁금합니다. (개인적으로 번역서는 관련분야 경험자이고, 영어권에서 살다 오신 분이 해야 제대로 나온다고 생각하는 사람이라서.....)
참고하세요.
- 자카르타 DBCP 는 커넥션 풀 중의 하나이다.

- 커넥션 풀은 데이터베이스와 연결된 커넥션 객체를 미리 생성하여 풀에 저장해 두었다가 필요할 때마다 풀에 접근하여 커넥션 객체를 사용하고, 사용이 끝나면 다시 반환하는 것을 말한다.

- 라이브러리 다운로드 http://commons.apache.org/
 사이트에서 다운로드

※ WAS 에 설정하는 방법은 안좋다. WAS가 바뀌면 다 바꿔야 된다. 그리고 WAS를 띄우지 않으면 테스트 자체가 불가능해진다. 하지만 was에 설정해야 되는 경우가 온다. 그래서 인터페이스로 만들어야 한다.

1. library 파일을 lib 폴더에 복사해 넣는다.
commons-dbcp-1.2.2.jar, commons-io-1.3.2.jar, commons-pool-1.3.jar

2. db.jocl(jocl 확장자 명을 가지는 파일 이름은 상관없음) 파일을 src 폴더 아래에 만든다.

<object class="org.apache.commons.dbcp.PoolableConnectionFactory"
        xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
    <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
        <string value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
        <string value="user01" />
        <string value="user01" />
    </object>
   
    <object class="org.apache.commons.pool.impl.GenericObjectPool">
        <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
        <int value="10" />
        <byte value="1" />
        <long value="10000" />
        <int value="10" />
        <int value="3" />
        <boolean value="true" />
        <boolean value="true" />
        <long value="600000" />
        <int value="5" />
        <long value="3600000" />
        <boolean value="true" />
    </object>
   
    <object class="org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory"
            null="true" />
   
    <string null="true" />
   
    <boolean value="false" />
   
    <boolean value="true" />
</object>


3. Class 파일에서 설정을 잡아준다.


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BasicDAO {
 
 private static final String BASIC_DRIVER = "oracle.jdbc.driver.OracleDriver";
 
 private static final String DRIVER = "org.apache.commons.dbcp.PoolingDriver";
 
 private static final String URL = "jdbc:apache:commons:dbcp:/db"; //db는 설정 파일의 이름 나중에 설정을 바꾸고 싶으면 다른 걸 만들어서 넣는다.
 
 static{
  try {
   Class.forName(BASIC_DRIVER);
   Class.forName(DRIVER);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public Connection getConnection() throws SQLException{
 
  Connection con = null;
  
  con = DriverManager.getConnection(URL);
  
  return con;
  
 }
}

이렇게 설정을 끝내고 테스트를 통해 같은 객체를 만들어 내는지 확인한다.
server.xml 의 tomcatThreadPool 과 커넥션 풀의 속성(maxActive)는 서버의 스레드풀에 갯수와 일치 시킨다.

서버에서 더 많은 스레드의 갯수를 가지면 정작 커넥션 풀의 스레드 수가 적어서 서비스를 제대로 하지 못하는 경우가 발생한다.
http://tomcat.apache.org/에서 zip 파일로 받은 Tomcat 버전 적용 방법.

1. Window - preferences 선택 - Server - Runtime Environments - Add 클릭한다.




2. 자신의 컴퓨터에 설치한 버전을 선택하고 Next 클릭



3. Browse를 클릭해서 설치한 Tomcat의 폴더를 선택한다.





4. JRE 부분을 그림에 보이는 것 처럼 자신이 설치한 버전의 jdk를 선택한다. 그리고 Finish 클릭



5. 자신이 만들 프로젝트에서 오른쪽 마우스를 클릭하고 Build Path - Configure Build Path 를 클릭한다.



6. 아래와 같은 화면이 나오면 Add Library를 클릭한다.



7. Server Runtime 을 선택하고 Next
 


8. 그러면 맨 처음 설정한 Tomcat이 나타나 있다. 이것을 선택하고 Finish



9. 그러면 아래 그림과 같이 추가된 것을 확인 할 수 있다.



10. 이제 프로젝트를 서버에 올린다. 생성한 프로젝트에서 오른쪽 마우스를 클릭하고, Run As - Run on Server



11. 설치한 버전을 선택하고 Next



12. 그러면 아래 그림과 같이 자신이 생성한 프로젝트가 오른쪽에 나타나 있는 것을 확인 할 수 있다.
Finish 클릭


13. 이클립스 화면에서 Project Explorer 에 Servers가 추가 되고, 아래쪽에 Servers 탭이 나타난 것을 확인 할 수 있다. 이제 서버를 실행시키고 아이피와 프로젝트 이름과 원하는 페이지 이름을 입력하고 실행하면 원하는 페이지를 볼 수 있을 것이다.

include 지시어는 JSP 파일 또는 HTML 파일을 해당 JSP  페이지에 삽입 할 수 있는 기능을 제공하는 지시어이다. 공통된 부분을 다른 폴더에 모아서 만들어 놓고 include 지시어로 포함시켜서 매번 같은 내용을 편리하게 입력할 수 있도록 도와 준다.

그리고 include 지시어는 하나의 파일에 중첩되어 사용가능하기 때문에 여러 파일들을 include 할 수 있다.

<%@ include file="header.jsp"%>

include 액션은 임시로 제어권을 include 되는 페이지로 넘겼다가 그 페이지의 처리가 끝나면 다시 원래의 페이지로 제어권을 반환한다. include 지시어 처럼 여러 페이지를 한 페이지 않에 담는 기능을 갖고 있지만 둘의 차이점은

<jsp:forward page="이동할 페이지"/> <jsp:param name="파라미터 이름1" value="파라미터 값1"/>
<jsp:forward page="포함될 페이지" flush="false"/> 파라미터 동일.

include 지시어는 include 되는 파일들을 포함시켜서 컴파일을 시키는 방법이고, include 액션은 따로 컴파일 되어 제어권 자체가 include액션으로 지정된 페이지로 넘어갔다가 다시 원래 페이지로 돌아온다는 점이다.

include 지시어는 주로 정적인 페이지를 포함시킬 때 주로 사용하고, include 액션은 JSP 페이지처럼 동적인 페이지를 포함시킬 때 사용한다.

1. viewCookies.jsp

쿠키에 들어있는 값들을 보여준다. 여기에 같은 조회번호가 있다면 더이상 카운트를 올려 주지 않으면 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" session="true"%>

<%
 Cookie[] cookies = request.getCookies();

 if(cookies == null || cookies.length == 0){
  
  out.println("쿠키없음");
  return; //return 실행의 제어권을 반환해준다.
  
 }

 for(Cookie ck:cookies){
  
  out.println(ck.getName() + ":" + ck.getValue());
  out.println("<hr>");
  
 }
%>


2. viewBbs.jsp

이 부분에서 bbsno 페이지 번호를 받고, 쿠키를 받아와서 쿠키의 name에 VIEWCOOKIE가 있는지 검색하고 없으면 VIEWCOOKIE 를 만들어 주고 있으면 bbsno를 추가한다. '|' 는 번호를 구분하기 위해 같이 입력한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>

<%
 String bbsno = request.getParameter("bbsno");

 Cookie[] cookies = request.getCookies();
 Cookie viewCookie = null;
 
 if(cookies != null && cookies.length > 0){
  
  for(int i = 0; i< cookies.length; i++){
   if(cookies[i].getName().equals("VIEWCOOKIE")){ //Cookie의 name이 VIEWCOOKIE와 일치하는 쿠키를 viewCookie에 넣어준다.
    viewCookie = cookies[i];
   }
  }  
 }
 
 //만일 viewCookie없다면
 if(viewCookie == null){
  System.out.println("VIEWCOOKIE 없음");
  Cookie newCookie = new Cookie("VIEWCOOKIE","|"+bbsno+"|"); //("VIEWCOOKIE"는 name, "|"+bbsno+"|" 는 value 다. 
  response.addCookie(newCookie);
 }else{
  System.out.println("VIEWCOOKIE 있음");
  String value = viewCookie.getValue();
  
  if(value.indexOf("|"+bbsno+"|") <  0){ // 입력한 번화와 일치하는 번호가 없으면 추가한다.
   value = value+"|"+bbsno+"|";
   viewCookie.setValue(value);
   response.addCookie(viewCookie);
  }
 }
 
%>

- 실행 화면

주소창에 처음으로

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 bbsno를 100으로 주고 들어가면 "VIEWCOOKIE 없음" 이라고 나온다.



그리고

http://127.0.0.1:8081/web01_10/viewCookies.jsp 들어가보면 100 이 추가 된 모습을 볼 수 있다.

다시

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 창에서 새로고침을 누르면 위에 사진 처럼
"VIEWCOOKIE 있음" 이라는 메시지가 뜨는 것을 확인 할 수 있다.



http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=101 번 추가 했을 경우 


http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=102 번 추가 했을 경우


이렇게 새로운 bbsno 를 입력할 때 마다 쿠키에 저장되고 다시 새로 고침을 해도 같은 번호는 들어가지 않는다. 이 방법을 이용해서 게시물 조회수 관리라든지 쇼핑몰에서 한번 클릭한 상품을 옆에 보여주는 기능도 구현 할 수 있다.

Session을 좀더 효과적을 사용하기 위해서 세션을 사용하여 로그인을 할 때, 데이타베이스에서 로그인한 사용자와 관련된 정보를 가져와서 세션에 저장 시켜 놓는 것이다. 그러면 사용자 정보가 필요할 때, 다시 데이타베이스를 접속하지 않아도 된다.

로그인을 통한 Session을 사용하는 방법과 사용자 정보를 가지고 와서 어떻게 유용하게 사용하는지 본다.

1. UserVO class를 만든다.


package org.web.member;

public class UserVO {

 private String id;
 private String pw;
 private String name;
 private String email;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getPw() {
  return pw;
 }
 public void setPw(String pw) {
  this.pw = pw;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }

 public String toString(){
  return id + ":" + pw + ":" + name + ":" + email;
 }
}

2. login.jsp 작성 - 아이디와 패스워드를 입력하고 loginAction.jsp로 전송한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="loginAction.jsp">
 <TABLE>
 <TR>
  <TD>아이디</TD>
  <TD><INPUT TYPE="text" NAME="id"></TD>
  
 </TR>
 <TR>
  <TD>패스워드</TD>
  <TD><INPUT TYPE="password" NAME="pw"></TD>
  
 </TR>
 <TR>
  <TD>로그인</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 
 </TR>
 </TABLE>
</FORM>
</body>
</html>

3. loginAction.jsp - 원래는 여기서 데이타베이스에서 로그인한 사용자의 정보를 가지고 와서 VO 객체에 저장시켜준다.


<%@ page contentType="text/html; charset=EUC-KR" session="true"%>
<%@ page import = "org.web.member.*" %>   
   
<%
 String id = request.getParameter("id");
 String pw = request.getParameter("pw");
 
 //데이타베이스를 통해서 데이타를 가지고 온다. 여기서는 그냥 임의로 입력한다.
 UserVO vo = new UserVO();
 vo.setId(id);
 vo.setPw(pw);
 vo.setName(id + "님");
 vo.setEmail("think@korea.kr");
 
 session.setAttribute("LOGIN", vo); //LOGIN이라는 이름으로 vo 객체를 담아 준다.
%>

<%= id %><br/>
<%= pw%>

4. insertBbs.jsp - 세션에서 정보를 받아와서 입력할 창에 넣어준다. 이러면 사용자가 다시 자기 이름과 이메일 주소를 입력하지 않아도 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@ page import = "org.web.member.*" %>   
 
<%
 //Object obj = session.getAttribute("LOGIN");
 UserVO vo = (UserVO)session.getAttribute("LOGIN"); //session에 있는 정보를 받아온다.
 
 if(vo == null){
  System.out.println("로그인 안한 사용자");
 }else{
  System.out.println("로그인한 사용자");
 }
%>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="insertBbsAction.jsp">
 <TABLE border="1">
 <TR>
  <TD>제목</TD>
  <TD><INPUT TYPE="text" NAME="title"></TD>
 </TR>
 <TR>
  <TD>내용</TD>
  <TD><INPUT TYPE="text" NAME="content"></TD>
 </TR>
 <TR>
  <TD>작성자</TD>
  <TD><INPUT TYPE="text" NAME="writer" value="<%=vo.getName()%>"></TD>
 </TR>
 <TR>
  <TD>작성자 e-mail</TD>
  <TD><INPUT TYPE="text" NAME="email" value="<%=vo.getEmail()%>"></TD>
 </TR>
 <TR>
  <TD>전송</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 </TR>
 </TABLE>
</FORM>
</body>
</html>
- 결과 화면 보기

1. login.jsp


2. loginAction.jsp


3. insertBbs.jsp



Cookie : 클라이언트 측에서 관리되는 정보로 쿠키는 하드디스크에 저장되어 있기 때문에 브라우저를 종료해도 사라지지 않는다. 그래서 보안의 문제를 가지고 있다. 따라서 보안에 관련된 정보는 세션으로 처리하고, 보안과 관련 없는 정보는 쿠키로 처리한다.

사용자를 식별하기 위한 쿠키 (자동으로 생성되는)를 보통 세션 쿠키라고 한다.

자동으로 발행되는 쿠키가 세션 쿠키이다. - 이건 was 마다 다르다.

수동으로 발행하는 쿠키를 수동쿠키 또는 사용자 정의 쿠키라고 부른다.

Session : 세션은 서버 측의 컨테이너에서 관리되는 정보로, 컨테이너에 접속해서 종료되기까지 유지된다. 서버측에서 관리되기 때문에 보안에 안전하다고 볼 수 있다. 세션은 세션의 유지 시간을 설정 할 수 있다.

HTTP를 사용한 웹 서버 통신은 기본적으로 Request/Response를 이용하여 한번 전송하고, 한번 응답하는 서비스를 종료한다. 그래서 사용자의 정보를 유지하기 위해 Session Tracking을 사용한다. (
추가!!!!)

Cookie와 Session을 사용하는데 있어서 반드시 알아야 하는 것은 동시에 많은 사용자가 페이지에 접속하게 된다면 session이 발생하여 메모리를 차지하게 된다는 것이다. 그래서 서버가 죽는 경우가 발생 할 수 있다.
일예로 아마존에서 이벤트를 했는데 동시에 접속자가 몰려서 session이 많이 발생하여 메모리를 잡아먹게 되어 서버가 다운 되는 경우가 발생했다고 한다.;;;

그래서 개발자가 개발시에 주의해야 할 점은 jsp페이지에서

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" session="true"%>

page 지시어에 보면 session="true" 항목이 있다. 기본값은 true이고 HttpSession의 사용여부를 결정한다.

이 부분을 false로 놓고 개발을 해야 한다. 그리고 로그인 같은 세션이 필요한 곳에서는 세션을 살려 놓고 작업을 한다.

이클립스에서 이부분을 설정하는 부분을 보면

Windows - Preferences - Web - JSP Files - Editor - Templates 로 이동해 보면 아래와 같은 그림을 볼 수 있다.


여기서 New JSP File(html)을 클릭하고 Edit를 누르면 아래와 같은 그림이 나온다.

<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>


이 부분을 아래 그림과 같이 변경한다.


이 부분에서 page 지시어 부분을 그림에서와 같이 변경하고 JSP 페이지를 만들면 기본적으로 변경한 내용으로 만들어 진다.

이렇게 설정을 하고 작업을 하며, 세션이 필요한 경우에는 session="true" 로 변경하고 작업을 하면 된다.

만약 false로 놓고 cookie나 session 작업을 한다면 cookie와 session은 실행되지 않는다.

반드시 구현해야할 계약서를 만드는 작업이 인터페이스다.

BbsDAO에서 반드시 해야 할 작업들을 작성해 놓는다.

Interface BbsDAO 를 작성한다.


package org.sdq.bbs;

public interface BbsDAO {

 public void create(BbsVO vo) throws Exception; //데이타를 집어넣을 작업을 구현하게 한다.
 
}


이제 인터페이스를 구현할 BbsDAOImpl Class를 만든다.

그리고 이전에 오라클과 연결하기 위한 작업을 수행하던 클래스를 상속 받아서 사용한다.


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BasicDAO {

 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 private static final String URL="jdbc:oracle:thin:@127.0.0.1:1521:XE";
 private static final String USER = "USER01";
 private static final String PW = "USER01";
 
 static{ //실행될 때 메모리 상에 올린다. 한번만
  try {
   Class.forName(DRIVER); //import 하는 거와 동일하다. 왜 이렇게 하냐 면 다른 DB를 사용 때 체크한다.
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public Connection getConnection() throws SQLException{
  
  Connection con = null;
  
  //서브잡일때 잡고, 메인잡일때 던져(일부분일 때는 잡아야되고, 전체일 때는 던진다
  
  con = DriverManager.getConnection(URL, USER, PW);
  
  return con;
 }
}

그리하여 완성된 BbsDAOImpl Class!


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BbsDAOImpl extends BasicDAO implements BbsDAO {

 @Override
 public void create(BbsVO vo) throws Exception {
 
    Connection con = null;
    PreparedStatement pstmt = null;
   
    StringBuffer buffer = new StringBuffer();
    //buffer.append(" INSERT into TBL_BBS (bbsno, title, content, writer)\n");
    //buffer.append(" values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'YNK')\n");
    buffer.append("  INSERT into TBL_BBS (bbsno, title, content, writer) \n");
    buffer.append("  values(SEQ_BBS.NEXTVAL, ?, ?, ?)  \n");
  
    try{
    
     con =
getConnection();
     pstmt = con.prepareStatement(buffer.toString());
     pstmt.setString(1, vo.getTitle());
     pstmt.setString(2, vo.getContent());
     pstmt.setString(3, vo.getWriter());
    
     int result = pstmt.executeUpdate();
     System.out.println(result);
    
     //작업
     pstmt.close();
     pstmt = null;
     con.close();
     con = null;
    }catch(Exception e){
     e.printStackTrace();
    }finally{
     if(pstmt != null){try{ pstmt.close(); }catch(Exception e){} }
     if(con != null){try{con.close();}catch(Exception e){}}
    } 
 }
}

+ Recent posts