스프링 컴포넌트 구조
웹 애플리케이션의 경우 Controller, Service, DAO, 데이터베이스 간의 관계를 효과적으로 관리하는 것이 매우 중요하다. Controller와 Service 간의 의존 관계를 살펴보고, 비즈니스 로직의 분리와 의존성 주입을 통해 유지보수성과 테스트 용이성을 향상시키는 방법에 대해 알아보자 !
컨트롤러는 사용자의 요청을 처리하고 응답을 생성하는 역할을 담당한다. 컨트롤러는 주로 클라이언트로부터 받은 데이터를 가공하고, Service 계층의 메서드를 호출하여 비즈니스 로직을 수행한다. Controller는 Service 계층에 의존한다.
비즈니스 로직을 처리하는 컴포넌트.
Service는 Controller로부터 요청을 받아 데이터의 유효성 검사, 데이터 변환, 외부 서비스 호출 등을 수행한다. Service는 DAO 계층의 메서드를 호출하여 데이터 액세스를 처리하고, 트랜잭션을 관리한다. Service는 DAO 계층에 의존한다.
Controller는 클라이언트의 요청을 처리하고, 필요한 데이터를 수집하고 가공한 후에 Service를 호출하여 비즈니스 로직을 실행한다. Controller는 사용자 인터페이스와 직접적으로 상호 작용하고, 요청의 유효성 검사, 데이터 변환, 응답의 생성 등을 담당합니다. 그리고 이러한 작업을 처리하기 위해 Service를 호출하여 비즈니스 로직의 실행을 위임한다.
Controller가 Service에 의존함으로써 Controller와 비즈니스 로직의 분리가 이루어집니다.
따라서, Controller는 Service에 의존하고 있기 때문에 Controller 대신에 Service를 사용하여 비즈니스 로직을 처리할 수 있다.
유지보수성과 테스트 용이성을 개선하는데 도움이 된다.
@Service
어노테이션을 사용하여 스프링의 빈으로 등록되었으며, MemberDao객체를 @autowired
어노테이션을 통해 주입받아 사용한다.이제 MemberController를 수정해보자!
우선적으로
MemberDao 타입의 객체를 필드로 선언하고, @Autowired
어노테이션을 붙여 주입받을 수 있도록 설정했던 코드를
GuestService 인터페이스를 자동으로 주입 받을 수 있도록 변경한다!
//회원 수정 요청 처리
@RequestMapping(method = RequestMethod.POST, value="/member/update")
public String update(MemberDto dto) {
service.updateMember(dto);
return "member/update";
}
//회원 삭제 요청 처리
@RequestMapping("/member/delete")
public String delete(int num) {
service.deleteMember(num);
//목록보기로 리다이렉트 응답
return "redirect:/member/list";
}
@RequestMapping("/member/updateform")
public ModelAndView updateform(ModelAndView mView, int num) {
service.getMemberInfo(mView, num);
mView.setViewName("member/updateform");
//모델(data)와 view page의 정보가 모두 담긴 ModelAndView객체를 리턴해주면
//spring이 알아서 처리 해준다.
return mView;
}
@RequestMapping("/member/list")
//회원 목록 보기 요청 처리
public String list(ModelAndView mView) {
//회원목록을 얻어와서
service.getMemberList(mView);
mView.setViewName("guest/list");
// /WEB-INF/views/member/list.jsp 페이지로 forward 이동해서 응답
return "member/list";
}
//회원 추가 요청처리
@RequestMapping("/member/insert")
public String insert(MemberDto dto) {
//MemberDao 객체를 이용해서 DB에 저장
service.addMember(dto);
//view page로 forward 이동해서 응답
return "member/insert";
}