0:04:47.277,0:04:49.996 뒤에 잘 들리나요? 0:04:50.875,0:04:56.304 저 뒤에도 잘 들리나요? 오케이 좋습니다.[br] 0:04:56.991,0:05:02.798 Um what is an electron?[br] 0:05:02.873,0:05:07.984 So part of atom, everybody knows that, I think[br] 0:05:08.290,0:05:17.718 It's um.. (Screams from other room) yeah I think so, . I think that's royal ???[br] 0:05:17.884,0:05:23.095 Um electron is part of atom[br] 0:05:23.334,0:05:32.113 it's carries a unit of electronic charge, negative charge, as oppose to a proton which carries a positive charge[br] 0:05:32.230,0:05:42.408 It apparently has ??? not very much, thousands of electron... very very small amount of mass[br] 0:05:42.922,0:05:56.253 And we think of it as a particle, although that misleading um.. electron actually behaves much more like a wave than like a particle[br] 0:05:56.281,0:05:58.778 why do we think of it as particle?[br] 0:05:58.780,0:06:08.906 and the reason we do that is that when electron interacts a location like a particle would[br] 0:06:09.151,0:06:16.302 when electron is moving through the space it does not moves the way a particle would[br] 0:06:16.418,0:06:21.308 moves as a wave and the wave has no location[br] 0:06:21.308,0:06:25.084 you look at an ocean wave, and ocean wave can be huge[br] 0:06:25.554,0:06:34.209 it has no distinct location it has well defined energy but no distinct location[br] 0:06:34.209,0:06:35.330 this is how an electron moves[br] 0:06:35.997,0:06:39.131 electrons obey a principle and it's a mistruster principle[br] 0:06:42.191,0:06:46.166 It's called the poly exclusion principle[br] 0:06:46.166,0:06:52.752 two electrons bound into the same system will not be in the same state[br] 0:06:52.752,0:06:57.328 for whatever reason they cannot be in the same state[br] 0:06:57.328,0:07:00.677 so if there are two electrons in an atom[br] 0:07:00.677,0:07:04.066 those two electrons must be different somehow[br] 0:07:04.066,0:07:07.359 now they might different in the direction of their spin[br] 0:07:07.359,0:07:10.899 an electron can spin to the left or spin to the right[br] 0:07:10.899,0:07:18.305 two electrons that have exactly same energy could fit together spinning one left and one right 0:07:18.305,0:07:21.442 0:07:21.450,0:07:27.492 0:07:27.492,0:07:30.246 0:07:30.246,0:07:35.063 0:07:35.109,0:07:37.917 0:07:37.985,0:07:48.213 0:07:48.213,0:07:57.677 0:07:57.690,0:08:08.557 0:08:08.557,0:08:10.628 0:08:10.972,0:08:15.300 0:08:16.582,0:08:17.618 0:08:19.624,0:08:25.082 0:08:25.082,0:08:27.496 0:08:27.496,0:08:33.732 0:08:33.732,0:08:40.437 0:08:40.437,0:08:46.332 0:08:46.332,0:08:51.162 0:08:51.162,0:08:55.237 0:08:55.237,0:09:03.380 0:09:03.380,0:09:11.226 0:09:11.226,0:09:20.400 0:09:20.400,0:09:25.099 0:09:25.099,0:09:30.861 0:09:30.861,0:09:35.184 0:09:35.184,0:09:45.678 0:09:45.678,0:09:54.029 0:09:54.136,0:09:57.675 0:09:57.675,0:10:02.000 0:10:02.000,0:10:08.075 0:10:08.075,0:10:11.206 0:10:11.206,0:10:23.141 0:10:23.151,0:10:33.736 0:10:33.892,0:10:36.804 0:10:36.804,0:10:42.888 0:10:42.888,0:10:51.704 0:10:51.704,0:11:03.020 0:11:03.027,0:11:06.062 0:11:06.336,0:11:08.995 물론 오늘의 발표 주제는 이게 아니지요.[br] 0:11:10.345,0:11:19.835 오늘 이야기할 주제는 "아키텍처, 잃어 버린 시간" 입니다.[br] 0:11:20.057,0:11:24.080 이 것은 클린 코드와 클린 디자인의 다음 단계에 대한 이야기입니다.[br] 0:11:28.535,0:11:32.116 클린 시스템 스트럭쳐에 대한 이야기 입니다.[br] 0:11:32.459,0:11:38.162 이 그림은 내가 10년 전에 작성했던 어플리케이션의 디렉터리 구조입니다.[br] 0:11:38.162,0:11:47.069 0:11:47.069,0:11:52.489 당시에 Rails를 배우고 있었지요.[br]여기 Ruby 프로그래머가 있나요? Ruby on Rails 프로그래머? 0:11:52.646,0:11:56.906 저쪽에 손 흔드는 사람이 한 명 있네요. 오케이.[br] 0:11:57.047,0:12:03.364 당시에 Rails를 배우면서 이 어플리케이션을 작성했는데 책의 내용을 따라 했습니다.[br] 0:12:03.467,0:12:09.735 0:12:09.767,0:12:13.839 책에서 이야기하는데로 그대로 작성했더니 이런 형태의 결과가 나왔습니다.[br] 0:12:13.839,0:12:20.077 만족스럽게 마무리했고 그뒤로 오랫동안 안 봤습니다.[br] 0:12:20.140,0:12:27.376 그리고 한 3년 전에 내 아들한테 어플리케이션을 하나 작성해달라고 했습니다.[br] 0:12:27.376,0:12:34.434 그런데 작성된 어플리케이션을 보니 디렉터리 구조가 똑 같았어요.[br] 0:12:34.531,0:12:40.573 이 둘은 전혀 다른 어플리케이션이고 아무런 연관도 없습니다.[br] 0:12:40.614,0:12:52.945 그런데 디렉터리 구조는 똑 같아요. 이걸 보면서 왜 두 어플리케이션의 최상위 구조가 똑 같은지에 대해서 고민했습니다.[br] 0:12:52.945,0:12:56.609 이 둘은 전혀 다른 어플리케이션이거든요. 0:12:56.706,0:13:02.408 두 어플리케이션의 디렉터리 구조가 동일한 이유는 둘다 Rails 어플리케이션이기 때문이었습니다. 0:13:02.475,0:13:07.724 그러자 이게 왜 중요한지가 궁금해졌습니다. 0:13:07.724,0:13:20.413 Rails 같은 프레임워크가 얼마나 중요하길래 어플리케이션의 최상위 디렉터로 구조를 결정지어버리는 걸 까요?[br] 0:13:20.726,0:13:25.363 내가 생각한 이유는 바로 다음과 같습니다.[br] 0:13:25.426,0:13:34.438 웹은 전달을 위한 장치입니다. 웹은 I/O 채널이에요.[br] 0:13:34.531,0:13:37.913 웹 자체는 아키텍처적으로 중요하지 않습니다. 0:13:37.980,0:13:51.898 흔히 웹 어플리케이션을 작성한다고 생각하는데 그렇지 않습니다. 우리는 컨텐츠를 전달하는 어플리케이션을 작성하고 있는 것 입니다. 0:13:51.964,0:13:56.805 그러면 왜 I/O 채널이 그렇게 중요할까요?[br] 0:13:56.867,0:14:06.705 혹시 웹이 번성하기 시작한 시기를 기억하나요? 1980년대? 1990년대?[br] 0:14:06.705,0:14:12.883 얼마나 큰 변화였는지 기억하나요? 얼마나 모든 것이 근본적으로 변했는지 기억하나요? 0:14:12.914,0:14:19.712 그렇게 큰 변화는 없었습니다. 왜냐하면 실제로 그다지 새로운 것이 아니었기 때문이지요.[br] 0:14:19.792,0:14:26.511 우리는 단지 입력 소스로 부터 입력을 받고, 처리하고, 출력 소스로 내보내기만 했습니다.[br] 0:14:26.573,0:14:28.374 웹은 그냥 그런거에요.[br] 0:14:28.374,0:14:31.082 그런데 왜 왭이 모든 것들을 결정해버릴까요? 0:14:31.082,0:14:38.989 그래서 나는 건축에 대해서 생각해봤습니다. 건축 도면을 봤어요.[br] 0:14:38.989,0:14:49.599 저 건축 도면을 보세요. 첫 눈에 도서관 도면이라고 생각이 안들어도 깨닫는데까지 얼마 걸리지 않을 겁니다.[br] 0:14:49.599,0:14:51.729 도서관이라는게 너무 명백하거든요.[br] 0:14:51.805,0:14:55.882 책장들이 많이 있고 책상도 많습니다.[br] 0:14:55.882,0:15:05.705 책상위엥 컴퓨터도 보이고요 책을 대출하고 반납하는 곳도 보여요. 0:15:05.705,0:15:11.308 저 도면을 보고 도서관이라는 것을 알아채는데에 오랜 시간이 걸리지 않을 겁니다.[br] 0:15:11.377,0:15:16.329 다른 것도 봐볼까요? 저건 교회에요. 누가 봐도 교회지요.[br] 0:15:16.364,0:15:21.714 어쩌면 극장이라고 생각할 수 도 있겠지요. 극장이랑 교회는 공통 부분이 있으니까요.[br] 0:15:21.759,0:15:29.736 하지만 이건 분명히 교회입니다. 제단, 바깥의 교실, 0:15:29.736,0:15:32.123 분명히 교회지요. 0:15:32.123,0:15:42.315 이 건물의 아키텍처는 어떻게 지어지는지 이야기하지 않습니다. 0:15:42.315,0:15:47.260 이 건물의 아키텍처는 그 의도 이야기하고 있지요. 아키텍처라는 것은 의도에 대한 것 입니다. 0:15:47.260,0:15:56.016 하지만 저 Rails 어플리케이션들의 최상위 구조는 그 의도에 대해서 이야기하지 않고 있지요. 0:16:01.724,0:16:01.974 저 어플레케이션들은 스스로 Rails 어플리케이션이라는 것을 이야기하고 있습니다. 무언가 잘못되었어요. 0:16:02.040,0:16:04.862 그리고 이런 생각이 들었습니다. 0:16:04.899,0:16:15.870 이건 이미 알려진 문제인가? 이미 해결되었던 문제인가? 이 문제는 1992년에 Iva jacobson이 저술한 책에서 거론되고 해결되었었습니다. 0:16:15.907,0:16:20.638 이 책을 가진 사람이 있나요? 읽어 본 사람? 여기 한 사람있네요 또 없나요? 0:16:20.677,0:16:23.431 Object-Oriented Software Engineering. 아주 훌륭한 책이에요. 0:16:23.503,0:16:29.821 1992년에 출반된 책이지만 상관없어요. 책에 담긴 원칙들은 여전히 유효합니다. 0:16:29.916,0:16:36.619 부제를 보세요. 부제는 'A Usecase driven approach' 입니다. 0:16:36.619,0:16:45.107 유즈케이스 기억하는 사람 있나요? 1990년대에는 아주 아주 유명했었습니다. 0:16:45.107,0:16:54.130 실제론 너무 유명해서 수많은 컨설턴트들에 의해 본래의 의미가 변질되었었지요. 0:16:54.130,0:17:07.146 수많은 컨설턴트들이 자신의 유즈케이스 양식을 인터넷에 앞다퉈서 내놓았었지요. 0:17:07.146,0:17:12.770 그러더니 양식 자체가 매우 중요하게 여겨져 버렸어요. 우리는 그 표준 양식의 빈칸을 채우도록 강요받았지요. 0:17:12.770,0:17:28.980 유즈케이스의 이름, 입력값, 사전조건, 사후조건, 주액터, 부액터 등을 채워야했습니다. 0:17:29.011,0:17:38.276 우리는 모든 빈칸을 채워야만했고 결국 유즈케이스의 가장 중요한 점은 그 기능이 아니라 양식이 되버렸습니다. 0:17:38.306,0:17:51.667 그 시기의 절정 즈음에 에자일 운동이 시작되었습니다. 우리는 유즈케이스에 대한 이야기는 멈추고 유저 스토리에 대해 이야기했습니다. 유즈케이스에 대해서는 아무도 이야기하지 않게되었지요. 0:17:51.714,0:17:58.190 그래서 나는 이 책을 다시 읽어봤어요. 0:17:58.227,0:18:02.105 Jacobson이 쓴것들을 다시 기억해냈습니다. 0:18:02.168,0:18:11.409 여기 유즈케이스가 있습니다. 전형적인 Jacobson 스타일의 유즈케이스에요. 0:18:11.444,0:18:23.728 매우 작은 양식이에요. '주문 생성'이라는 이름이 있네요. 주문 처리 시스템의 유즈케이스라고 생각해보세요. 0:18:23.791,0:18:32.570 입력 값으로 고객 아이디, 고객 연락처, 수신처 등이 보이네요. 0:18:32.602,0:18:37.959 여기에는 세부적인 내용은 없어요. 고객 아이디가 어떤 것인지 기술하지 않습니다. 0:18:38.027,0:18:40.146 숫자이건 문자열이건 상관없어요. 0:18:40.187,0:18:48.264 고객 연락처가 어떤 것인지 기술하지 않습니다. 아마도 이름 날자 주소등등 이겠지요. 0:18:48.328,0:18:51.560 하지만 세부사항들연 여기에 명시되어있지 않습니다. 0:18:51.599,0:19:05.294 여기 메인 흐름이 있네요. 메인 흐름은 유즈케이스를 만족시키기 위해 컴퓨터가 실행하는 단계들이에요. 0:19:05.327,0:19:11.037 첫 번째로 주문 담당자는 '주문 생성'을 요청합니다. 0:19:11.073,0:19:18.511 그리고 시스템이 데이터를 검증합니다. 어떻게 검증한다는 이야기는 안했지요? 어떻게든 검증을 하는지는 중요하지 않습니다. 그냥 검증을 한다는게 중요합니다. 0:19:18.575,0:19:27.947 세번째로 시스템이 주문을 생성하고 ID를 결정합니다. 아마도 어떤 데이터베이스 작업이겠지만 이야기는 안하겠습니다. 0:19:27.984,0:19:35.036 그리고 시스템은 담당자에게 ID를 전달합니다. 아마도 웹 페이지를 통해서겠지만 이야기는 안하겠습니다. 0:19:35.106,0:19:44.200 실제로 이 유즈케이스는 웹에 대해 아무런 이야기도 하지 않습니다. 이 유즈케이스는 어떤 I/O 채널을 통해서도 구현이 가능하겠지요. 0:19:44.234,0:19:53.376 이 유즈케이스는 콘솔 앱, 데스크탑 앱, SOA 앱, 아이폰 앱에서도 구현이 가능합니다. 0:19:53.376,0:19:59.609 유즈케이스는 I/O 채널을 모르기 때문에 가능한 것 입니다. 0:19:59.609,0:20:08.599 Jacobson은 유즈케이스를 오브젝트로 바꿀 수 있다고 했습니다. 0:20:08.599,0:20:19.218 Jacobson은 저것을 Control Object라고 불렀지만 MVC의 Controller와 헷갈릴 수 있으므로 Interactors라고 이름을 바꿨습니다. 0:20:19.218,0:20:26.489 어쩌면 유즈케이스라는 이름이 더 좋겠지만 그렇게 하지는 않았습니다. Interactors로 부르겠습니다. 0:20:26.489,0:20:38.378 Interactor 오브젝트는 유즈케이스를 구현합니다. 유즈케이스의 입력값을 입력 받아서 유즈케이스의 출력값을 출력합니다. 0:20:38.378,0:20:44.757 그리고 유즈케이스의 처리 흐름을 구현합니다. 0:20:44.757,0:20:53.936 밑에 설명을 보면 어플리케이션 별 비지니스 규칙들을 가진다고 되어있지요? 0:20:53.936,0:20:56.768 거기에는 두 종류의 비지니스 규칙이 있습니다. 0:20:56.768,0:21:06.636 먼저 글로벌할 비지니스 규칙이 있습니다. 모든 어플리케이션에 적용이 가능하지요. 0:21:06.636,0:21:11.995 그리고 개발중인 어플리케이션에만 해당하는 비지니스 규칙들이 있습니다. 0:21:11.995,0:21:22.020 예를 들어서 주문 입력 어플리케이션과 주문 처리 어플리케이션이 있다고 생각해봅시다. 0:21:22.020,0:21:29.693 둘 다 '주문'이라는 오브젝트가 있을겁니다. 그리고 그 주문 오브젝트들은 같은 비지니스 규칙을 가지고 있겠지요. 0:21:29.693,0:21:40.269 하지만 둘 중 하나의 어플리케이션만 주문 추가라는 유즈케이스를 가지고 있을 겁니다. 0:21:40.269,0:21:47.570 유즈케이스는 어플리케이션에 따라 다릅니다. 유즈케이스는 특정 어플리케이션에 종속되지요. 0:21:47.570,0:21:56.696 비지니스 규칙은 어플리케이션에 따라 다르지 않습니다. Entity 오브젝트에 종속됩니다. 비지니스 오브젝트라고 불려지기도 합니다. 0:21:56.727,0:22:01.325 나는 비지니스 오브젝트라는 말은 좋아하지는 않습니다. Jacobson 도 Entiry 오브젝트라고 불렀지요. 0:22:01.405,0:22:09.865 어플리케이션 비종속적인 비지니스 규칙들을 Entity 오브젝트에 넣고 Interactor가 Entity 오브젝트들을 관장합니다. 0:22:09.929,0:22:17.482 그런 후에 유즈케이스의 입력값과 출력값을 다른 유즈케이스에 전달하는 방법을 정합니다. 0:22:17.583,0:22:30.440 이 경우에는 인터페이스를 사용합니다. 그림에 객체지향 방식의 인터페이스로 표현을 했는데요. Interactor는 인터페이스 하나를 사용하고 있고요 다른 하나의 인터페이스는 구현을 하고 있습니다. 0:22:30.440,0:22:38.753 Interactor가 구현하고 있는 것은 입력 인터페이스이고요 Interactor가 사용하고 있는 것은 출력 인퍼테이스입니다. 0:22:38.753,0:22:42.174 두 인터페이스와 Interactor 사이의 화살표가 같은 방향이지요? 이 것이 중요한 것 입니다!!!!! 0:22:42.174,0:22:42.424 이게 왜 중요한지는 조금 뒤에 이야기하겠습니다. 0:22:45.446,0:22:53.815 0:22:53.815,0:22:56.483 0:22:56.483,0:23:03.344 0:23:03.344,0:23:10.518 0:23:10.518,0:23:12.711 0:23:12.711,0:23:25.915 0:23:25.915,0:23:31.619 0:23:31.619,0:23:37.450 0:23:37.450,0:23:50.748 0:23:50.748,0:23:52.764 0:23:52.764,0:23:56.904 0:23:56.904,0:24:01.911 0:24:01.976,0:24:10.546 0:24:10.546,0:24:26.691 0:24:26.754,0:24:33.210 0:24:33.666,0:24:41.673 0:24:41.673,0:24:47.942 0:24:47.942,0:25:00.808 0:25:00.808,0:25:10.958 0:25:10.958,0:25:14.686 0:25:14.686,0:25:20.292 0:25:20.292,0:25:24.772 0:25:24.772,0:25:30.220 0:25:30.220,0:25:33.044 0:25:33.044,0:25:40.663 0:25:40.663,0:25:45.237 0:25:45.237,0:25:50.775 0:25:50.775,0:25:56.698 0:25:56.698,0:25:58.451 0:25:58.451,0:26:05.846 0:26:05.846,0:26:14.500 0:26:14.500,0:26:18.196 0:26:18.196,0:26:27.613 0:26:27.613,0:26:35.480 0:26:35.480,0:26:41.154 0:26:41.154,0:26:47.457 0:26:47.457,0:26:50.027 0:26:50.027,0:26:57.638 0:26:57.638,0:27:00.550 0:27:00.550,0:27:06.406 0:27:06.406,0:27:12.775 0:27:12.837,0:27:18.543 0:27:18.543,0:27:27.724 0:27:27.724,0:27:29.759 0:27:29.759,0:27:41.696 0:27:41.760,0:27:48.409 0:27:48.472,0:27:59.126 0:27:59.220,0:28:01.293 0:28:01.324,0:28:07.470 0:28:07.470,0:28:15.161 0:28:15.201,0:28:24.117 0:28:24.152,0:28:35.691 0:28:35.725,0:28:40.078 0:28:40.144,0:28:50.360 0:28:50.423,0:29:01.220 0:29:01.284,0:29:04.320 0:29:04.383,0:29:14.740 0:29:14.740,0:29:23.961 0:29:23.961,0:29:29.431 0:29:29.431,0:29:37.781 0:29:37.781,0:29:43.463 0:29:43.463,0:29:50.645 0:29:50.645,0:29:53.596 0:29:53.596,0:30:07.610 0:30:07.610,0:30:21.488 0:30:21.488,0:30:34.438 0:30:34.438,0:30:44.621 0:30:44.621,0:30:55.782 0:30:55.782,0:31:06.173 0:31:06.239,0:31:13.115 0:31:10.120,0:31:31.439 0:31:13.146,0:31:17.470 0:31:31.502,0:31:37.292 0:31:37.323,0:31:44.851 0:31:44.914,0:31:51.867 0:31:51.940,0:32:03.285 0:32:03.320,0:32:10.685 0:32:10.753,0:32:17.424 0:32:17.490,0:32:28.306 0:32:28.401,0:32:37.522 0:32:37.596,0:32:43.097 0:32:43.191,0:32:53.170 0:32:53.202,0:33:03.697 0:33:03.697,0:33:08.017 0:33:08.079,0:33:16.245 0:33:16.283,0:33:21.133 0:33:21.133,0:33:28.686 0:33:28.728,0:33:33.069 0:33:33.100,0:33:38.591 0:33:38.661,0:33:43.797 0:33:43.844,0:33:48.844 0:33:48.844,0:33:53.198 0:33:53.198,0:33:55.956 0:33:55.956,0:33:59.520 0:33:59.520,0:34:06.612 0:34:06.612,0:34:12.975 0:34:12.975,0:34:18.556 0:34:18.556,0:34:24.989 0:34:24.989,0:34:32.487 0:34:32.487,0:34:37.349 0:34:37.349,0:34:48.541 0:34:48.541,0:34:54.206 0:34:54.206,0:35:00.046 0:35:00.046,0:35:04.588 0:35:04.588,0:35:11.045 0:35:11.045,0:35:20.650 0:35:20.650,0:35:30.222 0:35:30.222,0:35:33.517 0:35:33.517,0:35:38.750 0:35:38.750,0:35:50.047 0:35:50.085,0:35:54.420 0:35:54.420,0:36:03.295 0:36:03.359,0:36:14.766 0:36:14.799,0:36:26.294 0:36:26.334,0:36:27.517