(내일배움캠프) TIL(22) - 10주차: 테스트하기 용이한 코드로 만들기

Thomas·2023년 7월 28일
0
post-thumbnail

"스프링 제대로 공부했는지 5분안에 확인하는 방법"이라는 영상을 보고 공부를 제대로 안 해서 이 글을 남긴다...
다들 한 번 보길 권장한다
랑크: https://www.youtube.com/watch?v=bJfbPWEMj_c

일단 PSA이라는 용어가 나오는데 PSA는 POJO의 3대 요소로 IoC/DI, AOP, PSA가 있다.

POJO

Plain Old Java Object의 약자로 말 그대로 오래된 방식의 자바 오브젝트 즉, 순수자바라고 보시면 됩니다. Java EE 등의 무서운 프레임워크를 사용하게 되면서 이걸 반발해서 사용하게 된 용어이다.

POJO의 장점

특정한 기술과 환경에 종속되지 않는 오브젝트이기떄문에 깔끔한 코드가 된다. 자동화된 테스트에 유리하며 객체지향적인 설계를 자유롭게 적용가능하다.

그래서 오늘은 PSA에 대해서 알아 볼려고 한다.

POJO Framework

spring Framework, Hibernate는 POJO를 이용한 엔터프라이즈 애플리케이션 개발을 목적으로 하는 프레임워크이다.

PSA이란?

잘 만들어진 인터페이스 즉, 이식가능한 서비스 추상화이다.

PSA를 사용하면 확장성이 좋아지고 테스트하기 편해진다.
-> Spring은 Spring Web MVC, Spring Transaction, Spring Cache등의 다영한 PSA를 제공한다.

자세한건 참고 블로그를 보길 추천한다
-> https://dev-coco.tistory.com/83
-> https://dlgkstjq623.tistory.com/239

예를 들어 Spring은 서블릿을 사용하는 프로그램인데 서블릿을 사용하지 않고있다. 그대신 @GetMapping을 통해 특정 url로 요청이 들어왔을 떄, 해당 블록이 요청을 처리하도록 구현 되어 있다. 이렇게 추상화 계층을 사용해 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공하는 것을 Service Abstraction에 해당된다.
참고 블로그: https://zion830.tistory.com/109

예제 코드:

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()) {
          point += 1;
      }

      if(repository.getReadme() != null) {
          point += 1;
      }

      if(repository.getPulllRequests(GHIssueState.CLOSED).size > 0) {
          point += 1;
      }

      points += repository.getStargazersCount();
      points += repository.getForkCount();

      return points;
  	}
    
    public static void main(String[] args) throws IOException {
    RepositoryRank spring = new RepositoryRank();
    int point = spring.getPoint(repositoryName:"spring-advence");
  	System.out.println(point);
  }

Mockito없이 테스트를 돌릴수 있을까?

-> 문제점이 있다

      Github gitHub = GitHub.connect();

이미 내장된 라이브러리라서 테스트하기가 쉽지 않다.

예를 들면 테스트할 떄마다 깃허브 API를 쓰게 할것인가?
-> 많은 제약과 단점이 존재! (깃허브 제약, 속도 등등)

어떻게 테스트하기 좋게 만들까?

앞써 말한 PSA를 사용하여 추상화를 얻는다!

  1. 인터페이스를 따로 정의한다
interface GitHubService {
	GitHub connect() throws IOException;
}
  1. 클래스를 하나 만들고 인터페이스를 구현해준다
class DefaultGitHubService implements GitHubService {

	@Override
    public GitHub connect() throws IOException {
    	return GitHub.connect();
    }
  1. RepositoryRank 클래스에 해당 서비스를 주입해준다
private GitHubService gitHubService;

public RepositoryRank(GitHubService gitHubService) {
	this.gitHubService = gitHubService;
}
  1. 주입많은 서비스로 연결해준다
      Github gitHub = gitHubService.connect();

수정된 코드

Public class RepositoryRank {

  Public int getPoint(String repositoryName) throws IOException {
      Github gitHub = gitHubService.connect();
      GHRepository repository = gitHub.getRepository(repositoryName);

      int points = 0;
      if(repository.hasIssues()) {
          point += 1;
      }

      if(repository.getReadme() != null) {
          point += 1;
      }

      if(repository.getPulllRequests(GHIssueState.CLOSED).size > 0) {
          point += 1;
      }

      points += repository.getStargazersCount();
      points += repository.getForkCount();

      return points;
  	}
    
    public static void main(String[] args) throws IOException {
    RepositoryRank spring = new RepositoryRank();
    int point = spring.getPoint(repositoryName:"spring-advence");
  	System.out.println(point);
  }

결론은 이미 교육에서 MVC 패턴으로 PSA를 사용하고 있었다...

profile
Backend Programmer

0개의 댓글