언어/자바

객체지향OOP, 도메인 구조(서비스, 레퍼지토리, 컨트롤러, 모델 )

youngble 2024. 6. 26. 23:16

현재 인프런 강의를 들으며 간단한 개인 기록 노트식으로 작성, 공부를 통해 배운것을 생각해내며 생각나는대로 정리하였고 중간중간 공부 레퍼런스 참고겸 넣는 방식으로 작성.

 

1. OOP Object -Oriented Programming : 객체지향 프로그래밍

여러 패러다임이 있는데 객체지향 프로그램은 단위 객체로 나누고 객체간의 서로 상호작용하는 설계 방법이다.

 

객체는 클래스를 통해 구조를 가지는데 이때 속성과 메서드를 포함한 것이고 클래스는 어떠한 객체의 청사진의 설계도라고 생각하면된다.

이 설계도를 통해 여러개 복사해서 만들어가는 것이고 이때 만들어진것이 new 키워드를 통해 생성되는 인스턴스이다.

 

클래스

클래스는 단일로 존재할수도있지만 상속을 통해 부모 자식관계가 생겨날수있고 이를 상속 이라는 개념이다.

부모에서 자식으로 상속을 하기때문에 자식은 부모의 속성과 매서드를 물려받는다. 이렇게 되면 같은 기능이되 뭔가 추가적인 속성과 메서드를 추가하여 기능을 덭붙일수있을것이다.

 

인터페이스

이렇게 완성된 클래스외에도 미완성된 설계도라고 하여 인터페이스라는 것이있는데, 이는 하나의 완전체(구현체)라기보단 역할만 가지는 마치 빈껍데기만 만들어두고 각 구현시 해당 역할에 다른 구현들만 갈아낀다고 생각한다. 이를 통해 추상화와 다형성을 알수있다.

 

 

추상화와 다형성 

예를든것이

1. 로미오와 줄리엣 이라는 두역할이 있다면 이 역할들은 인터페이스가 되지만 각 배우들은 유명배우가 될수도있고 무명배우가될수있는등 대체가능하다. 이를 통해 두역할이라는 추상화에서 유명배우, 무명배우 등의 구현체가 정해지고 각 배우들의 특색에 맞는 연기와 표현을 통해 같은 역할과 대본이더래도 다형성이 형성된다.

 

2. 자동차 라는 역할이있다면 구현체로는 아반떼, BMW, 벤츠 등 다양한 구현체가 있지만 자동차라는 역할은 변하지않는 추상화를 가지며 각 구현체에 따른 각자만의 색과 기능을가지는 다형성을 가지고있다.

 

도메인 시작

 

이러한 개념들을 바탕으로 도메인서비스 프로젝트를 진행하는데, MVC패턴을 통해 Model, View, Control로 진행한다. 

개념적으로 아직 디테일하진않지만 이를 위해 Model,  Service, Repository 계층이 필요하고 Model 는 엔티티, Service 계층은 비즈니스 로직, 레포지토리와 컨트롤러 사의 중개역할, Service를 제공하기위한 저장소(메모리, DB, 외부저장소 등)를 위한 Repostory 계층을 통해 데이터 접근로직(DB상호작용) CRUD 기능(생성/조회/수정/삭제)한다. 컨트롤러는 서비스계층을 호출

 

 

이떄 SOLID 라는 원칙을 따르도록 한다.

Single Responsibility Principle(SRP), Open-Closed Principle(OCP) , Liskov Substitution Principle(LSP) , Interface Segregation Principle(ISP), Dependency Inversion Principle (DIP)

 

이때 OCP와 DIP를 특히 주목한다.

 

해당 도메인을 위해 예시로 진행하였다.

 

회원 서비스

 

회원 서비스를 제공하여 회원가입, 회원조회를 제공한다.

이때 회원 저장소라는 저장소를 사용하고 위에 작성한것과 같이 메모리, DB, 외부 시스템 연동 저장소 등이 이에 해당할수있다. 이떄는 CRUD중 Create, Read를 제공한다고 할수있다.

 

주문서비스

 

 

 

이제 회원이있다면 주문이라는 서비스를 제공하고 이 주문서비스는 회원을 조회하고 할인을 적용한다는 것이다.

이러한 서비스를 위해 다이어그램도 작성하고, SOLID 원칙을 지키는 객체지향설계를 해본다.

 

 

 

위와같이 좀더 디테일하게 나눠보면 역할과 구현을 세분화하였다.

이렇게 추상화(역할)에만 의존하고 나머지는 언제나 바꿀수있도록해야 좋은 객체지향 프로그래밍이 된다. 

예를들어 할인 정책이 아직 확실히 정해지지않았다면 10%, 20%, 혹은 정액일지 정률일지등에 따라 해당 주문에 영향을 미친다고 할때 이러한 할인 정책 역할이라는 큰 인터페이스를 만들어놓고 그때그때 바꿀수있는 구현체를 만들어 갈아끼면 된다.

 

회원 서비스를 구현하기위해 MemberService라는 추상화 인터페이스 생성, 회원가입/회원조회 라는 기능역할을 인터페이스에 넣고 MemberServiceImpl 을 통해 구체적인 구체화 적용, 회원가입/조회를 위한 저장소를 읽어야하는데 이때 저장소 인터페이스 MemberRepository 생성하여 아까 설명처럼 메모리 와 DB 저장소를 각각 구현한다.