게시판 Board -> Post > Reply 순으로 controller와 service를 개발하던 중 ReplyService의 create 메소드에서 구조적 개선이 필요하다고 깨닳았다. Board, Post, Reply의 controller와 service 클래스는 모두 CRUD (Create, Read, Update, Delete) 기능을 가지는데 클래스마다 구현하는 것이 비효율적이다.
위에 클래스 메소드를 보면 겹치는 메소드가 눈에 띄게 많이 보인다. 또한 Board Controller와 Service만 Dto로 반환하고 있어 Post와 Reply도 똑같이 수정해야 한다. 중복된 메소드와 Entity를 Dto로 바꾸는 작업을 인터페이스로 정리하면 더 깔끔하고 가독성 높은 코드가 될꺼라고 생각했다.
기본적으로 중복되는 코드를 추상화, 상속, 다형성 구현을 통해 해결했다.
먼저 CRUDInterface에는 중복됐던 CRUD 메소드를 포함하고 제네릭으로 반환할 때 사용할 DTO 타입을 선언했다. 이 인터페이스는 CRUDAbstractService와 CRUDAbstractApiController 추상 클래스로 구현되며 Entity와 Dto 타입을 제네릭으로 선언했다. 제네릭을 사용하여 하나의 코드로 여러 자료형 (Dto,Entity 짝)을 실행 할 수 있다. 추상 클래스로 구현하는 이유는 상속을 강제하기 때문이다. Board, Post, Reply의 controller와 service 클래스가 상속 받으면 추상 클래스의 CRUD 메소드 뿐만 아니라 클래스 고유의 메소드를 만들어 사용할 수 있다는 점이 장점이다.
Converter 인터페이스의 경우 Board, Post, Reply의 Entity와 Dto마다 가지는 필드가 다르기 때문에 각자 BoardConverter, PostConverter 그리고 ReplyConverter 클래스로 구현했다.