Controller 추상화
지금까지 CRUD 제작 시
@GetMapping ,@PostMapping 등 모든 작업에 직접 어노테이션을
달아가면서 제작했는데, 개발자가 이런 어노테이션을 까먹을 수도 있고
여러 상황이 발생함. -> 방지 목적
interface를 매번 상속받고 매번 직접 구현하기 보다
해당 interface를 상속받은 추상클래스를 하나 만들고 (로직 구현은 당연히 안되어 있는 상태)
public한 Interface를 return하도록 한 뒤에 원하는 Entity의 Controller에서 해당 추상클래스를 extends하여 추상클래스에서 return시키고 있는 interface를 자신의 logicservice로 치환하도록 함.
치환하는 것은 해당 Entity의 컨트롤러가 생성되는 시점에 되어야 하므로
@PostConstruct 어노테이션을 통해 그렇게 되도록 함수를 짜주도록 함.
1. 인터페이스를 상속 받는 추상 클래스 생성
-> interface를 반환하도록 설계.
public abstract class CrudController<Req,Res> implements CrudInterface<Req,Res> {
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);
}
}
2. 원하는 Entity의 controller에서 해당 추상 클래스를 상속받고 자신의 logicService로 반환되는 interface를 치환 시킴.
@RestController
@RequestMapping("/api/item")
public class ItemApiController extends CrudController<ItemApiRequest, ItemApiResponse> {
@Autowired
private ItemApiLogicService itemApiLogicService;
@PostConstruct
public void init()
{
this.baseService = itemApiLogicService;
}
}
'Spring' 카테고리의 다른 글
orderInfo 구현 (0) | 2019.11.18 |
---|---|
페이징 처리 (0) | 2019.11.18 |
Code Refactoring : JPA Enum 형태 관리 (0) | 2019.11.17 |
CRUD Logic 구현 (0) | 2019.11.17 |
@Slf4j (0) | 2019.11.14 |