์ง์ „์— ๋งˆ์ง€๋ง‰์—์„œ ๋‹ค๋ฃฌ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ , ์ฆ‰ Controller ์˜ code ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ์ ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Purpose of Service Layer

Service Layer ๋Š” Facade Design Patter ์„ ์‚ฌ์šฉํ•œ ์ „ํ˜•์ ์ธ ์˜ˆ์‹œ์ด๋‹ค.

Facade Pattern ์ด๋ž€, ๋ณต์žกํ•œ system ์ด๋‚˜ subsystem ์˜ Interface ๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์ˆœํ•œ ๊ณ ์ˆ˜์ค€์˜ Interface ๋กœ ๋ฌถ์–ด system ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  code ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” Design Pattern ์ด๋‹ค.

๋”ฐ๋ผ์„œ, Controller ๋Š” DAO ์™€ ๋ณต์žกํ•œ buisness logic ์„ ์•Œ์ง€ ๋ชปํ•˜์—ฌ๋„, Service Layer ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹จ์ˆœํ•œ method ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ Service Layer ๋Š” DAO/repository ๋“ฑ์˜ data source ๋“ค์„ integrate ํ•˜๋Š”๋ฐ, Controller ๋‚ด๋ถ€์—์„œ ์ง์ ‘ DAO ๋ฅผ Injection ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , Service Layer ๊ฐ€ DAO ๋“ค์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ Controller ์—์„œ๋Š” ๋‹จ์ˆœํ•œ method ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ buisness logic ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋”ํ•œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, ์œ„์˜ ์ด๋ฏธ์ง€์— ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Controller ๋Š” ๋‹จ์ˆœํžˆ multiple data sources ๋“ค์„ integrate ํ•œ Service Later object ํ•˜๋‚˜๋งŒ ๋ฐ”๋ผ๋ณด๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Service Layer ๋กœ ์‚ฌ์šฉํ•  class ์—๋Š” @Service annotation ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, @Service ๋Š” ์œ„์™€ ๊ฐ™์ด @Component ์˜ Specialization ๋œ annotation ์˜ ํ˜•ํƒœ์ด๋‹ค.

๋”ฐ๋ผ์„œ component-scanning ๋•๋ถ„์— Service object ๋„ Spring Bean ์— ๋“ฑ๋ก๋˜์–ด Spring Container ์— ์˜ํ•˜์—ฌ ๊ด€๋ฆฌ๋œ๋‹ค.

Implement Employee Service

๊ทธ๋Ÿผ ์ด์ œ Employee Service ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

Step 1: Define Service Interface
public interface EmployeeService {   
    List<Employee> findAll();  
}
Step 2: Define Service Implementation
@Service  
public class EmployeeServiceImpl implements EmployeeService {  
  
    private EmployeeDAO employeeDAO;  
  
    public EmployeeServiceImpl(EmployeeDAO employeeDAO) {  
        this.employeeDAO = employeeDAO;  
    }  
  
    @Override  
    public List<Employee> findAll() {  
        return employeeDAO.findAll();  
    }  
}

@Service annotation ์„ ์‚ฌ์šฉํ•˜๊ณ , EmployeeDAO ๋ฅผ Service ์—์„œ injection ๋ฐ›์•„์„œ findAll() ์ด๋ผ๋Š” method ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.

Step 3: Update REST Controller
private EmployeeService employeeService;  
  
public EmployeeRestController(EmployeeService employeeService) {  
    this.employeeService = employeeService;  
}

EmployeeDAO ๋ฅผ declare ํ•˜๊ณ  injection ํ•˜๋Š” ๋Œ€์‹ , EmployeeService ๋ฅผ declare ํ•˜๊ณ  injection ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ Controller ๋Š” Service ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋˜๊ณ , Service ๋Š” ๊ฐ๊ฐ์˜ DAO ๋ฅผ ๋ฐ”๋กœ๋ณด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ œ requirements ์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š”์ง€ ํŒŒ์•…ํ–ˆ๋‹ค. ์ด์ œ requirements ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜์—ฌ๋ณด์ž.