객체지향 바로 실무에 적용해보기

StarSeeker·2023년 4월 7일
0
post-thumbnail

동기

현재 내가 개발팀으로 있는 마케팅 플랫폼에서 새로운 기능을 추가했다.

기존에는 세그먼트 타겟팅으로만 발송되던 고객사의 유저 타겟에서 전체발송과 수동업로드 발송을 추가 한 것이다.

  • 세그먼트 타겟팅 발송 (첫 방문한 고객, 일정 기간 이상 방문한 고객 등등)
  • 전체 발송
  • 수동 발송 (엑셀 업로드를 통한 고객정보를 이용한 발송)

기존의 세그먼트 타겟팅 발송 로직만 있는 상황에서
여러 발송 종류가 추가 되자 코드가 복잡해 지기 시작했다.
특히 업데이트 부분에서 수많은 if else가 남발 되기 시작했다.

if 기존 세그먼트 타겟팅 발송 -> 전체 발송으로 바꿀때

else if 기존 세그먼트 타겟팅 발송 -> 수동 발송으로 바꿀때

else if 전체 발송 -> 기존 세그먼트 타겟팅 발송

else if 전체 발송.......

else if .....

하염없이 else if 가 늘어만 갈수 밖에 없었고 또 나중에 또다른 발송 로직이 추가된다면 코드가 더 복잡해 질수 밖에 없었기 때문에 확장성 측면에서 매우 안좋은 코드 구조라고 판단이 되었다.

고민해보자

먼저 발송 종류에 따라 추상화하면 되겠다는 생각이 가장 먼저 들었다.

  • SegmentTargetSender
  • AllTargetSender
  • ManualTargetSender

    TargetSender 라는 인터페이스를 두고 이 인터페이스를 서비스에서 사용하면 될것같다.

그런데 어떤 발송방식을 사용할지 미리 모르는 상태에서 동적으로 Sender클래스를 가져 올수 있을까?

Sender 클래스를 스프링 빈으로 선언하고 그때그때 필요한 빈을 호출하는 방식으로 하면 어떨까?
그래서 Sender 클래스를 얻기 위한 팩토리 클래스를 하나 만들었다.

  1. 처음에는 각 Sender 클래스에 스프링 빈 이름을 등록해두고 팩토리 클래스에서 SpringContext 객체를 이용해 그 빈 이름을 파라미터로 받아 Sender 빈을 리턴하는 형태로 구현해보았다.
    그런데 이렇게 되면 Spring에 의존하는 클래스가 되어버린 것 같아 외부에서 주입받는 형태를 생각하게 되었다.

  2. 그래서 팩토리 클래스에서 세가지의 Sender 빈을 Map 형태로 주입받는 형태로 바꾸었다. 스프링에서는 같은 타입의 빈은 Map 객체로 주입받을 수 있다.
    Map 객체로 받으면 key값으로 빈의 이름을 받기 때문에 동적으로 빈을 생성해낼수 있다.

  3. 그 결과,
    팩토리 클래스는 세가지의 Sender 빈을 Map형태로 주입받는다.
    팩토리 클래스는 파라미터로 들어온 타겟종류(enum 타입을 받아)를 받아 해당하는Sender 빈을 반환해준다!

해결

이제는 서비스 객체가 TargetSender 인터페이스만 바라보게 되었고 더이상
else if 문이 필요가 없게 되었다.
대략적인 코드는 다음과 같다.

class PushSendService{
	private final SenderFactory senderFactory;
	
    생성자 생략...
    
    public void pushSendUpdate(PushNoti originPushNoti, 
    							PushNotiTarget willUpdateTarget) {
    	TargetSender targetSender = 
        	senderFactory.getSender(originPushNoti.getSenderType());
        
        targetSender.update(willUpdateTarget);
    }
}

처음의 if else가 반복되던 구조에서 객체지향을 이용해 좀 더 가독성있고 확장성있는 코드로 탈바꿈 할수 있었다.

또한 업데이트 로직뿐만아니라 발송 로직도 추상화 되어 발송하는 서비스도 덩달아 코드의 구조가 개선 되었다.

느낀 점

이전에 배웠던 객체지향을 실무에 적용해 볼수 있어서 성취감이 높았던 것 같다.
앞으로 어떠한 레거시를 만나도 개선할수 있을것 같다는 자신감이 붙었고 객체지향을 이용해 얼마든지 유지보수하기 쉬운 코드로 바꿀수 있다는 생각이 들었다.
물론 또 다른 장애물들이 많겠지만..

아무튼 객체 지향 적용해보기 끝.

profile
춤추듯 개발하고 싶은 사람

0개의 댓글