나의 첫 컨퍼런스를 인프런과 함께!
9월 9일, 인프런과 VMware Tanzu가 협업하여 진행한 특별한 밋업에 참석했던 후기입니다!
https://www.inflearn.com/course/offline/josh-long-meetup
Intro
이번 밋업은 스프링 프레임워크 관련 기술과 커뮤니티 활동을 주도하는 세계적인 프로그래밍 전문가 조쉬 롱(Josh Long)을 초청해 'Bootiful Spring Boot: A DOGumentary'를 주제로 진행되었고, Spring 백엔드 개발자로써 되게 유익한 시간이 아닐까 싶어서 참가신청을 했었습니다.
그 결과!!
짜잔!! 참가자로 선정되었고 대구에서 먼 길이지만 설레는 마음으로 판교로 향하게 되었습니다.
세션 정리
이번 세션은 번역 파트너 Flitto와 함께하여 발표는 영어로 진행했지만, 플리토를 통한 실시간 통번역으로 별 무리 없이 들을 수 있었습니다!
전체적으로 제가 이해한 부분을 정리해보자면 다음과 같습니다.
1. Lombok 대신 Java 14부터 지원되는 record 불변 객체를 활용하자.
2. Sealed Class를 적극 활용하여 Super Class의 Sub Class를 인지할 수 있도록 하자.
3. Event-Driven
4. Spring Modulith을 통해 모듈 간 통신을 이벤트 기반으로.
5. SpringAI를 통한 OpenAI 통합
6. Java21 Virtual Thread의 강력함
이정도가 내 기억 속에 남은 잔재인 것 같네요...
Lombok은 이제 그만! record를 써보도록 해보자
조금 주관을 꺼내자면 저는 개발할 때 Project Lombok 라이브러리를 되게 좋아하고, 자주 사용했습니다. 하지만 이번 세션을 시작함과 동시에 record의 강력함을 어필하더라구요... 사실 record의 존재는 알고있었지만 때때로 setter를 추가하는게 개발함에 있어서 유연함을 주는 경우가 많아서 Lombok만을 사용하고 있었는데요.(언제 setter가 필요하게 될지 몰라!..) DTO란 데이터 전송 객체라는 뜻 그대로 전송만을 위한 객체여야 하기 때문에 record를 적극 활용하는게 맞는 것 같다라는 생각을 또 하게 되었습니다.
record타입에 대해 간단히 정리하자면 다음과 같습니다.
Java의 레코드는 명목형으로 사용되는 새로운 종류의 클래스로, 불변 데이터에 대한 투명한 캐리어입니다.
또한 다음에 대한 구현을 자동으로 해주는데요.
- - 간결한 표준 생성자
- - 모든 필드에 대한 접근자 메서드
- - equals() 및 hashCode()
- - toString()
record의 장점으로는 다음과 같습니다.
- - 보일러플레이트 코드 감소
- - 불변성
- - 향상된 가독성
Sealed Class라는게 있었어?
다음으로 Sealed Class 이야기가 나왔는데, "네. 저는 처음 본 클래스 타입이였습니다."
컨퍼런스가 끝난 후 조금 찾아보니 Sealed Class는 Java15에서 도입된 기능으로, 클래스의 상속을 제한할 수 있는 새로운 방식이더라구요. 상속 계층을 명확히 정의하고, 허용된 클래스들만 상속할 수 있도록 강제하는 역할을 수행해서 클래스 계층 구조를 조금 더 안전하게 관리할 수 있는 장점이 있었어요. Service 계층의 경우 상속 계층을 자주 정의하는데 Sealed Class를 한번 적용시켜 개발해보고 조금 더 체감을 해봐야겠다는 생각이 드는 기능이였어요!
Event-Driven 개발은 또 뭐지?
다음은 Spring Modulith 기반 Event-Driven입니다. 이때 제가 집중을 잘 못해서 강연을 제대로 집중을 못해서 추가로 찾아봤어요 ㅠㅠ...
스프링 애플리케이션에서 모듈화를 쉽게 관리하고, 아키텍처적으로 더 나은 경계를 설정하기 위해 소개된 새로운 모듈이라고 해요.
강연에서는 Spring MVC 구조의 하나의 Controller가 여러 부가적인 기능을 함께 하고 있을 때를 예시로 보여주었습니다. 이를 리팩토링하는 과정에서 Event기능을 설명해주었고, 이벤트를 발생시키고(publish) 이벤트를 수신하는(subscribe)하는 로직을 분리해서 작성하는 과정을 알 수 있었습니다.
이와 관련해서 이번 해커톤 개발과정에 접목하여, 채팅 내용을 분석함과 동시에 DB I/O를 Event 기능을 활용해서 처리해보았는데요. 전체적인 가독성이 향상됨과 동시에 핵심 로직을 간결하게 유지할 수 있었습니다.
Spring AI를 통해 생성형 AI를 애플리케이션에 적용해보자!
최근 생성형 AI를 서비스에 접목시키는 경우가 많은데요. Spring에서는 이러한 생성형 AI의 접목을 유연하게 도와주기 위해 추상화를 통한 요청을 쉽게 전송시킬 수 있도록 도와주고 있다고합니다!
추가로 현재 개발이 계속되고 있는 모듈이라고 합니다.
Spring AI 이전에는 RestTemplate 및 WebClient 등을 통해 http 요청을 직접적으로 다루어주어야했지만, SpringAI를 활용하면 ChatClient, ChatResponse, Generation 등을 통해 쉽게 Open AI와 같은 생성형 AI를 서비스에 접목할 수 있을 것 같았습니다.
Java21의 주역인 Virtual Thread
마지막으로 역시나 나올 수 밖에 없는 Java21의 강력한 기능인 Virtural Thread 이야기가 나왔습니다.
이번 컨퍼런스를 준비하면서 미리 공부했던 내용이기도 한데요.
공부하면서 이건 꼭 질문해야지!라고 생각했던 것이 Reactive Programming을 위한 WebFlux와의 차이점이였습니다. (나 대신 누군가 대신 이 질문을 해줘서 엄청 고마웠던....)
답변의 내용으로는 둘은 비교할 수 있는게 아니며, 둘을 적절하게 혼용해서 사용하는 것이 좋다. 또한 비동기 프로그래밍을 처음부터 작성해야 할 경우라면 Java21의 Virtual Thread를 사용하는게 맞다. 느낌의 답변이였던 것 같아요.
제 개인적으로는 가상 쓰레드는 기존의 동기적 코드를 변경없이 비동기 처리를 구현할 수 있어 코드의 유지 및 복잡함이 훨씬 덜어졌는데요. 이는 WebFlux와 비교하여 큰 장점으로 부각될 수 있을 것 같다고 생각되요.
또 다른 내용으로는 톰캣의 경우 쓰레드 풀이 기본적으로 200개로 설정되있기도하지만, 플랫폼 OS의 쓰레드를 활용하기에 더욱 많은 요청을 처리하기 위한 쓰레드 풀 확장이 어려웠습니다. 이러한 부분을 가상 쓰레드의 도입으로 수천, 수백만 개의 쓰레드 확장이 가능해졌습니다.
그 이유로는 플랫폼 os가 아닌 Java 런타임이 관리하며, 하나의 os 쓰레드에 다수의 가상 쓰레드를 매핑하는 방식이기 때문입니다.
또 다른 점으로 컨텍스트 전환도 Java 런타임 내부에서 처리하면서, 굉장히 적은 비용으로 컨텍스트 전환이 가능하다는 점이 장점으로 볼 수 있을 것 같아요!
후기
제 인생 첫 컨퍼런스를 인프런과 함께할 수 있어 좋았고, Java 개발자를 지망하는 사람으로서 되게 유익한 시간이였습니다!
Java의 새로운 버전들이 기존 버전들의 문제점을 어떻게 해결하는지, 기술적 향상을 위한 어떤 고민들을 통해 만들어지는지 간접적으로 알 수 있었고, 연사를 통해 Spring에는 다양한 모듈이 존재하고 있고 이를 활용함으로써 얼마나 쉽고 간단히 구현이 가능한지를 알 수 있었습니다.
이에 대한 느낀점으로 평소 개발하면서 이전 프로젝트의 소스코드를 자주 재활용했던것 같은데, 다음 기회에는 새로운 기능들을 유의깊게 보며, 적용할 수 있는 부분들을 찾아가면서 개발을 해야할 것 같다 생각했습니다.
여담
세미나 및 컨퍼런스에서 받는 스티커는 늘 새로워!! ("이거 한정판이래요.... 속닥속닥)
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!