본문 바로가기

Framework/spring

Study/springSpring Triangle [IoC, AOP, PSA] - 3탄 PSA편

반응형

나에게 질문을 해보았습니다.

기초는 튼튼한가? 
자바에 대해서 얼만큼 알고 있지? Spring은?

블로그를 시작한지 한달이 조금 넘어가는 시점에서 다시 개념을 정리하고 복습하는 의미에서 되돌아가기로 하였습니다.

 

이번 글에서는 Spring Triangle 중 하나인 PSA에 대해서 정리해보겠습니다.

 

PSA란?

Portable Service Abstraction

그대로 번역하자면 호환성있는 서비스 추상화이다. 무슨 의미야 한국말인데 무슨말이야? 

조금 더 이해하기 쉽게 설명하자면 잘 만든 인터페이스이다. ( 백기선님의 강의 참조 )

인터페이스란?
머릿속으로는 아는데 설명하긴 어려운 단어라고 생각합니다.
인터페이스는 메서드는 작성할 수 있지만 로직은 구현할 수 없습니다.
인터페이스로 N개의 클래스를 그룹화할 수 있고 인터페이스에서 implements 한 클래스는 반드시 인터페이스에서 구현된 메서드를 Override하여 로직을 작성해야합니다.

우리는 이렇게 잘 만들어진 인터페이스 덕분에 우리의 소스를 변경하지 않고 내부적으로 동작하는 로직을 변경할 수 있습니다. 다양한 예를 들어보겠습니다.

 

Tomcat, Netty

간단한 의존성만 변경하면 tomcat이 실행될 수 있고 Netty가 실행될 수 있습니다.

소스를 보시면 이해하는데 도움이 될 것입니다.

 

Tomcat

build,gradle 입니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

spring-boot-starter-web 을 주입하면 tomcat으로 실행되는 것을 확인할 수 있습니다. ( 아래 로그 참조 )

2020-12-11 22:01:06.142  INFO 3861 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8084 (http) with context path ''
2020-12-11 22:01:06.143  INFO 3861 --- [           main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories…
2020-12-11 22:01:06.143  INFO 3861 --- [           main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-12-11 22:01:06.153  INFO 3861 --- [           main] c.example.practice.PracticeApplication   : Started PracticeApplication in 4.236 seconds (JVM running for 6.118)

 

Netty

build.gradle 입니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
}

 

spring-boot-starter-webflux 를 주입하면 Netty로 실행되는 것을 확인할 수 있습니다 ( 아래 로그 참조 )

2020-12-11 22:05:35.947  INFO 4370 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8084
2020-12-11 22:05:35.949  INFO 4370 --- [           main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories…
2020-12-11 22:05:35.950  INFO 4370 --- [           main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-12-11 22:05:35.959  INFO 4370 --- [           main] c.example.practice.PracticeApplication   : Started PracticeApplication in 2.862 seconds (JVM running for 3.769)

 

이렇게 간단하게 의존성만 변경하여 사용할 수 있습니다. 

이와 비슷한 예시로 Spring Transaction, Spring Cache 등이 있습니다. 

 

우리는 직접 Low Level의 코드를 제어하지 않고 손쉽게 변경할 수 있습니다. 실제 디비에 connection하고 트랜잭션 관리하는 작업은 Spring에게 맡기고 개발자는 로직에만 집중할 수 있습니다. 

 

이것이 바로 PSA입니다.

 

결론

PSA 너무 어렵게 생각하면 끝도 없이 어렵습니다. 간단하게 Spring이 인터페이스로 의존성을 주입받아서 Low Level 코드를 알아서 시켜준다! 그래서 우리는 로직에만 집중할 수 있게 도와주는 것이 PSA 입니다! 

반응형

'Framework > spring' 카테고리의 다른 글

@Autowired vs @Inject vs @Resource  (0) 2022.01.11
Study/spring[Hateoas] Rest API를 구현해보자  (0) 2022.01.11
Rest API란?  (0) 2022.01.11
Spring Triangle [IoC, AOP, PSA] - 1편 IOC편  (0) 2022.01.11