@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
@Autowired
UserApiLogicService userApiLogicService;
@PostConstruct
public void init(){
this.baseService=userApiLogicService;
}
}
현재 Controller에서 많은 부분이 추상화로 인해 줄었지만, 아직도 반복적으로 같은 작업을 하는 부분이 존재한다.
@Component // autowired를 받기 위해 component로 생성
public abstract class BaseService<Req,Res,Entity> implements CrudInterface<Req,Res> {
@Autowired(required = false) // = 꼭 default는 아니다
protected JpaRepository<Entity,Long> baseRepository;
}
BaseService는 각각의 service에서 repository를 생성해서 다른 이름의 repository를 사용함을 지양하기 위한 목적으로 만들어졌다. 그래서 상위 repository인 JpaRepository type을 형으로 갖는다.
public abstract class CrudController<Req,Res> implements CrudInterface<Req,Res> {
protected CrudInterface<Req,Res> baseService;
-->
public abstract class CrudController<Req,Res,Entity> implements CrudInterface<Req,Res> {
@Autowired
protected BaseService<Req,Res,Entity> baseService;
Crudifs를 상속받았던 baseService를 BaseService형으로 선언해주었다. 또한 Controller에서 객체를 주입하지 않기 위해 Autowired또한 걸어주었다.
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
@Autowired
UserApiLogicService userApiLogicService;
@PostConstruct
public void init(){
this.baseService=userApiLogicService;
}
}
------->
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
}
Service
public class UserApiLogicService implements CrudInterface<UserApiRequest,UserApiResponse> {
@Autowired
private UserRepository userRepository;
---->
@Service
public class UserApiLogicService extends BaseService<UserApiRequest,UserApiResponse,User> {
Crud ifs를 상속받는것이 아니라 Crudifs를 상속받은 BaseService를 상속받는다. BaseSerivce안에 있는 baseRepository가 상속도중 자동으로 생겨난다.
- N-Controller에서는 BaseController를 상속받는다. Crudifs를 상속받은 BaseController에서는 BaseService를 autowired로 채워준다. 이 때, BaseService는 넘겨받은 Entity에 따라 다른 값이 생성된다.
- Controller -> abstract CrudController implemetns Crudifs
Service -> abstract BaseService implemetent Crudifs- Controller에서 일일히 하던거를, 추상화 단계에서 한 번에 한다고 생각하면 이해가 빠를 듯

추상화 = 앞에 한 단계를 두는 것

CrudController 에서 찍어낸 N-Controller에서 Entity를 BaseService에 넘겨준다. BaseService에서는 Entity에 따른 Repository를 생성하고 UserService에서는 BaseService에서 만들어진 Repository를 사용한다.