Controller에 추상 클래스를 상속

//com/example/study/controller/api/ItemApiController.java

@RestController
@RequestMapping("/api/item")
public class ItemApiController extends CrudController<ItemApiRequest, ItemApiResponse> {

	@Autowired
	private ItemApiLogicService itemApiLogicService; 

	/**
	 * static 메소드처럼 동작
	 * Controller가 생성될 때 @Autowired 로 Service를 주입받고
	 * 주입받은 객체를 baseService에 채운다.
	 */
	@PostConstruct
	public void init() {
		this.baseService = itemApiLogicService;
	}
}
  • CrudInterface를 구현하는 대신 CrudController 추상 클래스를 상속받는다.
  • 반복되는 CRUD 메소드는 추상 클래스에 있기 때문에 모두 지운다.
  • CrudController 추상 클래스의 baseService를 채워준다.

추상 클래스 정의

  • 다른 엔티티에 대한 Controller에서도 CRUD가 반복되므로 이를 추상화한다.
  • 추상 클래스를 만들고 Controller에서 이 추상 클래스를 상속받을 때 제네릭 타입으로 Req, Res를 받아서 CrudInterface로 전달한다.
//com/example/study/controller/CrudController.java

public abstract class CrudController<Req, Res> implements CrudInterface<Req, Res> {

	//Controller에 Service를 연결시키는 부분
	//Service는 CrudInterface를 상속받는다는 점을 이용
	protected CrudInterface<Req, Res> baseService;

	@Override
	@PostMapping("")
	public Header<Res> create(@RequestBody Header<Req> request){
		return baseService.create(request);
	}
	
	@Override
	@GetMapping("{id}")
	public Header<Res> read(@PathVariable Long id){
		return baseService.read(id);
	}
	
	@Override
	@PutMapping("")
	public Header<Res> update(@RequestBody Header<Req> request){
		return baseService.update(request);
	}
	
	@Override
	@DeleteMapping("{id}")
	public Header delete(@PathVariable Long id){
		return baseService.delete(id);
	}
}