티스토리 뷰

728x90

1. 서비스 Layer는 Facade 디자인 패턴을 사용한다.

 

2. Facade 정확하게 원하는 기능의 메소드를 제공하고 패턴은 세부적인 것을 내부적으로 감춘다.

  2-1 Information hiding을 서비스를 레벨에서 제공한다.

  2-2 데이터베이스의 여러 테이블, 외부 데이터 소스 등의 다양한 데이터의 출처와 상관없이 정확한 서비스를 제공한다.

  2-3 일반적으로 다양한 테이블의 데이터를 조합하여 원하는 데이터를 제공하는 용도로 많이 사용한다.

 

3. @Service annotation을 클래스 정의에 사용한다.

  3-1 @Service는 @Repository, @Controller와 동일하게 @Component를 상속하고 있다.

 

4. 여기서는 가장 간단한 기능의 서비스 구현 코드이다. 사실 동작에는 필요없는 부분이긴 하지만 확장을 위해서 만든다.

  4-1 바꿔야 할 부분은 3가지 이다.

  4-2 서비스 Interface를 만들고, 서비스 인터페이스를 구현하는 클래스를 작성한다.

  4-3 @Transaction을 DAO구현 클래스에서 Service 구현클래스로 옮겨온다.

  4-4 Controller에서 DAO객체 대신 Service를 주입 받아 사용한다.

// 서비스 인터페이스
package pe.pilseong.hibernateweb.service;

import java.util.List;

import pe.pilseong.hibernateweb.entity.Customer;

public interface CustomerService {
  List<Customer> getCustomers();
}


// 서비스 인터페이스 구현 클래스
package pe.pilseong.hibernateweb.service;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.pilseong.hibernateweb.dao.CustomerDAO;
import pe.pilseong.hibernateweb.entity.Customer;

@Service
public class CustomerServiceImpl implements CustomerService {

  @Autowired
  private CustomerDAO customerDAO;
  
  @Override
  @Transactional
  public List<Customer> getCustomers() {
    return this.customerDAO.getCustomers();
  }
}


// 컨트롤러 수정
@Controller
@RequestMapping("/customer")
public class CustomerController {
  
  @Autowired
  private CustomerService customerService;
  
  @GetMapping("/list")
  public String listCustomers(Model model) {
    
    model.addAttribute("customers", this.customerService.getCustomers());
    
    return "list-customers";
  }
}

 

728x90
댓글