2010년 6월 30일 수요일

스티브잡스 연설문(스탠포드 대학 졸업축사)

 


This is the text of the Commencement address by Steve Jobs, CEO of Apple Computer and of Pixar Animation Studios, delivered on June 12, 2005.

I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I've ever gotten to a college graduation. Today I want to tell you three stories from my life. That's it. No big deal. Just three stories.

The first story is about connecting the dots.

I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?

It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: "We have an unexpected baby boy; do you want him?" They said: "Of course." My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.

And 17 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents' savings were being spent on my college tuition. After six months, I couldn't see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn't interest me, and begin dropping in on the ones that looked interesting.

It wasn't all romantic. I didn't have a dorm room, so I slept on the floor in friends' rooms, I returned coke bottles for the 5¢ deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:

Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn't have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can't capture, and I found it fascinating.

None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.

Again, you can't connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.

My second story is about love and loss.

I was lucky — I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 20. We worked hard, and in 10 years Apple had grown from just the two of us in a garage into a $2 billion company with over 4000 employees. We had just released our finest creation — the Macintosh — a year earlier, and I had just turned 30. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 30 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.

I really didn't know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down - that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me — I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.

I didn't see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.

During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film,Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I returned to Apple, and the technology we developed at NeXT is at the heart of Apple's current renaissance. And Laurene and I have a wonderful family together.

I'm pretty sure none of this would have happened if I hadn't been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don't lose faith. I'm convinced that the only thing that kept me going was that I loved what I did. You've got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle. As with all matters of the heart, you'll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don't settle.

My third story is about death.

When I was 17, I read a quote that went something like: "If you live each day as if it was your last, someday you'll most certainly be right." It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: "If today were the last day of my life, would I want to do what I am about to do today?" And whenever the answer has been "No" for too many days in a row, I know I need to change something.

Remembering that I'll be dead soon is the most important tool I've ever encountered to help me make the big choices in life. Because almost everything — all external expectations, all pride, all fear of embarrassment or failure - these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.

About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, and it clearly showed a tumor on my pancreas. I didn't even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor's code for prepare to die. It means to try to tell your kids everything you thought you'd have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.

I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I'm fine now.

This was the closest I've been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:

No one wants to die. Even people who want to go to heaven don't want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life's change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.

Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma — which is living with the results of other people's thinking. Don't let the noise of others' opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 1960's, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback form, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.

Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-1970s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: "Stay Hungry. Stay Foolish." It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.

Stay Hungry. Stay Foolish.

Thank you all very much.




오늘 나는, 세계에서 가장 훌륭한 대학의 한 곳을 졸업하면서 새 출발을 하는 여러분들과 함께하는 영광을 가졌습니다. 나는 대학을 졸업하지 않았습니다. 사실을 말하자면, 이번이 내가 대학졸업식이라는 데 가장 가까이 다가간 경우입니다. 오늘 나는 여러분들에게 내 인생에 관한 세 가지 이야기를 하려고 합니다. 뭐 그리 대단한 것은 아닌, 그저 세 가지의 이야기입니다.


  첫번째 얘기는 점(點)을 잇는 것에 관한 이야기입니다.


나는 리드 대학이라는 곳을 첫 6개월 다닌 후 그만 두었습니다. 그후 18개월 동안은 비정규 청강생으로 머물렀고 그 후 진짜로 그만두었습니다. 내가 왜 대학을 그만두었을까요?


이 얘기는 내가 태어나기 전부터 시작됩니다. 내 생모는 젊은 미혼의 대학생이었는데, 나를 낳으면 다른 사람에게 입양을 시키기로 결심했습니다. 생모는 내가 대학을 졸업한 부부에게 입양되어야 한다는 생각을 강하게 갖고 있었습니다. 그래서 나는 태어나면 바로 어떤 변호사 부부에게 입양되기로 되어있었고, 그것으로 모든 것이 다 끝난 것처럼 보였습니다.

그러나 내가 태어났을 때 나를 입양키로 한 부부는 마음을 바꿔, 자신들은 여자아이를 원한다고 했습니다. 그래서 내 생모는 한밤중에 입양대기자 명단에 있는 다른 부부에게 전화를 걸어 "우리가 예기치 않은 사내아이를 갖게 되었는데 아이를 원하느냐"고 물었습니다. 이들 부부는 "물론"이라고 대답했습니다.


내 생모는 나중에야 내 어머니(양모)가 대학을 나오지 않았고, 내 아버지(양부)는 고등학교도 졸업하지 않았다는 사실을 알았습니다. 생모는 이 때문에 최종적인 입양서류에 서명을 하지 않다가, 몇달후 내 양부모가 나를 나중에 대학에 보낼 것이라는 약속을 하고서야 마음을 바꿨습니다.


17년이 지난 후 나는 정말 대학에 갔습니다. 그러나 나는 그때, 스탠포드와 거의 맞먹는 수준의 학비가 드는 대학을 선택했고, 노동자였던 내 부모(양부모)는 저축한 모든 돈을 내 대학등록금에 써야 했습니다. 그렇게 6개월이 지난후 나는 그만한 돈을 쓰는 데 대한 가치를 느낄 수 없었습니다. 나는 내가 내 삶에서 무엇을 하길 원하는지 알지 못했고, 대학이 그것을 아는 데 어떤 도움을 줄 것인지도 알지 못했습니다. 그런데도 내 부모들은 전 인생을 통해 저축해놓은 모든 돈을 내 학비를 위해 쓰고 있었던 것입니다.


그래서 나는 대학을 그만두기로 했습니다. 나는 모든 것이 잘될 것이라는 믿음을 가졌습니다. 그 당시 그런 결정은 다소 두려운 것이기도 했지만, 지금 돌아보면 그것이 내가 지금까지 한 가장 훌륭한 결정중 하나였습니다.


 내가 학교를 그만두는 그 순간, 나는 내게는 흥미가 없었던 필수과목을 들을 이유가 없어졌고, 내게 흥미롭게 보이는 다른 과목들을 청강할 수 있게 되었습니다.


 다 낭만적인 얘기는 아닙니다.  나는 기숙사에 방이 없었기 때문에 친구들의 방바닥에서 잠을 잤습니다. 음식을 사기위해 되돌려주면 5센트를 주는 콜라병을 모으는 일을 했고, 해어 크리슈나 사원에서 일주일에 한번 주는 식사를 얻어먹기 위해 일요일밤마다 7마일을 걸어가곤 했습니다. 나는 그걸 사랑했습니다. 그리고 내가 나의 호기심과 직관을 따라 가다가 부딪힌 것들중 많은 것들은 나중에 값으로 매길 수 없는 가치들로 나타났습니다. 한가지 사례를 들어보이겠습니다.


 내가 다녔던 리드대학은 그 당시 미국에서 최고의 서예 교육 기관이었다고 생각합니다. 캠퍼스 전체를 통해 모든 포스터, 모든 표지물들은 손으로 그려진 아름다운 글씨체로 장식되어 있었습니다. 나는 정규과목들을 더이상 들을 필요가 없어졌기 때문에 이런 글자체들을 어떻게 만드는지를 배워 보려고 서체과목을 듣기 시작했습니다. 나는 세리프나 산세리프 활자체를 배웠고, 무엇이 훌륭한 활자체를 만드는지에 대해 배웠습니다. 그것은 과학이 알아내지 못하는, 아름답고 역사적이며 예술적인 미묘함을 갖고 있었습니다. 나는 거기에 매료되었습니다.


 당시 나에겐 이런 모든 것이 내 삶에서 실제로 응용될 것이란 어떤 희망도 없었습니다. 그러나 10년 후, 우리가 최초의 매킨토시 컴퓨터를 만들 때 그 모든 것이 되살아 났습니다. 우리의 맥 컴퓨터는 아름다운 글자체를 가진 최초의 컴퓨터가 되었습니다. 내가 만일 대학의 그 과목을 듣지 않았다면 맥 컴퓨터는 결코 다양한 서체를 가진 컴퓨터가 될 수 없었을 것입니다. (마이크로소프트의) 원도즈는 맥 컴퓨터를 단지 베낀 것에 불과하기 때문에, 맥 컴퓨터가 그렇게 하지 않았다면 어떤 개인용 컴퓨터도 그런 아름다운 서체를 갖지 못했을 것입니다. 내가 만일 정규과목을 그만두지 않았고, 서체과목에 등록하지 않았더라면, 개인용 컴퓨터는 지금과 같은 놀라운 서체를 갖지 못했을 것입니다.


 물론 내가 대학에 있을 때는 미래를 내다보면서 점을 잇는 것은 불가능했습니다. 하지만 10년이 지난 후 과거를 되돌아 볼 때 그것은 너무나 분명합니다.


 다시 말하지만, 우리는 미래를 내다보면서 점을 이을 수는 없습니다. 우리는 오직 과거를 돌이켜 보면서 점을 이을 수 있을 뿐입니다. 따라서 여러분들은 지금 잇는 점들이 미래의 어떤 시점에 서로 연결될 것이라는 믿음을 가져야만 합니다. 여러분들은 어떤 것들에--자신의 내면, 운명, 인생, 카르마, 그 무엇이든지 신념을 가져야 합니다.  이런 접근법은 나를 결코 낙담시키지 않았고, 내 삶의 모든 변화를 만들어 내었습니다.


   나의 두번째 이야기는 사랑상실에 관한 것입니다.


 나는 내 삶의 이른 시기에 하고 싶은 것을 발견한 행운을 가졌습니다.  우즈(스티브 우즈니액, 애플 공동창업자)와 나는 애플을 우리 부모님의 차고에서 시작했습니다. 그때 나는 스무살이었습니다. 우리는 열심히 일했습니다. 10년이 지난후 애플은, 우리 둘만의 차고에서 20억 달러에다 4000명의 직원을 가진 회사로 성장했습니다.


 우리는 우리의 가장 훌륭한 발명품인 맥킨토시 컴퓨터를 1년 빨리 시장에 출시했는데 그 때 나는 막 서른 살이 될 때였습니다. 그리고 나는 해고를 당했습니다. 어떻게 자신이 만든 회사에서 해고를 당할 수 있느냐구요? 글쎄, 애플이 커가면서 우리는 회사를 운영할 어떤 사람을 고용했고 첫해는 그럭저럭 잘 되어 갔습니다. 그러나 그 후 우리들의 미래에 대한 관점에 차이가 나기 시작했습니다. 마침내 우리는 추락하기 시작했습니다. 우리 회사 이사회는 그를 지지했고, 서른 살이었던 나는 쫓겨났습니다. 성인으로서 내 삶의 초점이었던 모든 것들이 사라져버리고, 나는 참혹함에 빠졌습니다.


첫 몇달동안 나는 무엇을 할지 정말 몰랐습니다. 나는 앞서의 기업가 세대는 물러나게 된다는 어떤 느낌, 지휘봉을, 내게 전해진 것처럼 그렇게 내려놓았다는 느낌을 가졌습니다.  나는 데이비드 팩커드와 밥 노이스를 만났고 그들을 그렇게 못살게 군 데 대해 사과했습니다. 나는 아주 공식적인 실패자였습니다. 실리콘 밸리로부터 도망쳐 떠나버릴까도 생각했습니다.


그러나 어떤 것이 내게 떠오르기 시작했습니다.  나는 여전히 내가 하는 일을 사랑하고 있다는 것이었습니다. 애플에서의 일이 그것을 조금도 바꾸진 않았습니다. 나는 거부당했지만, 여진히 내 일을 사랑하고 있다는 것입니다. 나는 새롭게 출발하기로 결심했습니다.


그때는 전혀 몰랐지만, 애플에서 해고된 일은 내게 일어날 수 있었던 일중 최고의 경우였습니다. 성공에 대한 부담은, 모든 것에 확신은 갖고 있지는 않았지만, 새롭게 다시 시작할 수 있다는 가벼움으로 대체되었습니다. 그것이 내가 내 삶에서 가장 창조적이었던 시기로 들어갈 수 있도록 자유롭게 해 주었습니다.


이후 5년동안 나는 NeXT라는 회사, Pixar라는 이름의 다른 회사를 시작했고, 나중 내 처가 된 한 여성과 사랑에 빠졌습니다. 픽사는 세계 최초로 컴퓨터 애니메이션 영화인 토이스토리를 만들었고, 지금은 세계에서 가장 성공적인 애니메이션 회사가 되었습니다. 사건의 놀라운 반전 속에서 애플은 넥스트를 사들였고 나는 애플로 복귀했습니다. 그리고 내가 넥스트에서 개발한 기술은 애플의 현재 르네상스의 핵심이 되었습니다. 또한 로린과 나는 함께 한 가족을 만들었습니다.


내가 애플에서 해고되지 않았더라면 이런 일중 어떤 것도 일어나지 않았을 것이라고 나는 확신합니다. 그것은 두려운 시험약이었지만, 환자는 그것을 필요로 하는 것이었습니다. 인생이란 때로 여러분들을 고통스럽게 하지만, 신념을 잃지 말기 바랍니다. 나를 이끌어간 유일한 것은, 내가 하는 일을 사랑했다는 것이었다고 나는 믿습니다. 여러분들은 여러분이 사랑하는 것을 찾아야 합니다. 당신이 사랑하는 사람을 찾는 것과 마찬가지로 일에서도 같습니다.


여러분이 하는 일은 여러분 인생의 많은 부분을 채울 것입니다. 여러분이 진정으로 만족하는 유일한 길은 여러분 스스로 훌륭하다고 믿는 일을 하는 것입니다. 그리고 훌륭한 일을 하는 유일한 길은 여러분이 하는 일을 사랑하는 것입니다. 만일 그것을 아직 찾지 못했다면, 계속 찾으십시오. 주저앉지 마십시오. 언젠가 그것을 발견할 때 여러분은 마음으로부터 그것을 알게 될 것입니다. 그리고 어떤 훌륭한 관계에서 처럼, 그것은 해가 지나면서 점점 좋아질 것입니다. 그러므로 그것을 발견할 때까지 계속 찾으십시오. 주저앉지 마십시오.


   세번째 이야기는 죽음에 관한 것입니다.


내가 열일곱 살이었을 때, 나는 이런 비슷한 것을 읽은 적이 있습니다. "만일 당신이 매일을 삶의 마지막날처럼 산다면 언젠가 당신은 대부분 옳은 삶을 살았을 것이다." 나는 그것에 강한 인상을 받았고, 이후 33년동안 매일 아침 거울을 보면서 나 자신에게 말했습니다. "만일 오늘이 내 인생의 마지막 날이라면, 내가 오늘 하려는 것을 할까?" 그리고 여러날동안 그 답이 '아니오'라는 것으로 이어질 때, 나는 어떤 것을 바꿔야 한다는 것을 알게 되었습니다.


내가 곧 죽을 것이라는 것을 생각하는 것은, 내가 내 삶에서 큰 결정들을 내리는 데 도움을 준 가장 중요한 도구였습니다. 모든 외부의 기대들, 모든 자부심, 모든 좌절과 실패의 두려움, 그런 거의 모든 것들은 죽음 앞에서는 아무것도 아니기 때문에, 진정으로 중요한 것만을 남기게 됩니다. 당신이 죽을 것이라는 것을 기억하는 것은, 당신이 어떤 잃을 것이 있다는 생각의 함정을 피하는 가장 좋은 길이라고 나는 생각합니다. 여러분은 이미 벌거숭이입니다. 그러므로 여러분의 마음을 따라가지 못할 어떤 이유도 없습니다.


약 1년 전 나는 암 진단을 받았습니다. 나는 아침 7시30분에 스캔을 받았는데, 췌장에 분명한 종양이 발견되었습니다. 당시 나는 췌장이라는게 무엇인지도 몰랐습니다. 의사들은 이것이 치료가 불가능한 종류의 암이 거의 확실하다면서 내가 길어봐야 3개월에서 6개월밖에 살수 없다고 했습니다. 의사는 내게 집으로 가서 주변을 정리하라고 충고했습니다. 의사들이 말하는 죽음의 준비입니다. 그것은 가족에게 작별을 고하는 것입니다.


나는 그 진단을 하루종일 생각했습니다. 그날 저녁 늦게 나는 목구멍을 통해 내시경을 넣는 조직검사를 받았습니다. 몇점의 세포를 췌장에서 떼어내 조사를 했는데, 의사들은 놀랍게도 나의 경우 매우 드물게도 수술로 치료할 수 있는 종류의 췌장암임이 밝혀졌다고 아내에게 말했습니다. 나는 수술을 받았고 지금은 괜찮아 졌습니다.


이것이 내가 죽음에 가장 가까이 간 경우였습니다. 그리고 나는 앞으로 몇십년간은 그렇기를 바랍니다. 그런 과정을 거쳐 살았기 때문에, 나는 이제 죽음이라는 것을, 유용하긴 하지만 지적 개념만으로 알고 있었던 때보다는 좀 더 확신을 갖고 말할 수 있습니다.


누구도 죽기를 원하지 않습니다. 하늘나라 천국으로 가기를 원하는 사람조차 거기에 가기위해 죽기를 원하지는 않습니다. 하지만 죽은은 우리 모두가 함께하는 목적지 입니다. 누구도 거기에서 벗어나지 못했습니다. 죽음은 바로 그런 것입니다. 죽음은 생명의 가장 훌륭한 창조일 수 있습니다. 그것은 생명의 교체를 만들어 내는 매개체입니다. 죽음은 낡음을 청소하고 새로움을 위한 길을 열어줍니다.


지금 이순간, 그 새로움은 여러분들입니다. 그러나 미래의 어느날, 지금으로부터 그리 멀지 않을 그때, 여러분들도 점차 낡음이 되고 청소될 것입니다. 미안하지만 이것은 진실입니다.


여러분들의 시간은 한정되어 있습니다. 그러므로 다른 사람의 삶을 사느라고 시간을 허비하지 마십시오. 과거의 통념, 즉 다른 사람들이 생각한 결과에 맞춰 사는 함정에 빠지지 마십시오. 다른 사람들의 견해가 여러분 자신의 내면의 목소리를 가리는 소음이 되게 하지 마십시오. 그리고 가장 중요한 것은, 당신의 마음과 직관을 따라가는 용기를 가지라는 것입니다.  당신이 진정으로 되고자 하는 것이 무엇인지 그들은 이미 알고 있을 것입니다. 다른 모든 것들은 부차적인 것들입니다.


내가 젊었을 때, "전세계 목록"이라는 놀라운 책이 있었습니다. 우리 세대에게 그 책은 바이블과 같은 것이었습니다. 그 책은 이곳에서 멀지 않은 곳에 있는 스튜워트 브랜드라는 사람이 만든 것으로, 그는 시적인 면들을 가미해 책에 생명을 불어넣었습니다. 그 책이 나온 게 1960년대로, 그 당시에는 개인용 컴퓨터도 데스크탑 출판도 없었기 때문에, 모든 것이 타이프라이터와 가위, 폴라로이드 사진들로 만들어진 것이었습니다. 말하자면 종이책형태의 구글 같은 것이었는데, 구글이 나타나기 35년전의 일입니다.


스튜어트와 그의 팀은 이 책을 여러번 개정했고, 결국 그 책의 역할을 다 했을 때 최종판을 내었습니다. 그것이 1970년대 중반이었습니다. 바로 내가 여러분의 나이 때입니다. 그 최종판의 뒷표지에는, 여러분이 탐험여행을 하다가 지나가는 자동차를 얻어타기 위해 손을 드는 곳과 같은, 이른 아침 시골길을 찍은 사진이 인쇄돼 있었습니다. 그 밑에 이런 말이 적혀 있었습니다.

"늘 배고프고, 늘 어리석어라"(Stay Hungry. Stay Foolish)

이것이, 그들이 책을 더이상 찍지 않기로 하면서 한 작별의 메시지입니다. Stay Hungry. Stay Foolish. 나는 나 자신에게 늘 이러기를 바랬습니다. 그리고 지금, 여러분이 새로운 출발을 위해 졸업하는 이 시점에서, 여러분들이 그러기를 바랍니다.

Stay Hungry. Stay Foolish.

감사합니다.



연설문 MP3 다운 받기 >>>>>>

Intercepting Filter

Intercepting Filter

 


Brief Description

 

대부분의 어플리케이션들은 보안과 로깅과 같은 모든 어플리케이션 request들에 적용할 수 있는 어떤 요구사항들을 가지고 있다. 각각의 어플리케이션 서비스에 이런 기능을 추가하려면 시간이 걸리고, 에러가 발생하기 쉽고, 유지가 어렵게 된다. 이런 서비스들을 front controller에 구현하더라도 서비스들을 추가하거나 제거하기 위해서는 코드의 변경이 여전히 요구된다. 아래의 그림 1의 sequence diagram은 각각의 웹 리소스가 그런 서비스들을 개별적으로 호출하는 방식을 보여준다.


 

Figure 1. Before Intercepting Filter


Intercepting Filter 패턴은 현재의 어플리케이션 리소스들을 request의 수신과 response의 발신을 가로채는 일을하는 filter로 감싼다. intercepting filter는 어플리케이션 request들을  pre-process 또는 redirect 한다, 그리고 어플리케이션 response들의 컨텐츠를 post-process 또는 replace 한다. 또한 Intercepting filter들은 소스 코드의 변경 없이 현재의 웹 리소스들에 chain of separate와 declaratively-deployable service들을 추가하기 위해 다른것들 위에 놓여질 수 있다. 아래의 그림 2는 두개의 intercepting filter들의 연결이 그들이 감싸고 있는 두개의 웹 리소스에 대한 request들을 가로채는것을 보여준다.


Figure 2. After Intercepting Filter


 

Detailed Description

 

See the Core J2EE Patterns

 

Detailed Example

 

Java 2 Platform, Enterprise Edition (J2EE) platform 안의 Servlet Filter interface는 Intercepting Filter 패턴의 직접적인 구현이다. 예제 어플리케이션은 두개의 servlet filter들을 정의한다: 하나는 사용자의 signon을 전달하고, 다른 하나는 response encoding을 실행한다.

 

 ● The user signon filter.

 

예제 어플리케이션 클래스 SignOnFilter는 pet store front controller에 대한 모든 request들을 가로채는 일을 하는 intercepting filter 이다. SignOnFilter servlet filter는 사용자 signon이 요구되는 페이지들에 대한 request들을 감지하고 현재 로그온된 사용자가 없다면 사용자 로그인 페이지로 그런 request들을 redirect 한다. 이 프로세서의 자세한 설명은 User Signon and Customer Registration Module에 나와 있다 (온라인 문서 예제 어플리케이션 디자인과 구현의 일부분 [ BT-SADI02 ]).

 

 ● The encoding filter.


예제 어플리케이션 클래스 EncodingFilter는 pet store front controller로 부터의 response들을 수정하는 intercepting filter 이다. response의 encoding은 항상 일관되게 셋팅되어 있어야 한다는 것을 유의하라.

 

 ○ EncodingFilter 클래스에서 발췌한 아래의 코드 예제는 servlet filter가 각각의 response의 response encoding을 셋팅하고 그 request를 체인의 아래에 있는 다음 filter에 넘기는 방식을 보여준다. filter chain mechanism은 그런 filter들을 구성할 수 있도록 만들어 준다, 그래서 여러개의 intercepting filter들이 하나의 리소스를 감쌀수 있다.
               
public void doFilter(ServletRequest srequest,
                     ServletResponse sresponse,
                     FilterChain chain)
   throws IOException, ServletException {
           
   HttpServletRequest request = (HttpServletRequest)srequest;
   request.setCharacterEncoding(targetEncoding);

   // move on to the next
   chain.doFilter(srequest,sresponse);  
}

             
 ○ pet store 웹 어플리케이션 description web.xml 파일에서 발췌한 아래의 부분은 encoding filter가 "/*"(어플리케이션 컨텍스트 루트에 상대적인)에 메칭되는 모든 request들을 감싸도록 설정하는 방법을 보여준다.

 

  <!-- Encoding Filter Mapping Start-->
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

         
------------------------------------------------------------------------------------
원본 : http://java.sun.com/blueprints/patterns/InterceptingFilter.html
번역 : 김운주 ounju@naver.com

 

J2EE Patterns Catalog
http://blog.naver.com/ounju/140035283520

2010년 6월 28일 월요일

[펌]Eclipse에서 JPetStore 테스트 환경 구축 - Spring Framework 2.5, iBatis

이 글은 JPetStore라는 간단한 쇼핑몰 웹애플리케이션을 Eclipse에서 테스트하기 위한 방법을 소개한다. JPetStore는 원래  MS에서 소개된 샘플이나 나중에 java진영에 컨버팅되면서 더 유명해진듯 하다. 그러므로 JPetStore는 java만을 위한 것이 아님을 알고 접근하는 것이 좋겠다.

Spring Framework에 번들로 제공하는 JPetStore샘플은 Spring을 학습하는데 많이 유용하다. Spring 서적을 통해 학습한 내용을 실습한다는 차원에서 접근하면 좋겠다. Spring framework 2.5iBatis로 구성된 예제를 참고했다.

Eclipse 갈릴레오(JEE), JDK 1.6.0.18, Tomcat 6.0 , MySQL 5.0, Window 7 환경에서 테스트했음을 밝힌다. 즉, 이들 환경을 구축하는 방법은 모두 생략한다.


1. Spring 2.5 버전을 다운로드
현재 Spring 3.0 버전이 배포되고 있지만 JPetStore의 경우 2.5버전에만 있다. 다운로드 받을때는 2.5 최상위 버전을 다운로드 받되 뒤에 dependencies가 붙은 압축파일을 받도록 하자. 이 압축파일은 spring 2.5에 의존하는 lib나 예제들이 수록되어 있다. JPetStore 샘플도 여기에 있다.



다운로드 받으러 가기 : http://www.springsource.com/download/community

위 주소로 접속하면 첫화면에서 개인정보를 넣으라고 할것이다. 그냥 무시하고 download page 링크를 찾아 클릭하길 바란다. 다운로드를 완료하면 아무데나 압축을 풀면 되겠다.


2. 배포파일(war) 만들기
다운로드를 받아 samples/jpetstore 로 들어가면 아래와 같은 폴더 및 파일을 볼 수 있다.

원래는 ANT를 설치한 상태에서 ANT 스크립트를 담은 build.xml 만을 이용해 내부에 있는 명령인 "clean", "build", "warfile" 명령들을 이용해 최종배포파일인 war파일을 만들 수 있다. 하지만 그렇게 하면 많은 부분 불편하므로 spring 배포자가 이와 더불어 warfile.bat와 build.bat를 추가해서 ANT 환경을 구축해야하는 번거로움을 없애줬다. warfile.bat만 더블클릭으로 실행하면 자동으로 war를 만들어준다.

warfile.bat 구조은 다음과 같다.
build.bat warfile

이것은 위 build.bat를 실행하고 "warfile" ANT 스크립트 명령을 실행하는 것을 의미한다.

build.bat 내용은 다음과 같다.
"%JAVA_HOME%/bin/java" -cp ../../lib/ant/ant.jar;../../lib/ant/ant-launcher.jar;"%JAVA_HOME%/lib/tools.jar" org.apache.tools.ant.Main %1

build.bat는 JDK 설치경로에 ANT관련 jar를 복사해서 ANT를 실행할 수 있도록 해주는 것이 주 목표인것이다. 마지막에 org.apache.tools.ant.Main %1은 1개의 parameter를 받아 실행하겠다는 의미이다. 결국 %1이 warfile.bat의 "warfile" 문자열로 대체되어 build.xml의 warfile명령을 실행하도록 하는 것을 의미한다.

이제 warfile.bat만 두번 클릭해서 실행하면 된다. 혹시 제대로 실행이 되지 않을지도 모른다. 이것은 JDK 경로 설정이 잘못되었기 때문인데 build.bat에 자신의 JDK 경로를 아래와 같이 추가해보고 warfile.bat를 재실행해보길 바란다.

set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_18
"%JAVA_HOME%/bin/java" -cp ../../lib/ant/ant.jar;../../lib/ant/ant-launcher.jar;"%JAVA_HOME%/lib/tools.jar" org.apache.tools.ant.Main %

이제 %JAVA_HOME% 변수를 제대로 설정했기 때문에 이제 war파일을 제대로 만들 수 있게 된다.

만약 모두 지우고 war를 새로 만들고 싶다면 warfile.bat에서 warfile을 all로 수정하자.
build.bat all

이 모든과정을 이해하기 위해 build.xml에 있는 ANT 스크립트를 한번 훑어보는 것을 추천한다.

모든 과정을 마쳤다면 다음과 같이 .classes, dist 폴더가 추가되었을 것이다.


dist 폴더로 들어가면 jpetstore.war가 있다. 또한 war/WEB-INF/lib가 생성되어 그안에 필요한 jar가 복사된 것도 확인하자.


3. Eclipse에서 프로젝트 만들기

2가지 방법중 하나만 사용하면 되겠다. 먼저 Eclipse를 실행하기 바란다.


3.1. Web Project를 직접 만들기
File > New > New Project로 들어가 아래처럼 Dynamic Web Project를 선택한뒤 Next 버튼을 누른다.



Project name으로 jpetstore를 입력하고 Target runtime은 Tomcat 6.0을 선택하면 되겠다. Finish 버튼을 누른다.

2번 항목에서 samples/jpetstore 폴더로 가서 src와 war 내에 있는 파일을 각각 복사해 Eclipse내에 생성된 src와 WebContent 폴더에 파일을 복사한다.



3.2 war파일을 이용해서 프로젝트 만들기

이것은 3.1 방법외에 또 다른 방법이다.

2번 항목에서 samples/jpetstore/dist 폴더가 생성되었고 그 안에 jpetstore.war 를 생성했었다. 이것을 이용해 프로젝트를 생성한다. 이클립스에서 File > Import 를 들어가 아래처럼 WAR file을 선택한다.


아래 그림처럼 WAR file 경로(samples/jpetstore/dist)를 찾아 jpetstore.war를 선택하고 web project 이름과 target runtime을 설정한다. Finish 버튼을 누른다.


이렇게 프로젝트를 생성하면 src에는 아무것도 없다. 이 상태에서 실행해도 되지만 실제로 우리는 이클립스라는 개발툴을 활용하고 있으므로 java소스도 가져와야겠다. 그러므로 samples/jpetstore/src 에 있는 내용을 프로젝트의 src에 복사하도록 하자. Project Explorer에는 다음처럼 보여야 하겠다.



4. 실행해보기
3번 항목으로부터 만들어진 프로젝트는 이제 테스트해볼 수 있는 준비가 마련되었다.

이클립스에서 Window > Show View > Other 를 선택하면 아래와 같은 창이 나오고 거기서 Server를 선택한다.


이클립스 View 창에 아래처럼 Servers가 추가되어 있는 것을 확인할 수 있을 것이다. 테스트할 서버를 추가하자. 먼저 빈공간에 오른쪽 버튼을 눌러 New>Server를 선택한다.

아래와 같은 창이 나오면 Tomcat v6.0 Server를 선택한다.(필자는 Tomcat 6.0이 이미 설치되어 있으므로...) Next를 누른다.


다음과 같은 창이 나오면 우리가 만든 jpetstore 프로젝트가 왼쪽에 나오는데 이것을 선택한뒤 Add> 버튼을 눌러 Configured 부분에 추가한다. 이로써 우리 프로젝트는 Tomcat 서버위에서 하나의 웹애플리케이션으로 동작할 수 있게 된다. Finish 버튼을 누른다.


만들어진 서버에 jpetstore가 올라가 있음을 아래처럼 Servers View에서 확인할 수 있다. 이제 아래 그림처럼 실행버튼을 눌러 서버를 실행한다. 단, Tomcat 서버가 이미 실행되고 있으면 중지시킨뒤 해야하겠다.


참고로 필자는 서버 설정시 Ports를 80으로 지정한뒤 실행했다.



http://localhost/jpetstore 를 웹브라우저 주소창에 넣으면 아래와 같은 화면을 볼 수 있겠다. 만약 Ports가 8080이면http://localhost:8080/jpetstore로 접속하자. 내용을 보면 이 jpetstore 애플리케이션은 Spring과 iBatis로 만들어졌음을 보여주고 있다. Enter the Store 버튼을 누르면 실제 Store로 입장할 수 있게 된다.


5. 데이타베이스(MySQL)과 연동
아직 설정이 완료된 것은 아니다. 데이타 베이스 설정이 남아 있기 때문이다. JPetStore의 이곳저곳 들어가보면 MySQL 접속문제로 에러가 발생하는 것을 알 수 있을 것이다.

Spring Framework는 데이터베이스와의 연동을 위한 ORM(Object-Relation Mapping)을 지원하여 iBatis, Hibernate, JPA와 같은 영속성 프레임워크와 연동을 지원한다. 본 JPetStore는 그중에 iBatis를 이용하게 된다. 근간으로는 모두 JDBC와 같은 추상층을 사용하기 때문에 DB종류에 상관없이 간단한 프로퍼티 설정만으로 DB접속이 가능하며 JPetStore 예제는 hsqldb, mysql, oracle, postgres로 테스트 할 수 있도록 하고 있다.

필자는 많은 DB중에 MySQL 환경이 이미 구축되어 있으므로 이것을 사용하도록 하겠다. 다른 DB도 거의 비슷하므로 따로 설명은 필요 없겠다.


5.1 JDBC MySQL 드라이버 설치

MySQL 데이타베이스에 접근하기 위해 JDBC 드라이버를 다운로드 받아 프로젝트내에 포함시켜야 한다. 먼저 아래 링크에서 다운로드 받자.

http://dev.mysql.com/downloads/connector/j/

압축을 푼 뒤, mysql_connector_java 로 시작하는 jar 파일이 존재할 것이다. 이것은 프로젝트 내에 WebContent/WEB-INF/lib에 복사한다. 여기서 lib는 JPetStore를 동작시키기 위한 프레임워크 및 라이브러리 jar가 포함되어 있다. Spring, iBatis도 있는 것을 확인하자.



5.2 MySQL 계정정보 설정
프로젝트내 WebContent/WEB-INF/jdbc.properties 는 JDBC 접속정보를 설정할 수 있도록 되어 있다.

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpetstore
jdbc.username=jidolstar
jdbc.password=mypassword

위와 같은 설정은 5.1 항목에서 추가한 mysql driver에서 제공하는 MySQL 드라이버 클래스 사용한다는 것을 지정하고 있다. 또한 url, username, password를 설정하고 있다. 3306는 데이타 베이스 접속하기 위한 기본 포트번호 이며 그 뒤에 붙은 jpetstore는 접속할 DB 명이다. 그러므로 이들 정보는 필요에 따라서 수정해서 사용하면 되겠다.

5.3 MySQL DB를 만들고 테이블 생성
다운로드 받은 Spring Framework 폴더에 samples/jpetstore/db에 들어가면 총 4가지 자동 테이블 생성 코드가 있다. 여기서 mysql 폴더에 sql문이 존재한다.


먼저 MySQL에 "jpetstore" 이름을 가진 DB를 먼저 만든다.  jpetstore-mysql-schema.sql 을 열어보면 use jpetstore 부분이 맨 처음에 있다. 만약 DB 이름이 다른 이름을 가진다면 jpetstore 대신 다른 이름을 넣으면 되겠다. 그런 다음 위 두개의 sql 파일을 이용해 콘솔창에서 다음과 같이 해당 DB에 테이블과 데이터를 넣을 수 있다.
> mysql -uroot -p < jpetstore-mysql-schema.sql
Enter password: ***********
> mysql -uroot -p < jpetstore-mysql-dataload.sql
Enter password: ***********

물론 MySQL을 위한 클라이언트 애플리케이션(SQLGate나 SQLyog등)을 사용해도 되겠다.

이제 JPetStore는 모든 페이지에서 제대로 동작하게 될 것이다. 이를 이용해 Spring과 iBatis에 대해 공부하면 되겠다.

참고글

글쓴이 : 지돌스타(http://blog.jidolstar.com/688)