Clean Code that Works.

http://mvnrepository.com/artifact/javax.mail/mail

버전 클릭 해 보면 밑에 depend lib(activation)도 확인 할 수 있다.


http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mail.html

이메일 보낼려면 필요한 lib.

스프링 3.0에서 JSON view를 보여주고 싶다!!!!

왜!!
간단한 체크 요청에만 응답 해 줄려고.

참고한 URL : http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/
스프링 팀 블로그에는 좋은 글이 많은 듯 하다.

문서 삭제 하는데 문서가 잠겼는지 안잠겼는지 체크 한 후 삭제를 해야 했다.
잠겼으면 잠겼다고 리턴해 주어야 하는데
jsp뷰 리턴하면 기존 모델 객체의 값들이 필요 하므로..

form.jsp에서 삭제 하는데, return "form" 하게 되면 form.jsp를 다시 읽어서 하게 된다.
그러므로 form.jsp에서 필요로 하는 jstlView 속성들이 없기 때문에 오류가 난다.

간단하게 json으로 오류코드만 리턴해주고,
성공 했을 때는 이동할 페이지를 리턴해 주도록 하였다.

@RequestMapping( value="/bbs/delete.do", method=RequestMethod.GET)
    public @ResponseBody String delete( @RequestParam( "bbsID") String id, @RequestParam( "start") String start, HttpServletResponse response) throws Exception {
        if ( bbsService.isRocked( id)) {
            response.setStatus( HttpServletResponse.SC_BAD_REQUEST);
            return "false";
        } else {
            bbsService.deleteBbs( id);
            return "bbs/bbsList.do?start=" + start;
        }
    }

@ResponseBody만 붙여주면 일단 그냥 String으로 찍는다..

json형태로 응답을 받고 싶으면

스프링 aJax

위의 예제처럼..
jQuery에서 json형식으로 콜을 해주면 된다.





스프링 시큐리티 샘플 url.


두번째 URL에 있는 이미지를 보면 대충 감이 온다.

아 역시 security는 어려와 =_=;;


하드코드에 "죽음의 행진, 관리층이 문제야!"에 있는 내용.

죽음의 행진.. 우리나라로 따지면 무한 야근 막 이런거 -ㅅ-;;
다행히 입사한지 1년이 넘었지만 야근은 한번도 안했다.
되도록 일찍 퇴근하려고 노력하고, 집에 가면 기술 서적이나 방법론 개념 책들을 조금씩 읽는다.
많이 읽으면 한달에 2~3권, 아니면 1권.. 출퇴근할때나 잠잘때는 소설 들도 읽고.

아무튼 아래 컬럼은 개발자나 PM등 관리층에게도 도움이 되는 글이다.
야근을 피하고 윤택하고 아름다운 개발자 생활을 만끽하자 :-)

실패하는 이유.
멍청하고 무지한 관리층에게 고하노라, 죽음의 행진은 다음과 같은 이유로 실패하느니...

* 실패를 목표로 삼는다 - 처음부터 할 일은 너무 많고 시간이 너무 없는 프로젝트다. 당연히 실패한다.
* 편법을 부추긴다 - 일정에 쫓기면 당연히 편법이 난무한다. 그런데 안타깝게도 편법은 품질을 낮추고 위험을 높인다. 단기간에 작은 업무라면 무사히 넘어갈지도 모르겠다. 그러나 프로젝트가 지연되면 품질은 낮아지고 위험은 커져 결국은 문제를 일으킨다.
* 생각할 시간이 없다 - 효과적으로 일하려면 여유 시간이 필요하다. 읽고, 생각하고, 토론할 시간이 있어야 한다. 이런 시간이 없으면 맨 처음 떠오르는 추측을 적용한다. 맨 처음 생각이 옳을 확률은 낮으므로 당연히 설계와 계획이 엉성해지고 품질이 떨어진다. 결국 치명적인 결함이 드러나거나 완전히 뒤엎어야 하는 사태가 발생한다.
* 대화할 시간이 없다 - 모든 문제는 대화 단절과 오해에서 비롯된다고 주장해도 과언은 아니다. 심지어 우수한 팀도 대화 부족으로 실패하는 경우가 흔하다. 업무량이 과도하고 여유가 없는 환경에서는 대화가 줄어들고 대화의 효율성도 떨어진다. 대화 단절이 심할수록 프로젝트는 성공하기 어렵다.
* 긴장, 스트레스, 기능 장애가 발생한다 - 일정에 쫓겨 마음이 급하면 가장 먼저 너그러움이 사라진다. 업무에 사적인 감정이 개입된다. 다른 팀원의 실수를 부풀리고 곡해한다. 목소리가 높아지고 급기야는 대화가 끊긴다.
* 사기가 떨어지고 팀이 와해된다 - 가족과 친구들에게 소홀하면서 긴장과 스트레스 속에서 장시간 이하면 팀이 신체적으로나 정신적으로 지친다. 프로젝트가(당연히) 일정과 품질 목표를 못 맞추면 팀원들은 한순간 인내심을 잃는다. 운이 좋으면 프로젝트가 끝날 즈음 그룹을 옮기느 정도로 그친다. 운이 나쁘면 회사를 뜨거나, 이혼을 당하거나, 건강을 해치거나, 위험한 뭔가에 중독되는 지경에 이른다.
참고로, 팀원이 자발적으로 늦게 남아 일하는 경우를 죽음의 행진으로 오해하는 관리자도 많다. 죽음의 행진은 역학이 전혀 다르다. 죽음의 행진에 내몰리는 팀원은 어쩌 수 없이 늦게까지 일한다. 반면, 스스로 늦게까지 일하는 팀원은 대개 일이 좋아서다. 필요하면 여유 시간도 충분히 갖는다. 일정에 쫓기지 않으므로 편법으로 땜질할 이유도 없다.
* 회사를 불신하게 된다 - '죽음의 행진 = 뭔가 잘못되어 나타나는 현상'이라는 공식은 두말하면 잔소리다. 죽음의 행진을 지켜보는 직원과 고객과 협력업체는 팀에게서 헌신이 아니라 무능함을 느낀다. 진짜 문제는 덮어두고 죽어라 일해 봤자 회사 위신과 이미지만 구겨진다.
* 문제를 해결하지 못한다 - 컴퓨터 앞에 오래 앉아 있다고 근본적인 문제, 즉 '할 일은 많은데 시간이 부족하다' 라는 문제가 사라지지 않는다. 근본적인 문제를 해결하지 않는 한 상황은 나아지지 않는다.
* 선택의 여지가 줄어든다 - 시간을 들여서 제대로 설계하고 계획하지 않으면 제품에 치명적인 결함이 생기고 대다수 작업을 다시 해야 한다. 팀은 대화가 끊기고, 오해가 난무하며, 서로 잡아먹으려고 으르렁거린다. 사기는 떨어지고, 출시 능력을 의심받으며, 그러고도 일정과 품질 목표를 놓친다. 물론 원래 문제는 그대로 남아 있따. 이런 지경에 이르면 프로젝트는 선택의 여지가 줄어든다. 결국 품질을 낮추고, 일정을 늦추고, 죽음의 행진을 계속 하는 수밖에 없다. 멋지지 않은가?

전환점
자, 할 일은 너무 많은데 시간이 너무 없다. 어떻게 해야 할까? 현실적인 측면에서 답은 대단히 쉽다. 할 일이 너무 많은 이유와 시간이 너무 없는 이유를 찾아내면 된다.
"일정와 요구사항이 위에서 내려왔거든요"는 답이 아니다. 왜 그런 일정과 요구사항이 내려왔을까? 일정과 요구사항을 지키지 못하면 관리층은 어떻게 대응할까? 일정을 늦춰줄까? 얼마나? 요구사항을 쳐낼까? 어떤 기능을? 프로젝트 역학을 근본적으로 바꿀 방법은 없을까? 일단 위에다가는 주어진 날짜와 요구사항을 목표로 삼겠다고 말한 후 자체적으로 최악의 상황을 계획한다.
즉, 최악의 상황을 고려해 계획을 세운다. 반드시 지킬 최후 일정과 반드시 넣을 최소 기능을 계획으로 세워본다. 그래도 시간이 부족하다면 관리층에게 경고한다. 이런 프로젝트는 애당초 가망이 없다. 최악의 시나리오가 충분히 달성 가능하다면 여기에 총력을 기울인다. 팀원들에게 목표를 초과하면 3.5점 이상을 목표에 못 미치면 3.0점 미만을 주겠다고 말한다.(마이크로 소프트에선 4.5점 만점)

남들이 가지 않은 길
이로써 팀은 죽음의 행진에서 벗어나고, 상황을 개선할 여유 시간이 생긴다. 십중팔구 목표도 초과 달성한다. 그러면서도 편법을 쓰거나, 미숙한 결정을 내리거나, 서로 잡아먹는 일도 없다. 필요한 기능을 기한 내에 완료하면서 동시에 협력업체와 고객에게서 신뢰도 얻는다.
그럴 듯하게 들리지만 감정적으로 쉽지 않은 일이다. 최악의 상황을 계획하려니 프로젝트를 포기하는 느낌이 든다. 유약한 겁쟁이가 되는 듯하다. 난관을 극복할 능력이 없다고 자인하는 꼴이 아닌가? 역설적이게도 실제는 정반대다.
위험을 회피하는 행동이 오히려 유약하고 비겁하다. 최악의 가능성을 무시하는 태도가 오히려 기만적이고 무책임하다. 용기를 보여라. 진신을 인정하라. 영리한 태도로 협력업체와 고객과 직원을 고통에서 구하라. 팀과 삶과 자신감을 보호하면서 프로젝트를 성공으로 이끌어라.

개인적으로 하면서 햇갈리고 애 먹엇던 내용을 정리 하는 곳.

1. SimpleFormController클래스에서 onSubmit메서드를 override 했는데 submiit을 POST로 날렸는데 onSubmit 메서드를 타지 않는다.
 -> onSubmit 파라미터 중에 BindException 이 java의 것이 아니라 스프링의 import org.springframework.validation.BindException을 사용 하도록 한다.

2. SimpleFormController에서 submit한구 결과 페이지가 표시 되지 않고,
Neither BindingResult nor plain target object for bean name 'commandName' available as request attribute
에러를 뿜어낼 때, formView와 successView의 이름을 다르게 설정 한다. 이 부부은 스펙을 좀 읽어봐야 하겠는데.. -_-;; 너무 귀찮고.. 영어는 어려와~!~!

3. java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
이런 오류가 나올 경우.
왜 나왔냐 하면 .jsp 파일에 직접 접근 할 때 스프링 form 태그를 사용할때 발생 하였다.
이것저것 찾아보고, 샘플 파일들에서 설정을 봐보니.

전에는 servlet에서 *-servlet.xml 파일을 로딩하도록 하고 있었으나,
이렇게 하면 안되고 web.xml에서 이런 형식으로 사용을 해야 된다고 한다.

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
</context-param>

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
</listener>

4. 이클립스 디버깅 안될때.
JDK 버전이 6u14~15는 이클립스에서 디버깅이 잘 안된다.(웹 프로젝트의 경우)
이럴땐 그냥 6u16으로 변경 고고싱 -_-

Utility Class

Java/이론..2009. 9. 22. 09:44
In computer programming, a utility class is a class that defines a set of methods that perform common, often re-used functions. Most utility classes define these common methods under static (see Static variable) scope. Examples of utility classes include java.util.Collections [1] which provides several utility methods (such as sorting) on objects that implement a Collection (java.util.collection [2] ).

위키 디피아

일반적으로 자주 쓰이는 메소드들의 집합으로 스태틱 메서드들로 구현되어 있다.
유틸리티 클래스를 생성할 때는 private 생성자를 작성하여 Instance를 생성을 방지 하자. 스태틱 메서드들 뿐이기 때문에 인스턴스 생성이 필요 없다.

와우.. 신기하다.
http://www.zeroturnaround.com/javarebel/


왜 JavaRebel이 필요한지 보여주는 영상.


쉽고 편하다!!!!
다음 프로젝트때는 꼭 적용해 봐서 써야겠다.

지원하는 was list.

트랙백에 가보면 설정으로 되어있는데..
그냥 자바 코드로 했을 경우.

프로 스프링 2.5 참조
SimpleMailSender.java
public abstract class SimpleMailSender
{
    protected abstract MailSender getMailSender();

    public void sendMessage( String to, String text)
    {
        SimpleMailMessage msg = new SimpleMailMessage();
        msg.setTo( to);
        msg.setSubject( "Test Message");
        msg.setFrom( "보내는 사람 주소");
        msg.setText( text);

        MailSender sender = getMailSender();
        try {
            sender.send( msg);
        } catch (MailException e)
        {
            e.printStackTrace();
        }
    }
}

JavaMailSimpleMailSender.java
public class JavaMailSimpleMailSender extends SimpleMailSender
{
    protected MailSender getMailSender()
    {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost( "smtp.gmail.com");
        sender.setPort( 465);
        sender.setProtocol( "smtps");
        sender.setUsername( "아이디");
        sender.setPassword( "비밀번호");
        sender.getJavaMailProperties().setProperty( "mail.smtps.auth", "true");
        sender.getJavaMailProperties().setProperty( "mail.smtps.startls.enable", "true");
        sender.getJavaMailProperties().setProperty( "mail.smtps.debug", "true");
        return sender;
    }
}

SimpleMailTest
public class SimpleMailTest
{
    private static final String TO = "받는사람 주소";
    private static final String JAVAMAIL_TEXT = "HELLO WORLD! Email generated user JavaMail";

    public static void main( String[] args)
    {
        SimpleMailSender sender = new JavaMailSimpleMailSender();
        sender.sendMessage( SimpleMailTest.TO, SimpleMailTest.JAVAMAIL_TEXT);
    }
}

응...?
메일은 처음 보내 보는듯 -ㅅ-;;;

Art of Science.

Java/이론..2009. 8. 25. 23:29

우리는 과학이 예술이라는 사실을 잊어 버렸다.......중략
공학에 예술적인 감각과 열정을 되돌려야 한다.
재능, 자신감, 열정은 도구를 쓸 줄 아는 사람에게 나타나는 특성이다.
이런 특성이 부족한 사람은 아무리 좋은 도구와 기법을 안겨줘도 소용이 없다.

Frosch 1969 - "A New Look at Systems Engineering."
IEEE Spectrum, September 1969; Robera A, Frosch.


수학은 "그것이 무엇인가(What is)"의 개념을 정확하게 다루는 일에 바탕이 된다. 그와 달리, 컴퓨터 계산법은 "그것을 어떻게 하는가(How to)" 라는 개념을 정확히 다루는 일에 토대가 된다.
                                                                             -  컴퓨터 프로그램의 구조와 해석 -