개요 작년에 로버트 마틴의 '클린 아키텍처'를 읽은 적이 있다. SOLID부터 시작해서 여러 디자인 패턴이나 방법론에 대한 소개를 통해 객체지향적인 사고를 할 수 있도록 도왔고, OOP에 대한 새로운 시각을 제시해 주기도 했던 책이었다. 하지만 그 책을 읽고 나서도, 프로젝트를 진행하면서 책에 존재하는 수많은 선택지들 중에 '그렇다면 내가 앞으로 어떤 방법을 택해야 하는가?'라는 질문에 대한 확답을 내리지는 못했다. 예를 들어 추상화를 통해 클래스간의 결합도를 줄이고 외부 인터페이스에 의존하지 않는 코드를 만들고자 했던 목표를 두고 작성한 코드가, 간단한 프로젝트임에도 기존의 몇 배에 달하는 클래스들이 복잡한 연관관계를 가지고 있어 가독성이 떨어지고 간단한 유지보수조차 어렵게 하는 trade-off를 ..
행동 패턴? 행동 패턴은 '객체 사이의 상호작용 또는 객체의 책임 할당'과 밀접한 관련이 있는 디자인 패턴이다. 한 객체가 수행할 수 없는 작업을 여러개의 객체로 분배하는 등의 작업을 통해서 객체 사이의 결합도를 최소화하는데 중점을 두는 패턴이다. 템플릿 메서드 패턴 부모 클래스에서 골격을 정의하면 자식 클래스가 알고리즘의 특정 메소드를 오버라이딩하여 사용할 수 있도록 한다. 다시 말하자면, 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 메소드의 형태로 자식 클래스에 두어 상속을 사용하여 문제를 해결한다. 예를 들어 다음과 같이 메소드 실행에 대한 로깅을 한다고 가정하자. 핵심 비즈니스 로직의 시작과 끝에 로깅을 위한 코드가 추가되었다. 이는 개발자가 핵심 코드에 집중할 수 없게 할 뿐..
다형성 객체지향에서 말하는 다형성이란 무엇인가? 위키피디아에서는 "프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질"이라고 말하고 있으며, 오버라이딩으로 대표되는 런타임 다형성과 오버로딩으로 대표되는 컴파일 다형성을 자연스럽게 떠올리게 될 것이다. 의존 역전 하지만 사실 다형성의 진가는 DIP와 플러그인 아키텍쳐의 기반이 된다는 데에 있다. '클린 아키텍쳐'라는 책에서는 '객체지향의 다형성이 제어의 흐름을 간접적으로 전환하는 규칙을 부과한다'라고 말하고 있다. 다형성이라는 개념이 사용되기 전 소프트웨어는 어떤 모습이었을까? 모든 프로그램들은 main함수가 고수준 함수를 호출하고, 고수준 함수가 저수준 함수를 호출하는 형태로 되어 있..
Git은 협업을 위한 툴이다. 그래서 나도 지금까지 프로젝트를 할 때마다 나름의 커밋 컨벤션도 세우고, 작업마다 브랜치를 파서 작업한 후 pr을 올리고 merge conflict를 체크하고, 간단한 코드리뷰를 통해서 approve받은 후에야 develop으로 머지하는 프로세스들을 익히고 지켰다. 하지만 확실한 규칙을 설정하고 진행한 것이 아니기 때문에 reset --hard를 한다거나, 같은 branch에서 conflict가 난다거나 한다는 문제들이 발생했다. 그래서 브랜치 전략이라는 패턴에 대해서 간단히 정리해보고자 한다. 브랜치 전략이란? 효율적인 협업을 위해서 Git을 사용하는데, 협업하는 팀원들간에 스타일의 차이가 있기 때문에 사용방식의 통일을 주기 위해서 사용되는 전략을 말한다. 크게 Git F..
구조 패턴? 구조 패턴은 클래스나 객체 구조의 조합을 사용하여 더 큰 구조를 형성하는 방법을 다루는 패턴이다. 시스템이 복잡한 경우, 클래스나 객체의 조합을 상요하여 구조를 단순화하고 모듈성을 증가시키는 데 도움을 주고, 유연한 구조의 시스템을 만들어 코드의 재사용성을 높일 수 있다. 퍼사드(Facade) 패턴 퍼사드 패턴은 복잡한 시스템 내의 일련의 서브시스템에 대한 간단한 인터페이스를 제공하여 시스템의 복잡성을 감소시키는 패턴이다. 시스템이 각 서브시스템에 직접 접근하는 대신, 퍼사드를 통해 통합된 인터페이스의 형태로 제공한다. public static void treatFile() { String readContent = null; try (BufferedWriter writer = new Buff..
소프트웨어의 구성요소들은 확장에는 열려있고 변경에는 닫혀있어야 한다, 즉 요구사항의 변경이나 추가가 발생해도 기존 구성요소는 수정이 일어나지 않아야 한다. 흔히 OOP 5원칙에서 OCP를 만족시키기 위해서 사용하는 기법은 클래스 상속과 객체 합성을 통한 코드 재사용이라고 말한다. 상속이 어떤 문제가 있길래그러면 상속은 언제 사용해야 되나요? 먼저 상속을 사용하면, 자식클래스에 부모클래스를 덧붙이는 것으로 부모의 정의를 물려받은 후 코드를 추가하고 확장할 수 있다는 장점이 있다. 하지만 상속을 이용해서 코드를 재사용하기 위해서는 자식 클래스에서 부모 클래스의 구현법에 대한 지식을 가져야 하고, 그것은 부모 객체의 캡슐화를 약화시키는 문제를 가져오고, 결국 기능을 추가하는데 기존 구성요소를 수정하게 되..
절차적 프로그래밍, 전통적인 설계 원리 객체지향 프로그래밍 이전에 프로시저를 이용한 절차적 프로그래밍(procedural programming)이라는 방법이 많이 사용되었다. 이것은 프로시저(=함수)를 이용하여 절차적으로 프로그래밍을 하는 것으로, 메인함수뿐 아니라 여러 절차(기능)을 함수로 만들어 진행시키는 방식을 이야기한다. 순서도를 생각하면 쉽다. 필요한 기능들을 함수로 만들어놓고, 함수를 통해서 흐름을 나타내는 설계방식 하에서도 여러가지 설계 원리가 많이 나타났다. 단순성(simplicitiy): 유지보수를 위해서 가장 중요한 특성, 소프트웨어 유지보수는 비용이 매우 많이 드는 작업이기 때문에, 유지보수를 위해서는 단순하고 이해하기 쉬운 설계가 중요하다.효율성(efficiency): 단순..
1. MVC (Model - View - Controller) Model: 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분 View: UI(User Interface) Controller: 사용자의 입력을 받고 처리 - 동작 1. 사용자의 Action이 Controller로 전달된다. 2. Controller는 사용자의 Action에 따라서 Model을 업데이트한다. 3. Controller는 Model을 나타내줄 View를 선택한다. 4. View는 Model을 이용하여 화면을 나타낸다. (View가 직접 업데이트(Model이용 or 변경감지), Model이 View에 Notify) - 특징 > Controller는 여러개의 View를 선택할 수 있는 1:n관계를 가지며, View를 선택할..