Spring Boot 시작하기 #11

ims·2020년 9월 3일

Spring Boot 시작하기 !

목록 보기
11/14

Service 추상화

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {

    @Autowired
    UserApiLogicService userApiLogicService;

    @PostConstruct
    public void init(){
        this.baseService=userApiLogicService;
    }
}

현재 Controller에서 많은 부분이 추상화로 인해 줄었지만, 아직도 반복적으로 같은 작업을 하는 부분이 존재한다.

service > BasicService 생성

@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을 형으로 갖는다.

CrudController

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또한 걸어주었다.

UserController

@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> {
}

UserApiLogicService

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가 상속도중 자동으로 생겨난다.

요약

  1. N-Controller에서는 BaseController를 상속받는다. Crudifs를 상속받은 BaseController에서는 BaseService를 autowired로 채워준다. 이 때, BaseService는 넘겨받은 Entity에 따라 다른 값이 생성된다.
  2. Controller -> abstract CrudController implemetns Crudifs
    Service -> abstract BaseService implemetent Crudifs
  3. Controller에서 일일히 하던거를, 추상화 단계에서 한 번에 한다고 생각하면 이해가 빠를 듯

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

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

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글