ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [우아한테크코스 5기] 2주차 후기
    백엔드/우아한테크코스 5기 2023. 2. 20. 01:00
    반응형

     

    기간 : 2023/02/13 (월) ~ 2023/02/19 (일)

     

    저번주 일요일부터 ChatGPT에게 CS 지식에 대해 궁금한 점을 물어보며 유용하게 사용하고 있다. ChatGPT 성능이 이정도이면 GPT-4의 활용 용도는 얼마나 넓어질지 궁금해진다. 빨리 변수, 메서드, 클래스 이름을 자동으로 추천해주는 언어 모델이나 만들어졌으면 좋겠다.

     

    요즘 가고 싶은 기업이 바뀌었다. 출퇴근마다 너무 피곤해서 나중에 취업을 하게 된다면 재택근무하는 회사에 들어가고 싶어졌다. 그게 아니면 지하철을 최대한 타지 않고 충분히 회사에 도착할 수 있는 거리로 이사를 하거나.. 경의중앙선 저녁 시간 지하철보다 더 심하다.

     

    알고리즘 대회 스태프로 참여하게 됐다. 반년전만 하더라도 대회에 참가해서 수상 목표로 달리고 싶었다. 그래서 교수님 말씀대로 문자열 알고리즘을 열심히 공부했었는데, 알고리즘 공부에 손을 놓아버려서 다른 사람에게 자리를 양보하는게 좋아보였다. 그리고 교내 대회는 내가 규칙으로 정하고 싶으면 그게 전부 규칙이 되어서 뭔가 근본 없어보였는데, 학교 밖의 대회는 어떻게 체계적으로 돌아갈지 궁금하기도 했다 ㅋㅋ

     

     

     

    1. [온보딩] 연극, 자동차 경주 미션

     

    온보딩 조원들 다들 너무 잘 열심히 참여해서 재밌게 끝난 것 같다. 우테코를 시작한지 이제서야 2주차가 지났는데, 월요일에 온보딩 조가 끝났다는게 믿겨지지 않는다. 벌써 두세달은 지난 느낌이다. 좋게 말하면 매주마다 내 실력이 눈에 띄게 크게 상승하고 있다는게 체감이 되지만, 나쁘게 말하면 시간이 너무 안간다.

     

    코드 리뷰에서 두 개의 리뷰가 정말 반영하기 힘들었다.

    - 도메인 안에서 예외를 던질 때, 예외 안에 적혀 있는 에러 메시지는 진짜 도메인이 알아야하는 내용일까?

    - 에러 메시지로 다국어를 지원한다면 어떻게 코드를 작성해야할까?

     

    며칠동안 고민을 해보고 거의 포기할 때쯤에 노란 회사 신입 온보딩에서 우테코랑 비슷하게 진행하는 것이 생각났다. 그래서 지푸라기를 잡는 심정으로 지인 찬스를 사용했는데, 여기서 스프링에서는 HandlerException라는 것을 사용한다는 키워드를 알아냈다. 그렇게 찾아보고 있던 와중에 ResponseEntityExceptionHandler를 발견했는데, 추상 클래스를 사용하고 있고, 안의 특정 메서드는 오버라이딩하여 원하는 예외 메시지를 전송하는 듯한 느낌을 받았다. 그래서 이런 추상화와 다형성을 미션에 적용하면 문제를 해결할 수 있지 않을까라고 생각했고, 적용을 해보니 술술 풀려서 리뷰어가 원했던 정답 방향에 근접한 느낌이 들었다.

     

    예외 처리 구조에 대해서 링크로 주신 ResponseEntityExceptionHandler의 처리 방식이 제가 의도했던 방향과 비슷한 것 같습니다.
    에러 코드와 메세지를 맵에 담아서 노출하는 부분까지 바랐던것은 아니구요, 도메인이 뷰로직을 의존하지 않고, 뷰가 도메인에 맞게 동작하도록 의존의 방향을 바꾸는 것이 전달드리고 싶었던 내용입니다.
    위와 같은 의존을 갖게 되었을때 어떤 장점이 있는지 충분히 이해하신 후에 다음 미션에 적용하셨으면 좋겠습니다.

    객체지향 서적을 처음 보기 시작한지 한달만에 이걸 해내다니.. 엄청난 발전이다. 의존의 방향을 바꿀 경우 MVC 패턴 위반이 되지만 책임 분리가 명확히 된다는 장점을 가질 수 있을 것 같다.

     

    집에와서 유튜브를 보는데 백기선님의 영상이 알고리즘을 통해 최상단에 나왔다. (https://youtu.be/bJfbPWEMj_c)

    영상 내용은 대충 스프링을 제대로 공부한 사람은 PSA(Portable Service Abstraction)를 알고 있어야 한다는 것이었다. 그런데 문제 해결 방법이 뭔가 우테코 미션에 나오는 내용이랑 비슷했다. 자동차 경주 미션에서 중요하게 생각하는 점은 '랜덤값으로 인해 테스트하기 힘든 객체를 어떻게 테스트를 할 것이냐?' 였고, 이 방법중에 하나는 전략 패턴을 적용하는 것이었다.

    운이 좋게도 위 영상에서의 질문은 'Mocking을 사용하지 않고서, 테스트하기 힘든 객체를 어떻게 테스트 가능한 코드로 만들 수 있을까?'였다. 이 영상에서도 전략 패턴을 사용하여 추상화를 얻는 방법을 적용한다. 이걸 깨닫고 나서 우테코가 스프링을 더 근본있게 배우기 위한 빌드업으로 이런 미션을 한게 않을까라는 생각이 들었다. 미션의 핵심을 파악한 느낌?

     

     

     

     

     

    2. 레벨 1 - 사다리 타기 미션

    페어인 다즐과 함께하게 되었다. 이번엔 다즐과 많은 이야기를 나누면서 진행을 하게 됐다. 모든 기능에 대해 하나하나 이야기를 하니까 들인 시간에 비해 진도가 매우 느린 느낌이 들었다. 하지만 실력 상승을 하는데 더할 나위없이 좋았다. 내가 이런 메서드를 만드는 이유, 내가 이런 코드를 작성하는 이유에 대해서 계속 근거를 말해야 하니까 코딩은 내가 설계하는 것을 표현하는 도구이지, 도구에 매몰되면 안된다는 생각이 많이 들었다. 다즐이 꼼꼼하게 잘 알려줘서 나중에 팀프로젝트를 같이하면 정말 좋겠다는 생각이 들었다.

    1단계 미션은 페어와 TDD를 진행하는 것이었다. 페어프로그래밍만 하더라도 오래 걸리는데, TDD로 인해 거의 2배나 많은 시간이 걸렸지만, SRP가 최대한 지켜진 느낌이 들었고, 나중에 확인해보니 테스트 커버리지가 전략 패턴을 제외한 코드 빼면 100%였었다. 이거는 안만드는줄 알았는데 이것도 만들어야 한다고 해서 다음주에 만들 예정이다.

     

    다즐에게 배운 점은 아래와 같다. 딱 내가 당장 부족했다고 느낀 점을 다즐은 잘 알고 있어서 도움을 많이 받았다.

    - stream api, junit 기능을 바로바로 적용하고, 이것과 관련된 전혀 못봤던 기능도 새롭게 알게되었다.

    - 당장 필요한게 무엇인지 바로바로 캐치하는 것 같다.

    - 변수 이름, 메서드 이름에 대한 피드백을 잘해준다.

     

    사다리 타기 미션을 하며 어찌보면 개발에 나오는 문제 해결 과정이 알고리즘에 요구하는 능력과 비슷하다는 느낌을 받았다. 왜냐하면 사다리 타기의 사다리를 구현한다면 위에서 아래로만 생각을 했는데, 다즐이 가로줄을 연속으로 생성하지 말아야하니 사다리를 위에서 아래로 생성하는게 아니라, 왼쪽에서 오른쪽으로 생성한다는 관점으로 만든다면 코드를 깔끔하게 만들 수 있다는 내용이였다. 이걸 보니 마치 BOJ 3109 빵집 문제가 바로 떠올랐다. 지문만 보면 그래프 이론만 적용해야하는 문제로 보이지만, 생각해보면 메인 풀이는 그리디 알고리즘으로 접근해야하는 문제이다. 거기다가 사다리 가로줄을 생성하는 것도 재귀함수를 이용해서 만들었는데, 생각보다 이번 미션에 알고리즘적 요소를 많이 적용하게 됐다.

     

     

    3. 효율적인 공부하기, 레벨 1 목표

    어떻게하면 효율적으로 공부할 수 있을까?

    레벨 1에서는 자바와 객체지향에 대해 배우는데 어디까지 공부해야 적당하게 잘 공부했는지 고민을 많이 했다.

    일단 스프링을 배우기 전에 자바와 객체지향은 굉장히 중요한 개념이다. 특히 스프링은 객체지향의 꽃인 다형성을 최대한 적용한 프레임워크이기 때문에 객체지향에 대한 개념, 특히 다형성에 대한 내용을 내가 자연스럽게 꺼내서 활용할 수 있어야 한다고 생각한다. 그러면 일단 객체지향 지식을 레벨 1 안에 최대한 많이 공부해야한다.

    그다음은 자바에 대해 생각을 해보았다. 자바는 이펙티브 자바 내용이 나온다면 리뷰어분들이 책 이름과 같이 언급하고 있고, 책 언급을 하지 않더라도 은연중에 내포하고 있다는 것을 찾았다. 그래서 우테코 내내 계속 코드 리뷰를 받을텐데 굳이 여기에 시간을 투자해야하나라는 생각이 많이 들었다. 리뷰를 통해 피드백을 받으면 그 부분에 대해서는 충분히 숙지하고 적용하는 방법이 제일 좋아보인다. 그 이상으로는 내가 책을 보면서까지 공부해야하는 타당한 이유를 못찾았다.

     

    레벨 1을 진행하며 공부할 서적/강의 (🟩 완료, 🟨 진행중, 🟥 시작하지 않음)

    - 🟩 [자바] 자바의 정석

    - 🟨 [자바, 스프링]스프링 입문을 위한 자바 객체 지향의 원리와 이해

    - 🟥 [스프링] 스프링5 프로그래밍 입문

    - 🟥 [스프링] 김영한 스프링 기초

    - 🟥 [운영체제] 반효경 - 운영체제

     

    자바 공부로는 자바의 정석을 2회독하는 느낌으로 따로 공부해볼만한 키워드를 기록해놨어서 여기에 대해 포스팅을 할 예정이다. 이거 하면 자바 공부는 끝?

     

     

    4. 새롭게 알게된 점

    - IntelliJ 단축키에 대해 또 새로운 내용을 알게 됐다. 이제 마우스를 드래그하고, 클릭해서 사용하는 일의 50% 정도를 키보드만을 활용해서 사용하는 느낌이 든다.

     

    - 복잡한 문제는 추상화와 다형성을 통해 해결할 수 있는 경우가 많은 느낌이다. 추상화와 다형성에 대한 연습이 많이 필요하는 생각이 들었다.

     

    - 오버엔지니어링이란 현재 요구사항보다는 아직 불확실한 미래의 기능에 초점을 맞춰서 설계를 하고, 코드를 작성하는 것이다. 적당한 엔지니어링이란 현재 요구사항에 초점을 맞추면서 미래에 기능이 추가될 경우 수정할 내용을 최소화하도록 가능성을 열어두어 설계하는 것이다.

     

    - 자바의 정석을 읽으며 새롭게 알게 된 내용이 많았다.

     

     

    5. 다음주 공부할 내용

    - 가끔가다 보는 리뷰인데,stream을 왜 사용하는지에 대한 이유를 말할 수 있는지 궁금한 리뷰어분들이 있는 것 같다. 나는 stream을 사용한다면 가독성이 좋다는 생각만 가지고 있었는데 더 찾아보는게 좋을 것 같다.

    반응형

    댓글

Designed by Tistory.