Home > Backend Development > πŸ“š[Backend Development] Java Spring ν”„λ ˆμž„μ›Œν¬μ˜ 계측 - Business Layer(λΉ„μ¦ˆλ‹ˆμŠ€ 계측)

πŸ“š[Backend Development] Java Spring ν”„λ ˆμž„μ›Œν¬μ˜ 계측 - Business Layer(λΉ„μ¦ˆλ‹ˆμŠ€ 계측)
Backend Ddevelopment Component Layer Architecture

πŸ“š[Backend Development] Java Spring ν”„λ ˆμž„μ›Œν¬μ˜ 계측 - Business Layer(λΉ„μ¦ˆλ‹ˆμŠ€ 계측)

βœ… Business Layer (λΉ„μ¦ˆλ‹ˆμŠ€ 계측)

  • μ£Όμš” μ»΄ν¬λ„ŒνŠΈ : @Service
  • μ—­ν•  : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • μ„€λͺ… : μ‚¬μš©μžμ˜ μš”μ²­μ— λŒ€ν•œ μ‹€μ œ μž‘μ—…(e.g, β€œκ²Œμ‹œκΈ€μ„ μ €μž₯ν•œλ‹€β€, β€œμ‚¬μš©μž 등급을 μ—…λ°μ΄νŠΈν•œλ‹€β€)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ—¬λŸ¬ 데이터 μ ‘κ·Ό κ³„μΈ΅μ˜ κΈ°λŠ₯을 μ‘°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άκ±°λ‚˜, λ³΅μž‘ν•œ 계산을 μ²˜λ¦¬ν•˜λŠ” λ“± λΉ„μ¦ˆλ‹ˆμŠ€μ˜ β€˜κ·œμΉ™β€™κ³Ό β€˜μ •μ±…β€™μ„ κ΅¬ν˜„ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.

βœ… 1. 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (Core Business Logic)

β€œμ΄ μ„œλΉ„μŠ€λ₯Ό 무엇 λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ”κ°€?β€λΌλŠ” μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 μ½”λ“œλ‘œ κ΅¬ν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€.
즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 쑴재 이유이자 핡심 κΈ°λŠ₯ κ·Έ 자체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

  • κ°œλ… : 데이터λ₯Ό λ‹¨μˆœνžˆ μ €μž₯ν•˜κ³  λ³΄μ—¬μ£ΌλŠ” 것을 λ„˜μ–΄, νŠΉμ • λͺ©μ μ„ μœ„ν•΄ 데이터λ₯Ό κ°€κ³΅ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” λͺ¨λ“  κ³Όμ •μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ (μ‡Όν•‘λͺ°) :
    • β€˜μ£Όλ¬Έ μ²˜λ¦¬β€™ 둜직: μ‚¬μš©μžκ°€ β€˜μ£Όλ¬Έν•˜κΈ°β€™ λ²„νŠΌμ„ λˆ„λ₯΄λ©΄, μ‹œμŠ€ν…œμ€ μƒν’ˆμ˜ 재고λ₯Ό ν™•μΈν•˜κ³ , μ‚¬μš©μžμ˜ 쿠폰을 μ μš©ν•˜μ—¬ μ΅œμ’… 결제 κΈˆμ•‘μ„ κ³„μ‚°ν•˜κ³ , μ‚¬μš©μžμ˜ 등급에 따라 포인트λ₯Ό μ λ¦½ν•œ ν›„, 배솑 정보λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 λͺ¨λ“  κ³Όμ •μ˜ 쑰합이 λ°”λ‘œ β€˜μ£Όλ¬Έ μ²˜λ¦¬β€™λΌλŠ” ν•˜λ‚˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μž…λ‹ˆλ‹€.

βœ… 2. νŠΈλžœμž­μ…˜ (Transaction)

μ„œλ‘œ κ΄€λ ¨λœ μ—¬λŸ¬ 개의 μž‘μ—…μ„ ν•˜λ‚˜μ˜ 묢음으둜 μ²˜λ¦¬ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이 묢음 μ•ˆμ˜ μž‘μ—…λ“€μ€ β€˜λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜ λͺ¨λ‘ μ‹€νŒ¨ν•΄μ•Όβ€™ ν•©λ‹ˆλ‹€ (All or Nothing).

  • κ°œλ… : λ°μ΄ν„°μ˜ 일관성과 무결성을 보μž₯ν•˜κΈ° μœ„ν•œ 맀우 μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. 쀑간에 ν•˜λ‚˜μ˜ μž‘μ—…μ΄λΌλ„ μ‹€νŒ¨ν•˜λ©΄, 이전에 μ„±κ³΅ν–ˆλ˜ λͺ¨λ“  μž‘μ—…μ„ μ›λž˜ μƒνƒœλ‘œ λ˜λŒλ¦½λ‹ˆλ‹€(Rollback).
  • μ˜ˆμ‹œ (κ³„μ’Œ 이체) :
    • A의 κ³„μ’Œμ—μ„œ 1만 원을 μΆœκΈˆν•˜κ³ , B의 κ³„μ’Œμ—μ„œ 1만 원을 μž…κΈˆν•˜λŠ” 것은 두 개의 μž‘μ—…μž…λ‹ˆλ‹€.
    • λ§Œμ•½ μΆœκΈˆμ€ μ„±κ³΅ν–ˆλŠ”λ°, μ‹œμŠ€ν…œ 였λ₯˜λ‘œ μž…κΈˆμ΄ μ‹€νŒ¨ν•˜λ©΄ 돈이 κ³΅μ€‘μœΌλ‘œ μ‚¬λΌμ§€κ²Œ λ©λ‹ˆλ‹€.
    • β€˜νŠΈλžœμž­μ…˜β€™μ€ 이 두 μž‘μ—…μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄, μž…κΈˆμ΄ μ‹€νŒ¨ν•˜λ©΄ μ„±κ³΅ν–ˆλ˜ μΆœκΈˆκΉŒμ§€ μ·¨μ†Œμ‹œμΌœ 데이터가 ν‹€μ–΄μ§€λŠ” 것을 λ§‰μ•„μ€λ‹ˆλ‹€. Springμ—μ„œλŠ” @Transactional μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ κ°„λ‹¨ν•˜κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 3. λΉ„μ¦ˆλ‹ˆμŠ€μ˜ κ·œμΉ™ (Business Rule)

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 따라야 ν•˜λŠ” ꡬ체적이고 λͺ…ν™•ν•œ μ‘°κ±΄μ΄λ‚˜ μ œμ•½μ‚¬ν•­μ„ λ§ν•©λ‹ˆλ‹€.
보톡 β€˜μ°Έ/κ±°μ§“β€™μœΌλ‘œ νŒλ³„ν•  수 μžˆλŠ” λͺ…μ œ ν˜•νƒœλ₯Ό λ±λ‹ˆλ‹€.

  • κ°œλ… : λ°μ΄ν„°λ‚˜ ν”„λ‘œμ„ΈμŠ€κ°€ μœ νš¨ν•œ μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ κ°œλ³„μ μΈ 검사 ν•­λͺ©μž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ (μ‡Όν•‘λͺ°) :
    • β€œνšŒμ›κ°€μž… μ‹œ λΉ„λ°€λ²ˆν˜ΈλŠ” λ°˜λ“œμ‹œ 8자 이상이어야 ν•œλ‹€.”
    • β€œμƒν’ˆμ˜ μž¬κ³ κ°€ 0이면 β€˜ν’ˆμ ˆβ€™ μƒνƒœλ‘œ ν‘œμ‹œν•΄μ•Ό ν•œλ‹€.”
    • β€œλ―Έμ„±λ…„μžλŠ” μ£Όλ₯˜λ₯Ό ꡬ맀할 수 μ—†λ‹€.”

βœ… 4. λΉ„μ¦ˆλ‹ˆμŠ€μ˜ μ •μ±… (Business Policy)

μ—¬λŸ¬ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™λ“€μ΄ λͺ¨μ—¬μ„œ λ§Œλ“€μ–΄μ§„, 더 넓은 λ²”μœ„μ˜ 운영 λ°©μΉ¨μ΄λ‚˜ μ „λž΅μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

  • κ°œλ… : ν•˜λ‚˜μ˜ κ·œμΉ™μ΄λΌκΈ°λ³΄λ‹€λŠ”, νŠΉμ • μƒν™©μ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€κ°€ μ–΄λ–»κ²Œ μš΄μ˜λ μ§€μ— λŒ€ν•œ μ „λ°˜μ μΈ κ°€μ΄λ“œλΌμΈμž…λ‹ˆλ‹€.
  • μ˜ˆμ‹œ (μ‡Όν•‘λͺ°) :
    • β€œλ°°μ†‘λΉ„ 정책” : β€œκΈ°λ³Έ λ°°μ†‘λΉ„λŠ” 3,000원이닀(κ·œμΉ™1). ν•˜μ§€λ§Œ, 5만 원 이상 ꡬ맀 μ‹œ λ°°μ†‘λΉ„λŠ” λ¬΄λ£Œλ‹€(κ·œμΉ™2). λ˜ν•œ, 제주 및 λ„μ„œ μ‚°κ°„ 지역은 μΆ”κ°€ 배솑비 5,000원이 λΆ™λŠ”λ‹€(κ·œμΉ™3).” 이 κ·œμΉ™λ“€μ˜ 집합이 β€˜λ°°μ†‘λΉ„ μ •μ±…β€™μ΄λΌλŠ” ν•˜λ‚˜μ˜ 정책을 μ΄λ£Ήλ‹ˆλ‹€.
    • β€˜ν™˜λΆˆ 정책’ : β€œκ΅¬λ§€ ν›„ 7일 μ΄λ‚΄μ—λ§Œ ν™˜λΆˆμ΄ κ°€λŠ₯ν•˜λ‹€(κ·œμΉ™1). μƒν’ˆμ˜ 포μž₯이 ν›Όμ†λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€(κ·œμΉ™2).”

βœ… Service의 역할은 λ¬΄μ—‡μΈκ°€μš”?

Service의 핡심 역할은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. Controllerλ‘œλΆ€ν„° μš”μ²­μ„ λ°›μ•„, 데이터λ₯Ό κ°€κ³΅ν•˜κ±°λ‚˜ μ—¬λŸ¬ 데이터 μ†ŒμŠ€λ₯Ό μ‘°ν•©ν•˜λŠ” λ“± μ‹€μ œμ μΈ β€˜μ—…λ¬΄β€™λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 쀑앙화 : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λ‘œμ§μ„ ν•œ 곳에 λͺ¨μ•„ κ΄€λ¦¬ν•¨μœΌλ‘œμ¨ μ½”λ“œμ˜ 일관성을 μœ μ§€ν•˜κ³  쀑볡을 λ°©μ§€ν•©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ 관리 : μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ ν•˜λ‚˜μ˜ λ‹¨μœ„(νŠΈλžœμž­μ…˜)둜 λ¬Άμ–΄ λ°μ΄ν„°μ˜ 일관성을 보μž₯ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 좜금과 μž…κΈˆμ΄ λͺ¨λ‘ μ„±κ³΅ν•΄μ•Όλ§Œ κ³„μ’Œμ΄μ²΄κ°€ μ™„λ£Œλ˜λ„λ‘ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • Controller와 Repository 뢄리 : ServiceλŠ” Controllerκ°€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 직접 μ•Œμ§€ λͺ»ν•˜κ²Œ ν•˜κ³ , Repositoryκ°€ λ‹¨μˆœν•œ 데이터 CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ)μ—λ§Œ μ§‘μ€‘ν•˜λ„λ‘ ν•˜λŠ” 쀑간 닀리 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

βœ… ServiceλŠ” μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

Controllerκ°€ 받은 μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ‹¨μˆœν•œ 데이터 전달 μ΄μƒμ˜ μž‘μ—…μ΄ ν•„μš”ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • ν•˜λ‚˜μ˜ κΈ°λŠ₯이 μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ ν•„μš”λ‘œ ν•  λ•Œ (e.g, κ²Œμ‹œκΈ€ μž‘μ„± μ‹œ κ²Œμ‹œκΈ€ μ €μž₯ ν›„, μ‚¬μš©μž 포인트 μ—…λ°μ΄νŠΈ)
  • 데이터λ₯Ό κ°€κ³΅ν•˜κ±°λ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μ μš©ν•΄μ•Όν•  λ•Œ (e.g, μ‚¬μš©μž λ‚˜μ΄λ₯Ό κ³„μ‚°ν•˜κ±°λ‚˜, μ£Όλ¬Έ κΈˆμ•‘μ— 따라 배솑비λ₯Ό κ²°μ •ν•  λ•Œ)
  • νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ ν•„μš”ν•˜μ—¬ λ°μ΄ν„°μ˜ μ›μžμ„±(All or Nothing)을 보μž₯ν•΄μ•Ό ν•  λ•Œ

βœ… ServiceλŠ” μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ‚˜μš”?

@Service μ–΄λ…Έν…Œμ΄μ…˜μ„ ν΄λž˜μŠ€μ— λΆ™μ—¬ μ‚¬μš©ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μœ„ν•΄ Repositoryλ₯Ό μ£Όμž…λ°›μ•„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

μ•„λž˜λŠ” id둜 μ‚¬μš©μžλ₯Ό μ‘°νšŒν•˜λ˜, 없을 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” κ°„λ‹¨ν•œ Service μ˜ˆμ‹œ μ½”λ“œμž…λ‹ˆλ‹€.

// 이 ν΄λž˜μŠ€κ°€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” Serviceμž„μ„ μ„ μ–Έν•©λ‹ˆλ‹€.
@Service
public class UserService {
    
    // λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μœ„ν•œ UserRepositoryλ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. (μ˜μ‘΄μ„± μ£Όμž…)
    private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
        this.userRepository = userRespository;
    }
    
    /**
     * μ‚¬μš©μž ID둜 μ‚¬μš©μžλ₯Ό μ‘°νšŒν•˜λŠ” λ©”μ„œλ“œ
     * @Transactional(readOnly = true)λŠ” 이 λ©”μ„œλ“œκ°€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 읽기만 ν•˜λŠ”
     * μž‘μ—…μ΄λ©°, μ•½κ°„μ˜ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
     */
    @Transactional(readOnly = true)
    public User findUserById(Long id) {
        // Repositoryλ₯Ό 톡해 ID둜 μ‚¬μš©μžλ₯Ό μ°Ύκ³ ,
        // λ§Œμ•½ μ‚¬μš©μžκ°€ μ—†μœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 'λΉ„μ¦ˆλ‹ˆμŠ€ 둜직'을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
        return userRepository.findById(id)
            .orElseThrow(() -> new IllegalArgumentException("ν•΄λ‹Ή μ‚¬μš©μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. id=" + id));
    }
}

// Controllerμ—μ„œλŠ” 이 Serviceλ₯Ό μ£Όμž…λ°›μ•„ μ‚¬μš©ν•©λ‹ˆλ‹€.
@RestController
public class UserController {
    
    private final UserService userService;
    
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    @GetMapping("/api/users/{id}")
    public User getUserById(@PathVariable Long id) {
        // ControllerλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 직접 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  Service의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
        return userService.findUserById(id);
    }
}

βœ… 1. Business LayerλŠ” μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 κΈ°λŠ₯을 μˆ˜ν–‰ν•΄μ•Ό ν•  λ•Œ 항상 μ‚¬μš©ν•©λ‹ˆλ‹€.
Controllerλ‘œλΆ€ν„° μš”μ²­μ„ λ°›μ•„, λ‹¨μˆœνžˆ 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” 것을 λ„˜μ–΄ 데이터λ₯Ό κ°€κ³΅ν•˜κ±°λ‚˜, λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μ μš©ν•˜κ³ , μ—¬λŸ¬ λ‹¨κ³„μ˜ μž‘μ—…μ„ ν•˜λ‚˜μ˜ 묢음(νŠΈλžœμž­μ…˜)으둜 μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ 이 계측이 쀑심적인 역할을 ν•©λ‹ˆλ‹€.

βœ… 2. Business LayerλŠ” μ–΄λ””μ„œ μ‚¬μš©ν•˜λ‚˜μš”?

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜μ—μ„œ Presentation Layer(Controller)와 Data Access Layer(Repositoty) μ‚¬μ΄μ˜ 쀑간 계측에 μœ„μΉ˜ν•©λ‹ˆλ‹€.
μ™ΈλΆ€μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” λΆ€λΆ„κ³Ό λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 μ ‘κ·Όν•˜λŠ” 뢀뢄을 λΆ„λ¦¬ν•˜μ—¬, κ·Έ μ‚¬μ΄μ—μ„œ μ‹€μ§ˆμ μΈ 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” β€˜λ‘λ‡Œβ€™μ—­ν• μ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

βœ… 3. Business LayerλŠ” μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ‚˜μš”?

주둜 @Service μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ •μ˜ν•˜κ³ , 이 클래슀 μ•ˆμ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ©”μ„œλ“œλ‘œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

  • @Service ν΄λž˜μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μœ„ν•΄ @Repositoryλ₯Ό μ£Όμž…(Injection) λ°›μŠ΅λ‹ˆλ‹€.
  • Controllerλ‘œλΆ€ν„° 전달받은 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬, Repositoryλ₯Ό 톡해 데이터λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μ €μž₯ν•©λ‹ˆλ‹€.
  • 데이터λ₯Ό κ°€κ³΅ν•˜κ³ , λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μ μš©ν•˜λ©°, @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 데이터 처리의 일관성을 보μž₯ν•©λ‹ˆλ‹€.

βœ… 4. Business LayerλŠ” μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

κ°€μž₯ μ€‘μš”ν•œ μ΄μœ λŠ” κ΄€μ‹¬μ‚¬μ˜ 뢄리(Separation of Concerns) λ₯Ό 톡해 μ–»λŠ” μ—¬λŸ¬ 이점 λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • μœ μ§€λ³΄μˆ˜μ„± ν–₯상 : λΉ„μ¦ˆλ‹ˆμŠ€ μ •μ±…(e.g, ν• μΈμœ¨ λ³€κ²½)이 λ°”λ€” λ•Œ, λ‹€λ₯Έ 계측은 κ±΄λ“œλ¦¬μ§€ μ•Šκ³  Business Layer의 κ΄€λ ¨ μ½”λ“œλ§Œ μˆ˜μ •ν•˜λ©΄ λ˜λ―€λ‘œ 관리가 맀우 μš©μ΄ν•©λ‹ˆλ‹€.
  • μ½”λ“œ μž¬μ‚¬μš©μ„± 증가 : ν•˜λ‚˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(e.g, νšŒμ›κ°€μž…)을 λ§Œλ“€μ–΄μ£Όλ©΄, μ›Ή Controller, λͺ¨λ°”일 API Controller λ“± μ—¬λŸ¬ κ³³μ—μ„œ ν•΄λ‹Ή Serviceλ₯Ό ν˜ΈμΆœν•˜μ—¬ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ 관리 : μ—¬λŸ¬ 개의 λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½ μž‘μ—…μ„ ν•˜λ‚˜μ˜ 논리적인 λ‹¨μœ„λ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•˜κΈ°μ— κ°€μž₯ μ ν•©ν•œ μœ„μΉ˜μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ 정합성을 μ•ˆμ „ν•˜κ²Œ 지킬 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μš©μ΄μ„± : μ›Ή μ„œλ²„λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ 없이도 순수 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 자체의 정확성을 λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κΈ° νŽΈλ¦¬ν•©λ‹ˆλ‹€.