[Git/JGit] PullRequest 구현하기

코드를 주고 받는 방법엔 크게 두가지가 있는것 같다. 프로깃이라는 책에서도 두가지를 설명하는데 하나는 고전적인 방법으로 패치 파일을 주고 받을 수 있겠고, 나머지 하난 상대방 브랜치를 merge하거나 rebase하는 식으로 코드를 직접 합치는 방법이 있겠다.

나는 후자를 선택했는데 그전까진 패치 파일 주고 받는 방법을 미처 생각하지 못했었고, pull request가 주는 어감때문에도 왠지 “코드 가져가라는 요청”이니까 merge로 코드를 받아가면 되겠군? 이라고 생각해서 이쪽으로 발상을 한것 같다.

암튼, 그래서 어떻게 하기로 했냐면.. 요청 보내는 쪽에서 가져갈 브랜치가 그 브랜치에 있는 코드를 어느 브랜치에 보낼지 선택하게하고 무슨 코드를 보낸다고 대충 적는다.

그럼 서버에 데이터가 하나 저장되는데 그게 PullRequest라는 도메인으로 저장된다. 그 안에는 어떤 Project(역시 도메인)에서 어떤 Project로 어떤 Branch에서 어디로 보내는지 누가 보내는지 누가 받았는지 등의 정보를 가지고 있다.

그럼 코드를 받는 프로젝트의 “코드 주고받기”라는 메뉴에 가보면 열려있는 풀리퀘 메뉴쪽에 하나가 표시되고 거길 열어보면 누군가 요청 보낸걸 볼 수 있다.

거기서 클릭해서 들어가면 이제 두가지를 할 수 있는데.. 하나는 “수락” 하나는 “거절”.

“수락”을 하면 다음과 같은 일이 발생한다.

일단 Git 저장소는 전부 bare모드로 만들어져있기 때문에 Git  저장소에서 직접 브랜치를 옮기거나 checkout을 받는다거나 하는 작업을 할 수 없다. 그래서 요청을 받아줄 프로젝트의 저장소를 bare모드가 아닌 non-bare 모드로 clone을 한다. 다음으로 ‘요청 받을 브랜치’와 ‘요청 보낸 브랜치’를 두개 만들고 각각을 ‘요청 보내온 저장소’와 ‘요청 받아줄 저장소’의 브랜치에서 fetch 해온다. 그런다음 ‘요청 받을 브랜치의 코드를 받아온 브랜치’로 이동해서 ‘요청 보내온 브랜치의 코드를 받아온 브랜치’의 코드를 머지 한다.

머지가 잘 되면 요청 받을 프로젝트의 브랜치로 ‘요청 받을 브랜치의 코드를 받아와서 요청 보낸 브랜치의 코드를 받아온 브랜치와 머지한 코드’를 푸쉬한다.

이렇게하면 풀리퀘가 된다. 그리고 머지 커밋이 항상 남도록 하려면 merge할때 NO_FF 옵션을 주면 된다.

이제부터 다듬기로, 머지하기 전에 머지가 잘되는지 확인해보고(사실 확인이라기보다 그냥 한번 해보면 되는데.. 암튼) 미리 머지가 잘 될 상황인지 아닌지 알려줄 수 있겠고, 잘 안되는 상황이면 직접 콘솔로 머지하고 컨플릭트 해결하라고 안내해 줄 수 있겠다.

그리고 풀리퀘를 만들어 보낼 시점에도 위와 같이 머지가 잘 되는 상황인지 체크해서 알려줄 수 있겠다. 어디서 하는게 좋을지 생각해 봤는데 어차피 보내느 시점과 받는 시점 사이에 받는 브랜치의 코드가 바뀌면서 처음 보낼 땐 머지가 잘 될것 같아도 나중에 안된느 시점이 있을 수 있으니까 그냥 두번 다 해주는게 좋을 것 같다고 결정했다.

그 다음 다듬기로는 풀리퀘가 어떤 커밋을 보내는 건지 커밋 목록과 브랜치 간의 파일 DIff 정보를 보여주는건데.. 후자는 금방 찾았는데 브랜치간에 차이나는 커밋 목록 만드는게 생각처럼 쉽게 안찾아진다. git show-branch와 비슷한 명령어가 jgit에 없는것 같다. 어떻게 해야할런지.. 흠… 좀 더 고민하거나 팀원에게 도움을 받아야겠다.

갈 길이 멀지만… 일단 포크/풀리퀘 구현은 가능하단걸 알았으니까 끝.

[Play] routes가 그지 같은 이유

리팩토링에 존나 취약하다. 컨트롤러를 리팩토링 할 수가 없어.

예를 들어,  MainController라는 컨트롤러에다가 핸들러 10개를 만들고 쓰다보니 그 중에 5개는 별도의 컨트롤러 클래스로 떼어내는게 좋겠다는 생각이 들었다고 치자고. 충분히 그럴 수 있자나? 이런 상황을 처음부터 알 수 있는 사람이 어딨어. 다 하다보면 많아지고 많아지면 비슷한거끼리 쪼개서 모으고 싶고 그런거지.

스프링이면 해당 핸들러 메서드만 별도의 컨트롤러 클래스로 옮겨버리면 된다고. 뷰에다가 컨트롤러 클래스이름 적어준것도 아니고 routes 같은 파일에다 URL 매핑하지 않고(물론 비슷하게 흉내낼 순 있지만 요즘 누가 그렇게 써..) 핸들러 메서드 위에 @RM으로 되어있으니까 메서드 옮기면서 URL 매핑 정보도 같이 옮겨지는거라고 다른거 수정할께 없이 그냥 그게 끝이야.

그런데 플레이는… 하아… 이런 그지 같은게.. 일단 routes 파일에 적어둔 매핑 정보를 바꿔주려면 들어가서 졸라 많은 URL 매핑 정보중에서 내가 고친 컨트롤러 이름 찾아가지고 바꿔줘야되겠지. 그다음에 그 핸들러 쓰던 뷰 파일 다 찾아가서 @routes.MainController.핸들러이름 이딴식으로 박아둔거 다 바꿔줘야된다고 그걸 어떻게 다 찾아서 고치냐고 아.. 씨바… 더러워서 진짜.

후아…. 진정하고 스프링 코딩이나 해야지..

개발자에게 채용당하고 싶다면…

빗버켓이나 깃헙 공개 저장소에 자기 코드를 올리는게 좋겠다. 도무지 글만 보고서는 이 분이 어떤 코딩이 가능하다는건지 어떻게 코딩을 하시는건지 알수가 없다.

이런 시점에 자기 코드로 어필한다면 개발자를 채용하는 개발자에게 참 잘 어필할 수 있을텐데 드물어 보인다.

나나 잘 하자.

[IELTS] each band 6 넘었다. overall 6.5!!

너무 간당간당했다. 세달 공부했는데 이치밴드가 0.5밖에 안오르다니… 위험했다. 하지만 다행이다. 목표한 점수는 넘었으니깐.

리스닝과 롸이팅이 많이 딸린다. 스피킹과 리딩은 딱 원하는 정도 나왔다. 물론 스피킹은 좀 더 잘해서 7 이상으로 높이고 싶긴하다.

고작 이정도 점수로 무슨 조언이겠냐마는… 의외로 IELTS 시험을 한번도 보지 않고 학원부터 다니는 사람들이 많았다. 한달치 학원비면 IELTS 시험 한회는 볼 수 있다. 학원비나 시험 접수비나 비슷하다. 그 돈으로 학원에 들어가기 전에 일단 경험삼아 시험부터 보라고 권하고 싶다. 시험장에 실제로 가보기 전까지는 절대로 그 분위기와 시험 치르는 프로세스를 완벽히 알 수가 없다. 그리고 아무리 학원 모의 고사가 있다고 한들 실제 시험 보다 정확하게 자신의 실력을 평가할 순 없다. 그러니까 학원가기전에 실제 시험부터 보는게 좋다.

그런 다음에 자기가 부족한 부분을 채울 방법을 찾아보자. 도무지 어떻게 공부해야할지 감이 안잡힌다면 학원에 가는게 최고다. 다행히도 강남에 유능한 강사와 학원이 많다. 그것도 다양한 시간대로 말이지. 나는 주말반 두달을 다녔다. 처음 한달은 기본반, 다음은 중급반이었다. 그 뒤로도 종합반, 실전반 등이 있었고, 각 반마다 기본 과정이 두달이었지만 General을 준비하는 입장이었고 학원 반배치고사 결과가 기본반이래서 기본반에 갔었고, 한달간 기본기를 다지는 시간을 가졌다. 그뒤엔 중급반으로 바로 넘어가서 조금더 IELTS 시험 문제 풀이에 가까운 반을 수강하면서 문제 푸는 방법을 배웠다.

리딩은 어휘력이 생명이지만 기본적인 논리력이 부족하면 함정에 빠지기 쉽다. 리스닝은 많이 듣고 익숙해지는 수밖에 없으니 미리 미리 캠브리지 문제 풀이를 열심히 꾸준히 해야지 늘 수 있다. 나는 막판 한달 동안 조금 게을리 했더니 점수가 간당간당했다. 학원 다닐때는 6.5 ~ 7 정도 나오길래 만만하게 생각했었는데 역시 꾸준히 연습해야 한다. 리딩도 꾸준히 시간 재가면서 푸는 연습하고 단어 꾸준히 외우면 세달안에 충분히 점수 올릴 수 있다.

문제는 라이팅과 스피킹인데, 이 둘은 특히나 학원 도움을 많이 받았다. 라이팅은 전체 글 구조를 잘 잡아야하는데 보통 네 단락 구조를 자주 사용한다. 에세이가 찬/반인지 의견형인지 원인/결과형인지 등에 따라 주로 쓰는 표현이 조금 달라지니까 그런걸 학원에서 알려주는대로 잘 외우고, 문제의 주제도 가정, 아이들, 환경문제, 경제문제, 고령화 사회 등 주로 나오는 주제가 있으니까 그 주제에 관련된 단어를 꾸준히 외우고 관련된 주제에 대해서 평소에서 하나 둘 생각해보면 좋다. 글쓰기 전에 5분정도는 전체 문단 구조와 자기가 할 이야기 키워드 정도는 다 적은 다음에 글쓰기를 시작하는게 좋다.

스피킹은 학원 스터디에서 만난 분과 꾸준히 연습했었다. 학원 수업 시작하기 전이나 수업 끝나고 한두시간씩 했었으니까 거의 주말에는 하루 평균 세시간 넘게 학원에서 나눠준 스크립트를 주거니 받거니 읽어다. 처음엔 좀 새롭다가 나중엔 그냥 읽기만 하는것 같아서 지겨웠는데 그러면서도 은연중에 머리에 새겨지기 때문에 스피킹 연습과 좋은 연습 파트너를 구해보는게 좋겠다. 사실 돈이 많으면 원어민 강사 붙여서 맨날 놀면 되겠지만 난 그럴 돈이 없다.

2월부터 학원에 다녔고, 3월까지 다니고, 4월부터는 혼자 공부해서 4월 27일에 시험을 봤고 오늘 결과가 나왔다. 특히 4월에 혼자 공부하는 기간에 집중이 안되서 곤란했다. 특히 리스닝을 너무 뜸하게 했고, 롸이팅과 스피킹 연습도 혼자하려니 게을러지기 쉬웠다. 학원 다닐때 첨삭 받거나 캠브리지 교재로 모의고사를 볼때는 리스닝이 최소 6.5 ~ 7정도 나왔었고, 롸이팅도 처음에 6.5 나머지 두번은 7이 나왔었다. 그러다 학원에 안가고 혼자 하려니 그때 생각 하면서 나태해진것 같다. 그렇다고 학원에 가자니, 학원 수업은 Academic 이라서 내가 필요한 내용이 아니기도 했고 마지막주는 버리는거나 마찬가지라서 돈도 좀 아까웠다. 그 돈으로 차라리 시험을 한번더 볼 생각으로 4월 시험을 신청했고 이번에 점수가 안나오면 5월에 다시 볼 생각이었는데 결과가 좋다.

2, 3, 4월에 학원 다니고 5월에 시험봐서 이치밴드 6을 넘겠다는게 내 목표였고, 이 목표를 달성하지 못하면 죽어버릴꺼라고까지 말했었다. 진짜 다행이다. 주어담지 못할 말을 뱉었는데 주어담지 않아도되서.. ㅋㅋ

그리고 그동안 영어 공부한다고 짜증내고 집안일도 등한시했던 남편을 봐주느라 고생한 아내한테 최소한의 보답을 할 수 있어서 다시한번 정말 다행이다. 다행이야.. 후아…

좋아. 일단은 내가 필요한 점수는 만들었으니까 이제 뭐하고 놀까.

이동국님의 마이바티스 책이 나왔다.

http://www.yes24.com/24/Goods/8744450?Acode=101

국내 최초를 넘어 세계 최초 마이바티스 저서다. 와우…

내가 사용할 프레임워크를 선택할 자유가 있다면 나는 언제나 하이버네이트를 쓰기 때문에 아이바티스나 마이바티스는 잘 모른다. 그런데도 굳이 내 책에 아이바티스를 넣었던 이유는 한국에서는 아이바티스가 대세니깐 나같이 특이한 경우가 아닌 이상에야 하이버네이트를 접할 기회가 많지 않을꺼라는 판단에서였지만, 난 결국 하이버네이트도 넣고 말았다. 내 책인데 그정도는 내 맘대로 해야지.

게다가 아래와 같은 링크를 보면 에이콘 출판사의 마케팅이 부럽다.

http://www.yes24.com/24/Goods/8780194?Acode=101

어떻게 보면 내 책이야말로 전자정부 표준 프레임워크에 가장 가까운 책일꺼 같지만 뭐 이런 얘길 하고 싶었던건 아니니까 패스하고.

내 책에서 다루는 주제를 전문적으로 깊게 다룬 책들이다. 다 모으면 대충 3500p, 15만. 돈도 돈이지만 3500p를 언제보냐는거지… 그리고 저 책을 하나씩 보면 실제로 자바 웹 개발이 가능한가? 그렇치 않다. 스프링만 알면 스프링으로 웹 개발 할 수 있을 꺼 같지만, “스프링만 안다”는게 사실상 불가능하다. 스프링 MVC가 기반하고 있는 서블릿&JSP를 모르면 동작 원리를 이해할 수도 없고 각종 디자인패턴과 객체지향 원칙을 모르면 스프링이 왜 좋은지도 알 수 없다. 그뿐인가, 메이븐을 모르면 프로젝트 만들거나 빌드도 못할꺼고, 이클립스 모르면 그걸 가지고 편하고 빠르게 코딩하지도 못할꺼다. 더 욕심을 내서 Git이나 SVN 사용법을 모르면 협업을 못할꺼고, 이슈트래커나 위키를 쓸지 모르면 아무것도 기록하지 못하고 결국 기억력에 의존한 힘겨운 프로젝트가 될꺼다.

대신 내 책 230p를 1.4만에 보면 다 조금씩 모자라겠지만 당장 자바 웹 개발은 시작할 수 있다. 그렇게 시작부터하고 모자르는 부분은 해당 분야의 전문 서적을 참고하는 방식으로 공부하는게 어떻겠냐고 쓴거지만… 각종 오타와 악평으로 곤혹을 치르는 중이다.

이번 책에서 이클립스랑 메이븐을 다뤘으니까 이제 툴 관련 화면이나 사용법과 기초적인 프로젝트 생성 방법및 프레임워크 연동 방법을 빼고 다음 책에서는 조금 더 실무에 가까운 코드만 가지고 500p쯤 써볼까 싶다.

나한테 그럴만한 자극이나 동기나 여유가 생긴다면 말이지…