매일 퇴근 후 스터디
나 개인 작업을 진행하기 위해 여느때와 같이 책상에 앉았는데 이상하게 오픈소스
는 누가 만드는 걸까? 라는 궁금증이 생겼습니다.
Redis
, Kafka
, Spring Framework
와 같이 우리가 애용하는 오픈소스들은 누가 만들고 있고 아무런 대가 없이 힘들게 만든 소스를 공유하는 것일까?
이 한 마디의 질문
에서 제 오픈소스
활동이 시작되었습니다.
리눅스
를 만드신 리누스 토르발즈
형님.. 파이썬
의 창시자 귀도 반 로섬
형님과 같은 분들만 오픈소스 하신다는 마음이 있었습니다.
신입 개발자
인 내가 감히.. 해외 고수님들의소스
를개선
하자고 제안을 해..?
이런 마음때문에 처음에는 너무 조심스러웠고, 어디서부터 문제
를 찾아가야 할지 몰랐습니다. 또 어떻게 접근
해야 할지 어려웠어요.
그러던 중 검색을 하다가 망나니개발자
님의 Spring Boot
기여하기 포스팅을 보면서 큰 영감을 얻게 되었습니다.
그렇게 용기를 얻고, Spring Boot
프로젝트를 fork
해서 무작성 소스들을 읽어 나가기 시작했습니다.
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 문을 써서 자원해제
를 안전하게 하자
스트림
을 수동으로 닫지 말고 호출자에게 맡기라는 내용이 있어서 이 내용을 첨부해주신 Maintainer
상수 인터페이스
를 상수 전용 클래스로 변경하자
package-private
상태이기 때문에 다른 곳에서 접근이 불가능해서 변경할 필요가 없다는 Maintainer
의 의견 비록 거절
당했지만, 거대 오픈소스를 관리하고 발전시키는 Maintainer
형님들의 철학과 가치에 대해서 배워가고 있었습니다.
Spring Project
는 PR
에 여러가지 라벨을 붙여 현재 상태를 알 수 있는데, 그 중 저는 두 가지 라벨
에 대해 설명드리겠습니다.
task
: 단순 작업enhancement
: 개선 작업오픈 소스
에 기여하더라도, 내용에 따라 라벨이 달라질 수 있습니다.
제가 첫 기여를 한 Spring Boot
프로젝트에서는 task 라벨
을 받았 습니다.
이번에는 Spring-Kafka 프로젝트에서 두 가지 개선점을 제시했습니다.
패키지 문자열
을 관리하는 List
가 외부 접근이 불가능하고, 수정이 불필요하기 때문에 불변 리스트
를 사용하도록 개선수정
하여 개선
이렇게 해외 고수 개발자 형님께서 굽어 살피시어.. enhancement(개선)
라벨을 받게되고 Spring-Kafka
의 컨트리뷰터
가 되었습니다.
이 모든 기여는 2주 동안 시도한 내용입니다.
해외 고수 개발자
형님의 격려와 응원덕에 오픈 소스 문화가 정말 아름답다는 생각을 가지게 되었습니다.
저는 무조건 지금부터 시작하라고 권유하고 싶습니다.
처음에는 훌륭한 개발자
, 실력 좋은 개발자만이 기여할 수 있다고 생각해왔습니다.
내가 사용하는 오픈소스
에 대한 애정과 사랑이 있다면, 얼마든지 의견을 내고 자유롭게 기여해보면 Maintainer
분들의 의견도 듣고 더 성장할 수 있는 것 같습니다.
오늘도 읽어주셔서 감사합니다.
오호,,, 그럼 앞으로 스부트랑 카프카 신버전을 쓰면 렉스님 코드를 타는건가요 ㅋㅋ