Motivation 프로젝트는 Java 언어로 구현되었다.
Java는 대표적인 객체지향 프로그래밍 언어(OOP - Object-Oriented Programming)로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, '객체'들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성하는 프로그래밍 패러다임이다.
객체지향 언어로써 java 는
캡슐화(Encapsulation)
상속(Inheritance)
다형성(Polymorphism)
추상화(Abstraction)
강력한 메모리 관리
플랫폼 독립성
다음과 같은 특징을 가진다.
다음 중 캡슐화, 상속, 다형성에 주목해보자.
Motivation 프로젝트에는 Article, Lecture, Post 도메인이 존재한다. 각각 자유게시물, 강의 상세 정보, 블로그 게시물을 뜻하며 셋 모두 텍스트 에디터( toast ui editor ) 를 통해 본문이 작성된다.
또한 Article, Lecture, post 는 모두 해시태그를 가진다. 셋의 해시태그는 기본적으로 검색어 로써의 역할을 한다. 간단히 말해 해시태그를 클릭하면 동일한 해시태그가 사용된 모든 게시물들이 검색된다.
하지만 post 에서의 해시태그는 조금 다르다.
Motivation 에서 post 들은 동일한 해시태그들끼리 묶여 하나의 series 가 된다. 때문에 post 의 해시태그는 그 순서를 보장하고 변경할 수 있어야 한다. ( 위 이미지에서 #ALGORITHM 뒤에 [2/3] 이 그 순서의 보장이다 ) 즉, 위에서 설명한 Article, Lecture 의 해시태그에 순서를 보장하는 기능이 더해져야 함을 뜻한다. ( 필드에 sortNo 이 있어야 한다던가... )
텍스트 에디터를 통해 작성되는 문서들과 해시태그를 어떻게 야무지게 구현할 수 있을까?
public interface Document {
// some method ...
}
Motivation 에는 Document 라는 interface 가 존재한다. Document 는 텍스트 에디터로 작성되는 문서들에 대한 처리를 담당할 것이다. 예를들면 마크다운으로 작성된 본문을 db 에 저장하기위한 데이터와 클라이언트 뷰에서 출력하기 위한 데이터로 구분하는 작업 등이 이에 해당한다.
public interface DocumentHavingTags extends Document {
// some method ...
}
Document 를 상속받는 DocumentHavingTags 라는 interface 다. 이는 텍스트 에디터를 통해 본문이 작성되는 문서의 해시태그( 해시태그 중 기본적인 검색어로써의 역할만을 하는)기능을 가진다.
public interface DocumentHavingSortableTags extends DocumentHavingTags {
// some mothod ...
}
DocumentHavingTags 를 상속받는 DocumentHavingSortableTags interface 다. 이름에서 알 수 있듯, 해시태그 중에서도 그 순서를 보장하고, 변경할 수 있는 태그기능을 가진다.
Article, Lecture, Post 등의 도메인은 적절한 인터페이스를 구현함으로써 그 기능을 가지게 될 것이다.
Motivation 이 Java 의 객체지향 프로그래밍 개념을 적용했다!
1 인터페이스 사용: Document 인터페이스를 정의함으로써 다양한 타입의 문서들이 공통된 메서드를 구현하도록 했다. 다양한 문서 유형들이 Document 인터페이스를 구현함으로써, 이 인터페이스를 사용하는 코드는 구체적인 문서 유형에 대해 알 필요 없이 일관된 방법으로 문서를 다룰 수 있다.
2 인터페이스 확장: DocumentHavingTag와 DocumentHavingSortableTag 인터페이스는 Document 인터페이스를 확장하여 추가 기능을 제공한다. 이는 OOP의 상속 개념을 활용한 것으로, 기존 인터페이스의 기능을 확장하면서도 기존 기능을 유지하고 있다.
3 특정 기능의 분리와 재사용: 해시태그 기능을 일반적인 검색 기능(DocumentHavingTag)과 순서가 중요한 특별한 경우(DocumentHavingSortableTag)로 구분하여 구현함으로써, 각 기능을 필요한 곳에서 재사용할 수 있게 했다. 이는 코드의 중복을 줄이고 각 기능을 독립적으로 관리할 수 있게 해, 유지 보수와 확장성 측면에서 유리하다.
4 구체적인 구현의 다양성: lecture, article, post 등의 클래스가 이러한 인터페이스들을 구현함으로써, 각 클래스는 공통된 인터페이스를 통해 정의된 계약을 준수하면서도 각각의 특성에 맞게 동작을 구현할 수 있다. 이는 다형성의 핵심 개념을 반영한 것으로, 프로그램을 유연하고 확장 가능하게 만든다.
나는 Document Service 를 구현함으로써, 각 도메인들에 대해서 텍스트작성과 해시태그의 사용을 위한 서비스 로직을 여럿 구현할 필요가 없어졌다!
이 얼마나 객체지향스러운 방식인가!