"스프링 제대로 공부했는지 5분안에 확인하는 방법"이라는 영상을 보고 공부를 제대로 안 해서 이 글을 남긴다...
다들 한 번 보길 권장한다
랑크: https://www.youtube.com/watch?v=bJfbPWEMj_c
일단 PSA이라는 용어가 나오는데 PSA는 POJO의 3대 요소로 IoC/DI, AOP, PSA가 있다.
Plain Old Java Object의 약자로 말 그대로 오래된 방식의 자바 오브젝트 즉, 순수자바라고 보시면 됩니다. Java EE 등의 무서운 프레임워크를 사용하게 되면서 이걸 반발해서 사용하게 된 용어이다.
특정한 기술과 환경에 종속되지 않는 오브젝트이기떄문에 깔끔한 코드가 된다. 자동화된 테스트에 유리하며 객체지향적인 설계를 자유롭게 적용가능하다.
그래서 오늘은 PSA에 대해서 알아 볼려고 한다.
spring Framework, Hibernate는 POJO를 이용한 엔터프라이즈 애플리케이션 개발을 목적으로 하는 프레임워크이다.
잘 만들어진 인터페이스 즉, 이식가능한 서비스 추상화이다.
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);
}
-> 문제점이 있다
Github gitHub = GitHub.connect();
이미 내장된 라이브러리라서 테스트하기가 쉽지 않다.
예를 들면 테스트할 떄마다 깃허브 API를 쓰게 할것인가?
-> 많은 제약과 단점이 존재! (깃허브 제약, 속도 등등)
앞써 말한 PSA를 사용하여 추상화를 얻는다!
interface GitHubService {
GitHub connect() throws IOException;
}
class DefaultGitHubService implements GitHubService {
@Override
public GitHub connect() throws IOException {
return GitHub.connect();
}
private GitHubService gitHubService;
public RepositoryRank(GitHubService gitHubService) {
this.gitHubService = gitHubService;
}
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를 사용하고 있었다...