Spring | 의존성 주입을 활용한 유연한 컴포넌트 구조 : Service를 이용해서 list구현하기!

새니·2023년 6월 23일
0

spring

목록 보기
9/13
post-thumbnail

스프링 컴포넌트 구조

웹 애플리케이션의 경우 Controller, Service, DAO, 데이터베이스 간의 관계를 효과적으로 관리하는 것이 매우 중요하다. Controller와 Service 간의 의존 관계를 살펴보고, 비즈니스 로직의 분리와 의존성 주입을 통해 유지보수성과 테스트 용이성을 향상시키는 방법에 대해 알아보자 !




Controller와 Service의 개념


1. Controller

컨트롤러는 사용자의 요청을 처리하고 응답을 생성하는 역할을 담당한다. 컨트롤러는 주로 클라이언트로부터 받은 데이터를 가공하고, Service 계층의 메서드를 호출하여 비즈니스 로직을 수행한다. Controller는 Service 계층에 의존한다.



2. Service

비즈니스 로직을 처리하는 컴포넌트.
Service는 Controller로부터 요청을 받아 데이터의 유효성 검사, 데이터 변환, 외부 서비스 호출 등을 수행한다. Service는 DAO 계층의 메서드를 호출하여 데이터 액세스를 처리하고, 트랜잭션을 관리한다. Service는 DAO 계층에 의존한다.



controller와 Service의 관계

Controller는 클라이언트의 요청을 처리하고, 필요한 데이터를 수집하고 가공한 후에 Service를 호출하여 비즈니스 로직을 실행한다. Controller는 사용자 인터페이스와 직접적으로 상호 작용하고, 요청의 유효성 검사, 데이터 변환, 응답의 생성 등을 담당합니다. 그리고 이러한 작업을 처리하기 위해 Service를 호출하여 비즈니스 로직의 실행을 위임한다.
Controller가 Service에 의존함으로써 Controller와 비즈니스 로직의 분리가 이루어집니다.
따라서, Controller는 Service에 의존하고 있기 때문에 Controller 대신에 Service를 사용하여 비즈니스 로직을 처리할 수 있다.
유지보수성과 테스트 용이성을 개선하는데 도움이 된다.




컴포넌트 의존하는 구조를 그림을 통해 알아보자!



Service를 이용해서 list 구현하기!

[MemberService]

  • MemberService 인터페이스를 정의한다.
  • getMemberInfo와 getMemberList는 ModelAndView 객체를 매개변수로 받아서 회원의 정보 / 전체 회원 목록을 조회하야 ModelAndView 객체에 저장한다.


[MemberServiceImpl]

  • MemberServiceImpl 클래스는 @Service 어노테이션을 사용하여 스프링의 빈으로 등록되었으며, MemberDao객체를 @autowired어노테이션을 통해 주입받아 사용한다.
    MemberServiceImpl은 MemberService 인터페이스의 메서드들을 구현하고, MemberDao를 통해 데이터베이스에 접근할 수 있다.


[MemberController]

이제 MemberController를 수정해보자!

우선적으로

MemberDao 타입의 객체를 필드로 선언하고, @Autowired 어노테이션을 붙여 주입받을 수 있도록 설정했던 코드를


GuestService 인터페이스를 자동으로 주입 받을 수 있도록 변경한다!

[MemberDto를 이용해서 회원 수정 요청을 처리했던 코드]

  • Serivce를 주입 받아 코드 변경!
    이러한 방식으로 다른 코드들도 변경해보기!
//회원 수정 요청 처리
	@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";
	}
profile
새니의 뒤죽박죽 개발 일기📝

0개의 댓글

관련 채용 정보