외부 라이브러리를 열어보고 DI 시키자
라이브러리를 단순히 가져다 쓰지만 말자, 어떻게 구현되어 있는지 파악하자
Goal
- 외부 라이브러리 기능을 추상화 시킨다.
- 기능자체에만 집중하여 기능에 종속적였던 코드를, 비 종속적인 코드로 변경한다.
외부 라이브러리 내부를 까보고 인터페이스를 이용해 DI 시키자.
이전까지 라이브러리를 docs를 보고 사용법만 익히고 사용했다.
예를들어 최단 경로찾기 기능을 수행하는 메소드는, JpraphT 라이브러리를 이용해 당장 사용하는 Dijkstra 알고리즘에 종속적인 코드가 되어버렸었다.
물론 알고리즘 별로 각각의 클래스나 메소드를 만들어주면 되지만,
추상화하여 한개의 메소드로 xx알고리즘으로, xx그래프
를 이용해서 최단 경로를 찾아줘 라는 메시지를 보내고 싶다면?
근데 이게 외부 라이브러리였고, docs에 이런 자세한 설명이 없었다면?
단순히 xx 알고리즘을 어떻게 사용하는지에 대한 사용법 에 대해서만 docs에 적혀있었다면?
어떻게 할까?
라이브러리 코드 분석
1 |
|
기존의 getShortestPath 메소드는 DijkstraShortestPath
에 종속적인 메소드다.
DijkstraShortestPath
는 내가 만든 도메인이 아닌 라이브러리에 구현되어있는 클래스이다.
나는 단순히 라이브러리를 docs에서 알려주는것만 보고 파악해서 사용하는것에서 멈추고 싶지 않다.
DijkstraShortestPath
내부를 들여다보자
1 |
|
DijkstraShortestPath
는 BaseShortestPathAlgorithm
를 상속하고 있다.
BaseShortestPathAlgorithm
도 들여다보자
1 |
|
BaseShortestPathAlgorithm
는 ShortestPathAlgorithm
인터페이스를 implements하고 있다.
1 |
|
ShortestPathAlgorithm
는 최상위 인터페이스로 존재하고 있는것을 확인했다.
나는 이제 도메인을 파악했으므로 공식문서에 있는걸 보고
기능만 파악해 있는그대로 사용하는것이 아니라, 인터페이스를 이용해 DI를 시켜 확장성 있는 코드로 바꿀수 있는 방법을 찾았다.
즉 getShortestPath()
메소드를 다익스트라에 비종속적인 메소드로 바꿀수 있게 되었다.
전략패턴을 이용하여 외부 주입시킨다.
1 |
|
ShortestPathAlgorithm
인터페이스를 이용해 최단경로를 찾는 전략 enum을 만든다.- 최단 경로를 찾아주는
getShortestPath()
메소드는 이제 다익스트라에 비 종속적인 메소드가 되었다.
이제 내가 나만의 길찾기 알고리즘을 만들고 적용하고 싶다면(그럴리는 없겟지만), 단순히 Enum에 전략을 더 추가해주면 된다.
라이브러리를 docs만 보고 그대로 사용하는것이 아니라, 내부를 까보고
내가 내 도메인에 맞춰서, 좀 더 유연성있게, 응집성 있도록 응용해서 쓸 수 있다는 인사이트를 얻은 좋은 경험이었다.
코드 정리
수정전
1 |
|
1 |
|
수정 후
1 |
|
1 |
|
1 |
|
Reference
- https://github.com/woowacourse/atdd-subway-path/pull/114#discussion_r634515420
- https://www.baeldung.com/jgrapht
- https://jgrapht.org/guide/UserOverview#graph-algorithms