😥 갑자기 궁금해진 오픈소스 생태계

매일 퇴근 후 스터디나 개인 작업을 진행하기 위해 여느때와 같이 책상에 앉았는데 이상하게 오픈소스는 누가 만드는 걸까? 라는 궁금증이 생겼습니다.

Redis, Kafka, Spring Framework와 같이 우리가 애용하는 오픈소스들은 누가 만들고 있고 아무런 대가 없이 힘들게 만든 소스를 공유하는 것일까?

이 한 마디의 질문에서 제 오픈소스 활동이 시작되었습니다.

😎 용기가 필요해!!

리눅스를 만드신 리누스 토르발즈 형님.. 파이썬의 창시자 귀도 반 로섬 형님과 같은 분들만 오픈소스 하신다는 마음이 있었습니다.

신입 개발자인 내가 감히.. 해외 고수님들의 소스개선하자고 제안을 해..?

이런 마음때문에 처음에는 너무 조심스러웠고, 어디서부터 문제를 찾아가야 할지 몰랐습니다. 또 어떻게 접근해야 할지 어려웠어요.

그러던 중 검색을 하다가 망나니개발자님의 Spring Boot 기여하기 포스팅을 보면서 큰 영감을 얻게 되었습니다.

그렇게 용기를 얻고, Spring Boot 프로젝트를 fork해서 무작성 소스들을 읽어 나가기 시작했습니다.

🤔 첫 번째 기여 - Spring Boot

Spring Boot의 소스를 받아서 하나 하나 보다보니 너무 방대하고 어려웠습니다.
그렇게 설정 클래스들을 먼저 분석해보자는 마음에서 소스를 보고 있는데..

어딘가 아쉬운 코드가 발견되었죠.

마음속에는 이미 심봤다! 라는 소리가 맴돌고 있었죠

제가 찾은 코드는 RSocketPortInfoApplicationContextInitializer 클래스입니다.
이름은 엄청 길어서 난해해 보이지만, Rsocket 관련 설정 클래스였습니다.

private static class Listener implements ApplicationListener<RSocketServerInitializedEvent> {

	private static final String PROPERTY_NAME = "local.rsocket.server.port";

	private final ConfigurableApplicationContext applicationContext;

	Listener(ConfigurableApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}

... 중략

private void setPortProperty(ConfigurableEnvironment environment, int port) {
	MutablePropertySources sources = environment.getPropertySources();
	PropertySource<?> source = sources.get("server.ports");

	if (source == null) {
		source = new MapPropertySource("server.ports", new HashMap<>());
		sources.addFirst(source);
	}
	setPortProperty(port, source);
}

제가 생각한 아쉬운 점은, PROPERTY_NAME은 코드에서 접근하는 위치가 한 번 인데, "server.ports"는 두 군데서 접근하고 있다는 점입니다.

"server.ports"가 다른 값으로 변경된다면 코드의 변경점이 두 군데가 될 수 있으므로, 코드를 수정해서 PR을 올렸습니다.

private static final String SERVER_PORTS = "server.ports";

private void setPortProperty(ConfigurableEnvironment environment, int port) {
	MutablePropertySources sources = environment.getPropertySources();
	PropertySource<?> source = sources.get(SERVER_PORTS);
    
	if (source == null) {
		source = new MapPropertySource(SERVER_PORTS, new HashMap<>());
		sources.addFirst(source);
	}
	setPortProperty(port, source);
}

"server.ports"로 하드코딩 되어있는 문자열상수로 뽑아낸 것이 고작이라, 이걸 가지고 기여라고 할 수 있을까? 라는 고민이 있었죠.

영어가 서툰 저는 번역기로 제 생각을 외국 고수 형님들께 전달했고..

제가 고친 코드를 보신 형님들의 반응은...


이 야ㅏㅏㅏㅏㅏㅏ! 이렇게 Spring Boot의 컨트리뷰터가 되었습니다.

회사 동기PR 결과를 기다릴때까지 나눴던 대화들과 기대 그 설렘은 아직도 잊을 수가 없습니다.

수 많은 개발자분들이 사용하는 거대 오픈소스에 조금이라도 영향을 끼쳤다는 사실에 가슴이 웅장해졌습니다.


Spring Boot 3.2.0-RC2 버전의 컨트리뷰터로 당당히 이름을 올리게 되었습니다.

이때의 기분은 말로 표현하기 어려웠습니다.

😓 초심자의 행운인가..? 여러 번의 거절

오픈소스 PR이 Spring Boot 였고, 처음부터 성공을 해서 다음 기여도 잘 될거라는 생각을 했지만, 형님들의 차가운 거절을 맞이하게 되었습니다.

Spring Framework에서 두 번의 거절과 Spring-Data-JPA에서 한 번의 거절을 당하게 되었습니다.

거절된 사례는 아래와 같습니다.

  • Switch-Case문을 최신 버전의 문법으로 변경하자

    • 충돌을 감수하면서까지 변경할만큼 급하지 않다는 Maintainer의 의견
  • ObjectInputStream을 Try-with-Resources 문을 써서 자원해제를 안전하게 하자

    • Java Doc에 스트림을 수동으로 닫지 말고 호출자에게 맡기라는 내용이 있어서 이 내용을 첨부해주신 Maintainer
  • 상수 인터페이스를 상수 전용 클래스로 변경하자

    • 상수 인터페이스가 package-private 상태이기 때문에 다른 곳에서 접근이 불가능해서 변경할 필요가 없다는 Maintainer의 의견

비록 거절 당했지만, 거대 오픈소스를 관리하고 발전시키는 Maintainer 형님들의 철학과 가치에 대해서 배워가고 있었습니다.

😤 두 번째 기여 - Spring Kafka

Spring ProjectPR에 여러가지 라벨을 붙여 현재 상태를 알 수 있는데, 그 중 저는 두 가지 라벨에 대해 설명드리겠습니다.

  • task : 단순 작업
  • enhancement: 개선 작업

오픈 소스에 기여하더라도, 내용에 따라 라벨이 달라질 수 있습니다.
제가 첫 기여를 한 Spring Boot 프로젝트에서는 task 라벨을 받았 습니다.

이번에는 Spring-Kafka 프로젝트에서 두 가지 개선점을 제시했습니다.

  • 신뢰할 수 있는 패키지 문자열을 관리하는 List가 외부 접근이 불가능하고, 수정이 불필요하기 때문에 불변 리스트를 사용하도록 개선
  • List.size() == 0 코드를 List.isEmpty()로 수정하여 개선

이렇게 해외 고수 개발자 형님께서 굽어 살피시어.. enhancement(개선) 라벨을 받게되고 Spring-Kafka컨트리뷰터가 되었습니다.

이 모든 기여는 2주 동안 시도한 내용입니다.

해외 고수 개발자 형님의 격려와 응원덕에 오픈 소스 문화가 정말 아름답다는 생각을 가지게 되었습니다.

🥺 누군가 오픈소스 기여에 대한 생각을 묻는다면?

저는 무조건 지금부터 시작하라고 권유하고 싶습니다.
처음에는 훌륭한 개발자, 실력 좋은 개발자만이 기여할 수 있다고 생각해왔습니다.

내가 사용하는 오픈소스에 대한 애정과 사랑이 있다면, 얼마든지 의견을 내고 자유롭게 기여해보면 Maintainer 분들의 의견도 듣고 더 성장할 수 있는 것 같습니다.

오늘도 읽어주셔서 감사합니다.

🙇🏻‍♂️

참고한 레퍼런스

15개의 댓글

comment-user-thumbnail
2024년 1월 26일

오호,,, 그럼 앞으로 스부트랑 카프카 신버전을 쓰면 렉스님 코드를 타는건가요 ㅋㅋ

1개의 답글
comment-user-thumbnail
2024년 1월 26일

저는 아직 깊이가 부족해서 그런지 형님들이 안받아주네요ㅠㅜ

1개의 답글
comment-user-thumbnail
2024년 2월 3일

기여할 오픈소스에 대한 이해도가 어느정도 올랐다면 이슈 트래킹을 하는 방향으로 진행해봐도 괜찮죠

1개의 답글
comment-user-thumbnail
2024년 2월 6일

좋은 글 감사합니다 :)
자신감 얻어서 한 번 도전해보겠습니다~!

1개의 답글
comment-user-thumbnail
2024년 2월 7일

👍👍 멋집니다

1개의 답글
comment-user-thumbnail
2024년 4월 18일

좋은 글 감사합니다 흥미가 돋는 내용이네요

1개의 답글