반응형

메인 안내 페이지

 

https://developers.google.com/web/tools/chrome-devtools

 

Chrome DevTools  |  Tools for Web Developers  |  Google Developers

Option 1

developers.google.com


하나씩 개발도구 및 CSS 설정들을 보며 따라해 보기

 

https://developers.google.com/web/tools/chrome-devtools/css

 

Get Started With Viewing And Changing CSS  |  Tools for Web Developers

Learn how to use Chrome DevTools to view and change a page's CSS.

developers.google.com

 

 

반응형
반응형
반응형
반응형

개발환경에서 JAVA + ORACLE + JSP 일반적인 환경에서

ORACLE은 일반적으로 PL/SQL을 사용한다

그런데,,,

이 PL/SQL을 사용하다보면 JAVA + JSP를 통한 debugging 을 하기가 굉장히 어렵고

제대로 변수가 입력되었는지... 잘 동작하는지 찾기 어렵다.

그래서... 인터넷 검색을 하다보니

log4j 처럼

log4sql이라는 lib가 있다는 것을 알았다...

프로젝트 홈 : http://log4sql.sourceforge.net/index_kr.html

  Download log4sql-7.0.8



홈페이지에서 보면,

개발을 할경우 우리는 무수히 많은 프레임웍과 도구들을 사용 합니다.
View계층, Model계층 그리고 Controller또는 DataAcess계층에서 많은 도구들과 프레임웍은
현재 거의 모든 layer들에 걸쳐서 사용되고 개발되어지고 있습니다.
이런경우 개발자에게 중요한것중의 하나는 비즈니스 로직인 PL/SQL작업을 하는 것 입니다.
모든 PL/SQL작업은 SQL을 작성하고 실행한 후에 버그가 존재하가나 원하는 결과가 나오지 않을경우 수정하는 것이며
이런작업은 반복적으로 수행됩니다.
이런 경우에 우리는 jdbc또는 Connection Pooling(Apache DBCP) 또는 support 2PC (JTA,JOTM)등을 사용합니다.
또한 우리는 데이터 접근계층의 프레임웍으로 IBATIS나 SpringFramework을 사용할 경우 springJDBC또는 HIBERNATE등을 사용합니다.
이런 상황에서 우리는 의문을 갖게 됩니다. '내가 작성한 SQL이 정상적으로 작동한 것인가?', '내가 입력값으로 넣어준 값들이 제대로 등록된 SQL인가?'
SQL을 확인하고자 개발 소스의 구석구석에 System.out.println(...)으로 확인을 할 것입니다.
개발이 종료된 시점에 주석으로 가려진 가독성이 떨어지는 소스는 유지보수담당자에게 머리아픈 소스가 될 것이고
운영상에 문제가 발생할 경우 해당 SQL을 다시 확인하는 복잡한 작업이 반복될 것입니다.
이런경우를 경험한 개발자라면 log4sql은 간단한 설정으로 많은 편리함을, 개발의 즐거움을 당신에게 드릴것 입니다.

기본 apache common lang lib를 의존한다. : http://commons.apache.org/lang/

오픈 소스이며 apache 라이센스를 따른다 : http://www.apache.org/licenses/LICENSE-2.0





특징들

1.쉬운 설정.
log4sql은 굉장히 간단한 설정을 지원합니다.
개발자들이 할 일은 log4sql-xxx.jar파일을 클래스패스에 복사한 후에
사용하고 있는 driver-class 이름을 log4sql에서 지원하는 driver-class명으로만 바꿔주시면 됩니다.

 2.개발성 향상.
 log4sql은 SQL파라미터 매치된 로그뿐 아니라, 로그의 위치와 걸린시간 그리고 수행결과(INSERT,UPDATE,DELETE)를 보여드립니다.

 3. SQL실행시간을 가장 정확히 파악합니다.
log4sql은 실제 서비스와 동일한 시점의 순수한 SQL실행 시간만을 나타냅니다.
즉 이것은 Connection을 얻어오거나, Connection Pooling기법을 사용하더라도, 실제 작성된 SQL이 DBMS에 전달된 후 결과 값을 받아오기까지의 걸린 시간만을 측정하여
성능에 이상이 있는 SQL등을 쉽게 확인 할 수 있습니다.
 
 4. Application의 성능과 실행에 영향을 주지 않습니다.
 log4sql은 내부적인 문제가 존재하더라도 실제 Application에 영향을 주지는 않습니다.
내부적인 문제가 발생할 경우 해당로그는 설정변경으로 확인이 가능하며, 동시접속사용자가 많은경우 log4sql은 비동기 모드로의 전환이 실행환경에서 가능하도록 설계되었습니다.

5.어떤 유형의 프로젝트라도 적용이 가능합니다.
 JDK1.4이상의 아래의 JDBC드라이버 리스트를 사용하는 어떤 프로젝트라도 사용이 가능합니다.

[ORACLE DRIVER CLASS] 'oracle.jdbc.drirver.OracleDriver'
[MYSQL DRIVER CLASS] 'com.mysql.jdbc.Driver' or 'org.gjt.mm.mysql.Driver'
[SYBASE DRIVER CLASS] 'com.sybase.jdbc2.jdbc.SybDriver'
[DB2 DRIVER CLASS] 'com.ibm.db2.jcc.DB2Driver'
[INFOMIX DRIVER CLASS] 'com.informix.jdbc.IfxDriver'
[POSTGRESQL DRIVER CLASS] 'org.postgresql.Driver'
[MAXDB DRIVER CLASS] 'com.sap.dbtech.jdbc.DriverSapDB'
[FRONTBASE DRIVER CLASS] 'com.frontbase.jdbc.FBJDriver'
[HSQL DRIVER CLASS] 'org.hsqldb.jdbcDriver'
[POINTBASE DRIVER CLASS] 'com.pointbase.jdbc.jdbcUniversalDriver'
[MIMER DRIVER CLASS] 'com.mimer.jdbc.Driver'
[PERVASIVE DRIVER CLASS] 'com.pervasive.jdbc.v2.Driver'
[DAFFODILDB DRIVER CLASS] 'in.co.daffodil.db.jdbc.DaffodilDBDriver'
[JDATASTORE DRIVER CLASS] 'com.borland.datastore.jdbc.DataStoreDriver'
[CACHE DRIVER CLASS] 'com.intersys.jdbc.CacheDriver'
[DERBY DRIVER CLASS] 'org.apache.derby.jdbc.ClientDriver'
[ALTIBASE DRIVER CLASS] 'Altibase.jdbc.driver.AltibaseDriver'
[MCKOI DRIVER CLASS] 'com.mckoi.JDBCDriver'
[JSQL DRIVER CLASS] 'com.jnetdirect.jsql.JSQLDriver'
[JTURBO DRIVER CLASS] 'com.newatlanta.jturbo.driver.Driver'
[JTDS DRIVER CLASS] 'net.sourceforge.jtds.jdbc.Driver'
[INTERCLIENT DRIVER CLASS] 'interbase.interclient.Driver'
[PURE JAVA DRIVER CLASS] 'org.firebirdsql.jdbc.FBDriver'
[JDBC-ODBC DRIVER CLASS] 'sun.jdbc.odbc.JdbcOdbcDriver'
[MSSQL 2000 DRIVER CLASS] 'com.microsoft.jdbc.sqlserver.SQLServerDriver'
[MSSQL 2005 DRIVER CLASS] 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
[CUBRID DRIVER CLASS] 'cubrid.jdbc.driver.CUBRIDDriver'



사용법

 1.log4sql-xxx.jar파일을 클래스패스에 복사하십시요.
log4sql-xxx.zip파일은 sourceforge에서 다운로드한 후 압축을 해제합니다.
그리고나서 압축을 해제한 폴도에 가서 log4sql-xxx.jar을 복사한후 SQL로그를 보고자하는 어플리케이션을 lib디렉토리에 복사합니다.

 2.Driver Class이름을 변경합니다.
만약 Oracle Driver를 사용하신다면 driver-class의 설정은 아마도 아래와 같을 것입니다. <driver class='oracle.jdbc.driver.OracleDriver'>와 같다면 <driver class='core.log.jdbc.driver.OracleDriver'>로 변경하면 됩니다.
아래의 리스트는 log4sql에서 지원하고 있는 driver의 리스트 입니다.



JDBC TYPE Origin Your Driver Class -> log4sql Driver Class
[ORACLE DRIVER CLASS] oracle.jdbc.drirver.OracleDriver -> core.log.jdbc.driver.OracleDriver
[MYSQL DRIVER CLASS] com.mysql.jdbc.Driver' or'org.gjt.mm.mysql.Driver -> core.log.jdbc.driver.MysqlDriver
[SYBASE DRIVER CLASS] com.sybase.jdbc2.jdbc.SybDriver -> core.log.jdbc.driver.SybaseDriver
[DB2 DRIVER CLASS] com.ibm.db2.jcc.DB2Driver -> core.log.jdbc.driver.DB2Driver
[INFOMIX DRIVER CLASS] com.informix.jdbc.IfxDriver -> core.log.jdbc.driver.InfomixDriver
[POSTGRESQL DRIVER CLASS] org.postgresql.Driver -> core.log.jdbc.driver.PostgresqlDriver
[MAXDB DRIVER CLASS] com.sap.dbtech.jdbc.DriverSapDB -> core.log.jdbc.driver.MaxDBDriver
[FRONTBASE DRIVER CLASS] com.frontbase.jdbc.FBJDriver -> core.log.jdbc.driver.FrontBaseDriver
[HSQL DRIVER CLASS] org.hsqldb.jdbcDriver -> core.log.jdbc.driver.HSQLDriver
[POINTBASE DRIVER CLASS] com.pointbase.jdbc.jdbcUniversalDriver -> core.log.jdbc.driver.PointBaseDriver
[MIMER DRIVER CLASS] com.mimer.jdbc.Driver -> core.log.jdbc.driver.MimerDriver
[PERVASIVE DRIVER CLASS] com.pervasive.jdbc.v2.Driver -> core.log.jdbc.driver.PervasiveDriver
[DAFFODILDB DRIVER CLASS] in.co.daffodil.db.jdbc.DaffodilDBDriver -> core.log.jdbc.driver.DaffodiLDBDriver
[JDATASTORE DRIVER CLASS] com.borland.datastore.jdbc.DataStoreDriver -> core.log.jdbc.driver.JdataStoreDriver
[CACHE DRIVER CLASS] com.intersys.jdbc.CacheDriver -> core.log.jdbc.driver.CacheDriver
[DERBY DRIVER CLASS] org.apache.derby.jdbc.ClientDriver -> core.log.jdbc.driver.DerbyDriver
[ALTIBASE DRIVER CLASS] Altibase.jdbc.driver.AltibaseDriver -> core.log.jdbc.driver.AltibaseDriver
[MCKOI DRIVER CLASS] com.mckoi.JDBCDriver -> core.log.jdbc.driver.MckoiDriver
[JSQL DRIVER CLASS] com.jnetdirect.jsql.JSQLDriver -> core.log.jdbc.driver.JsqlDriver
[JTURBO DRIVER CLASS] com.newatlanta.jturbo.driver.Driver -> core.log.jdbc.driver.JturboDriver
[JTDS DRIVER CLASS] net.sourceforge.jtds.jdbc.Driver -> core.log.jdbc.driver.JTdsDriver
[INTERCLIENT DRIVER CLASS] interbase.interclient.Driver -> core.log.jdbc.driver.InterClientDriver
[PURE JAVA DRIVER CLASS] org.firebirdsql.jdbc.FBDriver -> core.log.jdbc.driver.PureJavaDriver
[JDBC-ODBC DRIVER CLASS] sun.jdbc.odbc.JdbcOdbcDriver -> core.log.jdbc.driver.JdbcOdbcDriver
[MSSQL 2000 DRIVER CLASS] com.microsoft.jdbc.sqlserver.SQLServerDriver -> core.log.jdbc.driver.MssqlDriver
[MSSQL 2005 DRIVER CLASS] com.microsoft.sqlserver.jdbc.SQLServerDriver -> core.log.jdbc.driver.Mssql2005Driver
[CUBRID DRIVER CLASS] cubrid.jdbc.driver.CUBRIDDriver -> core.log.jdbc.driver.CUBRIDDriver






설정하기

 우리는 log4sql_conf.jsp페이지를 통해서 보다 쉬운 운영상의 설정페이지를 제공합니다.
 
log4sql-xxx.zip파일을 sourceforge싸이트에서 다운로드한 후에 압축을 풀게되면 log4jsq_conf.jsp파일을 [log4sql-xxx.zip]/log4sql_conf.jsp에서 볼 수 있습니다.
log4sql_conf.jsp파일을 개발하고 있는 어플리케이션의 context-root에 복사하세요
(만약 개발중인 어플리케이션 서버의 context_root이름이 'site-root'이고 context_root까지의 디렉토리 구조가 'c://application/domain/site_root'와 같다면 log4sql_conf.jsp를 'c://application/domain/site_root/log4sql_conf.jsp'처럼 복사하세요)
그런 후에 log4sql_conf.jsp을 브라우져로 열기 위해서 'http://개발ip:개발port/site_root/log4sql_conf.jsp'처럼 접근합니다.

log4sql_sql.jsp의 형태는 아래와 같은 그림이 보여질것 입니다.


l환경설정에 사용되어지는 속성값들은 log4sql_configuration.properties에 위치하고 있으며,
항상 같은 설정이 적용되어지길 원할경우 [log4sql-xxx.jar]/core/log/log4sql_configuration.properties의 위치에서 해당항목의 값을 변경하시면 됩니다.


 1.Log Level(log4sql_configuration.properties 파일에서 'log.level'항목을 참조함).
Log Level은 로그를 남길경우의 우선 순위를 얘기하며, Log4j를 알고계신다면 쉽게 이해가 되실겁니다.
log4sql의 로그는 기본적으로 모두 DEBUG의 형태로 되어있으므로 DEBUG값 이상으로 로그레벨을 변경하게 되면 정상적인 로그를 남기지 않게 됩니다.
로그레벨의 종류는 DEBUG=0,INFO=1,WARNING=2,FATAL=3, ERROR=4, LOGGING_OFF=5와 같으며,
SQL수행도중에 구문문제 또는 잘못된 파라미터 INDEX에러가 발생하게 되면 자동으로 해당 SQL과 원인(Root cause Exception trace)를
ERROR 로그레벨로 남기게 되며, 모든 로그(Error 로그포함)를 남기지 않으려면 로그레벨을 LOGGING_OFF로 변경하시면 됩니다.

 2.Select Fix(log4sql_configuration.properties 파일에서 'query.logging.position.fixed.select'항목을 참조함).
 SELECT SQL에만 해당됩니다.
log4sql은 많은경우에 사용되어질 수 있도록 만들어 졌습니다.
따라서 우리는 log4sql을 사용하는 어플리케이션에서 어떠한 프레임웍을 사용하는지, 어떤 서버에서 실행되는지 알수가 없습니다.
문제가 있는 SQL일경우 사용자는 DEBUGING을 해야 할 것입니다. 그러기 위해선 어떤 클래서에서, 어떤 메소드에서 실행이 되었는지 알아야합니다.
log4sql은 SQL을 실행시킨 패키지와 클래스 그리고 어떤 메소드의 몇번째 라인에서 실행이 되었는지 실행된 시간과 함께 나타내 줍니다.
하지만, 위와같은 이유로 적합한 위치가 아닐수도 있으므로 log4sql은 적합한 위치를 사용자가 선택할 수 있도록 모든 실행에 참여한 클래스와 메소드들의 항목을 모두 보여줍니다.

 3.Select Position(log4sql_configuration.properties파일에서 'query.logging.position.select'항목을 참조함).
 2번 항목에서 적합하다고 생각되는 항목의 번호를 Select Position에 입력한 후 확인 버튼을 클릭하거나, 영구적으로 변경을 원하는 경우는 log4sql_configuration.properties에서 query.logging.position.select항목의 값으로 변경하시면 됩니다

 4.None Select Fix(log4sql_configuration.properties파일에서 'query.logging.position.fixed.none_select'항목을 참조함).
 INSERT, UPDATE, DELETE SQL에만 해당됩니다.
log4sql은 많은경우에 사용되어질 수 있도록 만들어 졌습니다.
따라서 우리는 log4sql을 사용하는 어플리케이션에서 어떠한 프레임웍을 사용하는지, 어떤 서버에서 실행되는지 알수가 없습니다.
문제가 있는 SQL일경우 사용자는 DEBUGING을 해야 할 것입니다. 그러기 위해선 어떤 클래서에서, 어떤 메소드에서 실행이 되었는지 알아야합니다.
log4sql은 SQL을 실행시킨 패키지와 클래스 그리고 어떤 메소드의 몇번째 라인에서 실행이 되었는지 실행된 시간과 함께 나타내 줍니다.
하지만, 위와같은 이유로 적합한 위치가 아닐수도 있으므로 log4sql은 적합한 위치를 사용자가 선택할 수 있도록 모든 실행에 참여한 클래스와 메소드들의 항목을 모두 보여줍니다

 5.None Select Position(log4sql_configuration.properties파일에서 'query.logging.position.none_select'항목을 참조함).
4번 항목에서 적합하다고 생각되는 항목의 번호를 Select Position에 입력한 후 확인 버튼을 클릭하거나, 영구적으로 변경을 원하는 경우는 log4sql_configuration.properties에서 query.logging.position.select항목의 값으로 변경하시면 됩니다.

 6.View Parameter Position(log4sql_configuration.properties파일에서 'query.logging.view.position'항목을 참조함).
 PreparedStatement를 사용할 경우 원하는 결과가 나오지 않을경우 해당 파리미터의 값이 적당하게 메치되었는지 궁금하게 됩니다.
이럴경우 개발자들은 난감한 상황에 접하게 됩니다. log4sql은 모든 파라미터가 결합된 SQL로그를 보여줍니다.
하지만, SQL문자열에 직접 입력된 값이 존재할 경우 개발자는 어떤값이 입력된 값인지, 어떤값이 문자열에 존재하는 값인지 혼동을 할 수 있습니다.
View Parameter Position값을 'true'로 변경할 경우 SQL log에서 입력된 값의 좌측에 '/**P*/'와 같은 표시를 보여줍니다. .

 7.View Internal Error(log4sql_configuration.properties파일에서 'query.logging.view.internal.exception'항목을 참조함).
 log4sql은 내부적인 문제가 있더라도 실제 SQL의 실행에는 영향을 미치지 않습니다.
log가 출력되지 않는 비정상적인 경우에 View Internal Error의 값을 'true'로 변경할 경우 내부적인 오류라면 오류의 내용을 출력할 것입니다.
이 내용은 사용자에게 고맙지 않은 경우일 것이나, 해당 내용을 log4sql개발팀에게 보내준다면 보다 견고한 버젼으로의 변경이 용이할 것입니다.

 8.Log To Asynchronous(log4sql_configuration.properties파일에서 'query.logging.asynchronous'항목을 참조함).
 log4sql은 SQL로그의 출력에 있어서 두가지 방법을 사용합니다. 동기적인 경우(Log To Asynchronous의 값을 'false'로 변경할 경우)모든 SQL로그는 순차적으로 실행이 될 것입니다.
이경우 log4sql에서의 모든 작업이 수행된 후에 다음 작업을 수행 할 것입니다.(많은 동시접속자가 존재하는 많은 로그가 출력되고 있는 상황에서 성능에 영향을 줄 수가 있습니다.
하지만 개발시 소수의 개발자에 의해서 디버그 용도로 실행되고 있을경우는 거의 영향을 주지 않습니다.) 비동기적인 경우(Log To Asynchronous의 값을 'true'로 변경할 경우)모든 SQL로그는 항상 순차적으로 실행되지 않습니다.
이경우 log4sql에서의 모든 작업과 SQL로그를 남기는 작업은 별도의 Thread로 동작할 것입니다.(많은 동시접속자가 존재(300tps)하는 많은 로그가 출력되고 있는 상황에서 성능을
보장하여 줄 것이나 이경우 로그는 순차적으로 남기지 않습니다.)

 9.View Appointed Package(log4sql_configuration.properties파일에서 'query.logging.view.appoint'항목을 참조함).
 아마도 개발자 혼자서 모든 개발을 진행하는 일은 흔치 않을것입니다.
따라서 log4sql은 개발자가 개발하고 있는 패키지 혹은 클래스 혹은 메소드에 한해서만 로그를 남길수 있습니다.
설정의 방법은 아래의 내용을 참조하세요.

[예약된 기호들]*..* : 모든 패키지를 의미합니다, * : 모든 클래스를 의미합니다, (..) : 모든 메소드들을 의미합니다
View Appointed Package의 값을 *..*.*.(..)로 입력한다면 실행 되고있는 모든 SQL로그가 보여질 것 입니다.
parttern 1 : *..*.*.(..) (모든 로그가 보여집니다.)
parttern 2 : net.*..*.*.(..) ('net'으로 시작되는 패키지 하위의 SQL모든 클래스의 로그가 출력됩니다.)
parttern 3 : *..*.Package_name.*..*.*.(..) ('Package_name'이 중간에 포함된 패키지의 로그가 보여집니다.)
parttern 4 : *..*.Package_name.*.(..)('Package_name'으로끝나는 모든 패키지의 로그가 보여집니다.)
parttern 5 : *..*.Class_name.(..) (클래스 이름이 'Class_name'인 곳의 로그가 보여집니다.)
parttern 6 : *..*.Package_name.Class_name.(..) (패지지가 'Package_name'로 종료되고 클래스 이름이 'Class_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 7 : *..*.Package_name.*..*.Class_name.(..) (패키지가 'Package_name'을 포함하고 있고 클래스 이름이 'Class_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 8 : *..*.Package_name.Class_name.Method_name (패키지의 이름이 'Package_name'로 종료되며, 클래스의 이름이 'Class_name'이고 메소드의 이름이 'Method_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 9 : *..*.Package_name.*..*.Class_name.Method_name (패키지의 이름이 'Package_name'을 포함하고 있고 클래스 이름이 'Class_name'이고 메소드 이름이 'Method_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 10 : *..*.Class_name.Method_name (모든 패키지에서 클래스 이름이 'Class_name'이고 메소드 이름이 'Method_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 11 : *..*.Package_name.*.Method_name (패키지 이름이 'Package_name'로 종료되고 메소드 이름이 'Method_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 12 : *..*.Package_name.*..*.*.Method_name (패키지 이름에서 'Package_name'를 포함하고 있고 메소드 이름이 'Method_name'인 곳의 SQL 로그가 출력됩니다.)
parttern 13 : *..*.*.Method_name (모든 패키지와 모든 클래스 중에서 메소드 이름이 'Method_name'인 곳의 SQL모든 로그가 출력됩니다.)
parttern 14 : net.sourceforge.log4sql.Class_name.Method_name (패키지가 'net.sourceforge.log4sql'이고 클래스 이름이 'Class_name'이고 메소드 이름이 'Method_name'인 곳의 SQL로그가 출력됩니다.)


p.$. : 아직 사용해 보진 않았다... 사용해야 하는데... 우선 간략하게 정리해본다... 쿠쿠... 시간나면 더 추가 ㄱ ~



반응형
반응형

PHP로 개발하는데, 혹시 디버깅(debugging)이라는 '용어'를 들으면 print_r()이나 var_dump() 함수가 가장 먼저 떠오르나? 그럼, 뭔가(?) 몹시 외롭게 사투하는 중일 가능성이 높다. PHP에서도 breakpoint를 설정해가면서 진짜 디버깅을 할 수가 있다. 이 대목에서 잠깐, breakpoint가 뭘까? 고개를 갸우뚱하는 사람은 정말 너무 오랫동안 PHP로 웹 개발만, 그것도 다른 개발자들과 담을 쌓고 혼자 살아왔을 가능성이 농후하다. 물론, 가난한 개발자여서 인터랙티브 디버깅(interactive debugging)이 가능한 Zend Studio와 같은 비싼 툴을 살 수가 없었기 때문일 수도 있다. 하지만 관심을 가지고 찾아봤으면 Zend Studio 외에도 삽질만 쫌 하면 구해서 쓸 수 있는 무료 툴들이 있었다. 대표적인 것이 바로 eclipse + xdebug 이다.

 

잠깐, 인터랙티브 디버깅(interactive debugging)의 장점을 생각나는 대로 메모해본다. 소스 코드에서 실행을 멈춰 보고 싶은 행에 중단점(breakpoint)을 설정할 수 있다. 그 지점에서부터 한 줄(행)씩 실행하거나 다음 중단점까지 실행하거나 할 수 있다. 그 와중에 모든 변수들의 값을 관찰할 수 있다. 따로 print_r()이나 var_dump() 함수로 변수값을 화면이나 로그 파일로 찍어내지 않아도 된다. (-> 프로그램 코드가 아주 깨끗해진다.) 마치 비디오 판독작업을 할 때처럼 순간 정지나 슬로비디오로 천천히 들여다 볼 수 있다. 이 기능의 위력을 알게 되면 그동안 print_r()과 var_dump()에만 기대어 살아온 날들이 허무하고 억울하게 느껴지게 된다. 이제부터라도 사용해보도록 하자.

 

Xdebug를 사용하려면, (1) 서버측에서의 설정과 (2) eclipse에서의 설정, 두 가지가 모두 필요하다.

 

 

1. 서버측 설정 : XAMPP

 

윈도 PC에서 apache/mysql/php 서버 환경을 간단하게 구축할 수 있도록 해주는 통합 패키지 xampp의 설치 및 설정은 다음 글 참조.

 

2009년 8월 6일 현재 XAMPP 최신 버전은 1.7.1 임. 기존의 1.6.x 버전대와 몇 가지 달라진 점 때문에, Xdebug 설정이 조금 혼란스러워 졌음. 과거의 방법들은 잊고, 새로운/더 쉬운 방법만 기억하자.

 

XAMPP 1.7.1 버전에는 xdebug 모듈이 이미 포함되어 있다. xampp\php\ext 디렉토리에 가면 php_xdebug.dll 파일이 있다. 실제로 xdebug 배포 사이트에 가보면, 대체 어떤 파일을 골라서 가지고 와야 하는지, 정말 어수선하고 혼란스럽고 헷갈리고 그래서 급기야 짜증모드로 돌진하게 되곤 한다. 다행인지 XAMPP 패키지에는 이미 적합한 놈이 들어있다. (혹시 참을성에 자신있으신 분은 xdebug 사이트로 가서 적합한 놈을 찾아보시길… http://www.xdebug.org 농담임. 괜히 고생함.)

 

중요한 설정작업: php.ini

 

XAMPP php.ini 파일은 xampp\php 디렉토리 밑에 있다. 그 파일을 열어서 xdebug 관련 부분을 설정해준다.

처음에는 아래와 같이 되어 있다.

 

 

위 부분에서 [Zend] 섹션은 모두 코멘트(;)로 막아준다. 그리고, 아래 [XDebug] 섹션은 모두 코멘트 해제한다.

 

 

xdebug는 Zend Optimizer와 함께 사용할 수가 없다. 보통 디버깅은 테스트 서버에서 수행하게 되므로, 특별히 Zend Optimizer가 없다고 해서 특별히 문제가 생기지는 않을 것이다. 만약 LIVE 서버(실 운영서버)라면 xdebug 모드는 접는 게 좋겠다.

 

주의사항: xdebug 관련 내용을 php.ini 파일에서 찾아보면 위 부분외에도 extension 지정하는 부분이 하나 더 나온다. 기본적으로는 코멘트로 막혀있다. 이 부분은 굳이 풀어주지 않아도 된다. 만약 이 부분을 풀어준다면, Warning 이 뜬다. 물론, eclipse에서 디버깅도 안된다.

   

[추가사항: 2009년 8월 13일]

2009년 8월 10일, XAMPP 1.7.2 버전이 새로 나옴. 패키지에 포함된 PHP 버전도 5.3.0으로 올라가고, Xdebug 모듈도 2.0.5로 올라갔다. 특히, php.ini 에서 xdebug 설정해주는 방법이 몹시 간단해졌다.

   

xdebug 설정을 위해 해줄 작업은 단 한줄의 코멘트를 제거해주는 일로 줄었다.

   

   

이것만 해주면, 아래와 같이 XDebug가 먹힌다.

   

   

추가사항 끝~

   

Xdebug 설정 전에는 php -v 명령을 실행하면 아래와 같이 나온다.

 


 

php.ini 설정을 완료하면, 아래와 같이 "with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans" 문구가 보인다.

 

 

모든 게 정상적으로 잘 설정되면, 아래 링크를 눌렀을 때 웹 페이지에서도 아래와 같은 이미지가 보인다. php.ini 파일을 수정했으므로 물론 아파치 서버는 stop시켰다가 새로 start 시켜야 한다.

 

 

뭔가 잘못되었으면, 아래와 같은 이미지가 보인다. "with Xdebug.." 메시지가 없다.

 

 

재미있는 것은 뭔가 잘못된 와중에도 아래와 같이 phpinfo() 출력값의 xdebug 섹션에는 관련 값들이 잘 보이는 경우가 있다.

 

 

이것은, 설정값은 적용되었지만, 정작 중요한 php_xdebug 모듈이 올라가지 않은 상황이다. php.ini 파일의 중간 부분에 있는 ; Windows Extensions 의 extension=php_xdebug.dll 설정라인이 코멘트로 잘 막혀있는지를 다시 확인해보자. 이걸 코멘트 해제하고 밑에서 [XDebug] 섹션도 코멘트 해제하면 서로 충돌해서 안된다. 이건 건들지 말자!

 


 

 

2. eclipse에서의 설정

 

eclipse galileo 버전(3.5)에서는 사실 특별히 뭔가를 새로 설치해주지 않아도 된다. (얼마나 편해졌는지… 혹시 예전 버전에서의 설정법을 알고 싶다면, 이 링크 참조. Eclipse 에 XDebug 플러그인 추가하기)

 

Xdebug를 위해 eclipse에서 해줘야 할 설정작업은 다음과 같다. 좀 많은 건 사실이다.

 

2.1. 우선 eclipse 에서 PHP Project를 하나 만든다.

 

웹 서버와의 연동을 테스트할 것이므로 웹 서버 document_root인 htdocs 밑에 디렉토리가 위치하는 PHP Project를 만드는 게 좋겠다.

 

 

아주 간단한 테스트 파일을 하나 만들자.

 

echo.php

<?php

$w = "hi, ";
echo $w;

$w = $w . "world...<br>\n";
echo $w;

$sum = 0;
for ($i=0; $i<10; $i++) {



$sum = $sum + $i;



printf("%d \t = \t%d <br>\n", $i, $sum);
}

 

 

2.2. Window->Preferences:: PHP ?> PHP Server 설정

 

 

위의 Default PHP Webserver 항목을 더블 클릭으로 누르거나 'Edit' 버튼을 눌러서 아래 화면을 띄운다.

 

 

그 다음 'Path Mapping' 항목을 눌러서, 값을 설정해준다. 웹 서버에서의 경로와 Eclipse 워크스페이스에서의 경로를 서로 맞춰주는 과정이다.

 

 

완료되면, 아래와 같이 보인다.

 

 

 

2.3. Window->Preferences:: PHP ?> PHP Executables 설정

 

 

php.ini 파일의 설정이 잘되었다면, 위와 같이 'Search' 버튼을 눌러서 XAMPP 설치 디렉토리를 지정하고 PHP 실행파일을 검색해본다. 만약 잘 찾았으면 아래와 같이 내용이 짠하고 나타난다.

 

 

만약 자동검색으로 잘 못찾으면, 'Add' 버튼을 눌러서 하나씩 지정해줘도 된다. 자동검색으로는 Zend Debugger 타입만 검색된다. XDebug 타입을 아래와 같이 'Add'해줘야 한다.

 

 

 

2.4. Window->Preferences:: PHP ?> PHP Debug 설정

 

PHP Debugger 타입을 XDebug로 바꾸면, 자동으로 밑의 PHP Executable도 바뀐다.

 

 

이제 대충 설정하는 작업은 마쳤다.

 

 

3. 실행해보기

 

3.1. Script로 디버깅하기

 

메뉴에서 벌레모양 아이콘의 화살표 부분을 누르고 Debug As ?> PHP Script 항목을 누른다.

 

 

퍼스펙티브를 바꿀려고 하는데 맞냐고 아주 친절하게 물어온다. 맞다고 해준다.

 

 

짜잔~ 드디어 디버깅 화면이 보인다.

 

 

위 화면에서 (1)은 중단점(Breakpoint)이다. 디폴트로 1st line이 자동으로 중단점이 된다. 만약 다른 라인에도 중단점을 주고 싶으면 편집창 왼편의 회색부분을 2번 클릭하면 된다.

 

위 화면의 (2)는 변수값을 관찰할 수 있는 영역이다. 현재는 모든 변수값이 초기화되기 전이므로 <Uninitialized>로 나타난다.

 

위 화면의 (3)은 컨트롤 버튼이다. Step Into(F5)는 한 라인씩 진행하되 함수 안으로까지 추적해들어가는 명령이고, Step Over(F6)는 함수를 만나면 안으로 들어가지 않고 그냥 한 라인으로 생각하고 다음 라인으로 넘어간다.

 

 

4행까지 진행한 결과가 위 화면이다. 변수값 $w의 값이 바뀌었고, Console과 Debug 창에 echo $w 결과값이 나타나 있다.

 

그 이후 과정도 이런 식이다. 한 줄씩 실행하면서 관련된 변수값의 변화를 관찰하는 것이다.

 

3.2. Web Page로 디버깅하기

 

메뉴에서 벌레모양 아이콘의 화살표 부분을 누르고 Debug As ?> PHP Web Page 항목을 누른다.

 

 

 

로컬서버인 xampp에서의 경로가 맞는지를 확인하는 창이 아래와 같이 뜬다.

 

 

다시, 친절하게 물어본다. 퍼스펙티브 바뀌는 게 맞냐고? 맞다고 해준다.

 

 

짜잔… 다시 디버깅 화면이 뜬다.

 

다른 건, Script 디버깅 모드와 동일한데, 아래와 같이 웹 브라우저가 뜨면서, 뭔가를 기다리는 모양새가 된다. 현재의 예제는 PHP 코드의 끝까지 실행되어야만 화면에 출력되므로, 사실 디버깅이 끝날 때까지 웹 브라우저는 그냥 계속 기다린다.

 

 

 

4. 보충

 

4.1. eclipse Run/Debug Configurations 화면에 대한 오해

 

처음 eclipse의 Debug Configurations 화면을 보면서, 잠시 막막했던 적이 있다. 아니, 매번 하나씩 이렇게 설정을 New해서 만들어줘야 하나? 그걸 귀찮아서 어떻게 해!!! 그랬다.

 

 

아래 화면처럼 하나씩 직접 입력해서 만들어줘야 하는 줄 알았다. 오해였다. 착각이었다. 이클립스가 그렇게 허술하고 불친절한 툴이 절대 아니다.

 

 

 

그냥, 아래와 같이 Rus As ?> PHP Script / PHP Web Page 를 선택해서 실행해주면 된다. 한 번 실행된 것은 자동으로 Configuration으로 만들어져서, 아래 그림에서와 같이 'echo' 'echo web'이라는 이름으로 빠른 실행이 가능하게 메뉴에 나타나게 된다.

 

 

 

 

 

4.2. Web Page 디버깅시 웹 브라우저가 뜨는 게 귀찮다면? Internal Web browser를 사용!

 

Window->Preferences: General->Web Browser에서 아래와 같이 선택한다.

 

 

그럼, 아래와 같이 디버깅이 마지막 라인까지 도달하면, Internal Browser의 출력값을 확인할 수 있다.

 

 

 

4.3. 참고한 문서들

 

 

 

 

 

 

 

반응형

'Language > PHP' 카테고리의 다른 글

플레쉬 차트 (OFC2JS) - Table2Chart  (0) 2010.01.19
정규표현식 테스트 필요할 때 보조 프로그램  (0) 2010.01.19
PHP 정규표현식  (0) 2010.01.18
XAMPP 설치 가이드  (0) 2009.12.28
xampp  (0) 2009.12.28

+ Recent posts