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);
}
}