2024 스프링 캠프 갔다온 후기

개발하는 구황작물·2024년 5월 26일
0
post-custom-banner

🚨 각종 TMI 남발 주의

후기 요약

  1. 생각했던 것보다 훨씬 알찬 내용이었다.(특히 자바 가상 스레드 vs 코루틴)
  2. 기회가 될 때마다 개발자 컨퍼런스를 가야겠다고 생각을 하게 되었다. 개발 지식도 중요하나 스프링 캠프 이후 다른 개발자 분들과 소통한 시간이 앞으로의 방향에 도움이 된 것 같다.
  3. 책도 받았다

티켓팅

스프링 캠프 티켓 오픈한다길래 락덕후 5년 경력을 살려 티켓팅을 한 결과 티켓을 구매할 수 있었다.(1분만에 매진되었다고 한다 ㄷㄷ...)

참고로 3개월 후 강의가 유튜브에 공개된다고 하니 스프링 캠프 참여하고 싶었으나 못하신 분들은 3개월만 기다리면 되겠다.

스프링 캠프 입장

스프링 캠프는 SETEC에서 열렸는데 같은 날에 사케 페스티벌도 열렸다.

그러다보니 스프링캠프로 가는 사람들과 사케 페스티벌로 가는 사람들로 길이 나눠졌는데 옷 이쁘게 입은 사람들은 사케 페스티벌로 가는 반면 무채색 티셔츠 입은 사람들은 다 스프링 캠프로 이동하는 모습을 볼 수 있었다ㅋㅋㅋㅋㅋ

아무튼 입장 팔찌, 기념품(손풍기, 키캡), 스프링 캠프 스티커를 받고 입장하였다.

세션 내용 정리

강의를 들으면서 md파일에 키워드 위주로 정리하였다. 그 중 기억 남는 내용을 적어보겠다.

동시성의 미래 - 코루틴과 버츄얼 스레드

전통적인 웹 동작 방식

1개의 요청당 1개의 스레드를 사용하는 Thread Per Request 모델

요청을 처리할 때까지 해당 스레드는 블로킹 된다.

Spring MVC 패턴을 예시로 들 수 있다.

플랫폼 스레드 문제점
커널 스레드를 사용하므로 무한정 스레드 생성이 불가능하다. 또한 컨텍스트 스위칭이 발생한다.

Thread Per Request 모델의 문제점을 해결하기 위해 스레드 풀을 통해 미리 스레드를 만들어 놓은 후 가져다 쓰는 방식으로 사용했으나 이러한 방식도 결국 스레드 풀에 생성된 스레드 개수만큼만 자원이 한정되었다.

비동기-논블로킹 방식은 그래도 자원문제를 해결할 수 있었으나 가독성(콜백 헬)과 유지보수성이 감소하는 문제가 있었다.

리엑티브 프로그래밍

비동기-논블로킹 방식으로 기존 방식의 콜백 헬 문제를 해결할 수 있다. (ex: ProjectReactor, RxJava, Webflux)

실시간 데이터 처리에 용이하고 높은 트래픽을 감당할 수 있게 되었으나 닝커브가 너무 높다는 단점이 있다.

코틀린 코루틴

비동기 프로그래밍을 손쉽게 사용 가능한 확장형 라이브러리이다.

비동기-논블로킹 방식임에도 전통적인 방식처럼 코드 작성이 가능하다.

전통적인 플랫폼 스레드 위에 여러 코루틴(경랑 스레드)이 띄워져 있는 방식으로 스레드 블로킹을 막을 수 있다.

가상 스레드

JDK21에서 나온 기술로 다수의 경량 스레드가 소수의 캐리어 스레드와 매핑되는 방식으로 동작한다.

가상 스레드의 이점은 기존의 코드에서 가상 스레드 설정만 해주면(스프링 3.2이전에는 빈 설정, 3.2이상에서는 yml에서 설정) 기존의 코드 그대로 사용해도 된다.(기존의 Thread.sleep()을 사용해도 스레드가 블로킹되지 않는다)

성능 테스트 결과

백엔드에서 플랫폼 스레드, 코루틴 + 블로킹, 가상 스레드, spring webflux + 코루틴 4가지 방식으로 각각 성능 테스트를 해본 결과

  • 플랫폼 스레드 : 지연 발생(8초), 성공률 스레드 수에 비례

  • 코루틴 + 블로킹 : 지연 발생(8초), 성공률 스레드 수에 비례, 코루틴 + 블로킹은 성능에 전혀 도움이 되지 못함

  • 가상 스레드 : 지연 발생 없음, 성공률 100퍼

  • spring webflux + 코루틴 : 지연 발생 없음, 성공률 100퍼

코루틴 + 가상 스레드 통합

코루틴과 버츄얼 스레드를 같이 사용할 수 있다.

이러한 경우 코루틴이 가상 스레드 위에서 동작한다.

이를 통해 블로킹이 필요한 경우에는 가상스레드를 활용하고 가상 스레드에서 지원하지 않는 기능은 코루틴의 고급 라이브러리 기능을 활용하여 구현할 수 있었다고 한다.

LLM에도 봄이 찾아오다

생성형 AI에 대한 설명과 스프링 AI의 동작 원리에 대한 내용이었다.

AI에 대해 사전 지식이 없어 많은 내용을 이해하지 못했으나 요약을 하자면

  • 기존의 AI(다양한 형태의 인풋 -> 텍스트 형태의 아웃풋)와 달리 생성형 AI는 텍스트 인풋으로 이미지, 오디오 등 다양한 형태의 아웃풋을 얻을 수 있다.

  • 생성형 AI의 성능은 파라미터 개수와 비례한다고 한다.

  • 스프링에서도 LLM을 활용할 수 있다고 한다. 여러 AI 모델의 Provider를 통합하였고, 주요 벡터 DB또한 활용할 수 있다고 한다. 무엇보다도 Spring 답게 POJO를 지원해주어 편리하게 개발할 수 있다고 한다. (다만 아직 실무에 쓰기에는 아직 이르다고 한다.)

  • Spring AI 구성 요소 플로우는 아래와 같이 진행된다.

    	1. 채팅옵션 초기값으로 client 생성
    	2. 텍스트 오디오 비디오 등 처리에 필요한 데이터를 포함한 지시사항이 생성
    	3. 실행 시점에 사용할 수 있는 채팅 옵션 제공
    	4. 지시사항이 AI 모텔이 이해할 수 있는 네이티브 요청으로 변환
    	5. 클라이언트가 런타임 채팅 옵션으로 오버라이드
    	6. 네이티브 요청이 API 호출을 통해 AI 모델로 전달
    	7. AI 모델이 요청 처리

왜 나는 테스트를 작성하기 싫은가

네이버 개발자분이 네이버 페이 개발을 하는동안 테스트를 작성하면서 겪은 여러 애로사항과 이를 해결하는 과정, Fixture monkey 오픈소스에 대한 내용이었다.

테스트 작성은 미래의 유지보수 비용을 줄여주고 사전에 오류를 잡아줄 수 있는 이득이 있으나 테스트 작성으로 인해 발생하는 비용(테스트 유지보수 비용) 또한 고려를 해야 한다는 내용이었다.

실전 MSA 개발 가이드

이 강의는 MSA를 적용하면서 발생하는 트랜잭션, DB 분리 문제를 주로 다루었다.

DB 분리

MSA를 위해 DB를 분리하면 다른 도메인의 데이터를 가져다 써야 할 때 조회속도가 느려질 수 있다.

이를 해결할 방법으로

  1. DB 복제 : 다른 DB에서 필요한 속성만 따로 복제하여 저장
  2. 모델링 변경 : 공통 속성은 각 서비스의 DB에 저장해놓고 오너십을 가진 서비스로 데이터 이전
  3. API로 전송 : 일괄 전송 방식으로 데이터를 전달하는 방식이 가장 낫고 병렬조회는 오히려 서버 부하를 늘릴 수 있어 비추한다고 한다.
  4. 로컬 캐시 : 로컬 캐시를 활용하여 조회속도 향상

트랜잭션

MSA로 인해 트랜잭션의 원자성, 독립성 원칙에 문제가 생길 수 있다.

  1. 원자성 보안

A에서 작업 후, B에서 작업할 때 오류가 발생하여 롤백이 된다면 A에서도 똑같이 롤백을 해야 한다.

그러나 만약 B에서 A로 요청을 할 때 오류가 나서 롤백 요청을 전달하지 못한다면 A와 B의 정보가 일치하지 않게 되는 문제가 발생한다.

이는 이벤트를 활용하여 재시도를 하는 방식으로 해결할 수 있다.

혹은 트랜잭션을 굳이 같이 묶지 않아도 되는 경우(실패해도 되는 기능이라면) 트랜잭션을 분리해도 된다.

  1. 일관성 보장

MSA의 경우 서비스 간 트랜잭션이 Read Uncommited 수준으로 떨어진다.

A서비스와 B서비스에서 연계를 진행하는 동안 트랜잭션이 완료되지 않은 상태에서 사용자가 서비스를 조회하면 Dirty Read가 발생할 수 있다.

이를 해결하려면 Application 레벨에서 lock를 걸어야 한다.

구해줘 홈즈: 은행에서 3천만 트래픽의 홈 서비스 새로 만들기

이 강의에서는 카카오뱅크에서 서비스를 분리하는 여정을 설명하였다.

의존관계가 복잡하게 꼬인 문제를 해결하기 위해 헥사고날 아키텍처를 도입하고, 성능적 문제를 해결하기 위해 코루틴을 활용하여 동시성을 적용하는 등 서비스를 분리하면서 마주친 문제와 이를 해결하기 위해 고민한 흔적들을 공유하였다.

서비스 이관을 위해 기존의 서버와 새로운 서버의 응답을 표본 비교를 해보고, A/B 테스트를 통해 기존 서비스에서 새로운 서비스로 트래픽을 조절하는 방식을 활용했다고 한다.


스프링 캠프를 다녀오고

스프링 캠프 강의 전반적으로 퀄리티가 좋아 얻어간 지식과 시야를 넓힐 수 있는 기회가 된것 같다.

가장 인상깊었던 강의는 자바 가상 스레드와 코루틴 강의였는데 가상 스레드와 코루틴에 대한 설명과 이를 동시에 적용하여 서로 부족한 부분을 보완했다는 점이 인상 깊었다. (빠른 시일 내에 코틀린 공부를 해봐야겠다.)

스프링 캠프 이후 스프링 캠프 참여한 다른 분들과 저녁식사를 하면서 강의를 들으면서 느낀점이나 감상들을 공유할 수 있었고, 이후 카페에 가서 코드리뷰도 받아 볼 수 있었다.

개발자 컨퍼런스의 참여를 하면 좋은 점은 지식 뿐만이 아니라 다양한 사람들을 만날 수 있는 기회도 된다는 것을 이번 기회로 알게 되었다.


+) 여담으로 유쾌한 스프링(유스방) 오픈채팅방에서 스프링 캠프를 진행하는 SETEC 건물 내에 곳곳에 붙어있는 불꽃 그림 종이를 찾으면 인텔리제이 IntelliJ IDEA 자바 프로그래밍 필수 도구 책을 준다해서 커피 브레이크 시간에 건물 내를 둘러봤는데 종이를 찾을 수 있었다.

덕분에 책도 받고 저자 분도 뵐 수 있었다. (책 감사합니다)

profile
어쩌다보니 개발하게 된 구황작물
post-custom-banner

0개의 댓글