교육 참여 계기
같이 학원에서 수업을 들으며 친해진 언니가 둘 있다.
그 중 나현언니가 쏘카의 어느 개발자분께서 재능기부로 5주간의 개발 교육을 해주신다는데 같이 하지 않을래? 라고 물어봤다.
수업 내용은 코틀린과 스프링부트 기반의 '전사 코드 체계를 관리하는 애플리케이션 개발' 로 실무에 가까운 개발 교육 프로그램이 될 것이라고 했다.
이 프로그램은 쏘카 회사 자체에선 공식 승인을 받았지만 아직 프로토타입인 수업이었고 코로나로 인해 시범적으로 교육생은 우리 셋으로만 진행되었다.
수업은 일주일에 한번 토요일 오전 10시부터 쏘카 서울본사에서 진행되었다.
교육 내용 정리
✳️ OT 21.07.16
교육에 대한 간단한 오리엔테이션이 이루어졌다.
교육을 진행해주실 김인태 선생님과 이 수업이 진행될 수 있게 승인해주신 임근중 인재문화본부장님이 함께했다.
✳️ 1차 21.06.19
- 프로그래밍 언어의 발전사
첫 수업은 실제 개발이 들어가기 전 우리가 사용할 코틀린이라는 언어가 탄생하기까지의 배경 및 프로그래밍 언어의 발전사에 대해 들었다.
대학때 정보학 수업을 들으며 프로그래밍 언어의 발전과정을 익혔지만 이 과정과정 사이에 있었던 사건이나 뒷내용에 대해 자세히 들려주셔서 무슨 전래동화 듣는 것처럼 재밌게 들었다.
- 자바의 구동과정
또 자바의 구동과정을 아주 길게 설명해주셨다.
'JVM이 class를 찾아 main 진입점이 있는 메소드를 찾아 실행한다.'
1
2
3
4
5
|
public class HelloJava {
public static main(String[] args) {
System.out.println("Hello World");
}
}
|
cs |
나는 처음 자바를 공부하며 hello world 하나를 출력하는데 왜 main이 없으면 실행이 안되고 String[] args 는 무엇이고 에 대해 의문을 가지지 못했다. 그저 자바의 문법이 그러하기 때문에라고만 생각했다.
선생님께서는 개발자는 항상 의문과 의심을 가져야 한다고 했다.
프로그래밍이란 항상 변하는 것이니 과거에는 맞지만 현재에는 틀릴 수 있다...
- 개발할 애플리케이션의 가장 핵심인 통합참조 테이블
그리고 마지막으로 우리가 개발할 '전사 코드 체계를 관리하는 애플리케이션'에서 가장 핵심이 되는 통합참조 테이블에 관해 설명해주셨다. 이 통합참조테이블은 enum 대신 사용할 테이블이다.
이전까진 mysql보단 오라클 위주로 공부해서 enum의 개념을 잘 이해하지 못했다.
단순하게 파이썬에서 enumerate라는 인덱스 순서를 세는 함수랑 관련이 있을까? 정도로만 알고 있었다.
개념은 같았다.
mysql에서 enum을 쓰는 경우는 절대 변하지 않는 유일한 값을 저장할 때 사용한다. enum을 사용하면 데이터 정합성을 높힐 수 있다. 품질이 좋아지는 것이다.
하지만 enum 대신 통합참조 테이블을 만드려는 이유는 enum이 가진 제약이 많기 때문이다.
일단 enum은 모든 DBMS에서 쓰이는 게 아니다. 오라클에선 쓰지 않는 개념이다.
또 enum 값은 꼭 무조건 유일한 값만 들어간다. 이 유일한 값을 정의내린다는게 쉬운 일은 아닐 것이다.
그리고 enum을 사용하면 중복성의 문제가 발생한다. 이는 정규화를 위반한다.
▶enum대신 통합참조테이블을 사용하는 이유에 대해 참고할 링크를 주셨다.
[번역] MySQL의 ENUM 타입을 사용하지 말아야 할 8가지 이유 (velog.io)
📍과제
과제는 작업환경 구축하기였다.
2021.06.25 - [IT 독학/JAVA] - Microsoft Open JDK 설치 (ms Java openJDK / openJDK SE 16)
2021.06.25 - [IT 독학] - Gradle build tool 설치 (gradle 7.1)
2021.06.26 - [IT 독학] - kotlin compiler 설치 (코틀린 / 코틀린 컴파일러)
2021.06.26 - [IT 독학] - Docker로 mysql 설치 (mysql / docker / WSL 2 / sqlectron)
✳️ 2차 21.06.26
- 작업환경 구축
과제로 해온 작업 환경 구축 과정에서 막히는 부분은 도와주셨다.
그리고 이 프로그램들을 왜 쓰는지? 어떻게 구동되는지 설명해주셨다.
📍과제
과제는 작업환경 구축에 대한 내용을 문서화하는 작업이었다.
✳️ 3차 21.07.03
- 테이블 설계
코드 정보를 담은 'com_code_info' 를 먼저 만들기로 했다.
그 이유는 이 중 가장 간단한 형태이기 때문이다. (다른 테이블들에는 조건이 많이 걸려있다.)
이 테이블은 모든 코드에 대한 정의를 담은, 변하지 않는 사전의 개념이라고 보면 좋다고 하셨다.
그 다음은 코드 그룹 정보를 담은 'com_code_group' 테이블이다.
이 테이블은 코드 테이블의 상위 개념으로 카테고리 테이블로 보면 된다.
이 테이블은 자기 자신을 참조하기도 하고, 이력도 관리하는 테이블이 참조되기도 한다.
코드 정보테이블과 코드 그룹 테이블간의 관계는 이런식이다.
코드 테이블에는 모든 코드가 들어가 있고 이 코드 테이블을 그룹짓는 코드 그룹 카테고리가 있다.
하지만 이 둘을 직접 연결해 참조한다면 중복성의 문제가 발생해 그 사이에 통합참조테이블인 'com_code'가 들어가게 된다.
하지만 'com_code'보다 'com_code_group_history' 가 먼저 생성되어야 한다.
그 이유는 코드그룹 정보가 생성됨과 동시에 이력도 생성되어야 하기 때문이다.
'com_code_group_history' 테이블은 코드 그룹 이력 테이블이다.
단순하게 log 관리 테이블로 보면 된다.
그리고 이 교육의 핵심이자 이 API의 핵심인 통합참조테이블 'com_code' 이 마지막으로 생성된다.
이 테이블에만 사용자가 접근할 수 있고 code_group_id와 code_id를 묶어 읽어오고 삭제하는 기능을 제공한다.
여기까지만 보면 사실 별로 어렵지 않았다. SQLD공부를 하며, DB공부를 하며 나왔던 내용들이 많아서...
나름대로 이해도 다 잘 됐다.. 하지만 고난은 테이블 정의와 함께 시작되었다.😅😥
- 테이블 정의
아직은 코드들 자체에 대해선 어렵지 않았다.
코틀린 기본 문법을 그래도 공부한답시고 열심히 인강도 듣고 해서 이해할만 했다.
- Exposed
exposed는 kotlin 기반의 ORM 프레임워크다.
스프링 부트에 JPA가 있다면 kotlin에는 exposed가 있다.
exposed는 밀키트처럼 이미 모두 다 처리 되어 있어 그냥 가져다 쓰면 된다고 한다.
📍과제
exposed 가이드 참고해 나머지 테이블 3개 만들어오기
https://github.com/JetBrains/Exposed/wiki
과제를 하던 중 보카님이 그룹 테이블을 맡아 하신 걸 보고, 유나언니와 남은 두개를 나눠했다.
나는 com_code 테이블을 만들었는데 일단 com_code는 PK가 2개 였다.
이건 많이들 밑에서 Primarykey(code_group_id, code_id)로 선언하면 된다고 나와있었다.
하지만 문제는 code_group_id는 String 타입이고 code_id는 int 타입이었다.
그렇기에 ComCodeInfos는 IntIdTable고 ComCodeGroups는 IdTalbe<String>였다.
여기서 ComCodes를 뭘로 정의해야할지 고민이 되었다.
이 테이블이 com_code_info와 com_code_group을 잇는 참조테이블인 것에 집중해
reference 가이드 대로 작성해봤다.
참고한 내용
https://www.baeldung.com/kotlin/exposed-persistence
https://blog.jdriven.com/2019/07/kotlin-exposed-a-lightweight-sql-library/
✳️ 4차 21.07.10
코로나가 갑자기 심해져 취업 상담도 취소되고 비대면 수업을 하게 되어 정말정말정말 아쉬웠다.
- 남은 테이블 정의 (과제 피드백)
만들어온 테이블을 피드백했다.
조교님이 ComCode에 대한 더 나은 코드를 제시해주셨다.
1
2
3
4
5
6
7
8
|
object ComCodeTable : Table("com_code") {
val codeGroupId: Column<String> = varchar("code_group_id", 4)
val codeId: Column<Int> = integer("code_id")
(...생략)
override val primaryKey: PrimaryKey = PrimaryKey(codeGroupId, codeId)
}
|
cs |
1
2
3
4
5
6
7
|
object ComCodeGroupTable : IdTable<String>("com_code_group") {
val codeGroupId: Column<String> = reference("code_group_id", ComCodeTable.codeGroupId)
(...생략)
override val id: Column<EntityID<String>> = codeGroupId.entityId()
}
|
cs |
ComCodeGroup 테이블에서 정의해주고 ComCode 테이블에서 참조해주는 방향으로 생각했는데 반대로 하셨다.
(이건 이후 스터디에서 바뀌었다.)
그리고 ComCodeGroup 테이블의 마지막에 참조한 컬럼에 대해 override 처리를 해줬다.
📍과제
4개 테이블의 기본 CRU Restful API 만들어오기
✳️ 5차 21.07.17
- Controller vs model
실무에서는 협업이 중요하다. 그렇기 때문에 개발의 순서를 정하는 것도 중요하다.
난 항상 모든 업무의 단위는 데이터이며 그렇기에 데이터 모델링이 가장 중요하고 제일 먼저해야한다고 생각했다.
이것도 무조건 틀린 말은 아니라고 하셨지만
실무에서는 데이터 모델링을 하고 controller로 들어가는 게 일반적인 게 아니라고도 하셨다.
협업이 우선이기 때문에 가짜 데이터(dummy data)를 만들어 controller를 먼저 작성하고 모델링으로 들어가는 방법도 많이들 사용한다고 하셨다.
- 과제 피드백
그리고 해온 과제에대한 피드백이 있었다.
유나언니와 보카님 이렇게 셋이 나눠서 했어야했는데 각자 하는데까지 열심히 해오느라 충돌되는 부분이 많아 시간이 많이 소요됐다.
과제는 그래도 열심히 한다고 했지만 역시나 좌절😢 했다.
각자 해온 부분에 대해 충돌 해결 후 머지하니 시간이 많이 흘러 테스트도 못해보고 수업이 아쉽게 끝났다.
교육 후기
일단 제일 먼저 아쉬운 점은
교육 진행 언어로 자바가 아닌 코틀린을 선택했던 우리의 선택에 아쉽다.
미리 공부한다고 했지만
익숙하지 않은 환경 (스프링부트+mysql 등..) + 잘 모르는 것 (코틀린) + 진짜 잘 모르는 것 (Exposed) 들의 연속이라
조금은 벅차기도 했다.
최대한 exposed 가이드 문서를 보고, stack overflow 를 참고하고 코드를 만들어봤지만 어려웠다!
그 다음으로는 아쉬운 점은 아직 시험단계의 교육이었기 때문에 중간에 바뀌는 부분이 많아 조금은 혼란스러웠다.
또 5주라고 했지만 5번의 수업으로는 뭔가를 만들어내기에 짧은 시간이었다.
(그래서 이후 스터디를 통해 수업에 함께하셨던, 쏘카의 맷님, 보카님과 함께 끝까지 완성을 목표로 하고 있다! 이후 내용은 또 블로깅할 예정이다.)
하지만 이 교육은 코틀린과 스프링부트, mysql, docker 등을 공부할 기회가 되었고
실무에서 정말 어떻게 API를 개발하는지, 깃을 통해 어떻게 협업하는지에 대해 옆에서 자세히 볼 수 있는 아주 좋은 시간이 되었다.
그리고 가장 큰 수확은
개발자로서의 자세에 대해 좀 더 생각해 볼 수 있었다는 점이다.
항상 의문을 가질 것, 의심을 할 것, 오류를 두려워하지 말고 일단 작성해볼 것,, 등
목표로 할 만한 이상적인 '좋은 개발자'의 모습을 배울 수 있었다.
이 수업을 기획하고 진행해주신 김인태 선생님에게 너무 감사하고
많은 도움을 주신 조교님(맷님)과 이런 수업을 같이 하자고 제안해준 나현언니에게도 감사하다는 말 전하고 싶다.
이 수업이 나중에 공식적으로 열린다면 또 다시 신청하고 싶다.
남은 스터디도 열심히 해서 이 수업의 목표이던 전사 코드 체계를 관리하는 애플리케이션 개발 을 잘 완성해내고 싶다.
댓글