Skip to content

Latest commit

Β 

History

History
88 lines (64 loc) Β· 2.84 KB

PSA.md

File metadata and controls

88 lines (64 loc) Β· 2.84 KB

Portable Service Abstraction

  • PSA λŠ” ν™˜κ²½κ³Ό μ„ΈλΆ€ 기술의 변화와 관계 없이 μΌκ΄€λœ λ°©μ‹μœΌλ‘œ κΈ°μˆ μ— μ ‘κ·Όν•  수 있게 ν•΄μ€€λ‹€.
  • POJO 둜 개발된 μ½”λ“œλŠ” νŠΉμ • κΈ°μˆ μ— 직접 λ…ΈμΆœλ˜μ–΄ λ§Œλ“€μ–΄μ§€λ©΄ μ•ˆλ˜λŠ”λ°, 이λ₯Ό μœ„ν•΄ μŠ€ν”„λ§μ—μ„œ μ œκ³΅ν•˜λŠ” λŒ€ν‘œμ μΈ 기술이 PSA 이닀.
  • μ„œλΉ„μŠ€ 좔상화λ₯Ό μœ„ν•΄ ν•„μš”ν•œ κΈ°μˆ μ€ DI 뿐이닀.
    • 즉, PSA λŠ” DI λ₯Ό μ‘μš© ν•˜λŠ” 방법이닀.
  • 좔상화 계측을 μ‚¬μš©ν•΄μ„œ μ–΄λ–€ κΈ°μˆ μ„ 내뢀에 숨기고 κ°œλ°œμžμ—κ²Œ νŽΈμ˜μ„±μ„ μ œκ³΅ν•΄μ£ΌλŠ” 것을 μ„œλΉ„μŠ€ 좔상화(Service Abstraction) 이라고 ν•œλ‹€.
  • μ„œλΉ„μŠ€ μΆ”μƒν™”λ‘œ μ œκ³΅λ˜λŠ” κΈ°μˆ μ„ λ‹€λ₯Έ 기술 μŠ€νƒμœΌλ‘œ κ°„νŽΈν•˜κ²Œ λ°”κΏ€ 수 μžˆλŠ” ν™•μž₯성을 κ°–κ³  μžˆλŠ” 것이 PSA 이닀.

PSA 핡심

  • νŠΉμ • 세뢀적인 κΈ°μˆ μ— μ’…μ†λ˜μ§€ μ•Šκ²Œ ν•΄μ€€λ‹€.
  • ν…ŒμŠ€νŠΈκ°€ μ–΄λ ΅κ²Œ λ§Œλ“€μ–΄μ§„ API λ‚˜ 섀정을 톡해 μ£Όμš” κΈ°λŠ₯을 μ™ΈλΆ€μ—μ„œ μ œμ–΄ν•˜κ²Œ λ§Œλ“€κ³  싢은 경우 μ‚¬μš©ν•  수 μžˆλ‹€.

PSA μ μš©ν•˜κΈ°

κΈ°μ‘΄ μ½”λ“œ

public class RepositoryRank {

  public int getPoint(String repositoryName) throws IOException {
    GitHub github = GitHub.connect();
    GHRepository repository = github.getRepository(repositoryName);
    
    int points = 0;
    if (repository.hasIssues()) {
      points += 1;
    }
    
    if (repository.getReadme() != null) {
      points += 1;
    }
  
    // μƒλž΅
  }
}

ν˜„μž¬ getPoint() λ©”μ„œλ“œλŠ” ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μš΄ μƒνƒœμ΄λ‹€.

λ°”λ‘œ getPoint() λ‚΄λΆ€μ—μ„œ GitHub API λ₯Ό ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ‹€μ œλ‘œ ν…ŒμŠ€νŠΈν•  λ•Œλ§ˆλ‹€ API λ₯Ό 맀번 ν˜ΈμΆœν•˜κ²Œ ν•  것인가?

API λ₯Ό λ§€λ²ˆν˜ΈμΆœν•˜κ²Œ 되면 GitHub API μžμ²΄μ— μ œν•œμ΄ μžˆμ„ μˆ˜λ„ 있고, API λ₯Ό ν˜ΈμΆœν•˜λŠ” κ³Όμ •μ—μ„œ μ‹€νŒ¨κ°€ 일어날 μˆ˜λ„ 있으며, 속도도 느릴 것이닀.

μ΄λŸ¬ν•œ 문제λ₯Ό PSA λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€.

λ¦¬νŒ©ν† λ§

ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μš΄ λΆ€λΆ„(GitHub github = GitHub.connect())을 μΆ”μƒν™”ν•˜λŠ” 것이닀.

interface GitHubService {
  GitHub connect();
}
public class DefaultGitHubService implements GitHubService {
  @Override
  public GitHub connect() {
    return GitHub.connect();
  }
}
public class RepositoryRank {

  private final GitHubService gitHubService;
  
  public RepositoryRank(final GitHubService gitHubService) {
    this.gitHubService = gitHubService;
  }

  public int getPoint(String repositoryName) throws IOException {
    GitHub github = gitHubService.connect();
    GHRepository repository = github.getRepository(repositoryName);
    
    // μƒλž΅
  }
}

PSA λ₯Ό μ μš©ν•˜μ—¬ λ¦¬νŒ©ν† λ§ ν•˜μ˜€λ”λ‹ˆ ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μš΄ μ½”λ“œκ°€ λ˜μ—ˆλ‹€.

References