Robert C. Martin - Clean Architecture and Design
-
0:00 - 4:44(4분45초에 시작. 실제 강연과 한글 자막은 11:05에 시작)
-
4:46 - 4:50뒤에 잘 들리나요?
-
4:51 - 4:56저 뒤에도 잘 들리나요? 오케이 좋습니다.
-
4:56 - 5:01Um what is an electron?
-
5:04 - 5:08So part of atom, everybody knows that, I think
-
5:08 - 5:18It's um.. (Screams from other room) yeah I think so, . I think that's royal ???
-
5:20 - 5:22Um electron is part of atom
-
5:23 - 5:32it's carries a unit of electronic charge, negative charge, as oppose to a proton which carries a positive charge
-
5:32 - 5:42It apparently has ??? not very much, thousands of electron... very very small amount of mass
-
5:43 - 5:55And we think of it as a particle, although that misleading um.. electron actually behaves much more like a wave than like a particle
-
5:55 - 5:59why do we think of it as particle?
-
5:59 - 6:09and the reason we do that is that when electron interacts a location like a particle would
-
6:09 - 6:16when electron is moving through the space it does not moves the way a particle would
-
6:16 - 6:21moves as a wave and the wave has no location
-
6:21 - 6:27you look at an ocean wave, and ocean wave can be huge
-
6:27 - 6:34it has no distinct location it has well defined energy but no distinct location
-
6:34 - 6:36this is how an electron moves
-
6:36 - 6:42electrons obey a principle and it's a mistruster principle
-
6:42 - 6:46It's called the poly exclusion principle
-
6:46 - 6:53two electrons bound into the same system will not be in the same state
-
6:53 - 6:57for whatever reason they cannot be in the same state
-
6:57 - 7:01so if there are two electrons in an atom
-
7:01 - 7:04those two electrons must be different somehow
-
7:04 - 7:08now they might different in the direction of their spin
-
7:08 - 7:11an electron can spin to the left or spin to the right
-
7:11 - 7:18two electrons that have exactly same energy could fit together spinning one left and one right
-
7:18 - 7:21there's no way to get a third one in there
-
7:21 - 7:28so the next electron must have higher energy and then you can have two more
-
7:28 - 7:31one spinning left one spinning right
-
7:31 - 7:35but if you wanted to add another that would have to be something different about them
-
7:35 - 7:38and you could arrange them differently in space
-
7:38 - 7:49so you could have one group of two this way and another group of two this way and another group of two this way and one group of two in a sphere and that adds up the eight by the way.
-
7:50 - 7:58most of our atoms that we know of have this need to have 8 electrons in their shells
-
7:58 - 8:08The reason for that is just this nice little geometry. the sphere and then three rows and each one of those can contain two
-
8:08 - 8:13have you ever thought about water?
-
8:13 - 8:17I got some here. Fascinating substance
-
8:17 - 8:20what's it made of?
-
8:20 - 8:25two hydrogen atoms one oxygen atom
that's what makes a water molecule -
8:25 - 8:28and what's it shaped like?
-
8:28 - 8:33Mickey mouse! yes, there is big oxygen in the middle and two little hydrogens forming the ears
-
8:33 - 8:42The angle there is the result of (??) the shell arrangement.
-
8:42 - 8:47What makes the hydrogen and oxygen stick together?
-
8:47 - 8:51think of two atoms, two atoms covered by electrons, two electrons are parallel each other
-
8:51 - 8:56what would make two hydrogens and an oxygen stick together?
-
8:56 - 9:03And it turns out that if you take these two hydrogens and big oxygen you lay them next to each other
-
9:03 - 9:12and you think of the electrons as waves, not particles, then where those waves like to be?
-
9:12 - 9:20and those waves would like to be mostly between protons. Protons in hydrogen atom and protons in oxygen atom
-
9:20 - 9:25So they will congregate those electron waves will congregate more
-
9:25 - 9:31between two atoms, between three atoms actually, then everywhere else
-
9:31 - 9:35they still go everywhere else that just that more likely to be between them
-
9:35 - 9:48that means there's little extra negative charge between the atoms and that little extra negative charge to tracks the protons and that's covalent bonds
-
9:48 - 9:54now if you take this Mickey mouse atom and you divide it in half
-
9:54 - 9:58you find there's more negative charge above the one and below the one
-
9:58 - 10:02cause all that negative charge likes to sit there between the two hydrogen atoms and oxygen atoms
-
10:02 - 10:08So there's more negative charge on one side than the other which means that water molecule is a dipole
-
10:08 - 10:11it is negative one side and positive on the other
-
10:11 - 10:13this is why water is wet.
-
10:13 - 10:20Water sticks to your hand because all the water molecules rotate to stick to the electrically charged surface of your skin
-
10:20 - 10:23even though it is not very electrically charged
-
10:23 - 10:34this is why water makes it good solvent because the little water molecules would rotate to attract to the parts of the other molecule that they want want to stick to
-
10:34 - 10:37this is why water makes it a good cleanser
-
10:37 - 10:43and this is why water will do one of the most wonderful things you can do with water. Who's done this experiment?
-
10:43 - 10:52You get a water faucet. You turn it on just so you get a really thin stream of water. Not very fast, just tiny stream of water
-
10:52 - 11:02And then you get a balloon and you rub the balloon on your head. And then you hold the balloon close to that stream of water and watch the water bend towards the balloon
-
11:02 - 11:06as all the water molecules turn around get it tracked the electric charge
-
11:06 - 11:10물론 오늘의 발표 주제는 이게 아니지요.
-
11:11 - 11:20오늘 이야기할 주제는 "아키텍처, 잃어 버린 시간" 입니다. 지난 몇 년 동안 강연해왔던 주제인데요.
-
11:20 - 11:28클린 코드와 클린 디자인의 다음 단계에 대한 이야기입니다.
-
11:29 - 11:34클린 시스템 스트럭쳐에 대한 이야기 입니다.
-
11:34 - 11:38화면을 보세요.
-
11:38 - 11:47이 그림은 내가 10년 전에 작성했던 어플리케이션의 디렉터리 구조입니다.
-
11:47 - 11:53당시에 Rails를 배우고 있었지요. 여기 Ruby 프로그래머가 있나요? Ruby on Rails 프로그래머?
-
11:53 - 11:57저쪽에 손 흔드는 사람이 한 명 있네요. 오케이.
-
11:57 - 12:04당시에 Rails를 배우면서 이 어플리케이션을 작성했지요.
-
12:04 - 12:10책의 내용을 그대로 따라 작성했습니다.
-
12:10 - 12:14책에서 이야기하는 데로 그대로 작성했더니 이런 형태의 결과가 나왔습니다.
-
12:14 - 12:20만족스럽게 마무리했고 그뒤로 오랫동안 보지 않았지요.
-
12:20 - 12:27그리고 한 3년 전에 아들에게 어플리케이션을 하나 작성해달라고 했습니다.
-
12:27 - 12:32작성된 어플리케이션을 봤더니
-
12:32 - 12:36디렉터리 구조가 똑같았어요.
-
12:36 - 12:41이 둘은 전혀 다른 어플리케이션이고 아무런 연관도 없습니다.
-
12:41 - 12:45그런데 디렉터리 구조는 똑같아요. 이걸 보면서
-
12:45 - 12:53왜 두 어플리케이션의 최상위 구조가 같은지에 대해서 고민했습니다.
-
12:53 - 12:57이 둘은 전혀 다른 어플리케이션이거든요.
-
12:57 - 13:03두 어플리케이션의 디렉터리 구조가 동일한 이유는 둘 다 Rails 어플리케이션이기 때문이었습니다.
-
13:03 - 13:09그러자 이게 왜 중요한지가 궁금해졌습니다.
-
13:09 - 13:21Rails 같은 프레임워크가 얼마나 중요하길래 어플리케이션의 최상위 디렉터리로 구조를 결정지어버리는 걸 까요?
-
13:21 - 13:25내가 생각한 이유는 바로 다음과 같습니다.
-
13:26 - 13:34웹은 전달을 위한 장치입니다. 웹은 I/O 채널이에요.
-
13:34 - 13:38웹 자체는 아키텍처적으로 중요하지 않습니다.
-
13:38 - 13:42흔히 웹 어플리케이션을 작성한다고 이야기합니다.
-
13:42 - 13:45하지만 그렇지 않습니다.
-
13:45 - 13:52우리는 어플리케이션을 작성하고 있는 것 입니다. 단지 어플리케이션이 웹 이라고 하는 I/O 채널을 통해 콘텐트를 전달하는 것뿐이지요.
-
13:52 - 13:58그러면 왜 I/O 채널이 그렇게 중요할까요?
-
14:00 - 14:07혹시 웹이 번성하기 시작한 시기를 기억하나요? 1980년대? 1990년대?
-
14:07 - 14:14얼마나 큰 변화였는지 기억하나요? 얼마나 모든 것이 근본적으로 변했는지 기억하나요?
-
14:14 - 14:20그다지 큰 변화는 없었습니다. 왜냐하면 실제로 크게 달라진 것이 없었기 때문이지요.
-
14:20 - 14:27우리는 단지 입력 소스로부터 입력을 받고, 처리하고, 출력 소스로 내보내기만 했습니다.
-
14:27 - 14:28웹은 그냥 그런 거에요.
-
14:28 - 14:31그런데 왜 웹이 모든 것들을 결정해버릴까요?
-
14:31 - 14:39그래서 나는 건축에 대해서 생각해봤습니다. 건축 도면을 봤어요.
-
14:41 - 14:50저 도면을 보세요. 저 위에 도서관이라는 글씨가 없더라도 깨닫는데 얼마 걸리지 않을 겁니다.
-
14:50 - 14:52도서관이라는게 너무 명백하거든요.
-
14:52 - 14:56책장들이 많이 있고 책상도 많습니다.
-
14:56 - 15:06책상위에 컴퓨터도 보이고요 책을 대출하고 반납하는 곳도 보여요.
-
15:06 - 15:11저 도면을 보고 도서관이라는 것을 알아채는 데에 오랜 시간이 걸리지 않을 겁니다.
-
15:11 - 15:16다른 것도 봐볼까요? 저건 교회에요. 누가 봐도 교회지요.
-
15:16 - 15:21어쩌면 극장이라고 생각할 수 도 있겠지요. 극장이랑 교회는 공통 부분이 있으니까요.
-
15:21 - 15:30하지만 이건 분명히 교회입니다. 제단, 바깥의 교실,
-
15:30 - 15:32분명히 교회지요.
-
15:32 - 15:42이 건물의 아키텍처는 어떻게 지을 수 있는지 말하지 않습니다. 이 건물의 아키텍처는 그 의도를 말하고 있습니다.
-
15:42 - 15:49아키텍처는 의도를 표현하는 것 입니다.
-
15:49 - 15:56하지만 저 Rails 어플리케이션들의 최상위 구조는 그 의도가 보이지 않습니다.
-
15:56 - 16:03단지 Rails 어플리케이션이라고 말하고 있지요. 무언가 잘못되었어요.
-
16:03 - 16:06그리고 이런 생각이 들었습니다.
-
16:06 - 16:15이건 이미 알려진 문제인가? 이미 해결되었던 문제인가? 이 문제는 1992년에 이바 야콥슨이 저술한 책에서 거론되고 해결되었었습니다.
-
16:15 - 16:21이 책을 가진 사람이 있나요? 읽어 본 사람? 여기 한 사람있네요 또 없나요?
-
16:21 - 16:23Object-Oriented Software Engineering. 아주 훌륭한 책이에요.
-
16:24 - 16:301992년에 출반된 책이지만 상관없어요. 책에 담긴 원칙들은 여전히 유효합니다.
-
16:30 - 16:37부제를 보세요. 부제는 'A Usecase driven approach' 입니다.
-
16:37 - 16:45유즈케이스 기억하는 사람 있나요? 1990년대에는 아주 아주 유명했었습니다.
-
16:45 - 16:54사실 너무 유명해서 수많은 컨설턴트들이 본래의 의미를 변질시켰지요.
-
16:54 - 17:06기억하나요? 수많은 컨설턴트들이 자신의 유즈케이스 양식을 앞다투어 인터넷에 올렸었지요.
-
17:06 - 17:16결국 양식만 중요하게 되어 버렸어요. 표준 양식의 빈칸을 채우도록 강요 받았지요.
-
17:16 - 17:23유즈케이스의 이름, 입력값, 사전조건, 사후조건, 주액터, 부액터 등을 채워야 했습니다.
-
17:23 - 17:30.
-
17:30 - 17:38우리는 모든 빈칸을 채워야만 했고 결국 유자케이스의 가장 중요한 점은 그 기능이 아니라 양식이 되버렸습니다.
-
17:38 - 17:44그 즈음에 에자일 운동이 시작되었습니다.
-
17:44 - 17:52우리는 유즈케이스에 대한 이야기는 멈추고 유저 스토리에 대해 이야기했습니다. 유즈케이스에 대해서는 아무도 이야기하지 않게 되었지요.
-
17:52 - 17:58그래서 나는 이 책을 다시 읽어봤어요.
-
17:58 - 18:02야콥슨이 쓴 것들을 다시 기억해냈습니다.
-
18:02 - 18:11여기 유즈케이스가 있습니다. 전형적인 야콥슨 스타일의 유즈케이스에요.
-
18:11 - 18:16보다시피 매우 작은 양식이에요.
-
18:16 - 18:25'주문 생성'이라는 이름이 있네요. 주문 처리 시스템의 유즈케이스라고 생각해보세요.
-
18:25 - 18:32입력 값으로 고객 아이디, 고객 연락처, 수신처 등이 보이네요.
-
18:32 - 18:38여기에는 세부적인 내용은 없어요. 고객 아이디가 어떤 것인지 기술하지 않습니다.
-
18:38 - 18:40숫자이건 문자열이건 상관없어요.
-
18:40 - 18:48고객 연락처가 어떤 것인지 기술하지 않습니다. 아마도 이름 날자 주소 등등 이겠지요.
-
18:48 - 18:52하지만 세부사항들은 여기에 명시되어있지 않습니다.
-
18:52 - 18:55여기 메인 흐름이 있네요.
-
18:55 - 19:05메인 흐름은 유즈케이스를 만족시키기 위해 컴퓨터가 실행하는 단계들이에요.
-
19:05 - 19:11첫 번째로 주문 담당자는 '주문 생성'을 요청합니다.
-
19:11 - 19:19그리고 시스템이 데이터를 검증합니다. 어떻게 검증한다는 이야기는 안 했지요? 어떻게든 검증을 하는지는 중요하지 않습니다. 그냥 검증을 한다는 게 중요합니다.
-
19:19 - 19:24세번째로 시스템이 주문을 생성하고 ID를 결정합니다.
-
19:24 - 19:29아마도 어떤 데이터베이스 작업이겠지만 이야기는 안 하겠습니다.
-
19:29 - 19:35그리고 시스템은 담당자에게 ID를 전달합니다. 아마도 웹 페이지를 통해서겠지만 이야기는 안 하겠습니다.
-
19:35 - 19:40실제로 이 유즈케이스는 웹에 대해 아무런 이야기도 하지 않습니다.
-
19:40 - 19:44이 유즈케이스는 어떤 I/O 채널을 통해서도 구현이 가능하겠지요.
-
19:44 - 19:54이 유즈케이스는 콘솔 앱, 데스크탑 앱, SOA 앱, 아이폰 앱에서도 구현이 가능합니다.
-
19:54 - 20:00유즈케이스는 I/O 채널을 모르기 때문에 가능한 것 입니다.
-
20:00 - 20:10야콥슨은 유즈케이스를 오브젝트로 바꿀 수 있다고 했습니다.
-
20:10 - 20:20야콥슨은 저것을 Control Object라고 불렀지만 MVC의 Controller와 헷갈릴 수 있으므로 Interactor라고 이름을 바꿨습니다.
-
20:20 - 20:26어쩌면 유즈케이스라는 이름이 더 좋겠지만 그렇게 하지는 않았습니다. Interactor로 부르겠습니다.
-
20:26 - 20:38Interactor 오브젝트는 유즈케이스를 구현합니다. 유즈케이스의 입력값을 입력 받아서 유즈케이스의 출력 값을 출력합니다.
-
20:38 - 20:46그리고 유즈케이스의 처리 흐름을 구현합니다.
-
20:46 - 20:54밑에 설명을 보면 어플리케이션 별 비즈니스 규칙들을 가진다고 되어있지요?
-
20:54 - 20:57거기에는 두 종류의 비즈니스 규칙이 있습니다.
-
20:57 - 21:06먼저 글로벌 한 비즈니스 규칙이 있습니다. 모든 어플리케이션에 적용이 가능하지요.
-
21:06 - 21:12그리고 개발중인 어플리케이션에만 해당하는 비즈니스 규칙들이 있습니다.
-
21:12 - 21:22예를 들어서 주문 입력 어플리케이션과 주문 처리 어플리케이션이 있다고 생각해봅시다.
-
21:22 - 21:30둘 다 '주문'이라는 오브젝트가 있을 겁니다. 그리고 그 주문 오브젝트들은 같은 비즈니스 규칙을 가지고 있겠지요.
-
21:30 - 21:41하지만 둘 중 하나의 어플리케이션만 주문 추가라는 유즈케이스를 가지고 있을 겁니다.
-
21:41 - 21:48유즈케이스는 어플리케이션에 따라 다릅니다. 유즈케이스는 특정 어플리케이션에 종속되지요.
-
21:48 - 21:57비즈니스 규칙은 어플리케이션에 따라 다르지 않습니다. 엔티티 오브젝트에 종속됩니다. 비즈니스 오브젝트라고도 이야기 하지요.
-
21:57 - 22:01나는 비즈니스 오브젝트라는 말은 좋아하지는 않습니다. 야콥슨도 엔티티 오브젝트라고 불렀지요.
-
22:01 - 22:11어플리케이션 비종속적인 비즈니스 규칙들을 엔티티 오브젝트에 넣고 Interactor가 엔티티 오브젝트들을 관장합니다.
-
22:11 - 22:17그리고 입력값과 출력값을 다른 유즈케이스에 전달하는 방법을 정합니다.
-
22:17 - 22:24이 경우 인터페이스를 사용합니다. 객체지향 방식의 인터페이스로 표현을 했는데요.
-
22:24 - 22:31Interactor는 인터페이스 중 하나는 사용하고 있고 다른 하나는 구현을 하고 있습니다.
-
22:31 - 22:38Interactor가 구현하고 있는 것은 입력 인터페이스이고요 Interactor가 사용하고 있는 것은 출력 인퍼테이스입니다.
-
22:38 - 22:42두 인터페이스와 Interactor 사이의 화살표가 같은 방향이지요? 아주 중요한 포인트입니다!!!!!
-
22:42 - 22:45이게 왜 중요한지는 조금 뒤에 이야기하겠습니다.
-
22:45 - 22:53야콥슨은 이 세가지를 어플리케이션 아키텍처의 일부로 이야기했습니다.
-
22:53 - 22:58자 그럼 이것들이 어떻게 작용하는지 봅시다.
-
22:58 - 23:03평범한 어플리케이션이 있습니다. 저기 작은 사람이 유저입니다.
-
23:03 - 23:11이 사람이 어떤 전달 매커니즘을 통해서 시스템과 상호작용합니다.
-
23:11 - 23:14전달 매커니즘은 웹일 수도 아닐 수도 있겠지요. 아무런 상관 없습니다.
-
23:14 - 23:26저 유저는 버튼이나 키보드를 사용해서 시스템이 데이터를 받아들이도록 합니다.
-
23:26 - 23:32어떤 전달 메커니즘을 통하는지는 전혀 중요하지 않습니다.
-
23:32 - 23:37시스템에 전달된 데이터는 Request Model이라는 것으로 변형됩니다.
-
23:37 - 23:40Request Model은 순수한 데이터 구조입니다.
-
23:40 - 23:51POJO나 POCO와 같은 순수 데이터 구조 입니다. 데이터가 어디에서 왔는지 모르고 웹과 아무런 연관도 없습니다.
-
23:53 - 23:57메소드도 없는 단순한 데이터 구조입니다.
-
23:57 - 24:02Public 데이터만 있는 구조로서 모든 입력 값을 저장하게 됩니다.
-
24:02 - 24:12Request Model은 입력 인터페이스를 통해 Interactor에게 전달됩니다.
-
24:12 - 24:21Interactor는 Request Model를 읽어 해석하고
-
24:21 - 24:27작은 여러 커맨드들로 변환하여 엔티티에 보냅니다.
-
24:27 - 24:33모든 비즈니스 오브젝트들은 엔티티로 호출되는 메소드들을 컨트롤합니다.
-
24:33 - 24:42작업이 끝나면 반대 방향으로 진행됩니다. Interactor는 엔티티를 조회하여 변경사항을 확인합니다.
-
24:42 - 24:48그 결과로 Result Model이라는 또다른 데이터 구조를 만들게됩니다.
-
24:48 - 25:01Result Model도 역시 순수한 데이터 구조입니다. 단순한 POJO나 POCO이지요.
-
25:01 - 25:12Result Model은 출력 인터페이스를 통해서 전달 매커니즘으로 전해집니다. 출력 인터페이스를 통해 어떻게던 유저에게 전달이 됩니다.
-
25:12 - 25:18어플리케이션의 일반적인 처리 과정입니다.
-
25:18 - 25:24그럼 Interactor를 테스트할 수 있을까요?
-
25:24 - 25:25매우 쉽겠지요?
-
25:25 - 25:31입력 데이터 자료를 생성해서 Interactor를 호출하고 출력 데이터를 보면됩니다.
-
25:31 - 25:33테스트를 위해 웹 서버가 필요할까요?
-
25:33 - 25:41아닙니다. Interactor는 단순히 POJO나 POCO만을 사용하기 때문이지요.
-
25:41 - 25:45테스트를 위해 데이터베이스가 필요할까요? 어쩌면 필요할 수도 있겠지요 하지만 이 문제는 조금 있다가 이야기하겠습니다.
-
25:45 - 25:51전달 메커니즘이 없어도 테스트가 가능합니다.
-
25:51 - 25:56전달 매커니즘이 웹 인가요? 상관 없습니다. Interactor를 테스트하는데에 웹 서버는 실행할 필요가 없어요.
-
25:56 - 25:58웹 페이지도 없이 테스트가 가능합니다.
-
25:58 - 26:07처음 입력단 부터 마지막 출력단까지 확인하지 않아도 테스트가 가능합니다.
-
26:12 - 26:14MVC에 대해 이야기 해볼까요?
-
26:14 - 26:19MVC는 당연히 따라야 하는 거 아닌가요?
-
26:20 - 26:29MVC는 무엇의 약자이지요? Model View Controller 입니다. 그럼 누가 발명했나요?
-
26:29 - 26:35저 사람입니다. 난 저 사람의 이름을 제대로 발음할 줄 모릅니다. 여러분이 제대로 발음할겁니다.
-
26:35 - 26:42트릭뷔 륀스카욱. 여러분은 정확히 발음하겠지요.
(역주: 트릭뷔 륀스카욱은 청중들과 마찬가지로 노르웨이 사람임.) -
26:42 - 26:47나는 저 사람을 만나봤습니다. 저 사람이 1970년대에 MVC를 발명한 사람입니다.
-
26:47 - 26:50나는 2년 전에 여기에서 만나봤습니다.
-
26:50 - 26:57그때 대기 라운지에서 전원 콘센트를 찾고 있었지요. 그때 어떤 나이든 사람이 다가와서 콘센트를 건네 줬습니다.
-
26:57 - 27:01누군가 돌려 보니 "트릭뷔 린스카욱!"
-
27:01 - 27:08멀티탭을 주고 받을 때에 손가락이 스쳤어요!
-
27:08 - 27:13나는 한동안 손을 안씼었습니다. 트뤽뷔 린스카욱.
-
27:13 - 27:19오늘 몇 사람이 내게 와서 사진을 찍었는데요, 나도 역시 비슷한 부류입니다.
-
27:21 - 27:2770년대 말에서 80년대 초에 트뤽비 린스카욱은 Model View Controller라고 부르는 이 구조를 제시했습니다.
-
27:27 - 27:30스몰토크 플랫폼 위에서 이걸 만들었지요.
-
27:30 - 27:33기본 개념은 매우 간단합니다.
-
27:33 - 27:37모델 오브젝트가 있습니다. 모델 오브젝트는 비즈니스 규칙을 담고 있지요.
-
27:37 - 27:41모델 오브젝트는 자신이 어떻게 유저에게 보여질지 전혀 모릅니다. 입력 값이 어디에서 오는지도 몰라요.
-
27:41 - 27:48단지 순수한 비즈니스 규칙입니다. 저기 아래에 있는 컨트롤러는 입력 값들을 처리합니다.
-
27:48 - 28:00컨트롤러는 입력 기기들을 쳐다 봅니다. 어떤 입력 기기인지는 중요하지 않습니다. 사용자의 행동을 커맨드로 만들어 Model에게 전달합니다.
-
28:00 - 28:01그리고 View가 있지요.
-
28:01 - 28:07View에 쌍선으로 그려진 화살표가 있는데요. 옵저버 관계를 의미합니다.
-
28:07 - 28:15View는 Model에 등록을 해놓습니다. 그리고 Model이 변하면 View는 이를 통지 받아 화면을 업데이트합니다.
-
28:15 - 28:25View의 역할은 Model의 컨텐츠를 표시하거나 전달하는 것 입니다.
-
28:25 - 28:35MVC는 GUI 환경에 아주 적합합니다. 그리고 콘솔, SOA 등에도 잘 적용될 수 있습니다.
-
28:35 - 28:41일부는 입력을 전담하고 (Controller)
일부는 프로세스를 전담하고 (Model)
또 일부는 출력을 전담합니다. (View) -
28:41 - 28:51MVC는 최초로 이름을 가진 디자인 패턴일 텐데요 원래는 아주 작은 것들에 사용하는 게 목적이었습니다.
-
28:51 - 29:02MVC는 버튼에 쓰일 수 있지요. MVC는 체크박스에도 쓰일 수 있습니다. 그리고 MVC는 텍스트 필드에도 쓰일 수 있습니다.
-
29:02 - 29:05스크린에는 MVC가 쓰이지 않습니다.
-
29:07 - 29:15아주 오래 전 부터 MVC는 비틀어지고 변형되어 왔습니다. 소프트웨어 분야에서 흔히 일어나는 일이지요.
-
29:15 - 29:24무언가 매우 좋은 것이라고 여겨지면 다른 모든 사람들이 모방을 시작합니다. 그리곤 완전히 다른 것에 같은 이름을 붙이고는 그 역시 좋은 것이라고 주장합니다.
-
29:24 - 29:29객체지향도 그랬고, 구조, 오브젝트 에자일 등도 마찬가지였습니다.
-
29:29 - 29:38어떤 이름이 좋은 것을 의미한다면 다른 사람들이 그 이름을 자기 것에 붙이려고 합니다.
-
29:38 - 29:44MVC도 마찬가지 입니다. 요즘 MVC 프레임워크들이 많이 있습니다.
-
29:44 - 29:50그런 MVC 프레임워크들은 원래 MVC와는 전혀 다릅니다. 트릭뷔 린스카욱의 MVC와는 전혀 다른 개념의 것 입니다.
-
29:50 - 29:54아주 많이 달라요. 보통 이렇게 생겼지요.
-
29:55 - 30:07저기 많은 컨트롤러들이 있지요. 웹 환경에서는 저 컨트롤러들은 웹에 의해 작동됩니다.
-
30:07 - 30:13저 구름 너머에 있는 웹 프레임워크지요. Rails 일지 Spring일지 어떤 것이든지 상관없어요.
-
30:13 - 30:22그 복잡하고 끔찍한 URL을 어떻게인가 전달해서 컨트롤러에 전달합니다.
-
30:22 - 30:27웹으로부터 받은 파라메터와 데이터를 컨트롤러에게 전달합니다.
-
30:27 - 30:34그러면 컨트롤러들은 비즈니스 오브젝트들에게 일을 하라고 소리를 칩니다.
-
30:34 - 30:46그리고 비즈니스 오브젝트에서 데이터를 모아서 뷰에게 이야기합니다. 그러면 뷰들은 다시 비즈니스 오브젝트들에게서 데이터들을 조회하고 화면에 표시합니다.
-
30:46 - 30:55결국 비즈니스 오브젝트에는 컨트롤러나 뷰에나 있을 법한 펑션들로 채워지면서 오염되어 버립니다.
-
30:55 - 31:05펑션의 적절한 위치를 찾기가 어려워서 비즈니스 오브젝트에 구현하면 안 되는 것 들을 구현해 넣기도 합니다.
-
31:09 - 31:14그럼 출력은 어떻게 처리할까요?
-
31:16 - 31:20여기 Interactor는 일을 끝냈습니다.
-
31:20 - 31:32유즈케이스를 끝내면서 데이터를 조회했지요. 조회된 Response Model을 출력 인터페이스를 통해 전달하려는 시점입니다.
-
31:32 - 31:38저 출력 인터페이스를 구현하는 것은 무엇 일까요? Presenter라 불리우는 것 입니다.
-
31:38 - 31:45Presenter의 역할은 순수 데이터 구조인 Response Model을 받아서
-
31:45 - 31:52View Model이라는 또다른 데이터 구조로 변형시킵니다.
-
31:52 - 32:04View Model은 출력 값을 표현하는 순수한 데이터 구조입니다.
-
32:04 - 32:11하지만 만약에 화면에 표가 있다면 View Model에도 표가 있을 겁니다.
-
32:11 - 32:17만약에 화면에 텍스트 필드가 보인다면 View Model에도 텍스트 필드가 있을겁니다.
-
32:17 - 32:28화면의 숫자를 소수점 이하 두 자리 까지만 표현하겠다면 ViewModel은 TrimToTwoDecimalPlaces와 ConvertIntToString라는 메소드를 가지게됩니다.
-
32:28 - 32:38음수를 괄호로 표현하고 있다면 Presenter가 데이터에 괄호를 붙여서 View Model에 저장을 한 것 입니다.
-
32:38 - 32:43메뉴 아이템들이 있다면 그 이름들도 View Model에 저장이 됩니다.
-
32:43 - 32:53비활성화된 메뉴 아이템은 회색으로 보여져야 한다면 View Model에는 활성 상태를 저장하는 불린 값이 있을 겁니다.
-
32:53 - 33:05화면에 표시되는 모든 것들은 View Model에 저장이 됩니다. 여전히 추상화된 방식으로요.
-
33:05 - 33:08그리고 View에 입력이 됩니다.
-
33:08 - 33:16View는 멍청해요. View는 저것들과 아무런 관련이 없고 단순히 View Model로 부터 데이터를 가져갑니다.
-
33:16 - 33:21아무 것도 처리하지 않습니다. If 문도 없습니다. 아마 테이블을 표시하기 위한 루프문 정도는 있겠만 그 정도가 전부 입니다.
-
33:21 - 33:30View는 아주 멍청해서 신경 쓸 이유가 없습니다. 일반적으로 테스트도 잘 안 하지요. 어찌되었건 우리 눈으로 보게 되니까요.
-
33:30 - 33:33그럼 Presenter를 테스트 할 수 있을까요?
-
33:33 - 33:38할 수 있습니다. Request Model을 입력한 후에 결과로 나온 View Model을 체크하면 됩니다.
-
33:38 - 33:44Presenter를 테스트 할 때에 웹 서버가 실행되어야 할까요?
-
33:44 - 33:49아니지요. 웹 서버가 없어도 모두 테스트할 수 있습니다.
-
33:49 - 33:53스프링 같은 컨테이너들을 실행할 필요도 없지요.
-
33:53 - 33:56그런 것 들을 실행하는 방법을 몰라도 됩니다.
-
33:56 - 34:00그냥 평범한 데이터 구조체를 테스트하는 것처럼 모두 테스트 할 수 있습니다.
-
34:00 - 34:07그나저나 이게 목표입니다. 다른 아무것도 실행하지 않고 가능한 많은 테스트를 하는 것 입니다.
-
34:07 - 34:1330초에서 1분씩이나 써가면서 이것 저것들을 구동하지 않아도 됩니다.
-
34:13 - 34:21다른 것들 없이 테스트만 실행할 수 있으면 됩니다. 다른 거 없이 가능한 빠르게 착착착 끝내면 됩니다.
-
34:23 - 34:26저게 전체 그림입니다.
-
34:26 - 34:32Interactor는 입력 인터페이스로 들어온 Request Model에서 데이터를 읽습니다.
-
34:32 - 34:38그리고 Response Model에 데이터를 저장하고 출력 인터페이스를 통해 Presenter에게 전달합니다.
-
34:38 - 34:49저기 검정색 선을 보세요. 저 선이 어플리케이션과 전달 매커니즘을 구분하는 선입니다.
-
34:49 - 34:55그리고 검정선을 지나는 모든 화살표가 어플리케이션을 향하는 것을 보세요.
-
34:55 - 35:00따라서 어플리케이션은 Controller나 Presenter에 대해 아무것도 모릅니다.
-
35:00 - 35:05어플리케이션은 웹이나 I/O 채널에 대해 아무 것도 모릅니다.
-
35:05 - 35:11I/O 채널은 어플리케이션을 알고 있지만 어플리케이션은 I/O 채널에 대해 모르고 있습니다.
-
35:11 - 35:21만약에 저 둘을 서로 다른 Jar 파일에 담는다면 어플리케이션 Jar 파일은 웹 Jar 파일에 의존하지 않게됩니다.
-
35:21 - 35:30저 둘을 다른 Jar 파일에 담는 게 바람직하겠지요. 하나는 웹에 대한 Jar 파일이고 하나는 어플리케이션이 담긴 Jar 파일입니다.
-
35:30 - 35:34그리고 어쩌면 또 다른 I/O 매커니즘에 대한 Jar 파일을 만들 수도 있겠지요.
-
35:34 - 35:39그리고 I/O 매커니즘을 변경하려면 그냥 Jar 파일만 바꿔치면 됩니다.
-
35:39 - 35:50웹이라는 I/O 매커니즘을 플러그인이라고 생각하세요. 여기 .Net Sharp 사용자가 있나요?
-
35:50 - 35:55여기 모두 .Net 개발자 아닌가요?
-
35:55 - 36:04어떤 IDE를 사용하지요? IDE용 플러그인을 사용하나요?
-
36:06 - 36:15IDE 개발자와 플러그인 개발자 중에 상대방에 대해 아는 사람은 누구일까요?
-
36:17 - 36:26플러그인 개발자가 IDE 개발자를 알지요. IDE 개발자는 플러그인 개발자에 대해서 아무것도 모릅니다.
-
36:26 - 36:28상관 안 합니다.
-
36:28 - 36:36둘 중에 누가 상대방에 피해를 줄 수 있을까요? 플러그인 개발자들이 비주얼 스튜디오를 해칠 수 있을까요?
-
36:36 - 36:43여기 Resharper 쓰는 사람? Resharper 제작자들이 비주얼 스튜디오를 해칠 수 있을까요?
-
36:43 - 36:47- (청중) 예!
- (로버트 마틴) 아마 실행 중에 죽일 수는 있겠지요. -
36:47 - 36:53하지만 그렇다고 비주얼 스튜디오 개발자들이 대응을 해야 할까요?
-
36:53 - 36:59MS의 개발자들이 JetBrains에게 신경 쓸까요?
-
36:59 - 37:02아니지요! 그들은 JetBrains는 신경쓰지 않습니다.
-
37:02 - 37:10그럼 MS의 개발자들이 JetBrains의 개발자들이 자신들을 따라오게 할 수 있을까요?
-
37:10 - 37:14그렇지요!
-
37:14 - 37:18그럼 여러분 어플리케이션에 대해 생각해봅시다.
-
37:18 - 37:26어플리케이션의 어떤 파트가 어플리케이션의 다른 파트로부터 보호되어야 할까요?
-
37:26 - 37:35어떤 파트가 어플리케이션의 다른 파트의 변경에 따라 수정되어야 할까요? 어떤 파트가 다른 파트의 변경에도 영향을 받지 않아야 할까요?
-
37:35 - 37:39답은 아주 명확합니다.
-
37:39 - 37:45비즈니스 규칙을 웹으로부터 보호해야 합니다.
-
37:45 - 37:50그 반대는 안됩니다.
-
37:50 - 38:00웹에 어떠한 변경이 생기더라도 비즈니스 규칙에는 영향이 없어야 합니다. 아키텍처적으로 보장되어야 합니다.
-
38:00 - 38:07저기 모든 화살표가 어플리케이션을 향하고 있습니다. 명심하세요. 저게 플러그인 아키텍처입니다.
-
38:08 - 38:12이제 데이터 베이스에 대해 이야기해봅시다.
-
38:15 - 38:18
-
38:20 - 38:23저 그림 속의 데이터베이스가 당신이 생각하는 것과 비슷한가요?
-
38:24 - 38:32데이터베이스가 세상의 중심이고 어플리케이션은 변방에 위치한 아랫것들 인가요?
-
38:32 - 38:38여기 DBA 있나요?
-
38:38 - 38:39아! 없군요 좋습니다.
-
38:39 - 38:49혹시 이런 DBA와 일 해본 경험 있나요? 어플리케이션은 구석으로 밀쳐버리고, 스키마를 정해버리고, 데이터베이스만 우선시하는?
-
38:49 - 38:52이게 여러분이 생각하는 데이터베이스인가요?
-
38:53 - 38:55내 이야기의 요점은 이 것입니다.
-
38:55 - 38:57데이터베이스는 디테일이에요.
-
38:57 - 39:01아키텍처적으로 큰 의미가 없습니다.
-
39:01 - 39:05데이터베이스는 그냥 데이터 저장소일 뿐입니다.
-
39:06 - 39:10시스템에서 아키텍처적으로 중요한 것이 아닙니다.
-
39:10 - 39:13비즈니스 규칙과도 아무런 연관이 없지요.
-
39:13 - 39:17설마 Stored Procedure로 비즈니스 규칙을 구현했나요?
-
39:17 - 39:26Stored Procedure에는 비즈니스 규칙 대신 쿼리, 검증, 무결성 검증 등이 들어가야 합니다.
-
39:30 - 39:33그럼 왜 데이터베이스를 사용할까요?
-
39:34 - 39:41데이터베이스는 왜 생겨났을까요? 오라클은 왜 존재할까요?
-
39:46 - 39:49데이터베이스 이전에는 데이터를 어디에 저장했었을까요?
-
39:49 - 39:53회전하는 디스크에 저장했었습니다. 여기 디스크 드라이버 개발해본 사람 있나요?
-
39:53 - 39:58회전하는 디스크에 데이터를 입출력 하는 프로그램을 개발해본 사람 있나요?
-
39:58 - 40:07없나요?
-
40:07 - 40:10디스켓? 그것도 마찬가지지요.
-
40:10 - 40:15데이터를 디스크에 저장하고 읽는 것은 매우 어렵습니다. 왜지요?
-
40:15 - 40:18디스크에 데이터가 저장되는 방식 때문입니다.
-
40:18 - 40:22데이터는 디스크의 원형 트랙에 저장됩니다.
-
40:22 - 40:26플래터 표면에 원형의 트랙이 있습니다. 플래터는 여러 개가 있을 수 있지요.
-
40:26 - 40:35헤드가 트랙을 찾기 위해 전/후로 움직입니다. 그러므로 원하는 트랙으로 헤드를 움직여야 하지요.
-
40:35 - 40:39그리고 디스크가 회전하면서 데이터를 읽게 됩니다.
-
40:39 - 40:47그 다음에 원하는 섹터를 찾아야 합니다. 트랙에는 50~60개의 섹터가 있고요 각각의 섹터는 4k 바이트의 데이터를 가지고 있습니다.
-
40:47 - 40:52그러므로 디스크가 회전해서 원하는 섹터가 올 때까지 기다렸다가 데이터를 읽어야 합니다.
-
40:52 - 40:57그리고 읽은 데이터에서 원하는 바이트를 찾아야 합니다.
-
40:57 - 41:01어렵습니다. 그리고 느려요.
-
41:01 - 41:05제대로 작성하지 않으면 아주 아주 오래 걸릴 수도 있습니다.
-
41:05 - 41:14그래서 사람들은 이 문제를 전담할 시스템을 만들었습니다. 데이터베이스 말입니다.
-
41:15 - 41:18그런데 상황이 변했습니다.
-
41:18 - 41:28여기 내 노트북 보이나요? 내 노트북은 500GB짜리 SSD가 있습니다. 디스크는 없어요. 놀랍지는 않지요?
-
41:28 - 41:31여기 디스크를 가진 사람 있나요?
-
41:31 - 41:34여기 회전하는 디스크를 가진 사람?
-
41:34 - 41:37이런! 진짜로요?
-
41:37 - 41:43요즘 HDD를 사고싶은 사람은 없어요. SSD가 대세입니다.
-
41:43 - 41:50어쩌면 서버 룸에는 HDD가 있을지도 모릅니다. 하지만 거기도 조만간 없어질 겁니다.
-
41:51 - 41:56앞으로 몇 년 후에는 HDD는 사라질 겁니다. 모든 것이 RAM으로 교체되겠지요.
-
41:56 - 42:00RAM 말입니다.
-
42:00 - 42:04RAM은 원하는 바이트를 직접 읽을 수 있습니다.
-
42:04 - 42:14무한한 용량을 가진 비휘발성 RAM이 우리가 추구하는 것 입니다.
-
42:14 - 42:18가장 이상적인 저장 매체이지요.
-
42:18 - 42:28그렇게 직접 액세스할 수 있는 저장 매체가 있다면 왜 SQL을 써야만 할까요?
-
42:28 - 42:32SQL은 어렵습니다. Table도 어렵습니다.
-
42:32 - 42:37해시 테이블에서 데이터를 검색하기 보다는 포인터로 바로 액세스하는 것이 좋겠지요?
-
42:37 - 42:45지금도 그렇게 하고 있지 않나요? 테이블에 저장된 데이터를 읽은 후에 사용하기에 더 좋은 구조에 저장합니다.
-
42:45 - 42:49그냥 우리가 사용하는 포맷 그대로 저장하면 어떨까요?
-
42:49 - 42:53내가 오라클이라면 아주 겁이 날 겁니다.
-
42:53 - 42:57존재의 이유가 서서히 사라지고 있거든요.
-
42:57 - 43:03대규모 데이터베이스 시스템이란 개념은 점차 사라지고 있습니다.
-
43:05 - 43:10그럼 어플리케이션을 이런 사소한 것으로 어떻게 보호할까요?
-
43:10 - 43:19이런 사소한 데이터베이스가 모든 것을 결정해버리곤 합니다. 하지만 웹을 격리한 방법으로 어플리케이션을 데이터베이스로부터 보호할 수 있습니다.
-
43:19 - 43:23자 여기 또 하나 굵은 선을 그립니다.
-
43:23 - 43:30자세히 보세요, 이 선을 지나는 모든 선은 어플리케이션을 향하고 있습니다.
-
43:30 - 43:36데이터베이스를 어플리케이션의 플러그인으로 만들었습니다.
-
43:36 - 43:39이제 오라클을 MySQL로 바꿀 수 있습니다.
-
43:39 - 43:43아니면 MySQL을 버리고 CouchDB로 바꿀 수도 있지요.
-
43:43 - 43:47아니면 CouchDB를 버리고 Datomic이나 다른 걸로 바꿀 수 있습니다.
-
43:47 - 43:50데이터베이스를 플러그인처럼 교체할 수 있습니다.
-
43:50 - 43:57데이터베이스를 실제로 바꾸지 않을지도 몰라요. 하지만 그럴 수 있다는 것은 좋은 겁니다. 실제로 필요하지 않다고 해도 말입니다.
-
43:57 - 44:01그럼 어떻게 하면될까요? 저 위에 인터페이스를 하나 더 두면 됩니다.
-
44:01 - 44:03엔티티 게이트웨이라고 이름을 붙였습니다.
-
44:03 - 44:10보통 엔티티 하나에 게이트웨이 하나를 둡니다. 엔티티 게이트웨이의 메소드들은 모두 쿼리 메소드들 입니다.
-
44:10 - 44:14모든 쿼리문에 해당하는 메소드가 존재합니다.
-
44:14 - 44:19엔티티 게이트웨이의 구현부는 저 선 아래에 위치합니다.
-
44:19 - 44:23구현부는 아마도 데이터베이스를 사용하겠지요.
-
44:23 - 44:30자세히보세요. 데이터베이스에 관한 어떤 부분도 어플리케이션에 노출되지 않습니다.
-
44:30 - 44:40그럼 엔티티 오브젝트는 어디에서 올까요? 아마도 데이터베이스에서 읽어져 올라올 겁니다. 테이블에 어떤 모양으로 저장되어있건 말이지요.
-
44:40 - 44:44엔티티 게이트웨이의 구현체는 그 데이터들을 읽어 모아 엔티티 오브젝트에 저장합니다.
-
44:44 - 44:48그런 후에 저 선 위로 전달하는 거지요.
-
44:48 - 44:53저 선을 넘어오면 어플리케이션에게 엔티티 오브젝트가 되는 겁니다.
-
44:55 - 45:00여기 Hibernate 쓰는 사람 있나요? ORM 툴?
-
45:00 - 45:02누구 쓰는 사람 있어요?
-
45:02 - 45:07ORM 툴은 저 그림에서 어디에 있을까요?
-
45:07 - 45:10구현부에 있습니다. 저 선 아래지요!
-
45:10 - 45:16저 선 위에선 ORM 툴의 존재에 대해 아무것도 모릅니다.
-
45:16 - 45:22혹시 비즈니스 오브젝트에 어노테이션이나 어트리뷰트가 붙어있나요? 없애 버리세요!
-
45:22 - 45:25비즈니스 오브젝트들은 Hibernate 같은 툴과 직접적인 연관이 없어야 합니다.
-
45:25 - 45:32저 선 아래의 것들은 데이터베이스 등에 오염된 사람이 개발하게 하세요.
-
45:32 - 45:36비즈니스 오브젝트는 오염되지 않아야 합니다. 왜일까요?
-
45:38 - 45:41오브젝트란 무엇인가요?
-
45:43 - 45:45천천히 이야기해봅시다.
-
45:47 - 45:54오브젝트란 무엇인가요? 오브젝트는 퍼블릭 메소드들의 집합입니다.
-
45:54 - 46:01그 외에는 알려져선 안됩니다. 그렇지요?
-
46:01 - 46:05그 안에 데이터가 있을지도 몰라요. 하지만 그걸 볼 수 있으면 안됩니다. 모두 비밀입니다.
-
46:05 - 46:11여러분의 관점에서 오브젝트는 메소드 덩어리입니다. 데이터 덩어리가 아닙니다.
-
46:11 - 46:14오브젝트는 메소드 덩어리입니다.
-
46:14 - 46:17그러므로 오브젝트는 행위에 대한 내용입니다.
-
46:17 - 46:21그러므로 오브젝트는 비즈니스 규칙에 대한 내용입니다.
-
46:21 - 46:23데이터가 아닙니다.
-
46:23 - 46:26아마도 안에 데이터가 있긴 하겠지요. 하지만 우리는 몰라요.
-
46:26 - 46:30어떤 형태로 저장되는지 모릅니다. 알 필요도 없어요.
-
46:30 - 46:33그럼 데이터 구조체는 무엇일까요?
(역주: Object와 Data Structure를 구분하여 사용하고 있음) -
46:33 - 46:41데이터 구조체는 잘 알려진 데이터 요소들입니다. 누구에게나 공개되지요.
(역주: Object와 Data Structure를 구분하여 사용하고 있음) -
46:41 - 46:43데이터 구조체에는 메소드가 없습니다.
-
46:43 - 46:45데이터 구조체는 펑션이 없어요.
-
46:45 - 46:47오브젝트와 데이터 구조체는 완전히 반대되는 것들입니다.
-
46:47 - 46:55데이터 구조체는 공개된 데이터를 가지고 메소드가 없습니다.
오브젝트는 메소드를 가지지만 공개된 데이터가 없습니다. -
46:55 - 46:56정확하게 반대이지요.
-
46:56 - 47:00ORM이란 말은 틀린 말입니다.
-
47:00 - 47:03오브젝트와 관계데이터는 매칭할 수가 없어요.
-
47:03 - 47:10데이터베이스에서 나온 것은 데이터 구조체입니다. 데이터 구조체는 오브젝트에 매칭할 수가 없는 것 이지요.
-
47:10 - 47:12서로 완전히 다른 것이기 때문입니다.
-
47:12 - 47:20엔티티에 저장되는 데이터는 어딘가에서 제공됩니다. 어딘지는 아무도 몰라요.
-
47:20 - 47:27그리고 엔티티로 전달됩니다. 어떻게 전달되는지는 상관없어요.
-
47:27 - 47:31그 엔티티 오브젝트들은 Hibernate가 생성한게 아닙니다.
-
47:31 - 47:38아마도 엔티티 오브젝트들은 Hibernate가 만든 데이터 구조체들을 사용하고 있을지도 몰라요. 어떻게 하는지는 관심 없습니다.
-
47:38 - 47:45저 검정선 아래의 Hibernate나 프레임워크에 대해선 아무 것도 몰라도 됩니다.
-
47:45 - 47:48저 선 아래의 것들은 오염될 수도 있습니다.
-
47:48 - 47:55저 선 위의 것들은 내 속살과 같이 소중한 것 입니다. 아주 소중하게 보호해야 하는 것 이지요.
-
47:55 - 48:03저 위의 것들은 비즈니스 규칙들입니다. 나는 내 비즈니스 규칙들이 프레임워크로 오염되지 않게 할겁니다.
-
48:03 - 48:10프레임워크. 사람들은 자신들이 사용하는 프레임워크를 좋아합니다. 아주 멋지지요.
-
48:10 - 48:15프레임워크는 많은 시간을 절감해준다고 생각합니다. 실제로도 그렇습니다.
-
48:15 - 48:22하지만 프레임워크 제작자는 우리를 프레임워크에 종속되도록 유도합니다.
-
48:22 - 48:26그들은 베이스 클래스를 만들어서 우리가 그것들을 상속해서 사용하기를 바랍니다.
-
48:26 - 48:32프레임워크의 베이스 클래스를 상속하는 순간 우리는 벗어나지를 못합니다.
-
48:32 - 48:40그 베이스 클래스에 아주 강하게 엮이게 되는 거지요. 상속보다 더 강한 관계는 없습니다.
-
48:40 - 48:47다른 사람의 베이스 클래스를 상속한다는 것은 아주 무거운 맹세를 하는 것과 같습니다.
-
48:47 - 48:52반대로 프레임워크는 당신에게 아무런 맹세를 하지 않습니다.
-
48:52 - 48:55비대칭적인 관계이지요.
-
48:55 - 49:02프레임워크 제작자는 우리의 헌신으로 이익을 챙기지만 그들은 우리에게 어떤 책임도 지지 않습니다.
-
49:02 - 49:07곰곰히 생각해보세요.
-
49:07 - 49:12현명한 아키텍트는 저런 관계를 맺지않습니다.
-
49:12 - 49:21현명한 아키텍트는 프레임워크를 비판적으로 바라봅니다. "저 프레임워크가 일을 어렵게 만들 수 있겠는 걸"
-
49:21 - 49:26"어플리케이션을 프레임워크에 단단히 엮으려고 하는 걸. 그럴 순 없지."
-
49:26 - 49:31"비즈니스 규칙과 프레임워크 사이에 경계를 만들어야겠어."
-
49:31 - 49:39"그래야 비즈니스 규칙들이 Hibernate나 Spring 같은 것들에 영원히 묶이지 않게 말이야."
-
49:39 - 49:44나는 프레임워크를 이용할 겁니다. 아주 조심스럽게요.
-
49:44 - 49:50왜냐하면 프레임워크 제작자는 내가 가장 중요하게 생각하는 것이 무엇인지 모르기 때문입니다.
-
49:56 - 50:03Fitnesse는 나와 아들 그리고 몇 몇 사람이 오래 전에 만들었습니다.
-
50:03 - 50:07여기 Fitnesse 쓰는 사람이 있나요? 오 많군요 좋습니다.
-
50:07 - 50:13Fitnesse는 인수테스트를 작성하는 툴입니다.
-
50:13 - 50:18위키 기반으로 개발되었지요. 위키 기반이라는 것이 중요합니다.
-
50:18 - 50:19누가 위키를 개발했지요?
-
50:19 - 50:22워드 커닝햄. 워드 커닝햄은 어떤 사람인가요?
-
50:22 - 50:27위키 개발자! 하~ 그 것 보다 더 많습니다.
-
50:27 - 50:35워드 커닝햄은 구루들의 구루입니다. 모든 구루들은 워드 커닝햄이 누구인지 압니다.
-
50:35 - 50:40나처럼 컨퍼런스에 연사로 초빙되는 사람들은 모두 워드 커닝햄에 대해 알고있습니다.
-
50:40 - 50:42우리는 워드 커닝햄을 리뷰합니다.
-
50:42 - 50:46그가 에릭 감마에게 전화 걸어 이야기 했지요
-
50:46 - 50:50"이봐 에릭, 디자인 패턴이란 책을 써보는 게 어때?"
-
50:50 - 50:58그는 캔트 백의 멘토이기도 했지요. 캔트 백에게 페어 프로그래밍, TDD, 에자일 개발 등을 가르쳤습니다.
-
50:58 - 51:07당신이 소프트웨어의 역사를 유심히 본다면 아주 많은 곳에서 그의 흔적을 찾을 수 있을 겁니다.
-
51:07 - 51:12Fitnesse는 Wiki와 Fit를 기반으로 개발되었습니다. 둘다 워드 커닝햄의 발명품이지요.
-
51:12 - 51:16오늘은 Wiki에 대해서만 이야기하겠습니다.
-
51:16 - 51:25우리들은 Fitnesse를 자바로 개발하기로 결정했습니다. 12년이나 13년 전에요.
-
51:25 - 51:28우리는 위키 형태로 만들기로 했습니다.
-
51:28 - 51:35우린 처음에 생각했습니다. "위키 페이지들을 저장할 공간이 필요하겠군, 데이터베이스에 저장합시다. 어떤 데이터베이스가 좋을까"
-
51:35 - 51:42그때는 오픈소스 데이터베이스는 MySQL밖에 없었습니다. 그래서 MySQL을 사용하기로 했지요.
-
51:43 - 51:51그래서 MySQL을 설치하고 데이터 스키마를 정하려고 할 때에 누군가 이야기했습니다.
-
51:51 - 51:54"지금 당장 할 필요는 없지 않겠어?"
-
51:54 - 51:59"그건 나중에 하고 일단 다른 문제들 부터 해결하는게 좋을 것 같아."
-
51:59 - 52:03다른 문제들이란 위키 텍스트를 HTML로 변경하는 작업이었습니다. 위키의 기본 기능이지요.
-
52:03 - 52:07위키에 입력한 텍스트들을 받아서 HTML로 변경하는 것 말입니다.
-
52:07 - 52:10그런 변환 작업이 아주 많이 있었어요.
-
52:10 - 52:14그래서 3개월 동안은 데이터베이스는 잊고 지냈습니다.
-
52:14 - 52:21위키 텍스트를 HTML로 저장하기위해 우린 WikiPage라는 오브젝트를 만들었습니다.
-
52:21 - 52:23저기 위에 있지요.
-
52:23 - 52:30추상 클래스인 WikiPage는 MockWikiPage가 구현하고 있습니다.
-
52:30 - 52:37WikiPage는 Load, Save 같은 펑션들을 가지고 있습니다.
-
52:37 - 52:40하지만 실제 구현은 되어있지 않습니다. MockWikiPage의 Load/Save는 그냥 빈 껍데기입니다.
-
52:40 - 52:43한 3달 동안 그렇게 작업했습니다.
-
52:43 - 52:49모든 페이지 변환 코드가 끝난 후에 말했습니다. "자 이제 데이터베이스를 구동합시다."
-
52:49 - 52:52"저 페이지들을 어딘가에는 저장해야만 해요"
-
52:52 - 52:55누군가가 말했습니다. "글쎄 아직 데이터베이스는 없어도 될 것 같은데"
-
52:55 - 53:00"대신에 변환된 페이지를 메모리에 저장하면 될 것 같아"
-
53:00 - 53:03"아직은 디스크에 저장할 필요는 없지 않아?"
-
53:03 - 53:06그럴 필요는 없었지요. 그때 단위테스트 작성하느라 바빴거든요.
-
53:06 - 53:15그래서 우린 WikiPage를 구현하는 또 다른 클래스를 만들었습니다. InMemoryPage였지요. 우린 그 안의 해시테이블에 모든 것을 저장했습니다.
-
53:15 - 53:17우린 그렇게 1년을 더 보냈습니다.
-
53:18 - 53:22데이터를 메모리에 저장하면서 계속 개발 했습니다.
-
53:22 - 53:24드디어 Fitnesse가 동작을 했습니다.
-
53:25 - 53:27실제 디스크에 저장하지 않는 상태로요.
-
53:27 - 53:32아주 좋았던 점은 테스트들이 매우 빠르게 실행된다는 거였습니다. 데이터 베이스가 없었거든요.
-
53:32 - 53:39반면에 전원을 끄고나면 모든 것이 사라지는건 좀 불편했지요.
-
53:39 - 53:45그러다가 누군가 말했습니다. "자 이제 데이터베이스를 구동할 시간이야. MySQL을 설치합시다."
-
53:45 - 53:47마침 그때 마이클 페더스가 같이 있었는데요
-
53:47 - 53:50마이클이 이야기 했습니다. "글쎄 아직은 MySQL이 없어도 되지 않겠어?"
-
53:50 - 53:59"실제 필요한 것은 저장하는 거잖아. 그냥 해시 테이블의 내용을 파일에 저장하는게 훨씬 간단하지 않겠어?"
-
53:59 - 54:07좀 옹색하지만 당분간은 괜찮아 보였습니다. 나중에 MySQL로 바꾸면되니까 일단 그렇게 했습니다.
-
54:07 - 54:11그 뒤로 3개월간 계속 개발을 했습니다.
-
54:11 - 54:16우린 들고 다니면서 사람들에게 보여줄 수 있어서 좋았습니다. 실제 저장도 되었고요.
-
54:16 - 54:18진짜 위키처럼 동작을 했지요.
-
54:19 - 54:283개월 뒤에 누군가 이야기했습니다. "데이터베이스가 필요 없겠는걸."
-
54:29 - 54:32"잘 동작하는데. 파일에 저장해도 충분히 빨라"
-
54:32 - 54:34"이거면 충분한데."
-
54:34 - 54:39우린 아키텍처적으로 매우 중요한 결정을 최대한 연기했고 결국엔 결정할 필요가 없게 되었습니다.
-
54:39 - 54:44데이터베이스는 아예 넣지 않았습니다. 그런데 실제로는 다른 누군가가 추가하긴 했었지요.
-
54:44 - 54:50고객 중 한 명이 와서 이야기 했습니다. "우린 데이터베이스가 필요합니다."
-
54:50 - 54:52"왜요? 파일시스템으로도 잘 동작합니다."
-
54:52 - 54:59그가 이야기했습니다. "회사 정책입니다. 모든 데이터는 데이터베이스에 저장되어야 합니다."
-
54:59 - 55:04누가 그렇게 이야기했는지는 모르겠습니다. 아주 유능한 데이터베이스 영업 사원이 있었나봅니다.
-
55:04 - 55:12그래서 이야기했습니다. "꼭 데이터베이스가 필요하다면"
-
55:14 - 55:24"여기 WikiPage를 구현하는 MySQLPage를 만드세요. 그렇게만 하면 될겁니다."
-
55:24 - 55:27바로 다음 날에 MySQL과 연동 작업은 끝났습니다.
-
55:27 - 55:31MySQL 연동 기능을 플러그인으로 배포했었는데요 아무도 사용하지 않아서 이젠 배포하고 있지 않습니다.
-
55:32 - 55:38우린 아키텍처에 대한 의사결정을 미루고 미루고 또 미뤘습니다.
-
55:38 - 55:41프로젝트의 마지막까지 미뤘고 결국에는 하지를 않았습니다.
-
55:41 - 55:45우리가 가장 먼저 결정해야 한다고 생각했던 것인데 결국엔 안했어요.
-
55:45 - 55:49따라서 이런 원칙을 이야기할 수 있겠지요.
-
55:51 - 56:00좋은 아키텍처는 중요한 의사결정을 뒤로 미룰 수 있게 합니다.
-
56:00 - 56:05아키텍트의 목표는 결정을 안 하는 것이에요.
-
56:05 - 56:13가능한 정보를 많이 가지고 결정 할 수 있게 미루고 미루는 것 이지요.
-
56:13 - 56:22상위 레벨의 결정을 미룰 수 있도록 아키텍처나 코드 구조를 설계해야 합니다.
-
56:22 - 56:29어플리케이션 아키텍처를 설명할 때에 프레임워크 이름을 말하지 마세요.
-
56:29 - 56:36"어플리케이션의 아키텍처가 무엇입니까? 네 우린 SQL서버, MVVM, ..."
-
56:36 - 56:37이건 아키텍처에 대한 설명이 아닙니다.
-
56:37 - 56:41단지 사용하는 툴들을 나열하는 것뿐입니다.
-
56:41 - 56:43그건 어플리케이션의 아키텍처가 아닙니다.
-
56:43 - 56:46어플리케이션의 아키텍처는 유즈케이스들입니다.
-
56:46 - 56:50유즈케이스는 툴에 대해 몰라야 합니다.
-
56:50 - 56:55저런 툴에 대한 결정은 가능한 늦게 해야 합니다.
-
56:55 - 57:02웹이나 데이터베이스 없이 어플리케이션의 모든 부분을 실행 할 수 있어야 합니다.
-
57:02 - 57:07어쩌면 설치가 쉬운 작은 웹 프레임워크를 잠시 쓸 수는 있겠지요.
-
57:07 - 57:12간단한 시연을 위해서요. 거대한 웹 프레임워크를 구동하지 않고도요.
-
57:12 - 57:17어쩌면 아주 심플한 데이터베이스를 사용할 수도 있겠지요. 단순히 데이터가 저장되는 것을 확인하려고요.
-
57:17 - 57:24오라클 등으로 저런 작업을 하려면 라이선스 비용처럼 이것 저것 복잡한게 많습니다.
-
57:25 - 57:34다음에 어플리케이션을 개발할 때는 어떤 결정을 미룰 수 있는지 생각해보세요.
-
57:38 - 57:48어플리케이션은 플러그인 구조이어야 합니다. 아키텍처는 플러그인 구조여야 합니다.
-
57:48 - 57:55GUI, 데이터베이스, 프레임워크 같은 디테일들은 모두 유즈케이스의 플러그인이 되어야 합니다.
-
57:55 - 57:58유즈케이스가 어플리케이션의 핵심이기 때문입니다.
-
58:00 - 58:04물론 고객은 웹 페이지를 보고 싶어하지요.
-
58:04 - 58:10플러그인 아키텍처로도 역시 고객에게 웹 페이지를 보여줄 수 있습니다.
-
58:11 - 58:13프레임워크에 큰 헌신을 맹세할 필요가 없습니다.
-
58:13 - 58:17웹 프레임워크에 막대한 헌신을 맹세할 필요가 없습니다.
-
58:17 - 58:19처음엔 간단한 웹 프레임워크를 사용해서 보여주면 됩니다.
-
58:19 - 58:26만약에 꼭 제대로 된 프레임워크를 사용하고 싶다면, 그렇게 하세요. 단 플러그인 구조는 유지하세요.
-
58:26 - 58:29그래야 필요할 때 빠르게 대체할 수 있습니다.
-
58:31 - 58:35이제 마지막 주제입니다. (TDD)
-
58:36 - 58:39TDD는 이미 이야기했지요?
-
58:42 - 58:45감사합니다. 질문 있습니까?
-
58:48 - 58:51잘 안보이네요. 밑으로 내려가보겠습니다.
-
58:55 - 58:57여전히 안보이군요.
-
58:57 - 59:01자 질문 있습니까?
-
59:01 - 59:04손드는게 안보이니까 크게 이야기해주세요.
-
59:04 - 59:05예
-
59:05 - 59:12(질문 중)
-
59:12 - 59:21오라클 같은 관계형 데이터베이스의 종말을 예고했는데 그 다음은 어떤 것이 될 거라고 생각하냐고요?
-
59:21 - 59:24아주 좋은 질문입니다.
-
59:24 - 59:31그냥 RAM으로 충분할지도 모르지요. 왜 데이터베이스를 대체할 것이 필요할까요?
-
59:31 - 59:37RAM에 데이터를 구성하고 RAM의 데이터가 비휘발성이라면, 더 필요한 게 있을까요?
-
59:37 - 59:39하지만 더 필요한 게 있다고 가정하고 이야기해봅시다.
-
59:39 - 59:41그 다음은 어떤 것 일까요?
-
59:42 - 59:46여기 CQRS에 대해 들어본 사람 있나요?
-
59:46 - 59:48조금 있군요.
-
59:48 - 59:50CQRS는 참 흥미로운 아이디어입니다.
-
59:50 - 59:55우리가 무한대의 고속 메모리를 가졌다고 생각해봅시다. 아주 빠른 RAM이요.
-
59:55 - 59:58어쩌면 디스크일 수도 있겠지요.
-
59:58 - 60:02상태 값을 저장할 이유가 있을까요?
-
60:02 - 60:05그냥 트랜즈액션만 저장하면 되지 않을까요?
-
60:05 - 60:12은행 계좌의 잔고를 저장하는 대신에 계좌를 생성한 트랜잭션을 저장하면 어떨까요?
-
60:12 - 60:19은행 계좌의 이름, 주소, 잔고를 변경시키는 트랜잭션들이요.
-
60:19 - 60:23왜 트랜잭션들을 저장한 후에 상태 값들을 재구성하면 어떨까요?
-
60:23 - 60:26아마도 시간이 오래 걸린 거라고 생각할겁니다.
-
60:26 - 60:29맞아요. 하지만 CPU의 처리능력은 막강합니다.
-
60:29 - 60:35이제는 할 수 있어요. 우린 거의 무한대의 처리능력과 메모리를 가지고 있습니다.
-
60:40 - 60:44그냥 이벤트들만 저장하는 건 어떨까요?
-
60:44 - 60:46매우 흥미로운 아이디어라고 생각합니다.
-
60:46 - 60:53이벤트들을 저장하면 아무 것도 삭제할 필요가 없습니다.
-
60:53 - 60:56업데이트를 할 필요도 없지요.
-
60:56 - 60:59CRUD 알지요? Create. Read. Update. Delete.
-
60:59 - 61:05U와 D 두 글자를 없어지고 C와 R만 남게될 겁니다.
-
61:05 - 61:09생성하고 조회만합니다. 업데이트나 삭제 할 필요가 없어집니다.
-
61:09 - 61:14업데이트나 삭제를 안한다면 트랜잭션은 없어도 됩니다.
-
61:14 - 61:17업데이트를 안 한다면 동시성과 관련된 문제가 없어집니다.
-
61:17 - 61:20아주 흥미롭지요.
-
61:20 - 61:25이런 생각들을 기반으로 하는 프레임워크들이 있을까요? 네 있습니다.
-
61:25 - 61:27몇 개인가 있지요.
-
61:27 - 61:32Write Only 데이터베이스들이지요. Write Once & Read Many Times.
-
61:33 - 61:35지금은 이야기를 하지 않겠습니다만 웹에서 검색을 하면 나옵니다.
-
61:35 - 61:38한 번 찾아보세요.
-
61:38 - 61:40관계형 데이터베이스를 그런 것 들로 대체할지도 모르지요.
-
61:40 - 61:46Couch나 Mongo DB로 교체할지도 모릅니다. 어떠면 새로 만들 수도 있겠지요.
-
61:46 - 61:52상관없어요. 대형 벤더에서 제공하는 것을 사용할 필요가 없습니다.
-
61:52 - 61:54저 하늘 위의 거대한 회사들이요.
-
61:54 - 61:59저 하늘 위에서 말합니다. "그래 우리 데이터베이스 시스템의 사용을 허락하노라."
-
62:00 - 62:03그냥 DB를 만들어 써도 됩니다. 그렇게 어렵지 않아요.
-
62:03 - 62:05다른 질문 있나요?
-
62:08 - 62:09그렇게 하니까 잘 보이네요.
-
62:09 - 62:12오케이. 또 다른 질문 없나요?
-
62:15 - 62:27(누군가 질문 하는 중)
-
62:27 - 62:32의사결정을 미루는 것이 어려울 때도 있는데...
-
62:34 - 62:42가족이 있을 때요? (청중들이 웃음)
-
62:44 - 62:47가족 동반 휴가처럼 여러 요소들이 같이 결정되는 것을 이야기하는 것 이지요? 결정이 필요한 것 중에 연기가 가능한 것들이 있습니다.
-
62:47 - 62:50예를 들어, 어떤 언어로 개발을 할까? 와 같은 결정은
-
62:50 - 62:53일찍 해야겠지요.
-
62:53 - 62:56그렇지요? 뭔가 작성을 해야 합니다.
-
62:56 - 63:02데이터베이스가 있어야 한다는 것은 아마도 일찍 결정해야 할 겁니다.
-
63:02 - 63:07웹 어플리케이션이어야 한다는 것도 일찍 결정해야 할 겁니다.
-
63:07 - 63:09어떤 프레임워크를 사용할지 결정하는 것? 아닙니다.
-
63:10 - 63:14가족 동반 휴가에 비유했었지요?
-
63:14 - 63:23휴가로 어디를 갈지는 일찍 결정해야겠지요. 어떤 차 모델을 선택할지도 미리 결정해야 할까요?
-
63:23 - 63:316개월 전에 여행을 계획할 때에 미리 신차를 뽑아야 할까요?
-
63:31 - 63:36여행 전에 차가 고장이 날지도 모릅니다.
-
63:36 - 63:43차는 단순히 이동 수단입니다. 짐을 싣고 가족이 탈 수 있으면 충분한 거지요.
-
63:43 - 63:45여행을 갈 수 있으면 되는 겁니다.
-
63:45 - 63:54데이터베이스 시스템은 차와 같습니다. 여행의 초반에 미리 결정할 필요가 없는 거지요.
-
63:56 - 63:59가장 최후까지 지연시킬 수 있습니다.
-
63:59 - 64:04여행가기 전 날에 신차를 살 수도 있는 거지요.
-
64:04 - 64:06왜요?
-
64:06 - 64:09복권에 당첨될지도 모르지요.
-
64:09 - 64:12어쩌면 아기가 태어나서 공간이 더 필요할지도 모릅니다.
-
64:12 - 64:18여행가기 직전까지 여러 일들이 발생할 수 있습니다.
-
64:19 - 64:21다른 질문 있나요?
-
64:22 - 64:24네 저기 뒤에요.
-
64:24 - 64:29(누군가 질문 중)
-
64:29 - 64:32레거시 시스템은 어떻게 하냐고요?
(역주: 에자일 세계에서 레거시 시스템은 단위 테스트가 없는 시스템을 의미함) -
64:32 - 64:35남은 시간으로 설명하긴 힘들겠군요.
-
64:36 - 64:40그래서 한 단어로 답변하고. 그에 대해 설명하겠습니다.
-
64:40 - 64:42점진적인 접근입니다.
-
64:42 - 64:48사람들은 레거시 코드를 없애 버리고 새로 개발하고 싶어합니다.
-
64:48 - 64:50그렇게 하지 마세요.
-
64:51 - 64:56보통 실패하게됩니다. 많은 시간과 돈을 낭비하고 말입니다.
-
64:56 - 64:58시스템의 작은 부분을 선택한 후에
-
64:58 - 65:01그 부분만 다시 작성하고
-
65:01 - 65:04동작하게 만드세요.
-
65:04 - 65:08결국 군데 군데 수정이 되겠지요. 하지만 수정된 부분은 원래 코드보다 개선됩니다.
-
65:08 - 65:12그렇게 계속 반복합니다.
-
65:12 - 65:17오랜 시간 동안 많은 노력을 기울여 점진적으로 개선이 될 것 입니다.
-
65:17 - 65:20신규 기능을 추가할 때에도 같은 방법으로 합니다.
-
65:20 - 65:24사실 이건 일반적인 코드 개선 과정입니다.
-
65:24 - 65:28크게 변경하는 것은 하지 마세요. 위험합니다.
-
65:28 - 65:33감사합니다. 다음에 봅시다.
- Title:
- Robert C. Martin - Clean Architecture and Design
- Description:
-
So we've heard the message about Clean Code. And we've been practicing TDD for some time now. But what about architecture and design? Don't we have to worry about that? Or is it enough that we keep our functions small, and write lots of tests? In this talk, Uncle Bob talks about the next level up. What is the goal of architecture and design? What makes a design clean? How can we evolve our systems towards clean architectures and designs in an incremental Agile way.
- Video Language:
- English
- Duration:
- 01:05:41
JongMoon An edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
JongMoon An edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
JongMoon An edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
YongWook Kim edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
YongWook Kim edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
YongWook Kim edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
YongWook Kim edited Korean subtitles for Robert C. Martin - Clean Architecture and Design | ||
YongWook Kim edited Korean subtitles for Robert C. Martin - Clean Architecture and Design |