나에게 질문을 해보았습니다.
기초는 튼튼한가?
자바에 대해서 얼만큼 알고 있지? 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 |