[SQL / OUTER JOIN] 데이터가 없을 경우 0으로 표시하는 쿼리

Posted by taeho Tae-Ho
2013.04.15 18:37 Web/DB/Dev

두개의 테이블을 Join 할 때 기준이 되는(코드) 테이블을 기준으로 join 하는 테이블(데이터)에 데이터가 없을 경우 inner join을 사용하면 기준이 되는 테이블의 행이 표시되지 않는다. 이 때 데이터가 없을 경우 0으로 표시하고 싶다면 outer join을 사용해야 한다.

예를 들어 특정 문자열이나 에러코드, 감사로그 코드의 일별 통계를 뽑을 때 한건도 없는 경우 일반적인 Inner Join을 하게 되면 건수가 0인 날짜는 출력되지 않는다. 이럴 때 해당 일자에 0건으로 출력되도록 하는 경우에 outer join을 사용할 수 있다.

다음의 두 테이블에서 예를 들어 설명하면...


table name : t_student 
no      name
 01      홍길동
 02      김철수
 03      이영희 


table name : t_score
code  subject grade 
 01      math      A
 01      social    A
 02      math      C
 03      social    B
 03      english  A

위의 테이블에서 아래의 결과처럼 각 이름별로 등급이 'A' 인 갯수를 구하고 A가 없는 학생의 경우 0 으로 출력하고자 한다면 어떻게 해야할까?

SELECT A.no, A.name, count(B.grade)
from t_student as A left join t_score as B on A.no = B.no
where B.grade = 'A' group by A.no;

로 하면 될 듯 하지만 안된다. -.-  0으로 출력되기를 원했던 학생들은 하나도 출력되지 않는다.
아~ 좌절했다... 시간이란... 알고 있다고 생각했던 것도 모두 지워버리는 매우 특별한 능력을 갖고 있다. 하지만 인간의 뇌는 잊었던 것을 다시 공부하면 훨씬 빠르게 되살릴 수 있는 능력 또한 갖고 있다.


Join,inner join, outer join




이런 저련 자료를 찾다보니 outer join 할 때 데이터가 있는 테이블에 WHERE 절로 조건을 주면 안되고 sub query를 써서 FROM 절에서 걸러내고 걸러낸 데이터셋에 outer join을 걸어야 한다는 이야기가 있었다.

즉... 위의 SQL은 아래와 같이 바뀌어야 한다는 이야기다.

SELECT  A.no, A.name, count(B.grade) 
FROM t_student as A LEFT OUTER JOIN (
SELECT no, COUNT(grade) AS grade 
 FROM t_score 
WHERE grade = 'A' 
GROUP BY no) as B on (A.no = B.no)
GROUP BY A.name



신고
이 댓글을 비밀 댓글로
  1. 내가 작성해 놓은 포스트를 내가 다시 검색해서 찾았을 때의 느낌은 참....묘하다..ㅋㅋ

톰캣 2개 설치 후 세션 정보 (JSESSIONID) 가 꼬이는(?) 문제

Posted by taeho Tae-Ho
2012.04.18 15:48 Web/DB/Dev

윈도 서버의 IIS와는 달리 Java 가상머신 위에서 구동되는 톰캣은 하나의 머신에 여러개가 설치되어 각각 구동될 수 있다. 특히 윈도서버에 설치되는 이런 저런 솔루션들은 톰캣과 JDK를 내장하고 웹서비스를 제공하는 경우가 있다. 이런 경우 JDK와 톰캣이 2개 이상 동시에 구동된다.

톰캣은 기본적으로 TCP/8080 포트로 웹서비스를 제공한다. 두개를 설치하였다면 둘중 하나의 서비스 포트를 8080 이외의 다른 포트번호로 변경하여 주면 두개의 톰캣이 각기 다른 JDK를 이용해 구동되는 것이 가능하다.

하지만 여기에서 문제가 발생하는 경우가 있다. 각각 다른 웹서비스인 두개의 톰캣은 사용자 로그인(웹 서비스 로그인) 세션관리를 위해 JSESSIONID라는 세션쿠키(?)를 사용한다. 그런데 서로 다른 JDK에서 구동되는 두개의 톰캣이 이 JSESSIONID라는 세션쿠키를 공유한다라는 조금은 이해가 안되는 문제가 발생한다. (지금도 왜 이렇게 만들었는지 이해가 안감... -.-)

즉, A와 B 두개의 톰캣이 설치되어 있을 때 C라는 PC에서 웹서비스 A와 B에 각각 다른 사용자 계정으로 로그인하면 먼저 로그인한 A라는 톰캣의 웹서비스에 로그인한 세션이 풀려 다시 로그인 페이지로 연결되는 문제가 발생하는 것이다.

톰캣에 대한 지식이 부족한 나에게 이 문제는 조금은 커다란 벽(?)처럼 느껴졌다. 한회사에서 만든 두 제품이 각기 다른 버전의 JDK를 사용해야만 하도록 한 것이나, 두개의 전혀 다른 성격의 제품을 하나의 서버에 설치하지 않기로 했다(누구 맘대로???)는 개발팀 스스로의 결정(?)을 보며 참 답답함을 금치 않을 수가 없었다.

결국... 스스로 문제의 해결책을 찾아야 했다..(목마른 자가 우물을 파는 법~~)

방법은 톰캣의 환경설정에서 그리 어렵지 않게 찾을 수 있었다. 톰캣에서 사용하는 JSESSIONID의 이름을 바꿔주면 된다는 아주 단순하고 쉬운 방법이었는데, 톰캣 왕초보인 필자는 도대체 어디에서 어떤 방법으로 설정을 바꿔줘야하는지를 찾는데 시간이 좀 걸렸다.

그 방법을 간단히 소개하고 포스트를 마무리 한다.


1. 톰캣 실행파일 (tomcat6w.exe)를 찾아 실행한다.

톰캣이 설치된 경로의 bin 폴더에 가면 아래와 같이 tomcat6w.exe라는 실행파일을 찾을 수 있다. 이 파일을 찾아 실행한다.

2. Apache Tomcat 6 Properties 창이 실행되면 java 탭으로 이동하여  Java Options: 부분에 아래 적색 박스의 내용을 입력한다. 이때 JSESSIONID 의 이름을 적색박스의 내용 처럼 다른 이름으로 지정해 주면 된다. (오타 주의!!!!)

즉, SESSION_COOKIE_NAME과 SESSION_PARAMETER_NAME의 기본값이 JSESSIONID를 다른 이름으로 변경해주면 된다는 결론에 도달하게 된다. 두개의 톰캣을 운영중이라면 서비스에 등록된 톰캣의 설정을 변경해주는 것이 편하다 하겠다.


다음에는 두개의 톰캣을 서비스관리자에 등록하는 방법을 찾아야 할 듯 하다.



신고
이 댓글을 비밀 댓글로
    • 초보웹개발자
    • 2013.11.28 13:21 신고
    안녕하세요?
    JAVA기반 초보 웹 개발자입니다.
    현재 저희 회사에서도 JSESSIONID때문에 논의가 이어졌는데요,
    다름이 아니라, 솔루션에서 필요한 쿠키를 자체 생성하기 때문에 그 외의 쿠키인 JSESSIONID 쿠키를 삭제하란 지침이 내려왔습니다.
    혹시, 톰캣에서 말고, JSP에서 JSESSIONID가 생성 안되게 할 수 있는 방법은 없나요?
    알아본 바로는 저것을 없애면 session기능을 아예 못쓰게 된다는 말도 있는데, 검색을해도 당췌 나오질 않습니다. 관련 포스팅이나, 책자가 있다면 가르침 청해도 될런지요?
    • 에구..전 개발자는 아니고 취미삼아 조금씩 코딩하는 수준의 사람입니다.
      세션과 쿠키는 모두 웹페이지와 서버가 정보를 공유하고 서로에게 전달하기 위해 사용되는 것인데..
      한번 참고해보세요.
      https://groups.google.com/forum/#!topic/ksug/7Cn16nBjlrU

[제로보드/XpressEngine 설치] gd 라이브러리 설치와 mod_rewrite 문제

Posted by taeho Tae-Ho
2012.02.07 15:41 Web/DB/Dev

오랫만에 PHP 용 게시판의 대명사 제로보드를 설치할 일이 생겼다. 일 때문이라기 보단 그저 궁금함..?? 때문이기도 했다. 제로보드에서 XpressEngine으로 이름을 바꾸고 네이버의 탈(?)을 쓰긴 했지만 오픈소스를 유지하며 계속 버전업이 되고 카페모듈까지도 지원이 되니 개발에 취미가 없는 나 같은 사람에게는 딱~좋은 무료 게시판 소스다.
그저 감사히 사용할 따름이다.

UTF-8 캐릭터셋을 지원하는 리눅스 서버에 http://www.xpressengine.net 에서 다운받은 xe.tar를 올려놓고 (zip으로 제공한다.) tar를 해제한 뒤 http://IPAddress/xe 와 같이 브라우저로 접근한다. (DocumentRoot의 xe 디렉토리 아래에 압축을 해제한경우)

설치하다보니... 이런... GD 라이브러리가 사용 불가능하단다.



gd 라이브러리 설치하려고 http://ftp.daum.net/centos 로 가서 최신 gd-devel 패키지를 받아 설치하니 이런... 뭐 이렇게도 디펜던드한 패키지가 많은지.. -.- 디펜던시가 있는 패키지를 받아 설치하려하면 또 다른 패키지가 필요하고...그래서 그냥 다음과 같이 yum 으로 업데이트를 했다.

# yum -y install gd gd-devel


그리고 나서 하나더... 빼먹은 것을 설치 했다.. 바로 php-gd... 위에서 한꺼번에 설치해도 된다.

# yum install php-gd


설치가 완료된 뒤 다음과 같이 gd 관련 패키지가 설치되어 있다면 gd 모듈 관련 XpressEngine 설치 문제는 사라지고 설치가 잘 진행된다.


다시 XpressEngine의 설치를 진행하면 gd 관련 오류가 사라진 것을 확인할 수 있다.


XpressEngine을 설치하고 나면 관리 페이지 접속으로 접속이 된다. 이 때 접속되는 페이지의 URL.은 다음과 같이 URL이 단축되어 접속을 시도하게 된다.

http://IP-Address/xe/admin

그런데 이 URL로 접속을 시도하면 404 Not Found가 뜨는 경우가 발생하였다.


단축되기 전의 URL로 접속하여 정상적으로 접속된다면 아파치의 mod_rewrite 모듈이 정상동작하지 않거나 설치되어 있지 않기 때문이다.


이 mod_rewrite 모듈의 설치 여부를 확인하기 위해서는 다음과 같이 아파치 웹서버의 설정파일인 httpd.conf 를 열어 mod_rewrite.so 모듈이 LoadModule 라인에 추가되어 있는지 확인하면 된다.

만약 위와 같이 포함되어 있는데도 단축 URL로 접속이 안된다면 다음과 같이 httpd.conf 파일의 아랫 부분을 확인하여야 한다. 확인해야 하는 섹션은 아파치 웹서버의 DocumentRoot 경로의 접근 권한을 설정하는 부분이다.

아래의 두 부분 중 아랫부분을 다음과 같이 수정해주면 된다.

DocumentRoot의 물리적 경로에 해당하는 <Directory "/var/www/html"> 섹션의 AllowOverride None
AllowOverride All 로 변경해주어야 한다.


None 을 All 로 수정하고 저장한 뒤 아파치 대몬을 재구동하여야 한다.
아파치를 재구동 한 뒤 http://IP-Address/xe/admin 으로 접속하면 잘 접속이 된다.


 

신고
이 댓글을 비밀 댓글로
    • 데벨
    • 2012.05.15 22:08 신고
    감사합니다!

JSP의 통합 개발환경 "이클립스"를 다시 깔다.

Posted by taeho Tae-Ho
2012.01.14 13:56 Web/DB/Dev

처음 Java를 공부했던 2000년 즈음에는 쓸만한 java 개발환경을 지원하는 IDE가 없었다. 비주얼베이직이나 비주얼C는 훌륭한 개발환경을 Microsoft에서 제공하기 때문에 "자바는 뭐 이따위야..."라는 생각을 했었던 기억이 있다.

하지만 10여년이 지난 지금 Java 언어는 이제 개인홈페이지에도 쓰일 만큼 대중화가 되었고 대부분의 엔터프라이즈 급 어플리케이션 개발 프로젝트의 대부분에 주요 언어로 사용되고 있다. 그리고 여러 Java 개발환경 지원도구들도 개발되어 많은 개발자들의 개발을 도와주고 있다.

비록 지금은 개발분야의 일을 하고 있지는 않지만 이따금씩 코딩이 필요한 경우가 있다. 엔지니어 조직을 관리하면서 기술업무를 병행하기 위해 만들었던 프로젝트관리 및 엔지니어 일정관리(http://cybercafe.tistory.com/9) 페이지와 심심해서(?) 만들어본 개인 일정관리(http://cybercafe.tistory.com/197)가 그런 예라고 할 수 있다. 이 두 웹페이지는 Apache-PHP-Mysql 기반으로 만들었다. 아무래도 Java 보다는 PHP가 더 쉽기(?) 때문이다.

하지만 두 웹페이지의 일정을 구글 캘린더와 연동해 보고 싶다는 생각이 퍼뜩~~들었다. 그래서 방법을 찾아보니 역시.. PHP의 경우 구글이 공식적으로는 지원하지 않고 있는 듯 하다. 서드파티 개발업체에서 제공하는 모듈을 사용해야 한다고 한다. 반면에 JSP의 경우 구글에서 공식적으로 지원하고 있고 연동방법도 더 쉬운 듯 하다.

결국 미루고 미루었던 두 웹사이트의 JSP 버전으로의 포팅을 시작할 때가 된것 같다. 그래서... 안드로이드 프로그래밍을 맛보기 위해(http://cybercafe.tistory.com/200) 설치했었던 이클립스를 다시 설치했다.


짧은 자바 지식으로 과연 포팅에 얼마나 시간이 소요될지 ....
나이먹고 쫌스러운 코딩을 해야하는게 버겁긴 하지만 일정관리와 구글캘린더 연동을 꼭 시켜보고 싶으니 어쩔 수 없다.

가자..!!!

신고
이 댓글을 비밀 댓글로

Apache, PHP, MySql 환경에서 한글저장 시 깨질때 확인할 것들...

Posted by taeho Tae-Ho
2011.09.20 10:49 Web/DB/Dev
2 byte 코드를 사용하는 한글을 데이터베이스에 저장할 때 DB의 잘못되어 있는 캐릭터셋 설정은 많은 개발자와 DBA에게 혼란을 야기한다. 아주 오래전 신입사원시절에 Ingres라는 DB의 기술지원을 할 때도 가끔 한글코드가 잘못 지정되어 있어 DB를 업그레이드하거나 다른 서버로 마이그레이션할 때 불편함을 겪곤 했다.

그리고 15년이 지난 요즘...취미삼아 붙잡고 있는 Apache, PHP, MySql 의 환경에서도 여전히 DB의 한글코드 문제는 이따금씩 발생하곤 한다.

예를 들자면 웹페이지의 한글은 정상적으로 깨지지 않고 표시되는데 웹페이지를 통해 DB에 한글을 저장하고 다시 웹페이지에서 불러오면 DB에 저장한 한글데이터가 깨져보이는 현상이 대표적인 "한글깨짐" 증상이다.

이때 확인해야할 것은

1. 웹브라우저의 캐릭터셋.
2. 웹서버의 캐릭터셋.
3. 데이터베이스 서버의 캐릭터셋.
4. 생성되어 있는 데이터베이스의 캐릭터셋.
5. DB에 접속하는 세션의 캐릭터셋.

크게 4가지라 할 수 있다.

이 네가지 캐릭터셋 설정 중 어느하나가 다른 세개와 다르게 설정되어 있다면 여러가지 증상이 발생할 수 있다. DB에는 정상적으로 저장되는데 웹페이지에서 조회하여 보면 깨져있거나, 웹브라우저 화면에선 정상적으로 DB에 저장되어 있는 것 처럼 보이는데 DB의 쿼리툴에서 조회해보면 깨져서 저장되어 있을 수도 있다. 초심자로서는 잘 이해되지 않는 경우일 수도 있다.

즉, 클라이언트인 웹브라우저의 캐릭터셋부터 DB에 접속하는 세션의 캐릭터셋, 그리고 데이터베이스서버와 데이터베이스 생성시 지정되는 캐릭터셋, 마지막으로 테이블 생성 시 지정된 캐릭터셋이 일관되게 설정되어 있어야만 어떠한 환경에서 저장, 조회하더라도 문제가 발생되지 않는다.

 

먼저 웹브라우저의 캐릭터셋을 보자.

웹브라우저의 캐릭터셋은 서버에 저장되어 있다가 웹브라우저가 호출하는 웹페이지의 소스에서 설정할 수 있다.


meta 태그로 설정되는 charset = "utf-8" 부분이 바로 웹브라우저가 해당 웹페이지를 호출했을 때 설정할 브라우저의 캐릭터셋이다.

다음은 웹서버의 캐릭터셋이다.


아마치의 경우 httpd.conf 파일에서 'AddDefaultCharset' 파라미터에서 캐릭터셋을 설정할 수 있다. 기본적으로 utf-8을 지원하는데 이부분은 특별히 건드리지 않아도 utf-8이나 euckr을 처리해 주는 것 같다. 아직까지는 웹서버의 캐릭터셋으로 인해 DB에 저장되는 데이터의 캐릭터셋 오류는 보지 못했다.
(난 현재 웹이나 DB엔지니는 아니므로 경험부족일지도 모른다.. -.-)

세번째는 데이터베이스 서버의 캐릭터셋 설정이다.

mysql의 경우 이부분이 참 복잡했다. 한글이 깨지는 경우 대부분 서버의 캐릭터셋 환경과 생성된 DB의 캐릭터셋이 틀린 경우인것 같은데 또 꼭 그렇지만도 않은 듯 하다.

먼저 서버의 캐릭터셋 환경을 보면...


왜인지는 모르겠지만 character set client와 character set connection의 Global value가 latin1 으로 되어 있다. 이 의미는 클라이언트 프로그램 즉 브라우저를 통해 DB에 저장할 데이터를 전달받은 아파치 웹서버가 DB에 세션을 맺을 때 특별한 캐릭터셋을 지정하지 않으면 latin1 으로 캐릭터셋을 지정한다는 의미다.
한글은 2바이트 코드이고 latin1은 1바이트 코드다. 따라서 2바이트인 한글을 쪼개서 저장하면 당연히 깨져서 저장이 될 수 밖에 없다. 만약 이런 환경이라면 아무리 데이터베이스를 euckr 이나 utf8로 생성하더라도 클라이언트를 통해 커넥션을 맺고 한글을 저장하면 깨져서 저장될 수 밖에 없다.

네번째, 데이터베이스의 캐릭터셋 설정


각 데이터베이스마다 사용할 캐릭터셋을 다르게 지정할 수 있다.

마지막으로 문제해결의 키를 가진 DB 접속 세션의 캐릭터셋...

DB에 접속하는 세션의 캐릭터셋을 잘 이용하면 한글깨짐의 문제를 해결할 수 있다. 하지만 그 전에 앞에서 설명한 mysql 서버의 캐릭터셋 환경을 utf8로 통일시켜주는 것이 가장 좋은 방법이라는 점을 명심해야한다. mysql의 소스를 가져다 컴파일하여 설치할 때 컴파일옵션에 캐릭터셋을 utf8로 설정하는 것이 가장 좋은 방법이다.

하지만 오래전부터 운영하던 mysql 서버라면 쉽게 서버의 캐릭터셋을 변경할 수는 없을 수도 있다. 이런 경우 mysql 서버의 캐릭터셋 환경이 어떻든 간에 DB를 용도에 따라 euckr 혹은 utf8로 생성하고 각각의 db를 사용하는 웹페이지 소스에서 meta 태그를 이용해 euckr 혹은 utf8로 페이지의 캐릭터셋을 지정할 수 밖에 없다.

그리고 각 db에 접속하는 mysql_connect() 함수가 포함된 소스페이지에서 db에 접속한 세션의 캐릭터셋을 각각 euckr 혹은 utf8로 설정하여 사용할 수 있다.


위의 mysql_query('set names utf8') 함수를 실행하면 접속한 DB세션의 캐릭터셋이 utf8로 설정되고 MySql 서버의  character set client와 character set connection 환경변수보다 우선하게 되어 한글이 깨지지 않고 저장/조회된다. 만약 euckr로 설정하고자 한다면 다음과 같이 utf8 대신 euckr 을 지정하면 된다.

mysql_query('set names euckr');

물론 웹브라우저에서 한글이 깨지지 않도록 php 파일 자체의 캐릭터셋을 utf8 혹은 ansi 코드 중 하나로 저장하는 것도 중요하다. 만약 php 파일 자체의 코드를 맞추지 못하면 DB에서 조회한 데이터뿐만 아니라 HTML 내의 한글도 모두 깨지게 되므로 주의가 필요하다.

2011년 9월의 조금 흐린 어느날.....




신고
이 댓글을 비밀 댓글로

[Solaris 10 x86] Apache2 + PHP5 + mysql5 (APM) 설치하기

Posted by taeho Tae-Ho
2011.07.01 21:18 Web/DB/Dev

어제부터 끙~끙~대던 협력사 엔지니어 교육 준비....
내가 하기로 했던 교육을 류과장에게 부탁했는데... 벌을 받은 듯... APM이 설치된 Solaris10 vmware 이미지가 말썽을 부리기 시작했다. 이유없이 TTY 모니터링도 동작을 안하고 이런 저런 오류도 발생하고.... 그동안 별의별 짓을 다하며 잘 부려먹었는데 드디어 탈이 난 모양이다.

그런데....

백업해둔줄 알았던 APM 설치된 Solaris10의 VMWare 이미지가  없다... -.- 이런 낭패가....
아무리 백업 디스크를 뒤져봐도 없다. APM이 설치 안된 Solaris10은 있는데 APM이 설치된 Solaris10은 없다. 설상 가상 SunFreeWare에서 패키지를 다운받아 pkgadd를 실행하는데 통... 설치가 안된다. 분명 전에도 그렇게 설치했던 것 같은데 안된다. 환장할 노릇이다... T.T

에러메시지는 다음과 같다.

WARNING: Stale lock installed for pkgadd, pkg <pkage-name> quit in initial  state. Removing lock.

이 에러가 발생하여 /var/sadm/install 디렉토리에 생성되는 . 으로 시작되는 lockfile을 지워주고 pkgadd를 해도 설치가 되지 않는다. 결국 Solaris 10 x86에서 발생하는 이 에러메시지는 운영체제의 버그로 판단된다. 그래서 Apache 소스를 다운받아 컴파일하려 했지만 그 역시도 configure가 되지 않는다. C++ 프리프로세서가 없어 에러가 난다. 에이...

그래서 www.oracle.com 에서 Solaris 10 x86을 다시 다운로드 받아 VMWare player 3.1에서 다시 이미지를 만들었다. 그리고 다음의 과정을 거쳐 APM을 설치 했다.

http://www.sunfreeware.com 에서 다음의 패키지를 다운받아 서버에 업로드 하고 gzip 명령으로 압축을 푼다.


Apache 2.0.59 와 PHP 5.2.1 그리고 MySQL 5.0.67을 제외한 나머지 패키지를 먼저 설치하는 것이 좋다. 세개를 제외한 나머지는 APM이 구동되는데 필요한 의존성을 갖는 패키지들이다.

설치 명령은 다음과 같다.

pkgadd -d ./<package-name>

즉 pkgadd -d ./zlib-1.2.5-sol10-x86-local 과 같이 명령을 수행하여 설치한다.

Apache 2.0.59 를 설치한 뒤에는 두가지를 고쳐주어야 한다.

1. /usr/local/apache2/conf의 httpd-std.conf 를 httpd.conf 로 복사한다.
2. httpd.conf 파일을 vi로 열어 "Group -1"을 찾아 "Group nobody" 로 변경해준다.

PHP 5.2.1 을 설치한 뒤에는 다음의 작업을 수행한다.

3. httpd.conf 파일을 vi로 열어 다음의 두줄을 추가한다.
    LoadModule php5_module modules/libphp5.so
    AddType application/x-httpd-php .php


아파치 구동은 /usr/local/apache2/bin/apachectl start  명령으로 수행한다.

다음은 phpinfo() 를 수행한 결과다.



   
신고
이 댓글을 비밀 댓글로
    • 김진아
    • 2013.09.24 04:45 신고
    으아~~~~~~ 벌써 새벽 5시가 다되어가네요ㅜㅜ 솔라리스 이것저것 만지다가 벌써 새벽이 ㅜㅜ
    솔라리스 웹서버 구축하는거 찾다가 들어와 보니 이사님 홈페이지가 똭!!!!!!
    이것저것 둘러보고 많이많이 배우고 갑니다 ~~~~~~~~!!!! 앞으로도 자주 들릴게요 좋은정보 부탁드려요!^^
    • 헉... 이 구석텡이 포스트까지 찾아오다닝.. ^^
      솔라리스10에 아파치와 PHP 구축???
      ㅎㅎ 도움이 됐을랑가 모르겠네...

안드로이드 개발환경 구축하기(JDK + 이클립스 + 안드로이드 SDK + ADT)

Posted by taeho Tae-Ho
2011.04.04 09:57 Web/DB/Dev

윈도 모바일 스마트폰을 사용할 때는 어플의 개발에 별 관심이 없었습니다. 윈도 모바일 자체가 워낙 불안정한데다 윈도의 개발환경과 별반 다를 바가 없기 때문이었죠. 헌데 안드로이드 운영체제와 IOS의 등장으로 모바일 기기 운영체제가 다양해지니 왠지 개발환경을 한번 경험해보고 싶어졌습니다. 그리고 모바일기기에서 실행되는 어플의 특징을 한번 살펴봐야겠다 싶었습니다.

그래서 안드로이드 개발환경을 한번 구축해보기로 했습니다.

= 기본적으로 필요한 것은 다음과 같습니다.

  * JDK
   * 이클립스
  * 안드로이드SDK

   이클립스에 플러그인 형식으로 설치되는 안드로이드 툴킷(ADT)는 이클립스를 설치하고 이클립스
   실행 후 인터넷으로부터 설치해도 되기 때문에 따로 파일을 다운로드 받아둘 필요는 없었습니다.

= 먼저 JDK를 다음의 사이트에서 다운로드 합니다.
  http://www.oracle.com/technetwork/java/javase/downloads/index.html 



= JDK에 추가로 설치할 안드로이드 SDK를 다음사이트에서 다운로드 한다.
  http://developer.android.com/sdk/index.html
  여기에선 install 버전이 아닌 zip 파일을 다운로드 받아 수동으로 파일을 복사합니다.



= 이클립스를 다음 주소에서 다운받는다.
  http://www.eclipse.org/downloads/packages/release/galileo/sr2

이클립스는 최신버전인 3.6 (Helios)도 있지만 여기에선 안정버전인 3.5 (Galileo) 를 다운받는다.


= 다운로드 받은 세개의 파일들. 파일 이름에 붙은 순서대로 설치를 진행하면 됩니다.




= 먼저 JDK를 설치합니다.
  설치 중 묻는 질문에는 그냥 기본으로 넘어갑니다. 설치 경로도 변경하지 않고 진행합니다.

= 다음은 Android SDK를 설치합니다. Java 개발환경에서는 설치의 개념이 그저 파일의 복사이기 때문에 궂이 Install 버전을 다운받지 않아도 됩니다. 다음과 같이 C:\android-sdk-r09-windows 폴더를 만들고 압축을 해제하면 끝입니다.



= 설치된 안드로이드 SDK 설치 매니저를 실행합니다. (SDK Manager.exe)
  처음실행하면 설치할 API를 보여줍니다. 아래의 Install 버전을 누르면 인터넷을 통해 API를 다운로드
  받아 설치합니다.


  만약 일부만 설치되었다면 Available Packages 메뉴에서 추가로 설치할 수 있습니다.
  
  안드로이드 2.2 프로요에서 구동되는 어플을 개발하기위해선 Android 2.2 SDK,  API 8 관련 항목을
  필수로 설치해야 합니다.
 

= 이클립스 설치

  이클립스도 설치는 그저 파일의 압축해제와 원하는 폴더로 복사하는 것이 설치의 전부입니다.
  다운로드 받은 이클립스 압축파일을 압축해제하여 C:\Eclipse 폴더로 복사합니다.
 



= 이클립스를 설치하고 나면 이클립스 설치 폴더 안에 eclipse.exe라는 실행파일이 있습니다.
   이제 eclipse.exe를 더블클릭하여 이클립스를 실행하고 ADT라는 Android Develpoment Toolkit 을
   설치해야 합니다.

   먼저 이클립스를 실행하면 개발하게되는 소스를 저장할 워크스페이스를 지정해야합니다.
   워크스페이스를 지정하고 나면 다음과 같이 이클립스 개발환경이 실행됩니다.
 



= 이제 ADT를 설치하기 위해 "Help" 메뉴 속에 있는 "Install New Software..." 메뉴를 선택합니다.
   다음과 같이 Install 창이 실행되면 오른쪽 위의 "Add" 버튼을 누릅니다.



= "Add" 버튼을 클릭하면 "Add Site" 창이 실행됩니다. 여기에 다음의 Name과 Location을 입력합니다.

    Name : ADT
    Location : https://dl-ssl.google.com/android/eclipse/

    주소를 입력하고 "Ok" 버튼을 클릭합니다.
    잠시 후 다음과 같이 설치 가능한 안드로이드 개발 툴킷의 목록을 보여줍니다. 모두 선택한 뒤
    "Next" 버튼을 클릭하면 다운로드가 가능한지 점검하고 다음과 같이 리뷰화면이 표시됩니다.


  "Next" 버튼을 클릭하면 라이센스 동의화면이 표시됩니다. 동의하고 "Finish" 버튼을 누르면 아래 화면
  과 같이 다운로드와 설치가 자동으로 진행됩니다.
  
  중간에 인증관련 창이 표시되는 경우가 있는데 대충 OK 해주고 넘어가면 됩니다.
  
  ADT의 설치가 완료되면 자동으로 이클립스가 종료되고 재구동 됩니다.


= 안드로이드 SDK와 ADT의 연동

   이클립스에 ADT (안드로이드 개발 툴킷)을 설치하고 나면 ADT가 안드로이드 SDK를 인식할 수
   있도록 안드로이드 SDK가 설치된 폴더를 알려주어야 합니다.

   이클립스에서 "Windows" 메뉴를 선택하고 하위의 "Preferences" 메뉴를 선택합니다.
   그리고 Preferences 창이 실행되면 오른쪽 창에서 "Android"를 선택합니다.
  


SDK Location에 Android SDK를 설치한 경로를 선택한 뒤 "Apply" 버튼을 누르면 설치된 Android SDK 2.2 항목이 보이게 됩니다. "OK"를 눌러 연동을 마무리 합니다.

= 완료됨.

이제 Android 어플을 개발하기 위한 개발환경은 모두 만들어졌습니다.
추가로 에뮬레이터를 생성하여 코딩한 어플을 실행해보는 환경도 만들 수 있습니다만....
에뮬레이터의 속도는 정말 느려서 에뮬레이터를 이용해 어플을 개발하는 것은 추천하지 않습니다.
안드로이드가 탑재된 스마트폰을 USB로 직접연결하여 코딩 중간중간 실행시켜보는 것이 훨씬 편하고 확실한 개발방법입니다.

시간이 되면 스마트폰을 USB 인터페이스를 이용하여 연동하고 코딩된 어플을 스마트폰에서 실행하는 방법에 대해서도 포스트를 올려보겠습니다.
 


신고
이 댓글을 비밀 댓글로
    • 이상한 사람중 하나
    • 2011.05.30 22:08 신고
    ㅠㅠㅠ전 설치하는데만 1주일은 걸릴것 같네요.......
    전화선도 아닌데 다운속도가 왜이렇게 느린지ㅠㅠ
      • 주인장
      • 2011.05.30 22:44 신고
      아...그런경우도 있군요...
      전 그렇게 느리진 않던데...
    • 2011.06.06 17:59
    비밀댓글입니다
    • 영훈
    • 2011.06.10 16:46 신고
    환경변수 설정에 대해서는 설명이 없네요?
      • 주인장
      • 2011.06.12 21:56 신고
      음...java 환경변수 말씀이신가요?
      그 변수는 원래 자동으로 PATH와 JAVA_HOME이 설정되죠. 궂이 설정해주지 않아도 됩니다. java 경로나 class를 못찾으면 설정해주면 되죠.

나모코드에디터로 PHP 코딩 시 UTF-8의 BOM으로 인한 헤더오류 방지법.

Posted by taeho Tae-Ho
2011.02.23 11:18 Web/DB/Dev

취미삼아 PHP를 이용해 웹으로 이것 저것 코딩하며 노는 나로서는 HTML이나 CSS, PHP 함수에 대해 많은것을 항상 외우고 있지를 못하다. 코딩을 할 때마다 똑같은 키워드를 매일 인터넷을 뒤져가며 하다보니 코딩 속도도 더디고 힘도 많이 든다.

그러다 발견한 나모코드에디터.... 바로 내가 찾던 에디터다. 직접 만들 실력은 안되니 실력자들이 만들어 놓은 것을 주로 활용하는 내게 나모코드에디터는 사막을 헤매다 오아시스를 만난 듯한 느낌을 주었다. (물론 조금 아쉬운 부분들도 있지만..)

그런데...

UTF-8로 저장하고 서버에 업로드한 뒤 브라우저에서 호출하면 이런 에러가 찍힌다.. 아무리 해도 이유를 알아내지 못하다가 얼마전에야 그 원인을 알았다.
(관련포스트 : http://cybercafe.tistory.com/178 )



그런데 문제는 나모코드에디터의 파일저장 화면에 "UTF-8 BOM 없음" 과 같이 파일헤더부분에 BOM(Byte Order Mark)를 기록하지 않는 저장옵션을 찾지 못했다. 그래서 결국 나모코드에디터를 사용하지 못할 처지에 놓이게 되었다.

하늘이 무너져도 솟아날 구멍은 있는 법...

나모코드에디터의 도움말부터 모든 메뉴의 설정 화면을 뒤졌다. 그리고 결국 찾아낸 옵션....


"도구 - 프로그램 설정" 메뉴에서 찾아낸 "BOM이 없는 UTF-8 파일 지원" 이라는 체크옵션이 있었다. 그런데 문제는 이 옵션을 체크(V)하고 저장한 뒤 웹서버에 업로드하고 호출해도 같은 오류가 발생한다는 것이다.

혹시나 버그(?)일까 싶어 체크를 해제하고 저장해보니.... 빙고..!!!

옵션이 내가 생각했던 것과 반대였다. 옵션을 체크하면 BOM 없이 저장되어야 할 것 같은데 BOM을 포함하여 저장이 하는 것 같다. 그리고 체크를 해제하면 BOM이 저장되지 않는다. 코드에디터 개발자가 잠시 착각하고 if 문을 잘못 코딩하였거나 뭔가 다른 의미로 생각하고 코딩한 것 같다.

어쨌든... 이 옵션을 만들어준 나모코드에디터 개발자에게 감사드린다... 흑흑~~~~





신고
이 댓글을 비밀 댓글로
  1. 그렇네요. 좀 애매한 표현이네요 어떻게 했을까요?

    if (인코딩=utf8) then
    if (BOM 없는 지원)
    // 음... 없다는 표시니깐 BOM 넣지말자
    else
    // 이건 토글이니 위꺼랑 반대로
    end

    아니면 아래처럼 간략화로 했을까요?
    if (인코딩=utf8)
    BOM 체크값!=(BOM옵션체크박스값)
    • 주인장
    • 2011.02.23 22:18 신고
    ㅎㅎ 네..그렇겠죠~~ ^^

PHP 코드로 날짜 및 요일 구하기

Posted by taeho Tae-Ho
2011.01.27 11:25 Web/DB/Dev

PHP는 날짜 계산을 위한 함수를 다양하게 제공한다.
그중에서도 오늘날자를 원하는 포맷으로 구하는 방법... 그리고 몇일 전을 구하는 방법... 그리고 오늘을 기준으로 이번주의 월요일을 구하는 방법을 소개한다.

<?
    //오늘 날짜 구하기
    //$today = date("Y-m-d", mktime(0,0,0,date("m"),date("d"), date("Y")));
    //$today = "2011-01-10";
    //$timetoday = strtotime($today);
   
    // 1일전 날짜 구하기
    //$beforeDay = date("Y-m-d", strtotime($today . " -1 day"));
    //echo $beforeDay . "<br>";
   
    // 이번주 월요일 구하기
    // $beforeMonDay = date("Y-m-d", strtotime("last Monday")); 
    //echo $beforeMonDay . "<br>";
?>

     - 아래 이미지의 월요일구하기는 오류발생함 - ^^

신고
이 댓글을 비밀 댓글로

PHP 세션응용 코딩 시 session_start() [function.session-start]: Cannot send session cache limiter - headers already sent 에러의 원인

Posted by taeho Tae-Ho
2011.01.03 14:43 Web/DB/Dev

PHP의 session 변수를 이용해 사용자 로그인 여부를 검사하는 코딩을 할 때 이따금씩 특정 웹페이지에서 "session_start() [function.session-start]: Cannot send session cache limiter - headers already sent ~~~" 라는 오류를 보게 된다.

처음엔 도대체 이게 무슨 원인으로 발생하는 것인지 몰라 헤매곤 했다.그리고 오늘.. 또 뭔가 새로운 기능을 구현하다가 이 에러를 맞닥뜨렸다.

PHP와 MySql이 각각 euc-kr로 설정된 상태에서 php 소스파일을 UTF-8로 저장하게 되면 바로 이 에러가 발생한다. 당연히 php는 4.x 버전, MySql도 4.x 버전이다. 하지만 반대로 PHP와 MySql이 모두 UTF-8이 지원되는 경우에도 동일하게 발생하는 것 같다. 즉.. APM의 버전과는 별 관계가 없다는 것이다.


이 에러는 많은 PHP 초심자들을 힘들게 하는 것 같다. 수많은 개발자들이 질문을 하고 답변을 하는데... 대부분은 session_start(); 함수 앞에 그 어떤 코드도 포함되어 있으면 안된다는 답변이 가장 많다. (당연히 include(), require()의 앞이다.) 이것도 정답이다. 하지만 가장 앞에 포함되어 있는데도 발생한다면..???

여기서부터 참 막막해진다. session_start();앞에 @를 붙여 @session_start(); 와 같이 사용하면 된다고 하기도 하는데 이렇게 하면 속도가 느려진다는 무시할 수 없는 답변이 또 보인다.

결국 Goole을 뒤질 수 밖에 없었다. 그리고 찾아낸 원인은 APM의 Apache와 PHP의 버전 그리고 php 소스 파일이 저장될 때의 문자셋 때문에 발생한다는 것이다.

그 이유는 바로 아래화면 처럼 PHP 파일의 소스를 저장할 때 파일포맷을 무엇으로 하느냐에 따라 각각 파일 헤더의 내용이 다르고 그 헤더의 차이로 인해 Apache가 session_start() 함수의 앞부분에 무엇이 있는가 없는가를 판단할 때 오류의 원인을 제공하게 되기 때문이다. 특히 UTF-8 포맷으로 저장할 때 BOM 없음 옵션을 선택하고 저장해야한다는..정말로 어이없는 정답이었다.

  울트라에딧에서 확인한 UTF-8 (BOM 아님) 저장옵션

PHP 버전이 낮은 경우에, 즉 PHP와 MySql이 모두 euc-kr인 경우는 ANSI 포맷으로 저장하면 session_start() 에러가 사라졌고 PHP5, Mysql이 모두 UTF-8인 경우에는 UTF-8 BOM 아님 옵션으로 지정하여 저장해야 session_start() 오류가 사라졌다.

이 문제로 골치아픈 초보 PHP 개발자들에게 도움이 되면 좋겠다.

영원한 초보인 난... 하루를 꼬박 헤맸다.. ^^


신고
이 댓글을 비밀 댓글로
    • qewr
    • 2011.07.17 14:44 신고
    최근 php를 시작하게 되었는데
    좋은 정보 잘 얻고 갑니다.
      • 주인장
      • 2011.07.17 22:26 신고
      졸필에 댓글까지 남겨주시니 감사하네요~ ^^
    • musicbar
    • 2011.07.25 17:26 신고
    세션 관련 글을 검색하다가 들르게 되었습니다.
    세션을 사용할때도 캐릭터셋을 맞춰줘야 하는군요.
    좋은 글 잘 읽었고, 많은 도움이 되었습니다.
      • 주인장
      • 2011.07.25 22:07 신고
      댓글 감사합니다~
    • sanarea
    • 2012.03.05 01:45 신고
    감사합니다^^ session 오류나서 찾다보니 최고의 답변이네요 ㅎㅎ
    • 2012.03.12 10:52
    비밀댓글입니다
    • 초보
    • 2013.05.28 14:12 신고
    php가 동작하기는해도 에러땜에 신경쓰였는데 한번에 다 해결됬네요
    넘넘 감사합니다~^^
    • 지니가다
    • 2013.06.04 13:15 신고
    와.. 정말 감사합니다. 파일포맷 문제.. 파일의 고유 헤더 문제가 있을 수 있다는건 몰랐네요. 좋은 글 감사합니다. 다른 어디서 개발을 하더라도 파일 고유의 헤더를 염두에 둘 수 있겠네요. ^^ 건승하세요!!
  1. 멋져요
    • 2015.12.14 15:38
    비밀댓글입니다
    • 그 블로그는 제 블로그는 아니구요.. (네이버블로그는 폐쇄했습니다. ^^)
      제 글을 그대로 퍼간분이 계시다는 건 알고 있습니다. 똑같이요.. ^^
      살펴봐 주셔서 감사합니다.