별거 아닌 사람의 2021년 회고

라모스·2021년 12월 22일
15
post-custom-banner

Prologue

'개발'의 '개'자도 모르는 내가 학부 3학년을 앞두고 백엔드 공부를 시작한지 어엿 1년이 다 되어간다. 여느 평범한 지방대 전공자인 나로서는 '내가 이 세계에 발을 담가 뭔가를 해낼 수 있을까?'라며 늘 끊임 없이 고민하고 회의적이었다. 작년 이맘때쯤, 1년 뒤인 2021년 12월에는 내 모습이 어떻게 달라져있을지 궁금했었는데 종강기념으로 글을 끄적여가며 한 해를 되돌아보고자 한다.

1년 농사의 시작

되돌아보면 2020년 여름이었다.
전공자임에도 불구하고 남들보단 아~~~주 늦게 코딩을 시작했던 터라 뭘 할지 고민하다 시작한 것은 블로그 정리였다. 중요하다고 생각했던 CS과목들을 수업듣고 시간 나는대로 매일매일 블로그에 정리하는 것으로 시작했었다.

이전 블로그

GitHub를 꾸준히 사용하던 것도 아니고 코드 작업을 하던 것도 아니었어서, 무엇보다 코딩에 자신있던게 아니었던 터라 우선은 이론적인 공부 내용을 정리하는 것을 시작으로 흥미를 갖는데는 성공했었다.
이 때의 시행착오를 거치며 생각한 게 2021년에는 1일 1커밋을 목표로 하며 근본적으로 코드치는 시간을 늘리자는 생각이었다.

결론적으론 목표한 바를 어느 정도 이루었다.
// 2021년 commit 기록
2021년 commit 기록

Spring과의 첫 만남

백엔드가 뭔지, 특히나 스프링이 뭔지도 잘 몰랐지만, 학교에서 배운 프로그래밍 언어 중에서는 Java를 제일 선호했기에 여기에 깊이감을 더해가며 공부하고자 했다. 스프링과의 첫 만남은 김영한님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 인프런 강의였다. 개발 자체를 해본 적이 없던 터라 프로세스 자체를 이해하는데 상당히 오래걸렸다.
(지금 되돌아 보면 그 정도까지 오래 걸릴 일은 아니었다고 생각함...)

이 후 여유가 되는대로 김영한님 강의 커리큘럼을 따라가며 공부했는데, 내 스스로 공부한 내용을 추가적으로 써먹고 응용하는 방식이 아니라 단순히 설명한 내용을 이해하고 정리해보고, 예제코드를 따라 쳐보는 식이 대부분이었다.

다시 말해, 실전타입이 아니라 전형적인 학자형 공부+주입식 교육을 하고있었다.
(지금 생각해보면 공부하는 방식이 비효율적이긴 했다...)

현직자 선배님과의 인연

아마 내가 스프링 공부 시작한지 얼마 안됐을 때일 것이다. 나는 원래 학과 내의 사람들을 잘 모르는 편이기도 하고, 든든하게 기댈만한 선배가 있지도 않았다. 우연히 교내 에브리타임 앱에서 백엔드 멘토링/스터디 관련된 글이 올라왔었다. 우리 학교는 특이한게 대다수가 개발자로 취직하려는 분위기가 아니라서 꽤 네임벨류 있는 곳에서 현직 개발자이신 선배님이신 것도 신기했는데, 스프링 기반 백엔드 스터디라는 것도 굉장히 놀라웠다.

이제 막 첫 걸음을 떼는 입장에서 이런 분한테 조언이나 도움을 구할수만 있다면 무조건 문의는 드려야겠단 생각에 인연이 닿게 되었다. 개인적으론 올 한해 내게 가장 도움을 주셨던 분이라고 생각한다.

내가 선배님께 플러스가 되는 실력과 입장은 아니라서 공부하다 해결 안되는 문제들을 가지고 고민고민하다 질문할 때 여쭤보기만 했지 사실 스터디라고 해서 둘이서 어떤 결과물을 만드는 등의 대단한 걸 한 것은 아니다.
(물어보기만 해서 죄송해요 선배님...ㅎㅎ)

사람이 가장 두렵다고 느끼는 것은 예측할 수 없는 것에서 나오는 두려움이다. 어떤 방향으로 가야 하는지, 내가 잘 하고 있는 게 맞는건지 매일 매일 두려움이 앞섰는데 진짜 열심히 잘하고 있고 그 방향이 맞다는 선배님께서 하신 그 한마디가 내겐 큰 자신감을 갖게 된 계기였다.

매번 바쁘실텐데 뜬금 없는 질문에도 같이 고민해주시고 어떤 것을 공부하면 좋을 것 같다고 조언해주셔서 늘 감사했었다. 이런 멘토의 존재가 올 한해 큰 성장의 시작이 아닐까 한다.

코테 스터디

2학년 2학기 학부 알고리즘 수업을 듣고 나서 2021년 새해에는 백준 문제를 꾸준히 풀며 입문해야겠다는 생각중일 때, 학교 내의 알고리즘 장인 몇 명이 코딩테스트 스터디를 제안해서 시작한 스터디였다.

내가 실력이 제일 떨어지기 때문에 따라갈 수 있을까 주눅 들었는데 무대포로 따라가길 잘했다고 생각한다. 아직까지도 이 스터디 아니었으면 올 한해 중에 코딩 실력 키울 기회 거의 없었다고 생각한다.

스터디 GitHub Repo

PS문제를 개인적으로 입문하는 것은 어렵다. 지금도 늘 문제 풀 때마다 어렵다고 생각한다. 이 스터디에서 팀원들과 매주 주제와 분량을 정해두고 풀이 방법을 개별 발표 및 코드 리뷰를 하는 방식으로 공부했는데 서로 고민하는 시간도 많았고 끈질기게 접근했어서 혼자 공부하는 것보다 효과가 백배는 좋았다고 생각한다. 특히 입문자 입장에서 문제에 접근하는 방식을 많이 배울 수 있었다.

더불어 스터디 관리를 GitHub로 했기 때문에 git도 꾸준하게 익힐 수 있었어서 여러모로 많이 얻어 갈 수 있었던 스터디였다.

4달 정도 했었는데 당연하게도 꼭 좋은 점만 가득한 것은 아니었다. 개인적으로 많은 우여곡절도 있었다. 솔직하게 말하자면, 개인적으론 스터디 내에서 매주 정해둔 분량과 주제와는 별개로 진도가 빠르다고 느낀 것도 없지 않아 있었고 스터디 후반부에 갈 수록 약간의 매너리즘에 빠지기도 했었다. 나 같은 경우엔 스터디원들에 비해 개념적으로나 스킬적으로나 부족한 부분이 많아서 따로 개인 공부로 메꾸며 따라간 것도 있지만 개인적으로 겪는 문제점에 대해 팀원들에게 솔직한 커뮤니케이션이 부족하지 않았나 싶다.

다들 처음하는 그룹 스터디였기에 당연히 발생할 만한 문제기도 하고, 이를 밑바탕 삼아 추 후 다른 일들에도 개선점을 적용해나가면 된다고 생각한다.

첫 팀 프로젝트

이게 사실 가장 메인이 아닐까 한다.

대단하고 거창한 것을 만든 것은 아니지만, 개발을 처음해보는 사람들끼리 모여서 전공 수업에서 제시한 팀 프로젝트를 진행했다. 우리 팀의 주제는 전기차 충전소 현황 데이터를 따와서 이를 기반으로 지도기반 안드로이드 앱과 서버를 만들고자 하였다. 실제로 존재하는 앱을 프로토타입으로나마 클론코딩 하고자 했다.

코드 구현 상 내가 담당한 부분은 Backend를 담당했다. Client 개발을 담당했던 세 친구들에게 큰 감사함을 표하고 싶다.

팀플 GitHub Repo

코드 구현이 메인이 아닌 개발 프로세스 전 과정을 일련의 순서로 진행하는 방식으로 한 학기 내내 팀프로젝트 과제를 수행했는데, 프로젝트 계획서, 유스케이스, UML 모델링 등등 기존에 생각지도 못했던 것들을 배우며 만들어보고 교수님께서 제시하시는 방향에 맞춰 간단한 프로그램을 개발하였다.

조별로 주제를 선정해서 앱, 웹, Java Swing 등등 결과물을 제시할 수 있는 것으로 아무거나 자유롭게 만들되 완성품이 아닌 프로토타입으로 구현할 정도의 수준이고, 회원가입/로그인 기능은 반드시 구현해야 하며 조별 주제에 맞는 기능을 최소 1개 이상을 구현하면 된다고 하셨다.
(프로토 타입의 수준임은 학기 말에 가서야 처음 알았었다...)

어쩌다 팀장...

친한 동생들과 팀을 꾸려 시작했지만, 그래도 개발 관련 공부를 해본 사람은 나 뿐이었다. 결과물을 낼 수 없을까봐 내 개인적으로도 고민이 많았지만, 이 친구들은 더더욱 처음이라 나보다 더 고민이 많았을 것 같다. 그래도 팀의 분위기가 가장 중요하다고 생각하기 때문에 자신있게 주도하려 노력했다. 오히려 잘안되면 내가 더 공부하고 알려주면서 해야지 이것도 다 공부고 내 자산이 될거라는 생각이 컸다. 특히나 누군가를 리드하는 경험은 인생에서 꼭 겪어봐야 한다고 생각했기에 팀장을 맡았다.

한 학기동안 팀원 모두와 함께 너무 즐겁게 프로젝트를 진행하였습니다. 결과물과는 별개로 모든 순간 순간 속에서 놓여있는 문제들을 어떻게 해결해야 할지 다같이 끊임없이 고민하며 해결하였습니다. 제 개인적인 경험과 마찬가지로 학교의 모든 사람들이 공통적으로 프로그래밍 공부, 개발 공부를 하며 겪었던 문제는 처음 개발을 시작 할 때, 너무 거창한 것을 생각하며 '내가 못하면 어쩌지?', '어려워서 못할 거 같은데?'와 같이 두려움과 부담감이 앞서 실행 조차 하지 못한다는 것입니다. 이번 프로젝트에선 저도 처음 해 보는 것이 많았습니다. 그렇기에 이 문제 또한 겪었고 첫 발걸음이 어렵다는 것을 가장 잘 느끼고 있었던 터라 팀장으로서 개발 경험이 없는 팀원들에게 어떻게 자신감을 불어 넣어줘야 할 지, 제가 알고있는 지식들을 팀원들에게 어떻게 이해하기 쉽게 설명해가며 프로젝트를 진행해야 할 지에 관한 고민이 많았습니다. 하지만 이런 고민이 무색할 정도로 모두가 한 마음 한 뜻으로 각자 책임감이 앞서 의욕있게 프로젝트를 진행하였다는 점이 제 개인적으로는 가장 놀라웠습니다. 팀원들 각자가 스스로 어려움에 처해 있을 때는 '내가 이 부분은 잘 못하지만, 어떤 자료를 찾아 공부해보고 코드를 작성해보고 프로젝트에 적용 해야 할까?' 라는 질문들을 통해 제게 부담 없이 눈치보지 않고 도움을 요청해주었기 때문에 너무 감사했고 이렇기 때문에 팀원 개개인의 성장 곡선이 빠르다고 느꼈습니다. 팀원들의 이런 자세 덕에 저 또한 힘이 되어 더 열심히 할 수 있었습니다. 학교 다니면서 개인적으로 좋은 결과들을 많이 만들어보고, 다양한 경험들이 많았지만 이번 프로젝트는 제게 그 무엇보다도 가장 의미있고 오래오래 기억에 남을 정도로 최고의 경험이었다고 생각합니다.

'프로젝트 팀원 상호 평가에 작성했던 내 글 中'

시간이 나면 함께 자라기 라는 책을 읽어보고 싶다.

Spring 적용

어쨌든 가장 중요한 문제인 기술적인 문제다. Spring을 '공부'만 하고 있었지 이를 써먹은 건 이번이 처음이다. 첫 개발이다 보니 부담감도 심했고 이렇게 하는게 맞나 의심스러울 때가 많았다.
특히나 단순히 클라이언트 쪽이 웹 프론트엔드거나 스프링 서버에서 thymeleaf 같은 템플릿 엔진을 사용해서 view까지 처리하는 방식이 아니라 안드로이드 앱을 클라이언트로 사용했기 때문에 굉장히 낯설었다. 그래서 그런지 개인적으로 멍청한 의문도 많았었다. 'Http로 통신하는 건데 내가 알고있는 웹의 방식이랑 지금 하고있듯 앱의 통신방식이 같은건가?'부터 시작한 미친소리들을 혼자 해대곤 했지...

서버는 view를 제외하여 API를 클라이언트에게 제공하는 역할로 나누고 JSON 방식으로 통신하도록 구현했다. 구현한 기능 상 연관관계 매핑을 적용할 수준은 아니고 단순히 테이블이 2개밖에 되진 않아 쉽게 공부할 예제코드라 생각하기도 했고 Spring Data JPA를 사용해서 이에 대한 기본적인 매커니즘을 익혀볼 수 있었다.

추가로 공부하며 개선해야 할 문제점들

  • 교수님이 JUnit 테스트코드까지 과제 사항으로 요구하셔서 TDD도 해보긴 했는데 내가 짠 방식이 맞나 싶다.
  • 향 후 충전소 리뷰작성 기능 구현을 생각하면 로그인/회원가입 기능을 구현할 때 Cookie/Session 방식으로 구현했어야 하는데 시간에 쫓겨 Http Status Code가지고 눈속임을 했다.
    (이 부분은 공부가 필요하다.)
  • 유효성 검사를 하고자 javax.validation.Validator에서 제공하는 @Valid를 사용했는데, ExceptionHandling을 구현해서 처리할 때, 원하는 방식이 아닌 경우가 있었다.

// 해당 issue

// 해당 코드의 일부는 다음과 같다.

@RestController
@ControllerAdvice // 전역 설정을 위한 annotation
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    /**
     * @Valid 또는 @Validated 를 사용하여 유효성 검사를 하게 되면, 모든 예외 처리보다 우선순위가 높은데
     * 이 상황에서 MethodArgumentNotValidException 을 커스텀으로 처리하고자 하면
     * Bean Creation Exception 이 발생하거나 default로 설정된 500 Internal Server Error가 상태코드로 지정됨.
     * 이런 문제를 피하고자 500 Internal Server Error 대신 default error 를 400 Bad Request 로 처리하였음.
     * (handleAllExceptions 에서 전역 에러 핸들링이 발생함)
     */
    // 현재 시스템에서 대부분의 에러는 입력값에 대한 클라이언트 에러만 발생할 수 밖에 없는 구조라서 다음과 같이 전역 처리를 함.
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        ExceptionResponse exceptionResponse =
                new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));

        return new ResponseEntity<>(exceptionResponse, HttpStatus.BAD_REQUEST);
    }
  • 교수님 요구사항은 아니지만 개인적으로 만족스럽지 못했던 것은 Spring 프로젝트를 dockerfile로 push한 결과를 aws ec2에서 pull, run 할 때 'docker unable to access jar file' 오류 떠서 클라우드 서버 배포 없이 그냥 제출했던 문제.

프로젝트 하다 겪은 대부분의 문제들은 며칠 고민하다 뜬금없는 곳에서 해결점을 찾아 해결하곤 했었다. 아마 여기 서술한 문제점들도 내가 point를 잘못 잡아 해결하지 못한 것들도 있을 것이라고 본다.

이번 팀프로젝트가 아니었다면 Spring을 어떻게 써먹을지 깨달으며 성장할 기회는 찾기 힘들었을거라 생각한다. 자꾸 부딪히며 성장해야겠다.

교내 활동

1학기 과탑


전공도 필요한 것만 여유있게 들으며 선택과 집중을 했는데 운이 좋아 얻은 결과였다. 학점이 중요하단 생각은 없어서 그 이상도 그 이하도 아니라는 생각이지만, 예상밖의 결과라 잠깐의 자랑만 하고 넘어갈 생각이다. 아직도 부족한게 많은 사람이라 더더욱 겸손해져야지.

교내 프로그래밍 튜터

컴공과 학생임에도 개인적인 사정으로 집에 컴퓨터도 없이 2학년 1학기까지 다녔던 정도로 남들보다 코딩을 많이 하지 못했다. 1, 2학년 때는 고학년이 됐을 때 나도 이런 것을 할 수 있을거란 생각도 못했었는데 나도 모르게 어느 순간 폭풍성장을 하긴 했구나 싶다.
큰 활동을 한 것은 아니지만 학술 동아리를 운영하면서 동아리 내에서도 후배들 질문에 답해주곤 했지만 이번 2학기 동안은 교내에서 정식으로 후배들을 가르쳐주며 용돈 벌이를 했다.

누군가를 가르쳐주면서 공부가 되는 것도 분명하지만, 늘 이 활동을 하며 느낀점은 내 스스로도 기본기를 다듬고 쌓는 것이 가장 중요하다는 것이었다.

당연하다고 생각되는 것을 시원하게 답해 줄 수 없다면 그 지식은 완벽한 내 것이 아니다. 특히나 그게 기본기라면 더 중요한 문제라고 생각한다. 내 스스로도 부족한 점을 꾸준하게 찾으며 보완해야 겠다.

Epilogue

2021.12.12-전남 화순군 이서면 별사진

// 2021.12.12 - 전남 화순군 이서면에서 별구경

늘 열심히 살고자 노력은 하지만, 내 능력에 대해 확신을 갖고 살진 않았다. 어쩌면 나도 모르는 포텐셜을 무시한 채 한계치라는 것을 정해놓고 살았나보다. 아직도 갈 길이 멀지만 아무것도 모른채 시작한 첫 1년이다보니 너무 보수적인 자세가 아니었나 싶었다.

개발이라는 생태계 내에서 엄청난 사람들이 많다는 것을 늘 느껴왔고 스스로 매번 뒤쳐지는 것은 아닐까 고민했던 적이 많았다. 지금도 이 고민이 없진 않다. 개발공부를 처음 시작했을 때는 프론트도 잘하고 백엔드도 잘하고 다양한 언어도 다룰 줄 아는 사람들이 신기해보이며 넘사벽처럼 느꼈었고 더 나아가 이 글에 언급하지 않은 내용인 알고리즘 대회에 참가했을 때나 해커톤에 참가했을 때 본 사람들을 생각하면 한 번씩 주눅들게 된다.

근데 그건 그거고, 올 한 해동안 이것 저것 겪어보며 바뀐 마음가짐은 남들과 경쟁하며 비교하는 것을 초점 잡지 말고 내 자신과 경쟁하며 스스로 더 솔직한 자세로 나아가야겠단 생각이 크다. 사람 일이 모두 그렇듯이 시작점이나 환경이 다른 것에서 비롯한 내가 컨트롤 할 수 없는 문제들은 어쨌든 언젠가 해결하게 될 각기 다른 개개인의 타이밍이라는 것이 분명히 온다. 이와 별개로 스스로 컨트롤 할 수 있는 문제는 지식이나 실력을 쌓는 문제라고 생각하는데 이는 조급하게 생각말고 마라톤 뛰듯 꾸준하고 묵묵하게 대처하면 늘게 되고 해결할 수 있다고 믿는다.

작년엔 늘 갖고 살던 멘탈적인 문제가 유난히 심했는데 어느 순간부터 이런 마인드로 살다보니 주위에서 내게 하는 말들은 많이 건강해진 모습이라고 한다. 내 스스로 느끼며 변화 한 것도 있지만, 무엇보다 곁에서 든든하게 서포트 해주는 소중한 사람들이 있었기에 행복했던 한 해를 보내지 않았나 생각하며 끝으로 감사의 표시를 하며 마무리 짓고자 한다.

새 해에도 행복하게 코딩하며 살자.

(조만간 새해 프로젝트로 시작할 개발 소모임도 잘 되길 기원한다.)

profile
Step by step goes a long way.
post-custom-banner

0개의 댓글