우선 넷빈즈를 깔면 PHP관련 개발툴이 설치가 되는데요(다운로드 시 PHP가 포함된 설치파일을 받을 시^^).
하지만, php를 돌리기위한 Apache나 PHP, 디버거는 직접 셋팅을 해줘야합니다.
각 사이트에서 최신버전 받으시면 됩니다.
Apache HTTP Server는 웹서버, PHP5는 php, XDEBUG는 PHP디버그해주는 모듈 같습니다^^




Apache HTTP Server - http://httpd.apache.org/download.cgi
PHP5 Engine - http://kr.php.net/downloads.php
XDEBUG - http://www.xdebug.org/download.php

저는 각각 apache_2.2.11-win32-x86-no_ssl.msi, php-5.2.9-1-win32-installer.msi, php_xdebug-2.0.4-5.2.8.dll을 받았습니다.

apache를 설치해봅시다.
Server Infomation을 물어보는데, localhost라고 쓰면 되는 듯 합니다-_-(잘 모르겠네-_-)
그냥 다음신공으로 설치했습니다-_-;
http://localhost/ 하니까 It Works!가 뜨네요.

php를 설치해봅시다.
설치파일 실행하면 Web Server Setup을 물어보는군요. Apache 2.2.x니까 그거 선택하면 됩니다.
아파치 디렉토리 선택하라고 나오는데, 디폴트 설치 시
C:\Program Files\Apache Software Foundation\Apache2.2\여기에 있습니다.
그 다음에서 고생한게-_-; 여기서 Extensions에서 MySQL추가 안하면....MySQLdb연동이 안됩니다-_-; 젠장 나만 몰랐었나. 저는 디비연동php스크립트 코드가 왜 안먹히지 그러고 있었는데, 저거 설치안해줘서 그렇더군요 ㅠ
MySQL이랑 MySQLi는 뭐가 틀린거지-_-; 암튼, 둘다 설치했습니다-_-; 찜찜하면 그냥 풀설치로....-_-;

※php설치 후에 apache를 재시작해야합니다.

XDEBUG를 설치해봅시다.
해당 dll파일을 C:\Program Files/PHP/에 복사를 합니다.
그리고, php.ini파일을 열어서 맨아래에 추가합니다.
[code]zend_extension_ts="C:/Program Files/PHP/php_xdebug-2.0.4-5.2.8.dll"
xdebug.remote_enable=1[/code]

셋팅이 완료되었어요. 넷빈즈를 실행해봅시다.

New Project -> PHP -> PHP Application -> Project Name은 Hello Php-_-; -> Run As에서 Local Web Site도 있고, Remote Web Site가 있는 걸보니, 웹에다가 올려놓고, 디버깅도 되나봅니다. 암튼, local에서 할꺼니까 Local Web Site로 선택하고, Finish를 클릭합니다.
index.php
[code]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        echo "Hello PHP";
        phpinfo();
        ?>
    </body>
</html>[/code]
사용자 삽입 이미지
디버깅도 되는데, 디버깅도 해봅시다.
코드를 이렇게 고치고-_-;
[code]<?php
        $hello = "mudchobo";
        echo $hello;
        $hello = " shit";
        echo $hello;
        ?>[/code]
$hello = "mudchobo"부분에 ctrl + F8 또는 라인맨앞에 마우스클릭으로 Break Point를 잡습니다.
디버깅은 페이지단위로 되는 듯합니다. 디버깅은 Ctrl + Shift + F5를 입력하거나 마우스로 파일에 오른쪽버튼 눌러서 디버깅을 할 수 있습니다.
그러면 Server side PHP만 할것인지, Server side와 Client Javascript디버깅을 동시에 할건지 물어봅니다. 넷빈즈는 정말 만능인 것 같습니다. Javascript디버거도 매우 만족 스러운 수준이거든요. 좋아요~
우선 Server side만 할꺼니까 그거 선택하고, Debug버튼 누르면 디버깅이 시작됩니다.
사용자 삽입 이미지
이렇게 브레이크포인트 부분에서 멈춥니다. 아래에서 변수값을 확인할 수 있어요.
사용자 삽입 이미지
근데, 좀 이상한게-_-; Value를 클릭하기 전에는 값을 확인할 수 없어요-_-; 왜 그럴까요....
암튼, 저렇게 변수값이 보이게 됩니다.

작년에 선테크데이에서 넷빈즈행사에서 말했는데, 6.5에서 가장 크게 향상된 기능은 PHP라고 하더라구요. 다른 PHP용 IDE는 안써봤지만, 넷빈즈의 PHP는 정말 강력한 것 같아요. 코드힌트도 너무 잘나오고, 디버깅도 쉽게 할 수 있고-_-; 뭐 그렇다구요 ^^

 
Posted by 머드초보
,
 
http://appengine.google.com/start 에 접속하면 로그인을 하라고 나옵니다. 구글계정으로 로그인 하고나면 Create an Application버튼과 왤컴한다는 내용이 있을겁니다.
사용자 삽입 이미지
전 여기서 좀 고생을 했는데요-_-; SMS인증을 받아야하거든요. 국내통신사도 지원한다고 했는데, 전 안되는 것이였습니다. 결론은 전화번호를 잘못 입력해서......-_-;
Create an Application을 클릭하면 아래와 같은 화면이 나옵니다.
사용자 삽입 이미지
Country는 당연히 우리나라는 없더군요. Mobile Number에서 저는 +82 010 0000 0000이라고 입력하니....안되더군요-_-; 바보같이-_- 010에서 0을 빼야합니다ㅠ +82 10 0000 0000 라고 하니 되더군요 ㅠ 하루고생했습니다ㅠ

보내고 나면 애플리케이션을 만들 수 있는데요. 우선 Application Identifier:에유니크한 이름을 적습니다. 여기서좀 이상한 점이......분명 available이라고 해놓고, 등록하려고 하면 이미 사용하고 있다고 나오는 경우가 있더라구요. sosiage라고 등록하려고 하니 그렇더라구요-_-; 이 app id는 한번 등록하면 바꿀 수 없구요. 총 10개의 애플리케이션을 만들 수 있습니다. 더 쓰고 싶으면 돈내라 이건가.....

애플리케이션을 생성했으면 이제 개발툴을 설치해야합니다.
http://code.google.com/intl/ko-KR/appengine/downloads.html 이곳에 가면 다운로드할 수 있는데, 분명 저번 세미나에서 보여줬던 관리툴같은 게 있었던 것 같은데, Mac OSX용만 있나봅니다 ㅠ
아.....이걸 설치하기전에 파이썬부터 설치해야합니다.

http://www.python.org/download/
안정적인 버전이 2개가 있는데, 2.6.1과 3.0.1이 있네요.
3.0.1을 설치하면 안됩니다-_-;
2.6.1버전을 설치해야합니다. 설치는 그냥 다음신공으로 설치할 수 있어요. 쉬워요!

그 다음 개발툴을 설치하면 됩니다.
그리고 난 다음에 데모를 실행해서 잘 되는지 확인해보면 됩니다.
시작 -> 실행 -> cmd를 열고......디폴트로 설치했다면 이곳에 데모가 있을 겁니다.
[code]cd C:\Program Files\Google\google_appengine\demos
dev_appserver.py guestbook/[/code]이렇게 실행하면
INFO     2009-03-01 05:08:50,332 dev_appserver_main.py] Running application guestbook on port 8080: http://localhost:8080
웹브라우저에서 http://localhost:8080을 입력하면 초간단 방명록이 실행되고 있을겁니다-_-;

PS. python이라는 언어가 참 간결하고 좋긴한데, 전.....개인적으로 다른 언어도 지원했으면 좋겠네요-_-;

 
Posted by 머드초보
,
 
오....간만에 초간단 시리즈-_-;
그냥 넷빈즈6.5가 새로 나와서 Hibernate도 공부해볼 겸 해서 삽질을 좀 해봤습니다. Hibernate를 공부하고 있는데, 왜이렇게 어렵죠ㅠ 아직도 잘 모르겠습니다. 좋은 자료가 있으시면 댓글로 좀 알려주세요 ㅠ(굽신굽신 ㅠ)

넷빈즈6.5 JDK6U10환경에서 해봤습니다.

File New Project -> Java -> Java Application 선택.
Project Name은 WondergirlsHibernate로 하고 Finish!(원더걸스를 예제로 해야 접근성이 좋은..-_-)

Mysql에다가 DB를 만들어봅시다.
첫번째 테이블은 wondergirls에 대한 정보를 나타냅니다. 이름과 나이가 있습니다.
[code]CREATE TABLE  `wondergirls`.`wondergirls` (
  `idx` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `age` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `wondergirls` (`idx`,`name`,`age`) VALUES
 (1,'선예',20),
 (2,'선미',20),
 (3,'소희',17),
 (4,'예은',17),
 (5,'유빈',21);
[/code]
두번째 테이블은 과목점수를 나타냅니다. widx 칼럼이 wondergirls테이블의 idx와 FK로 연결되었습니다.
[code]CREATE TABLE  `wondergirls`.`score` (
  `idx` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `widx` int(10) unsigned NOT NULL,
  `korean` int(10) unsigned DEFAULT NULL,
  `math` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`idx`),
  KEY `FK_score_1` (`widx`),
  CONSTRAINT `FK_score_1` FOREIGN KEY (`widx`) REFERENCES `wondergirls` (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `score` (`idx`,`widx`,`korean`,`math`) VALUES
 (1,1,100,100),
 (2,2,90,90),
 (3,3,80,80),
 (4,4,70,70),
 (5,5,60,60);
[/code]
넷빈즈에 Mysql을 추가를 안하셨다면 추가를 하셔야합니다.
왼쪽에서 Projects탭 말고,  Services탭을 클릭합니다. Register Mysql를 클릭해서 정보를 입력하여 추가합니다. connect했을 때 db가 보인다면 추가가 잘 된 것입니다. start나 stop도 이곳에서 관리하려면 추가로 입력하시면 되는데, 입력안하고, 외부에서 실행하고 종료해도 상관 없더군요.

그러면 다시 Projects탭으로 돌아와서.....프로젝트이름에 대고, 오른쪽버튼 -> New -> Hibernate -> Hibernate Configuration File선택 -> Name and Location에서는 그냥 Next -> Database Connection은 방금 추가한 테이블이 있는 Mysql의 db를 선택합니다. Finish를 누르면 각종 설정화면이 나옵니다.
여기서 Optional Properties -> Configuration Properties에 add하고, hibernate.show_sql을 true로 설정한 것을 추가합니다. 이제 XML로 보면 이렇게 보일겁니다.
[code]<?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.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wondergirls</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">mudchobo</property>
    <property name="hibernate.show_sql">true</property>
  </session-factory>
</hibernate-configuration>
[/code]
설정하기 편하게 되어있군요. 다 뭐하는 건지는 하나씩 해봐야 알 것 같아요 ㅠ 우선은 sql쿼리만 볼 수 있도록 하고-_-;

이제 HibernateUtil을 추가합니다. 설정파일을 통해 session을 가져오는 유틸인 듯 합니다.
Ctrl + N -> Hibernate -> HibernateUtil.java 선택.
Class Name은 New를 뺀 HibernateUtil, Package는 wondergirlshibernate.util로 합시다. Finish를 누르면 자동으로 생성됩니다.

이제 매핑파일을 가져옵시다.
Ctrl + N -> Hibernate -> Hibernate Mapping Files and POJOs from Database 선택.
Name and Location에서는 그냥 Next.
hibernate.cfg.xml이 자동으로 선택이 되는데, 거기에 방금 생성한 테이블이 있을 겁니다.
사용자 삽입 이미지
score를 추가하면 wondergirls는 따라옵니다. 서로 연결이 되어있어서 필요합니다. Next한다음에 Package에 wondergirlshibernate.entity로 하고 Finish를 클릭합니다.

이제 entity도 만들어졌으니, HQL을 테스트해볼 수 있습니다.
Source Packages -> default package -> hibernate.cfg.xml에 오른쪽버튼 클릭 후 Run HQL Query를 클릭하면 쿼리를 날릴 수 있습니다. 아래와 같이 날려봅시다.
[code]from Score[/code]
사용자 삽입 이미지
이렇게 결과를 볼 수 있습니다.
별 것도 없는데 글이 길어 지네-_-; 다음 글에-_-;

[NetBeans] 넷빈즈를 이용한 Hibernate 초간단 예제2 - 데이터가져오기.


참조글 : http://www.netbeans.org/kb/docs/java/hibernate-java-se.html
 
Posted by 머드초보
,
 

우선 service-config.xml파일을 수정해야합니다.
<factories>
  <factory id="springfactory" class="flex.messaging.factory.SpringFactory" />
</factories>
를 추가합니다.

그 다음 remote-config.xml파일을 수정해야합니다.
<destination id="productmanager">
 <properties>
  <factory>springfactory</factory>
  <source>productManager</source>
 </properties>
</destination>
자세히 보시면 factory는 위에 service-config.xml파일에 정의한 놈이고, source는 bean이름입니다.
즉 applicationContext.xml파일에 정의한 그 bean이름을 저기에 적어 놓으면 됩니다.
그러면 그 bean을 flex로 가져와서 쓸 수 있습니다.

아 그리고 프로젝트에서 이상하게 contextroot가 WebContent로 되어있는데 프로젝트이름으로 고쳐줍시다-_-;
프로젝트 이름에 대고 마우스오른쪽버튼(alt+enter) properties를 선택, Flex Server부분 클릭.
context root를 프로젝트이름(SpringAndBlazeds)으로 바꿔줍시다.

자 그러면 flex_src에 있는 SpringAndBlazeds.mxml을 수정해봅시다.
SpringAndBlazeds.mxml
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
 applicationComplete="init();">
 
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.remoting.RemoteObject;
   
   private function init():void {
    var remoteObject:RemoteObject = new RemoteObject();
    remoteObject.destination = "productmanager";
    remoteObject.addEventListener(ResultEvent.RESULT, resultHandler);
    remoteObject.addEventListener(FaultEvent.FAULT, faultHandler);
    remoteObject.getProducts();
   }
   
   private function resultHandler(event:ResultEvent):void{       
       dg.dataProvider = event.result;  
      }     
  
      private function faultHandler(event:FaultEvent):void{       
       Alert.show("실패 메세지 : " + event.fault.message);  
      } 
  ]]>
 </mx:Script>
 
 <mx:DataGrid id="dg" width="100%" height="100%" />
</mx:Application>
[/code]
간단하게 Manager에 있는 getProducts를 호출해서 DataGrid에 넣는 코드입니다.

자 이제 실행해봅시다-_-;
이클립스 오른쪽아래에 server에다가 SpringAndBlazeds프로젝트를 추가합니다.
서버에 대고, 오른쪽버튼누르면, Add and Remove Project클릭해서 추가하면 됩니다.
서버를 가동합니다.
Run Flex Application을 실행해봅시다!-_-;

사용자 삽입 이미지


아....잘되....는.....군.....요......-_-;
 
Posted by 머드초보
,
 

이제 Manager클래스를 만들어봅시다.
실제로 BlazeDS를 이용해서 가져오는 놈은 이 Manager클래스가 되겠죠^^

Java Resources: src에서 오른쪽버튼 클릭하고, New를 해서 interface를 구현합니다.
[code]
package springapp.service;

import java.util.List;
import springapp.domain.Product;

public interface ProductManager {
 public List<Product> getProducts();
}
[/code]
getProducts라는 메소드가 하나 있군요! 구현해봅시다!!!
[code]
package springapp.service;

import java.util.List;

import springapp.dao.ProductDao;
import springapp.domain.Product;

public class ProductManagerImpl implements ProductManager {

 private ProductDao productDao;
 
 @Override
 public List<Product> getProducts() {
  return productDao.getProductList();
 }

 public void setProductDao(ProductDao productDao) {
  this.productDao = productDao;
 }
}
[/code]
getProducts라는 함수는 Dao에서 getProductList를 호출하는 놈이네요.
요 아래에는 setter가 있네요. 이건 spring에서 DI를 하기위해 존재하는 setter입니다^^
서비스도 완성이 되었네요! 이제 설정파일을 작성해봅시다.

applicationContext.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <!-- Enable @Transactional support -->
 <tx:annotation-driven />

 <!-- Enable @AspectJ support -->
 <aop:aspectj-autoproxy />

 <aop:config>
  <aop:advisor pointcut="execution(* *..ProductManager.*(..))"
   advice-ref="txAdvice" />
 </aop:config>

 <tx:advice id="txAdvice">
  <tx:attributes>
   <tx:method name="save*" />
   <tx:method name="get*" read-only="true" />
  </tx:attributes>
 </tx:advice>

 <bean id="productManager"
  class="springapp.service.ProductManagerImpl">
  <property name="productDao" ref="productDao" />
 </bean>

</beans>
[/code]
Dao부분의 설정파일인 applicationContext-ibatis.xml파일을 봅시다.
applicationContext-ibatis.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
  p:location="classpath:properties/jdbc.properties" />

 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
  p:username="${jdbc.username}" p:password="${jdbc.password}" />

 <!-- Transaction manager for iBATIS Daos -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>

 <!-- SqlMap setup for iBATIS Database Layer -->
 <bean id="sqlMapClient"
  class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation"
   value="classpath:springapp/dao/SqlMapConfig.xml" />
 </bean>

 <!-- Add additional Dao definitions here -->
 <bean id="productDao"
  class="springapp.dao.ProductDaoImpl">
  <property name="sqlMapClient" ref="sqlMapClient" />
 </bean>
 
</beans>
[/code]
jdbc.properties파일은 properties라는 package를 만들고, jdbc.properties파일을 넣어버립시다.
[code]
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://DB주소
jdbc.username=DB아이디
jdbc.password=DB비밀번호
[/code]
이 설정들의 bean들의 관계를 보고 싶다면-_-;
Spring Elements에서 오른쪽버튼 클릭하고 properties를 선택.
Bean Support를 선택, Add한 뒤 두개의 설정파일(applicationContext.xml, applicationContext-ibatis.xml)선택.
Config set에서 New하고 Name에 applicationContext라고 하고, 두개다 체크 오케이~
그럼 이제 스프링 설정파일에서 에러를 찾아낼 수 있어요!
bean들의 관계를 그래프로도 볼 수 있네요!
Config set에 추가한 applicationContext에다가 마우스오른쪽버튼을 클릭하면 open graph로 볼 수 있어요!

이제 클라이언트 구현으로....다음 시간에-_-;

 
Posted by 머드초보
,