- 병렬프로그래밍
- concurrency vs parallelism
- 동시성 프로그래밍
- two-sum
- Parallelism
- leetcode
- 개발자로드맵
- 2019
- strstr
- longest substring
- Today
- Total
노력만이 살길
[Spring-Boot] 인생 첫 open source 기여 경험기 본문
Spring-Boot 설정 중에 생긴일 ....
이 이야기는 최근에 Spring-Boot를 활용한 Project를 시작하게 되면서 경험하게 된 일이다.
회사에서 Spring-Boot를 활용한 프로젝트를 맡게 되었고, 운이 좋게도 밑바닥 부터 구성을 할 수 있는 기회가 주어졌다.
처음에 Spring-Boot 셋업을 하면서 내가 신경 썼던 부분은 바로 "Profile" 이였다.
Spring에는 "Profile"이란 개념이 있는데, 공식 문서에서 발췌하면 다음과 같다.
"Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments."
같은 코드로 다른 환경에서 동작할 수 있게 하는것인데, 이 Profile을 설정을 할 때 default
와 active
옵션이 있다.
active
는 어플리케이션이 구동 될 때 내가 원하는 Profile을 명시하는 것이다.
비슷하게, default
는 active
된 옵션이 없을 때 실행 되는 Profile이다.
default
와 active
를 설정하기 위해선 여러가지 방법이 있는데, 내가 선택한 방법은 configuration file을 통한 설정 방법이였다.
물론 이 글에서 어떻게 설정하는지에 대해서는 자세히 다루지는 않겠다. (해당 내용은 검색해보면 좋은 내용들이 많이 있다.)
내가 Profile을 설정하면서 하고싶었던 부분은, 만약 active
Profile을 설정하지 않으면 다른 개발자(front-end 개발자등 ..)들이 실행 시킬 때 Production레벨에 영향이 안가게 dev
설정을 default
로 물고 실행 될 수 있게 하고 싶었다.
그렇기에 나는 아래와 같이 설정을 하였다.
(본 코드는 이해를 돕기 위한 코드이다.)resources/application.properties
spring.profiles.default=dev
server.port=8083
resources/application-dev.properties
server.port= 8082
위와 같이 설정을 마친 후 애플리케이션을 실행을 하면 아래와 같이 정상적으로 default profile이 dev
로 설정 되었다는 로그를 확인 할 수 있었다.
만약 default 설정이 위의 로그와 같이 잘 설정 되었다면, 실제로 애플리케이션은 8083이 아닌 8082로 떠야 했다.
그러나, 애플리케이션은 계속해서 8083에서 실행되었고, 문제를 해결하기 위해 여기저기를 뒤지기 시작했다...
Stackoverflow로 도전
사실 특별히 복잡한 설정이 아니였기에, 더이상의 구글링으로 해결을 하지 못한 나는 개발자들의 성지인 Stackoverflow
에 질문을 하기로 마음을 먹었다
사실 첫 질문은 아니였지만 영어를 써서 질문하는 것이 쉬운 일만은 아니였고, Stackoverflow
는 질문에 대한 수준을 메길수 있어 질문을 쓸때 내가 모르는 부분, 내가 해본 부분, 내가 참고한 자료 등을 최대한 깔끔하게 정리하여 답변을 주는 사람으로 하게끔 좋은 답변을 받을 수 있게 노력하였다.
개발자들의 성지답게 질문을 올리자마자 댓글과 답변으로 여러가지 방법을 올려주었지만, 대부분의 답변 및 댓글이 내가 처한 문제랑 조금은 거리가 있는 답변이였다. 답변의 대부분은 spring.profiles.active
를 활용하여 내가 원하는 profile을 활성화 시키라는 답변이였지만, 내가 원하는 것은 default
profile의 설정방법 이였다.
여러 사람들과 논의를 하던 중 한 유저가 spring.profiles.default
설정과 관련된 git-hub 이슈를 link로 주었고, 해당 이슈에 동일한 이슈는 아니지만 비슷한 이슈가 있었고 또 힌트를 얻을 수 있었다.
보내준 link에는 아래와 같은 내용이 있었다.
내용인 즉슨, spring.profiles.default
설정은 config file에 명시함으로써 변경 할 수 없다는 뜻이였다. 실제로 애플리케이션이 뜨기전에 config file의 내부를 읽어서 적용을 시키기 때문에 해당 config file에 쓴다 한들 이미 애플리케이션이 떳기 때문에 spring.profiles.default
설정이 적용되지 않는 다는 것이였다.
다음날 출근을 해야하지만 새벽 3시까지 토론을 했다.
어찌 됬든 원인을 찾았고, default 설정은 JVM args에 parameter를 줌으로써 의도 했던 대로 동작이 가능함을 확인했다.
남아 있는 찜찜함 ... Git Hub로 간다.
근데, 뭔가 찜찜했다.
분명 그렇다면, spring.profiles.default
의 설정이 적용이 안되었을 텐데 왜 console에는 No active profile set, falling back to default profiles: dev
와 같이 찍혀있던 것일까...?
분명 console에 찍히는 것이 이해가 가지않았고, 직접 spring-boot git hub project에 가 issue를 리포팅 하기로 마음을 먹었다.
사실 issue를 리포팅한다는것이 굉장히 떨리고 긴장되었다. 어떻게 보면 되게 사소한 부분이지만, 인생 첫 open source
에 무언가를 하려는 것이였고, 그 대상이 spring-boot project
였기 때문에 혹시나 실수는 하지 않을까 "open source에 기여 하는 방법" 등을 검색해보며 찾아 봤다.
실제로 spring-boot
에 issue를 남기기 위해선 컨트리뷰션 규칙을 따라야 한다. 이러한 기여 규칙은 open source project마다 다르고 보통은 README.MD
에 명시되어 있다.
하루에도 수 많은 issue들이 리포팅 되기 때문에 무턱대고 issue를 쓰기 보단 규칙을 잘 읽어보고 기여하는것이 정말 중요한 것 같다.
(spring-boot contribution guide - [https://github.com/spring-projects/spring-boot/blob/master/CONTRIBUTING.adoc ])
문서를 완독하고 License Agreement도 마친 후, 본격적으로 이슈를 적어 냈다.
(github 이슈 link - [https://github.com/spring-projects/spring-boot/issues/18656])
두근 거리며 이슈를 제출했고, 신기하게도 정말 빠른 시간 안에 메인터넌스가 커멘트를 달아주었다. 커멘트 골자는 도움이 될만한 sample app을 만들어서 달라는 요청이였고, 간단한 설정이기에 그자리에서 만들어서 새로 comment로 남겼다.
그렇게 1시간 정도가 지난 후, 메인터넌스가 bug 딱지와 issue에 대한 설명을 함께 달아 주었다.
(보고나서 정말 신기했다...)
내용을 요약하자면, configuration file에 있는 spring.profiles.default
설정은 이전 이슈에서 언급된 것처럼 이미 애플리케이션이 뜬 이후에 적용되기엔 너무 늦기 때문에 적용이 되진 않지만, log상에는 그렇게 찍히는 것 또한 맞다고 했다(? 이게 무슨말이지)
왜냐하면 @Profile('dev')를 이용해서 Bean을 생성하면 실제로 Bean이 생성되기 때문에 그렇다고 했다.
어찌 됬든 해당 로그가 혼란을 줄 수 있기 때문에 다음 Milestone에 내가 올린 이슈가 할당이 되었단걸 확인 할 수 있었다.
마치며 ...
사실 처음엔 되게 사소한 문제였다.
내 기준엔 active
랑 default
는 엄연히 다른 의미였고, 나름대로의 고집으로 default
설정을 해내고 싶어서 이것저것 뒤지다가 결국 위와 같은 과정을 겪게 되었다.
단순히 내가 구글링을 해서 해당 이슈를 해결했었더라면, 아마 이렇게 글을 쓰지도 않았을테고 그냥 넘어가는 자그만한 설정 중에 하나 였을 것이다.
근데 우연히 생각대로 잘 되지 않았고, 또 관련된 레퍼런스가 몇개 없었기 때문에 오기가 발동해서 파고 들다 보니 좋은 경험을 할 수 있었던 것 같다.
사실 내가 이번 경험을 통해서 뭔가 엄청난 기술적 성장이나 기술 스택이 쌓인건 아니지만, 직접 Stackoverflow에 질문도 해보고 얼굴도 본적 없는 외국의 개발자들과 토론하며 정답을 찾아내는 과정은 꽤나 뿌듯하고 보람찼다. 더군다나 github에 첫 이슈를 리포팅 한것은 정말 기억에 많이 남을 것 같다.
더불어 먼지 쌓인 블로그에 먼지를 털어내며 글을 쓰게 된것 또한 보너스라고 생각한다.
한가지 더 욕심을 내자면 단순히 이슈 리포팅이 아닌 다음엔 코드 수정후 PR을 날려보는 것을 목표로 해야겠다.
만족 !