인프콘 2023에서 발표한 <코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기> 발표 자료입니다.
https://www.inflearn.com/conf/infcon-2023/session-detail?id=765
1. 코프링 프로젝트 투입 일주일 전
주니어 개발자의 코틀린 도입 이야기
라인비즈플러스 이석재
2. 발표자 소개 이석재 Seokjae Lee
• 3년 차 서버 개발자
• 現 라인비즈플러스 재직 중
• 태국 라인 뱅크 LINE BK 채널 서버 개발 및 운영
• Email
seok9211 naver.com
• Github
https://github.com/doljae/
• Blog
https://doljae.tistory.com/
• LinkedIn
https://www.linkedin.com/in/doljae/
3. 세션 내용
제목: 코프링 프로젝트 투입 일주일 전
• 팀과 신규 프로젝트에 코프링 코틀린 스프링 을 도입하면서 조사했던 내용과 여러가지 이야기
• 코틀린 학습법, 개발 팁 및 신규 프로젝트를 시작할 때 고려해 볼 만한 여러 가지 도구들에 대한 소개
부제목: 주니어 개발자의 코틀린 도입 이야기
• 주니어 개발자가 팀에 새로운 기술을 도입하고 전파할 때 겪었던 에피소드와 배운 점을 공유
4. 세션 내용
제목: 코프링 프로젝트 투입 일주일 전
• 팀과 신규 프로젝트에 코프링 코틀린 스프링 을 도입하면서 조사했던 내용과 여러가지 이야기
• 코틀린 학습법, 개발 팁 및 신규 프로젝트를 시작할 때 고려해 볼 만한 여러 가지 도구들에 대한 소개
부제목: 주니어 개발자의 코틀린 도입 이야기
• 주니어 개발자가 팀에 새로운 기술을 도입하고 전파할 때 겪었던 에피소드와 배운 점을 공유
5. 이런 분들을 대상으로 준비했습니다.
• 코틀린에 관심이 있는 스프링 개발자
• 코프링 프로젝트를 시작하려고 하는 스프링 개발자
• 팀을 설득해 새로운 기술을 도입해 보고 싶은 개발자
6. 기초 수준의 스프링, 스프링 부트 관련 경험
로컬 환경에 동작하는 API 서버를 개발해 본 정도
사전 지식
7. 다루지 않는 내용
• 코틀린, 스프링 자체에 대한 깊은 내용
예 동작 원리, 내부 구현
• 프로젝트 설계 관련 이야기
예 아키텍처, 모듈 및 패키지 구조 등
• 좋은 코드 관련 이야기
예 객체 지향 프로그래밍, TDD
8. 세션 목표
1. 개인, 팀의 효율적인 코프링 도입 견인
2. 팀을 설득하고 새로운 기술을 도입하는 방법에 대한 실마리 제공
9. 컨텐츠 목차
Why 코프링?
스프링 개발자가 코틀린을 선택한 이유
코프링 도입하기
신규 프로젝트 기술 스택 선정에 대한 의사결정 이야기
In Action
코드와 함께 알아보는 코프링
유용한 도구
프로젝트에 도입해 볼 만한 플러그인 라이브러리
FYI For Your Information
고려해 볼 만한 포인트
팀에 새로운 기술 도입하기
주니어 개발자의 고군분투 이야기
결론
정리 Josh와의 인터뷰 맺음말
1
2
3
4
5
6
7
14. 코프링을 배워야할까?
처음에는 회의적이었음 🤔
• 스프링을 위한 코틀린을 배워야할까?
스프링 프레임워크는 자바로 작성된 오픈소스
JVM에서 동작, 자바 호환성 보장, 스프링 진영의 지원이 있긴 하지만…
• 정상적으로 사용하기 위해서 추가 플러그인이 필요함
• 자바도 계속 발전하고 있음
2년 주기로 신규 LTS 버전 릴리즈
21. 이펙티브 코틀린 Effective Kotlin
• 이펙티브 자바 Effective Java 의 코틀린 버전
• 기본 문법은 숙지하고 도전하는 것을 추천
22. 공식 문서
• 돌고 돌아 다시 보는 참고 자료
• 코틀린 공식 문서는 읽기 편하게 잘 작성되어 있음
• 스프링 공식 문서의 코틀린 관련 챕터는 한 번 정도는 꼭 정독하는 것을 추천 👍
23. 그 이외에…
개인 기술 블로그 안드로이드
• 2017년, 코틀린은 안드로이드 진영 공식 개발 언어로 추가되었음
• 한글로 작성된 포스트를 읽으면서 기초 문법을 차례차례 학습하기 좋았음
코프링 프로젝트
• Github 및 사내에서 운영 중인 프로젝트 소스 코드 분석
• 프로젝트 시작 전 가장 좋은 참고 자료
24. 내가 생각하는 코틀린과 코프링
Why 코틀린?
• 자바 대비 상대적으로 간결한 문법
• 언어 레벨에서 지원하는 다양한 기능
null safety, infix function, scope function, coroutine…
• 지속적인 업데이트 및 활발한 커뮤니티
• IDE 레벨에서의 강력한 지원
Why 코프링?
• 스프링 진영의 적극적인 지원
• 국내의 많은 IT 기업에서 도입해 사용하고 있음 검증됨
• 증가하고 있는 레퍼런스
뭔가 새로운 걸 하는 느낌… 재밌다 😆
31. 코프링 제안하기
대부분 긍정적인 반응을 주셨음
• 팀의 기반 기술 스택을 그대로 사용함
→
JVM, 스프링 프레임워크 및 관련 프로젝트
• Mock 서버에서 코프링을 사용하고 있음
• 여러가지 경로를 통해 코프링에 대해 노출이 되어 계신 상태
우리 팀에 새로운, 그렇지만 안정적인 기술 스택 이라는 동의를 얻음
34. MVC vs WebFlux
• 서블릿 기반의 MVC
• 리액티브 애플리케이션을 위한 WebFlux
•코틀린 coroutine 지원
• 게이트웨이가 아닌 실제 로직을 담당하는 API 서버를 리액티브 애플리케이션으로 개발해보고 싶은 욕구
• 이를 위해 WebFlux와 리액티브 애플리케이션 관련 기술에 대한 POC 진행
35. R2DBC 및 MySQL 호환성 조사
The Reactive Manifesto 리액티브 선언문
• 큰 시스템은 더 작은 규모의 시스템들로 구성되어 있기 때문에 구성 요소의 리액티브 특성에 의존합니다.
리액티브 애플리케이션의 모든 구성 요소가 리액티브하게 동작해야 한다.
R2DBC Reactive Relational Database Connectivity
• 리액티브 프로그래밍을 RDBMS에서 지원하기 위해 만든 스펙
• 스프링 진영에선 Spring Data R2DBC로 이를 지원함
팀에서 메인 DB로 사용하고 있는 MySQL로 R2DBC를 사용하는 것이 최적인 상황
37. 상대적으로 아직 어린 R2DBC 프로젝트
• R2DBC 1.0 GA가 22년 4월에 릴리즈되었음
• JPA, JDBC에 비해 부족한 레퍼런스
• 샘플 프로젝트도 만들어 보았지만 만족스럽지 않았음
38. 다른 방법이 없을까?
• 공식 벤더에서 관리하고 있는 MariaDB 드라이버를 MySQL과 사용하기
• MariaDB, PostgreSQL처럼 공식 벤더에서 드라이버를 관리하는 다른 RDBMS 도입하기
• 리액티브 지원을 하고 있는 NoSQL MongoDB 를 메인 DBMS로 선택하기
• 데이터 조회용 API 서버를 만들고 이를 호출하는 식으로 사용하기
배보다 배꼽이 더 큰 상황
39. 그래도 해 볼 수 없을까?
WebFlux가 필요할 정도로 높은 처리량이 필요하지 않을 것으로 예상됨
신규 API 서버는 메인 서비스와 연계하는 추가 기능
메인 서비스도 MVC로 문제 없이 요청을 받아내고 있음
나의 WebFlux와 리액티브 애플리케이션에 대한 경험 및 지식 부족
팀에 드라이브를 걸 수 없음
40. MVC로 결정
팀의 현 상황에서 WebFlux는 신규 프로젝트의 적정 기술이 아니다.
→
POC 과정을 통해 스스로가 설득되어서 MVC로 개발하는 것을 제안함
비즈니스를 위한 기술이 되어야 한다.
비즈니스 문제를 해결하기 위한 기술은 OK
기술을 사용하기 위해 비즈니스에 억지로 맞추는 것은 NO
42. Kotest
코틀린 멀티플랫폼 테스트 프레임워크
• Spec 클래스를 활용한 다양한 테스트 스타일 지원
• 가독성 좋은 Assertions 라이브러리, 풍부한 DSL
43. MockK
코틀린을 위해 만들어진 Mocking 라이브러리
• final class에 대한 Mock 객체 생성 및 Stubbing 지원
• 간결하고 직관적인 문법, 풍부한 DSL
44. Kotest
+
MockK로 결정
코프링 프로젝트와 잘 어울리고 많이 사용하는 조합
• 코틀린 스타일의 DSL 지원
• 팀 기준 JUnit5
+
Mockito 조합에서 사용하고 있던 모든 기능 지원
• 문법 레벨에서 통일된 스타일로 테스트 코드를 관리할 수 있음
• 이해하기 쉬운 공식 문서
• 스프링 지원
• Kotest Spring Extension
• SpringMockK
45. 정리
팀의 상황을 고려해 적정 기술을 선택
• Kotlin
• Spring Boot
+
MVC
+
Data JPA
• Kotest
+
MockK
58. 느림에서 오는 아쉬운 개발 경험
• IntelliJ에서 코드를 분석해서 제공하는 기능의 성능이 자바 대비 조금 아쉬움
• 최신 버전의 IntelliJ 기준 굉장히 많이 개선되었고 계속 진행중
2022.3 버전부터 굉장히 좋아짐
59. 코드 스타일 관련 이야기
기본적인 가이드라인이 있지만 언어 레벨에서 다양한 문법을 지원
같은 로직도 다양한 스타일로 작성할 수 있음
코드 스타일 컨벤션을 도입할 때 이야깃거리가 많아집니다 🤣
scope function
expression
60. Scope functions 오남용
불필요한 Scope functions으로 인한 가독성 저하 로직 변경 대응에 취약한 구조
개인적으로 중첩 사용은 지양, 연속으로 사용할 땐 최대 두 개 정도만 🙏
1
2
3
4
5
😫😫😫
😎😎😎
61. ? vs Optional
Kotlin Nullable Types vs. Java Optional
• 관용적으로 ?을 사용하는 것을 권장, 불필요하게 Optional로 Wrapping할 필요가 없음
• 정답은 없으나 일관성 있게 사용하는 것이 좋음
62. Kotest 이야기
Slow typing performance when using Kotest plugin
아래 요인에 따라 코드 하이라이팅 및 자동 완성 기능의 속도 차이가 발생함
• IDE Kotest 플러그인 사용 유무 플러그인이 없으면 더 빠름
• 테스트 코드 작성 위치 init block에 작성하는 것이 init lambda에 작성하는 것보다 더 빠름
init lambda
slow
init block
fast
63. Kotest 이야기
Nested annotation doesn t work with inner class
• inner class에서 Nested가 동작하지 않음
• 2022년 9월 등록된 이슈, 여전히 Open 상태
Kotest를 도입하기 전에 POC가 필요함
• 팀에 필요한, 혹은 사용 중인 테스트 관련 기능을 모두 지원하는지
• 도입으로 인해 얻는 기대 효과와 비용 비교
• 기존에 테스트 프레임워크의 기능을 적극적으로 사용하고 있다면 변경 비용이 굉장히 큼
테스트 프레임워크 변경이 부담스럽다면 Assertions 라이브러리만 사용하는 것도 방법
→
JUnit5
+
MockK
+
Kotest Assertions
64. JPA 이야기
• class vs data class
• property
@
Column 작성 위치
• public setter 관련 이슈
• 기타 등등
→
TL;DR
:
정답은 없지만 팀의 정답을 찾아보자!
66. 신뢰와 설득
두 개념은 연관 관계
• 구성원들이 인정하는 성과를 내고 신뢰를 얻는다.
이를 바탕으로 구성원들을 설득한다.
• 구성원들을 설득해 내 계획을 실행하고 성공적으로 완수한다.
이를 바탕으로 구성원들에게 신뢰를 얻는다.
주니어는 여러가지 부분을 채워나가며 신뢰를 쌓아가는 단계
• 기술 역량
• 업무 도메인 지식
• 커뮤니케이션 스킬
• 책임감
이를 바탕으로 팀원을 설득
68. 설득의 어려움
여러가지 이유로 다른 사람을 설득하는 것은 어렵다.
• 당신의 주장이 잘못되었거나 설득력이 없음
• 당신의 커뮤니케이션 방법에 문제가 있음
• 상대방이 당신의 이야기에 관심이 없음
• 상대방이 당신이 맘에 들지 않음
• 기타 등등
특히 주니어가 팀과 시니어를 설득하는 것은 더욱 어렵다.
아직 충분한 신뢰가 쌓이지 않았음
실제로 부족하지 않더라도 그렇게 보이는 경우도 있음
70. 미리 공부하고 준비하기
내가 이해하지 못하는 것을 다른 사람에게 설득하는 것은 굉장히 어려움
코프링에 내 자신을 노출시키기
1. 프로젝트 시작 약 6개월 전부터 코틀린 공부 시작
2. 다른 팀의 코프링 프로젝트 소스 코드 읽어보기
3. 코프링으로 간단한 API 서버 구현해보기
팀에서 자주 사용하는 기능 위주로
4. 코틀린에 익숙하시거나 능숙하신 개발자분들과 이야기 나누기
양질의 정보를 효율적으로 얻을 수 있음
71. 팀에 은근하게 어필하기
팀에서 발생하는 다양한 커뮤니케이션 자리에서 나의 코프링에 대한 관심 어필하기
코프링을 팀에 노출시키기
1. 좋은 레퍼런스 공유하기
2. 자주 언급하기
• 옆 조직에서 새로 오픈한 서비스에 코프링 사용했다고 한다.
• Mock 서버가 아니라 API 서버에서 코프링을 써보면 어떨까?
• 요즘 자바 오픈소스들이 코틀린 지원을 적극적으로 하는 추세가 보인다.
• 신규 API 서버를 개발할 일이 생기면 코프링으로 개발해봐도 괜찮을 것 같다.
3. 팀 내 코틀린, 코프링 스터디 진행하기
• 꼭 해봤으면 좋겠다 싶었던 방법 1, 팀 전체적으로 해당 기술에 대한 이해도를 끌어올리고 이후 도입 허들을 완화
72. 팀에 !은근하게 어필하기
객관적인 자료를 준비하기
신뢰 쌓기
1. 좋은 레퍼런스 만들기
• POC 후 Wiki 문서 작성, Draft PR 생성, 라이브 코딩 등
• 정보를 찾는데 들어가는 팀원분들의 부담 덜어드리기
2. 다른 코프링 프로젝트 분석
• 가장 맘에 드는 해보고 싶은 것들이 많은 프로젝트를 찾아서!
• 실제로 프로젝트 초기 설정 시 새로운 기술과 도구를 자연스럽게 도입할 수 있었음
3. 개발할 서비스의 핵심 기능을 추상화 후 코프링으로 개발해보기
• 꼭 해봤으면 좋겠다 싶었던 방법 2, 많은 리소스가 필요하지만 굉장히 효과적인 방법
73. 팀을 배려하기
한꺼번에 많은 변화는 누구에게나 부담스럽다.
• 특히 시니어, 책임을 지는 입장이신 분들은 더욱…
• 이번에 꼭 모든 것을 다 할 필요는 없음
• 적절한 포기도 필요
시니어를 이해하기
• 주니어의 동료는 시니어
• 나는 그분들의 부담을 덜어드리는 동료인지 생각해보기
74. 1. 팀에 코프링 도입을 견인
코틀린 및 코프링 지식
2. 스프링 부트 3 환경으로 이주
부트 버전 업그레이드 관련 트러블슈팅, 신규 기능 사용법
3. 프로젝트에서 사용하는 의존성을 최신 버전으로 유지하면서 개발
공식 문서 독해 능력 상승, 오픈소스 기여
4. 문서화, 발표 등 다양한 방식의 커뮤니케이션
내 의견을 효과적으로 전달하고 설득하는 방법
굉장히 많은 것을 경험하고 배웠고 성장했다 👍
개인 회고
76. 정리하면...
코틀린
자바 대신 사용할 수 있는 새롭지만 현실적인 프로그래밍 언어
• JVM 기반
• 매력적인 기능
• 활발한 커뮤니티
코프링
스프링을 사용하는 팀이 취할 수 있는 새롭지만 현실적인 개발 스택
• 자프링 자바 스프링 과 유사한 개발 경험
• 스프링 진영의 적극적인 지원
• 증가하고 있는 레퍼런스
77. Josh에게 물어봤습니다
Q1. 코틀린과 스프링 조합이 가질 수 있는 가장 큰 장점이 있다면?
코틀린은 장황하지 않다. 자바의 아쉬운 부분을 많이 커버하고 있다.
Q2. 스프링 진영의 코틀린 지원이 앞으로도 계속 될까?
계속 될 것이다. 코틀린 코드는 스프링 JAR 파일에도 들어가고 있다.
Q3. 자바도 계속 발전하면서 코틀린의 유용한 기능이 추가되고 있는데?
코틀린은 지금 바로 그 기능들을 쓸 수 있다.
78. 주니어에게 새로운 것에 대한 도전과 준비는 성장의 원동력
여러분의 도전을 응원합니다 😎
79. 외부 자료 출처
인스타그램, 데브 경수: 출처 / 11, 12, 67 페이지
인프런 블로그 포스트: 출처 / 13 페이지
코드너리 기업 기술 블로그 모음: 출처 / 15 페이지
Gradle 블로그 포스트: 출처 / 17 페이지
자바 로고: 출처 / 11, 27 페이지
스프링 프레임워크 로고: 출처 / 11, 27 페이지
스프링 부트 로고: 출처 / 45 페이지
코틀린 로고 및 마스코트: 출처 / 12, 14, 16, 21, 23, 24, 45 페이지
MySQL 로고: 출처, 원본 / 27 페이지
R2DBC 로고: 출처 / 35 페이지
Kotest 로고: 출처 / 42, 44 페이지
MockK 로고: 출처 / 43, 44 페이지
Pepe the Frog: 출처, 원본 / 25 페이지
포켓몬스터1: 출처 / 29 페이지
포켓몬스터2: 출처 / 30, 33, 41 페이지
포켓몬스터3: 출처 / 30, 33, 41 페이지
Success kid: 출처 / 32 페이지
Shia LaBeouf, Just Do It : 출처, 원본 / 19 페이지
펭수1: 출처 / 28, 70 페이지
펭수2: 출처 / 71, 73, 74페이지
펭수3: 출처 / 32, 72 페이지
펭수4: 출처 / 38 페이지
Josh Long 사진: 출처 / 77 페이지
고슴도치: 출처 / 78 페이지