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