소프트웨어 크리에이티비티 2.0

참으로 오랜만에 글을쓴다. 아마도 이번달의 첫글이지 싶다.

그동안 게을렀던건 아니고,.. 그냥 바빴다.
요새 내가 글을 쓰지 못하는 이유는 2가지다.
첫째는, 바쁘다.
둘째는, 글이 잘 안써진다.
여튼, 오늘은 바쁜와중에 틈틈히 출퇴근시간에 읽어 재낀 책을 하나 소개 하려한다.
제목은 위에 이미 썼고, 부록빼고 약 430여 페이지 분량의 두께를 자랑하는 책이다.
읽는데 걸린시간은 대략 2주 정도 걸린듯 싶다.
책을 읽으면서 밑줄을 치고 메모를 해야하는데.. 하는 문구들이 엄청나게 많았다.
그만큼 읽으면서 공감을 많이 했다.
과연 소프트웨어개발에서 창의력이 필요할까?
위 질문은 책에서 나왔던 질문중에 하나고,..
내가 요즘에 든 생각중에 하나는
프로세스가 점점 안정화 되어가면서, 나는 점점 재미를 잃어간다는 것이다.
잘 갖춰진 공장의 프로세스처럼, 생산라인의 하나의 부품처럼,..
그냥 조이고 닦고, 또 조이고 닦고,.. 생각없이 조이고 닦고,..
그러면 뚝딱… 상품이 하나 나온다.  이게 재밌나?
난 재미가 없다.
얼마전에도 팀원들에게 푸념섞인듯이 이런말을 했다.
“요즘 코딩이 재미없어졌어”
테스트코드를 한창 짤때도 그랬다.
“코딩이 재미없어”
이런 생각들이 내 머릿속을 가득메우고 있을때,
이책에서는 창의성에 대한 다양한 연구들을 소개한다.
테스트코드는 유용하지만, 많이 짤수록 지겨워진다는 연구결과도 있었다…(딱 나다..-_-)
너무나 많은 연구들이 소개되어 있어서..
일일이 다 열거하기도 힘들다.
결론은 이거다..
현재까지 소프트웨어의 생산성을 높이기 위해, (물론 품질도 포함된 얘기다)
프로세스를 강조하고, 정형화하고, 문서화 하고, 또는 자동화 하고
그런 과정들이 굉장히 중요시 되어 왔다.
그리고 이런 풍토는 그 반대점에 있는 개인의 직관이라든가 창의성 자율성들을 제약하고,
상향식이 아닌 하향식(위에서부터 밑으로 지시가 내려오는 것) 구조가 되는데..
점점 소프트웨어의 복잡도가 높아짐에 따라서, 이런 구조의 생산성이 생각보다 높아지지 않는다라는것..
그래서 이제는 상대적으로 지양되었던 개인의 창의성과 경험 또는 직관들도 필요하고,
이것이야 말고, 정형화된 프로세스만큼 혹은 그 이상 중요해 졌다 라는 얘기다!
그리고 난 여기에 굉장한 공감을 표하는 바이다~!!
소프트웨어의 복잡도가 높아지면, 높아질수록, 정형화된 프로세스와 맞지 않는
예외사항이 너무나 많이 발생한다.
또는 개뿔 그동안의 방법들이 아예 안통하는 경우도 많다.

네이버 블로그를 다시 해보렵니다.

오늘 문득,.. 그동안 방치해놓고 있던..

내 네이버 블로그를 들어가봤다.
음… 사실 그닥 네이버 블로그를 쓸 이유는 없었고,..
내가 한때,.. 이글루스에서 처음 블로그를 시작하고,..
한창 쓰다가..이글루스가 SK에 넘어가면서 부터, 에라이~ 하면서..
테터툴즈로 갈아탔다가.. 서버가 죽는 바람에..
잠깐 네이버 블로그와 티스토리를 만들었었다..
(지금 티스토리는 비번을 잊어먹어서.. 그냥 버렸다.. ㅋㅋ)
그 뒤로는 거의 테스트 용으로 사용했는데..
오늘 다시 한번 보게 됐다..
네이버씨의 질문도 답하고,.. 해피빈 콩도 하나 얻었다..
요즘은 취미삼아 해피빈으로 기부를 하고 있어서..
부지런히, 블로그씨 답변을 해야지 하는 맘도 생겼다.ㅋ
어쨌거나 저쟀거나.. 오늘 나의 결론은 네이버 블로그 다시 해보련다! 이다..
그렇타고 마이크온블로그닷컴을 버리고 이사를 간다는 얘기는 아니고..
그냥 2개의 블로그를 운영하겠다는 얘기~!!
사실 오늘 같은 팀에 있는 송모군이 “고객문의”에 대한 경험담을 메일로 쏴줘서..
읽다가.. 참으로 느낀바가 많아.. 네이버 블로그를 다시 보게 됐다.
네이버 블로그 참으로 편하겠꾸나…
여기서 편하겠꾸나는.. 라는 표현은 내가 편하다는 얘기가 절대 아니다..
몇달전,.. 나도 고객문의를 한적이 있다..
고객PC에 원격접속을 하던 설레임을 뒤로하고,..
그때 느겼던 점은,.. 아~ 정말로 이걸 모를수도 있구나 하는 거였다!!
개발자들이 빠지기 가장 쉬운 오류들.. 내가 편하면.. 모두가 편하겠지..
내가 불편하면.. 모두가 불편하겠지..
정말이지 특정 부류를 타켓팅해서 서비스를 만들지 않는이상..
절대 다수를 고객으로 서비스해야 한다면,.. 고객의 눈높이는 절대적으로 낮다라는 것을..
잊지 말아야 하겠다.
그래서,.. 내 네이버 블로그는 고객과의 대화를 위해 쓰겠다!
이겁니다.. 헤헤
이상 끝~!!
——
바빠서 도저히 못해먹겠다.
네이버 블로그는 그냥 접자!!
– 2009년 7월 25일 비 조낸 오는날 –

Spring Framework 에서 UTF-8 한글 설정

인코딩 문제로 오늘 또 하루종일 씨름했다.

사실 그닥 어려운게 아닌데.. 처음 설정을 잘못해놓으면,.
고생하기 쉽상이다.
웹개발에서 인코딩과 관련해서 신경써야할 부분
아래와 같은 3가지라고 보면 되겠다.
1. 클라이언트 (javascript)
2. 서버 (apache or tomcat 설정)
3. DB
1. DB 캐릭터셋 설정하기
그중에서 가장 실수하기 쉬운 것중에 하나는 DB 설정.
mysql 을 설치하고, 꼭 아래와 같은 명령어로 현재 mysql 의 설정 상태를 확인해야한다.

mysql> \s

mysql 을 설치할대, 기본 캐릭터셋이 latin1 으로 설정되어 있기때문에
신경써서 설치하지 않으면, 원하는 utf8 설정이 안된다.
설정이 제대로 안되어 있다면, 설치 폴더로 가서 my.ini 파일을 열어
인코딩 관련 부분을 모두 수정해줘야한다.
여기서 그렇게 했는데도 불구하고, \s 명령어를 이용해, mysql 설정상태를 확인 했을때,
DB character set 이 latin1 로 나오는 경우가 있는데..
이런 경우는, create database로 db를 생성할 당시의 캐릭터 셋이 latin1이 었기 때문에
뒤늦게 수정해봐야 수정되지 않는다. 결국엔 db를 날리고 다시 생성해야한다.
이런 경우 때문에 초기 설치시에 주의해서 원하는 캐릭터셋으로 설정을 해야한다.
2. 스프링 프레임웍에서 설정하기

두번째로 서버 설정을 확인해야하는데.. tomcat에서 server.xml 을 열어서 8080포트와 8009번 포트의
커넥터에 URIEncoding=“UTF-8” 를 추가해준다.
스프링 프레임웍을 이용할경우, web.xml 열어서 아래와 같은 필터를 추가해준다.

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

그리고 xxxx-servlet.xml 파일을 열어서, viewResolver를 아래와 같이 또 수정해준다.

<bean id=“viewResolver” class=“org.springframework.web.servlet.view.InternalResourceViewResolver”>

<property name=“prefix” value=“/WEB-INF/view/”/>

<property name=“suffix” value=“.jsp” />

<property name=“contentType” value=“text/html; charset=UTF-8”/>

</bean>

이렇게 해주면, 기본적으로 클라이언트딴에서 특별한 인코딩을 수행하지 않아도 UTF8로 인식을 한다.
때문에 응답할때도 특별한 디코딩을 해주지 않아도 된다.


3. 서버 설정없이 클라이언트에서 무조건 UTF-8로 넘겨주기

위와 같이 서버딴에서 특별한 설정을 해주지 않았다면,
다소 귀찮은 작업을 해줘야하는데..
그것은 클라이언트에서 서버로 정보를 날릴때, 무조건 인코딩을 해서 넘겨야 한다는 것이다.
인코딩하는 방법은 간단하다.
아래와 같이 자바스크립트를 이용해, 넘기고자 하는 정보를 encodeURIComponent()
함수를 이용해 인코딩 해주면, 넘기는 정보를 UTF-8로 인코딩해서 넘기게 된다.
4. 인코딩 파헤치기

보통은 클라이언트에서 서버로 요청 파라메터 정보를 넘기게 되면,
아래와 같은 3가지 인코딩 방식으로 넘기게 된다. 아래 1번을 제외한 나머지 방법은
브라우저가 설정된 인코딩 방식을 따르게 된다. 1번방법은 자바스크립트에서 강제로 인코딩한다.
예를 들어 “한글”이란 문자열을 넘기면,
1. encodeURIComponent() 로 인코딩 할때, “%25ED%2595%259C%25EA%25B8%2580
2. UTF8 인코딩을 할때,  “%ED%95%9C%EA%B8%80
3. EUC-KR로 넘길 때, “%C7%D1%B1%DB

위 3가지 타입을 UTF8로 설정된 서블릿에서 각각 request.getParameter() 로 넘겨받은 정보를 읽어오게 되면,
UTF8로 디코딩 되어 각각  
1. %ED%95%9C%EA%B8%80
2. “한글
3. “???”
로 읽혀오게 된다.
여기서 문제는 3번이 문제가 된다. 3번은 실제로 “한글”이란 정보를 EUC-KR로 인코딩해서 넘기게 되는데..
서블릿에서 UTF-8로 디코딩을 하게 되어 알수없는 값이 되어버린다.

그리고 서버에서 이것을 다시 UTF8 캐릭터셋으로 설정된 DB에 그대로 저장하면,. 각각
1. %ED%95%9C%EA%B8%80
2. “?쒓?”
3. “ㅁ싼깍옙”
로 다시 저장된다.
1번을 제외한 2,3번 방식으로 DB에 저장이 되면, 본래 기대했던 값들과 다른 값들로 저장이 되는데..
DB 정보를 서블릿에서 다시 읽어볼때, 같은 UTF8로 디코딩을 하게 되면 사실 큰문제 없다.
하지만 위 DB정보를 다른 캐릭터셋으로 설정된 서블릿에서 읽어오게 되면 이식성에 문제가 생긴다.
또한 DB 캐릭터 셋이 UTF8이 아닌 다른 캐릭터셋으로 설정이 되었다면, DB에 저장될때 마찬가지로
문제가 생길수있다.

때문에 UTF8로 다국어를 지원해야하는 특별한 상황이라면, 1번 방법을 사용하는것이 보다 안전하다.
하지만 보통 하나의 캐릭터셋만을 지원하거나 통일하기 때문에 2번 방식으로 대부분 커버가 가능하다.

사실 더 중요한 것은, 인코딩과 디코딩할때,
클라이언트(브라우저인코딩) – 서버 – DB
3박자를 모두 잘 맞춰서 해줘야 한다는 것이다.

이상 정리 끝~