자~!!! 오늘은 스프링에서 Service 를 알아보도록 하겠습니다!!!
제가 말주변이 없어서 최대한 알기 쉽게 작성하려고 하는데 도움이 되기를 바라면서 시작해볼게요!!
1. Service 란 무엇? 왜 필요?
Controller | Request 를 어떻게 처리할까? |
Service | Request 에 대해 어떤 처리를 할까? |
위와 같이 정리를 해봤는데요.. 좀.. 이상한가요?
제대로 설명을 해보도록 할게요 우선 간략하게 큰 틀을 말하자면 아래와 같습니다.
1) Client 가 Request 를 보낸다.
2) Request URL에 알맞은 Controller 가 수신한다.
3) Controller 는 넘어온 요청을 처리하기 위해 Service 를 호출한다.
4) Service 는 알맞은 정보를 가공하여 Controller 에게 데이터를 넘긴다.
5) Controller 는 Service 의 결과물을 Client 에게 전달해준다.
여기에 Service 가 Client 의 요청에 대한 올바른 정보를 제공하기 위한 처리를 하는데요 이것을 '비즈니스 로직을 수행한다' 고 말합니다. 비즈니스 로직이라는 단어는 팁으로 알아두면 좋겠죠??ㅎㅎ
만약에 사용자에게 객체 100개 생성 후 List에 담은 결과 값을 전달하기 위한 다음 2가지 방법 중에서 좀 더 깔끔한 걸 다같이 골라볼까요??
- Controller 에서 수행
@RequestMapping(value="/getUsers")
public String getUsers(Model model) {
ArrayList arrayListOfUser = new ArrayList<>();
for(int indexOfUser = 0; indexOfUser < 100; indexOfUser++) {
User user = new User();
user.setUserId(indexOfUser);
user.setUserName("UserName"+indexOfUser);
arrayListOfUser.add(user);
}
model.addAttribute("users",arrayListOfUser);
return "user";
}
- Controller 에서 Service 호출해서 처리
@RequestMapping(value="/getUsers")
public String getUsers(Model model) {
model.addAttribute("users", userService.getUsers());
return "user";
}
저는 아래쪽이 더 좋을 것 같은데 여러분의 생각은 어떠신가욤?? 지금은 좀 간단하게 했지만 여러 정보를 가공해야한다거나 DB에서 데이터를 가져와 핸들링 한다면 Controller 에서 수행하는 첫번째 방법은 getUsers() 라는 메서드가 어마무시하게 길어지니까... 가독성이 매우 떨어지겠죠?
그래서 Service 라는 속성을 통해 요청과 수행을 분리하는 것 입니다!!
2. Service 사용법
여기에 들어오신 분들은 보통 Service 어떻게 사용해야하나.. 하고 들어오신 분들이겠죠?? 그러면 2번에 집주우우웅!!
스프링에서 Controller, Service 등과 같은 녀석들은 어노테이션(@)을 사용해서 표시를 해주는데요 이거슨 바로 스프링에서 아 이녀석들은 구성요소구나 그러니 시작과 동시에 미리 세팅해놔야 문제가 없겠구나!!! 하고 알 수 있게해주는건데 사실은 더 깊고 많은 뜻이 있어요^~^ 이건 궁금해 하는 분들이 계시면 나중에 따로 다루도록 할게요~!!
Service 를 구현할때 크게 2가지가 있어요.
1) Service Interface 만들기
2) Service Interface 구현한 Class 만들기
그럼 1번부터 가볼게요~!!
1) Service Interface 만들기
public interface UserSerivce {
public ArrayList getUsers();
}
2) Service Interface 구현
@Service
public class UserServiceImpl implements UserSerivce{
@Override
public ArrayList getUsers() {
// TODO Auto-generated method stub
ArrayList arrayListOfUser = new ArrayList<>();
for(int indexOfUser = 0; indexOfUser < 100; indexOfUser++) {
User user = new User();
user.setUserId(indexOfUser);
user.setUserName("UserName"+indexOfUser);
arrayListOfUser.add(user);
}
return arrayListOfUser;
}
}
요렇게 구현 할 수 있는데요 여기서 나오는 @Service 어노테이션 꼭 붙여줘야 스프링에서 이녀석이 Service 역할을 하는 녀석이구나!! 하고 인식 할 수 있습니다.
먼저 Interface 를 만들 때 자신이 원하는 값 입력받고 원하는 값을 리턴할 함수를 선언해주고, Class 를 만들어 implements 해서 선언해 둔 함수를 구현해서 원하는 방식대로 동작하도록 설정을 합니다.
3) 만들어 둔 Service 를 Controller 에서 호출하기
@Controller
public class UserController {
@Autowired
private UserSerivce userService;
@RequestMapping(value="/getUsers")
public String getUsers(Model model) {
model.addAttribute("users",userService.getUsers());
return "user";
}
}
요기서 중요한데요 @Service 라는 어노테이션으로 선언한 Class 를 사용하기위해서 @Autowired 라는 어노테이션을 사용해서 해당 서비스를 스프링에 등록시켜줍니다. 이후 Service 를 변수로 사용해 원하는 메서드를 실행하면 깔끔하게 동작하게 됩니다.
잠.깐!!! 짚고 넘어가야할게 있죠?? 분명 @Service 로 등록한 Class 는 UserServiceImpl 이라는 클래스고 그럼 @Autowired 라는 어노테이션으로 UserServiceImpl 이라는 객체를 묶어줘야하지 않나...?? 라는 생각이 드실텐데요
UserServiceImpl 은 UserService 라는 인터페이스의 구현체이기 때문에 스프링은 @Autowired 를 UserService 라는 인터페이스를 상속한 Class 를 자동으로 등록시켜줍니다.
마지막으로 컨트롤러 내 소스코드를 해석하고 이 글을 마치도록 할게요!!
이녀석은 컨트롤러이며(@Controller) 이름은 UserController 이다(public class UserController)
어떤 컴포넌트를 스프링에 자동으로 등록할건데(@Autowired) UserSerive 라는 녀석을 상속받은 Class 를 사용할 것이다(UserService). 그리고 메인 URL(HOST) 뒤에 /getUsers 라는 요청을 받는(@RequestMapping(value="getUsers")) 메서드의 이름은 getUsers이다(public String getUsers), userService 라는 서비스에서 getUsers() 라는 메서드를 호출해서(userService.getUsers()) model에 users 라는 이름의 변수로 담아(model.addAttribute("users", userService.getUsers())) user 라는 jsp 페이지에 던져주겠다(return "user").
여기까지 아주아주아주 간단한 Service 사용법을 알아보았습니다.
다음글에서는 Service 에서 DB 정보를 조회해서 가공하는 방법을 알아볼게요~!!!
모두모두 수고하셨습니돠아~!!!
'Develop > Server' 카테고리의 다른 글
SpringBoot AOP 이해 - AOP(1) (1) | 2019.11.29 |
---|---|
SpringBoot Controller, Service, DAO 이해 - Service(2) + MyBatis (5) | 2019.11.12 |
SpringBoot Controller, Service, DAO 이해 - Controller(3) (5) | 2019.03.25 |
SpringBoot Controller, Service, DAO 이해 - Controller(2) (4) | 2019.03.22 |
SpringBoot Controller, Service, DAO 이해 - Controller(1) (6) | 2018.02.27 |