개요
객체를 만들 때 크게 두 분류로 만들 수 있습니다. 데이터 위주의 사고와 행동 위주의 사고 인데요, 이번 포스팅에서는 좋은 객체지향 설계를 위해 어떻게 객체를 설계해야 하는지 알아보겠습니다.
1. 좋은 객체지향 설계
객체지향 설계에 있어 중요한 것은 데이터 위주의 사고와 행동 위주의 사고를 균형있게 조합하여 객체를 구현하는 것입니다.
데이터 위주의 사고가 뭔데?
이를 코드로서 간단하게 살펴보겠습니다.
class Car {
private Frame frame;
private Engine engine;
private List<Wheel> wheels;
private Direction direction;
private Speed speed;
}
Java
복사
행동 위주의 사고를 하면 어떻게 구현할 수 있어?
class Car {
public void drive(){}
public void accelerate(){}
public void decelerate(){}
public void changeDirection(){]
}
Java
복사
제가 듣는 강의에선 데이터 위주의 사고는 struct 나 다름 없다고 말하고 있습니다. 반면 행동 위주의 사고는 객체지향 성격에 맞는 class를 만든 것이죠!
2. 행동 주의적 사고가 뭐가 좋을까
보통 MVC 패턴으로 개발하다보면 각각의 Layer가 맡은 역할이 다릅니다. 대게 Domain 단의 클래스들은 단순히 데이터를 저장하는 역할만을 갖고 있습니다.
하지만 만약 Domain이 행동을 갖고 다른 객체와 협력하는 객체가 된다면 어떨까요?
Service 단의 코드가 엄청나게 얇아질 수 있습니다.
기존의 Service Code가 다음과 같다고 가정해봅시다.
@Service
@RequiredArgsConstructor
public class ServiceA {
private final RepositoryA repositoryA;
private final RepositoryB repositoryB;
private final RepositoryC repositoryC;
public void functionA(){
A a = repositoryA.find();
B b = repositoryB.find();
C c = repositoryC.find();
// 수 많은 비즈니스 로직
...
repositoryA.save(a);
}
}
Java
복사
만약 A 라는 도메인에서 행동을 갖고 있다면 어떨까요?
@Service
@RequiredArgsConstructor
public class ServiceA {
private final RepositoryA repositoryA;
private final RepositoryB repositoryB;
private final RepositoryC repositoryC;
public void functionA(){
A a = repositoryA.find();
B b = repositoryB.find();
C c = repositoryC.find();
a = a.function(b,c);
repositoryA.save(a);
}
}
Java
복사
수 많은 비즈니스 로직은 도메인 계층에 책임을 위임하면 되기 때문에 Service 단이 엄청 얇아지게 됩니다.
이를 DDD 라고 부르는데요, DDD 라는 개념은 후에 자세히 알아보도록 하고 행동 주의적 사고를 가지고 객체를 만들면 책임을 분산하여 Service 단이 엄청나게 가벼워질 수 있다는 사실을 알고 가시면 좋겠습니다!