자바와 객체지향에 대한 기본만 되어있으면 헥사고날 어렵고 자시고 할 게 없다.
Controller와 Service와 Repository 중, 여기서 Service가 외부 의존성을 가지지 않게 만들면 된다. 어떻게 외부 의존성을 사용하지 않게 만드느냐? 바로 인터페이스를 사용하면 된다.
Service는 인터페이스를 사용해 구현하고, 해당 인터페이스의 구현체에서 외부 의존성을 사용하면 된다. 그러면 Service가 외부 의존성을 직접적으로 사용하지 않게 된다. (인터페이스를 이용한 의존성 역전)
세부적인건 이대로 코드를 짜다보면 자동으로 깨닫게 된다. 다른 사람 코드를 조금씩 참고하는 것도 도움된다.
package application;
@RequiredArgConstructor
class BoardService{
//JpaRepository를 직접 사용하지 않고, Repository 인터페이스를 만들어 사용
private final BoardRepositoryInterface boardRepostiroyInterface;
public Board findBoard(Long id){
return boardRepositoryInterface.findById(id);
}
}
//외부 의존성을 가지지 않으므로, 순수 자바 코드만으로 Service(핵심 비즈니스 로직)가 구현됨
package infra;
@RequiredArgsConstructor
class BoardRepositoryInterfaceImpl implements BoardRepositoryInterface{
//JpaRepository를 직접 의존
private final JpaBoardRepository jpaBoardRepository;
@Override
public Board findById(Long id){
BoardEntity entity = jpaBoardRepository.findById(id);
return entity.toModel();
}
}
//외부 기술을 이용하여 인터페이스를 구현함 _jpa, mybatis, kafka, ....
책임이 명확해져 비즈니스 로직이 깔끔해진다. 그리고 사용하는 기술이 변경되거나 할 때, 인터페이스의 구현체만 갈아끼우면 되므로 변경과 확장이 쉽다. 따라서 유지보수성이 극대화 된다.
위 예시에서 Repository 인터페이스의 구현체를, Jpa를 사용하는 구현체에서 MyBatis를 사용하는 구현체로 바꿔 끼우면 된다. (어차피 구성으로 가지므로 그냥 둘 다 써도 된다)
주변 얘기 듣고 헥사고날이 진짜 엄청 어렵고 고수들만 쓰는 대단한 건 줄 알았는데 그냥 위 내용대로 짜보니까 그게 헥사고날이었음. 포트어댑터패턴이 어쩌고 육각형이 어쩌고... 하여간 취준생 레벨에는 허수가 판을 친다는 걸 느낌.
참고 github.com/Anyeon00/PracticeRepo
(패키지 네이밍을 헥사고날 용어를 사용함. 관련 내용 구글링해보면 위에서 설명한 개념이 어떤 용어와 매칭되는지 이해 가능)