From 11f71923d542aa6957a04cdae19329744e1310ab Mon Sep 17 00:00:00 2001 From: kyuwon53 Date: Sun, 28 Aug 2022 23:55:21 +0900 Subject: [PATCH 1/2] =?UTF-8?q?1=EC=A3=BC=EC=B0=A8=201=EC=9E=A5=20?= =?UTF-8?q?=EC=98=A4=EB=B8=8C=EC=A0=9D=ED=8A=B8=EC=99=80=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EA=B4=80=EA=B3=84=20=EC=9D=B4=EA=B7=9C=EC=9B=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" diff --git "a/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" "b/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" new file mode 100644 index 0000000..e69de29 From 7226d67c68f06e820bbb9590396055ad5e7b10a0 Mon Sep 17 00:00:00 2001 From: kyuwon53 Date: Sun, 4 Sep 2022 20:44:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?1=EC=9E=A5=201=EC=B0=A8=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_\354\235\264\352\267\234\354\233\220.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" "b/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" index e69de29..f05f128 100644 --- "a/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" +++ "b/vol01/[1\354\243\274\354\260\250]_1\354\236\245_\354\230\244\353\270\214\354\240\235\355\212\270\354\231\200_\354\235\230\354\241\264\352\264\200\352\263\204_\354\235\264\352\267\234\354\233\220.md" @@ -0,0 +1,31 @@ +```DAO : DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다. ``` + +객체지향 설계에서의 좋은 설게란 변화에 용이한 설계이다. 요구사항이란 언제든 변할 수 있고 이를 구현한 코드는 언제든 변한다. +그렇다면 미래의 변화 대비하여 어떻게 설계하고 개발을 할 것인가? 변경이 일어났을 때 필요한 작업을 최소화하고, 그 변경이 다른 곳에 문제를 일으키지 않으려면 **분리와 확장**을 고려한 설계가 있어야한다. +관심이 같은 것끼리 모으고, 다른 것은 따로 떨어져 있게 **관심사를 분리**해야한다. + +앞에서 `DAO`의 정의를 썼는데 DAO는 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트이다. 그렇다면 DAO의 관심사는 `데이터를 조회하거나 조작하는 기능`인 것이다. +DAO는 DB 접속 정보가 궁금하지 않다. 이를 분리해야한다. + +템플릿 메소드 패턴 또는 팩토리 메소드 패턴으로 관심사항이 다른 코드를 분리해내고, 서로 독립적으로 변경 또는 확장할 수 있지만 **상속**을 사용했다는 단점이 있다. +**상속**은 간단하고 편리하지만 한계점들이 있다. 상속관계는 두 가지 다른 관심사에 대해 긴밀한 결합을 허용한다. 두 클래스가 서로 긴밀하게 연결되어 있지 않도록 중간에 추상적인 연결고리(인터페이스)를 만들어준다. +**인터페이스**는 어떤 일을 하겠다는 기능만 정의해놓고 자신을 구현한 구체적인 정보는 모두 감춰버린다. 그냥 **연결고리**이다. 인터페이스를 통해 접근하게 하면 실제 구현 클래스를 바꿔도 접근하는 쪽에서는 신경 쓸 일이 없다. 런타임시 클라이언트가 구체적인 정보를 설정한다. + +### 개방 패쇄 원칙 (Open-Closed Principle) +객체지향 설계의 원칙 중 하나이다. `클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.` +인터페이스를 통해 제공되는 확장 포인트는 확장을 위해 활짝 개방되어 있다. 반면 인터페이스를 이용하는 클래스는 자신의 변화가 불필요하게 일어나지 않도록 굳게 패쇄되어 있다. +잘 설계된 객체지향 클래스의 구조는 개방 패쇄 원칙을 아주 잘 지키고 있다. + +개방 패쇄 원칙은 높은 응집도와 낮은 결합도로도 설명이 가능하다. +응집도가 높다는 것은 하나의 모듈, 클래스가 하나의 책임 또는 관심사에만 집중되어 있다는 뜻이다. 즉 변경이 일어날 때 모듈의 많은 부분이 **함께** 바뀐다. +낮은 결합도는 높은 응집도보다 민감한 원칙이다. 책임과 관심사가 다른 모듈과는 느슨하게 연결된 상태를 유지해야한다. 꼭 필요한 최소한의 방법만 알도록하고 나머지는 알 필요가 없게 만들어야 한다. +결합도가 낮아야 변화에 대응하는 속도가 높아지고, 구성이 깔끔해진다. + +### 전략 패턴(Strategy Pattern) +> 자신의 기능 맥락에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴 + +개방 패쇄 원칙의 실현에 가장 잘 맞는 패턴이다. + +### 제어의 역전 (IoC) +프로그램의 제어 흐름 구조가 뒤바뀌는 것이다. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임해 오브젝트가 자신이 사용할 오브젝트에 대해 모른다. +모든 오브젝트는 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.