안녕하세요? 새발의 피입니다.
지난 번 글에서 작성한 AppConfig 기억나시나요? (지난 번 작성한 AppConfig가 뭐지? (tistory.com))
AppConfig는 물론 훌륭한 역할을 해내고 있지만 아직 부족한 상태입니다.
해당 로직은 인스턴스 중복 생성이 존재하고 역할에 따른 구현이 잘 보이지 않는 문제점이 있습니다.
더 편리한 프로그래밍을 위해 AppConfig를 더 알맞게 리팩터링 하는 글을 작성하겠습니다.
수정 전 AppConfig
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
앞서 언급했듯이 인스턴스를 생성하는 코드가 중복으로 들어가고 역할에 따른 구현이 한 눈에 보이지 않습니다.
중복되는 MemoryMemberRepository 인스턴스 생성을 반환하는 메서드를 만들어 중복 코드를 대체하겠습니다.
뿐만 아니라 구현과 역할을 확실히 보이게 하기 위해 FixDiscountPolicy를 반환하는 메서드 또한 생성 해 줍니다.
수정 후 AppConfig
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
private MemberRepository memberRepository() {
return new MemoryMemberREpository();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
이렇게 하면 처음 언급한 문제점들이 모두 해결됩니다.
중복 생성하는 코드가 없어지고 역할에 따른 구현이 한 눈에 보입니다.
뿐만 아니라 기획의 변경으로 MemoryMemberRepository를 다른 구현으로 바꿔줘야 할 때
memberRepository 메서드의 반환 객체만 손쉽게 바꿔줄 수 있습니다.
물론 discountPolicy도 마찬가지입니다.
이해를 돕기 위해 AppConfig를 리팩터링 해야하는 이유에 대해 설명하겠습니다.
< 중복 생성 제거해야 하는 이유 >
구현체를 바꿀 때 중복된 부분에서 모두 수정을 해야한다.
한 객체만 변경을 해도 번거롭게 해당 객체를 사용하는 모든 부분에서 바꿔줘야 한다.
< 역할에 따른 구현이 눈에 잘 보여야 하는 이유 >
애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 이해할 수 있다.
가독성을 높여 코드의 유지보수를 수월하게 할 수 있다.
지난 번 작성한 AppConfig 생성에 이어 리팩터링 하는 방향에 대해서 알아보았습니다.
지금은 간단한 프로젝트이기 때문에 AppConfig의 역할이 크게 와닿지 않지만 기획 수정 시 아주 획기적이고
편리하게 수정이 가능한 걸 느꼈습니다.
참고로 프로젝트의 객체들은 구성영역과 사용영역으로 나눌 수 있고 구성영역에는 AppConfig가 존재하고
사용영역은 클라이언트 클래스를 포함한다고 합니다.
때문에 구성영역에 있는 AppConfig만 수정하면 간단하게 확장이 가능해집니다.
그럼 다들 좋프 (좋은 프로그래밍이라는 뜻) 하세요 ~!
지난 번 작성한 AppConfig 보러가기 !
AppConfig가 뭐지?
한창 강의를 통해 비즈니스 요구를 만족하는 프로젝트를 설계해 구현하던 중 객체 지향 원칙을 어긴다는 예감이 들었고 절망적이게도 그 예감이 맞았습니다. 열림 교회 닫힘과도 같은 OCP 원칙
kes0917.tistory.com
해당 글은 김영한님의 스프링 핵심 강의를 기반으로 작성 되었습니다.
'Spring' 카테고리의 다른 글
[스프링] 자바 기반 AppConfig를 스프링으로 바꿔보자 (0) | 2023.03.15 |
---|---|
[스프링] DI, IoC, 컨테이너가 뭐지? (DI, IoC, 컨테이너의 간단 정리) (0) | 2023.03.15 |
[스프링] AppConfig가 뭐지? (0) | 2023.03.14 |
[스프링] 좋은 객체 지향 설계가 뭐지? (좋은 객체 지향 설계의 5가지 원칙) (2) | 2023.03.10 |
[스프링] 스프링이 뭐지? (스프링 탄생 배경과 객체 지향, 다형성) (0) | 2023.03.08 |
댓글