Java개발자로 전향한지 4년차가 되었습니다. 문득 저에 대해서 돌아보는 시간을 강제로 갖게되었고 난 개발자로써 살아가고 있는가에 대해서 궁금해졌습니다.
모든 소스는 github에 올려두었습니다.
나에게 질문을 해보았습니다.
기초는 튼튼한가?
자바에 대해서 얼만큼 알고 있지? 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 입니다!
'Study > spring' 카테고리의 다른 글
@Autowired vs @Inject vs @Resource (4) | 2021.02.18 |
---|---|
[Hateoas] Rest API를 구현해보자 (0) | 2020.12.17 |
Rest API란? (0) | 2020.12.16 |
Spring Triangle [IoC, AOP, PSA] - 2탄 AOP편 (0) | 2020.12.14 |
Spring Triangle [IoC, AOP, PSA] - 1편 IOC편 (0) | 2020.12.13 |