우테코 7기 백엔드 과정 지원
이번에 우테코 7기 백엔드 과정을 지원했다. 사실 작년에 지원해보려고 했었는데 군대를 막 전역했기도 했고 머리속에 아무런 지식이 없었기 때문에 지원을 하지 않았다.
🍀성장로그
이제 계속 주차별 미션을 진행하면서 어떤 것을 배웠고 어떤 부분에서 막혔으며 왜 이렇게 했는지 등등의 내가 생각 했던 것들 위주로 글을 작성해보려고 한다. 글을 잘 못쓰기도 하고 난잡해 보이기도 할텐데 프리코스 기간동안 내가 어떤것을 배웠고 느꼈는지 합, 불에 상관없이 나의 성장 로그를 남겨보자는 취지로 일기? 느낌으로 적어보려고 한다.
10월 15일~16일 (화,수)
프리코스 1주차 미션이 공개되었다. 매우 간단한 내용에 미션이었다.
학습 목표는 Git, Github, IDE등 실제 개발을 위한 환경에 익숙해지기 였다. 사실 미션 자체는 너무 간단했다. 그냥 문자열에서 숫자를 뽑아 덧셈하는 문제로 기본 구분자(, :)와 커스텀 구분자를 만들어 사용할 수 있었다.
우선 나는 세부 요구사항을 정리한 README 문서를 만들었다. 어떤 기능을 구현해야하는지를 위주로 작성하려고 했고, 처음에는 막막했지만 과거 선배(?)들의 기록들을 보면서 나만의 언어로 문서를 작성해보려고 노력했다.
🚀오늘 한 작업
대충 코드 끄적끄적 해보다가 한글이 콘솔에 출력이 안되는 문제가 발생했다. UTF-8 파일 인코딩 등의 설정을 해봤지만 되지 않았다. 정말 예상치 못한 곳에서 시간을 너무 쏟았다. 제어판 -> 시계 및 국가 -> 국가 또는 지역 -> 관리자 옵션 -> 시스템 로캘 변경 -> Unicode UTF-8 사용 체크하니 해결이 되었다 휴…😒
일단 요구사항을 다 작성하고 구현에 들어갔는데 기존 선배님들의 코드들을 보면 패키지 구조를 있어보이게? 잘 짜여졌다는 느낌을 받았다. 하지만 나의 상태는 첫번째 과연 이런 간단한 과제에서 저런 복잡한 구조를 짜야할까?와 두번째 간단한 과제이지만 익숙해지려면 저렇게 짜야겠다 라는 생각이 공존했다. 그래서 코딩을 하면서 어떻게 역할 책임으로 분리 할 수 있을까? 어떻게 더 객체 지향적으로 짜지? -> 그냥 돌아가는 코드 만들자 의 반복으로 인해 너무 더디게 코딩을 하고 있었다. (중간에 갈아 없기도 했다.) 나의 상태를 진지하게 점검해 볼 필요가 있었다. 잘 알지도 못하면서 어설프게 따라서 구현하는건 아무리 생각해도 적절치 않았다. 이분은 왜 이렇게 짰는지를 알 수 없었고, 나의 나름대로 분석을 해봐도 잘 모르는건 마찬가지였다. 그래서 일단은 돌아가는 코드를 짜되 리팩토링에 신경을 써서 읽기 좋은 코드로 만들어보자를 목표로 잡았다. 추후 더 공부해서 주차가 거듭될 수 록 이 구조의 필요성을 느끼고 자연스럽게 적용해보자 라고 생각하게 되었다.
일단 구현을 해 나갈 때 성공 시나리오를 미리 적어본다
1 |
|
이렇게 하면 어느 정도 어떻게 구현해야 할지 갈피를 잡을 수 있다. 그리고 일단 돌아가는 코드를 짜본다. 그다음 역할을 기준으로 나눠본다.
1 |
|
그 다음 각각의 클래스에서 구체적으로 어떤 로직을 수행 해야 하는지를 적어본다. 추가로 예외가 발생할 수 있는 상황들을 고려해서 작성한다.
1 |
|
1 |
|
1 |
|
이렇게 적고 개발에 들어갔다. 당연히 순조롭게 개발을 할 수 있었고 모두 개발이 완료되었다.
😶🌫️오늘 공부한 내용
Java 문자열 자르기
Split()
1 |
|
- 정규식으로 문자열 패턴을 받고, 이 패턴을 기준으로 문자열을 잘른다
- limit은 몇개 이하로 나눌건지에 대한 것이다.
예를 들어
1 |
|
이런식으로 사용할 수 있다.
Trim() - 공백 제거
1 |
|
특정 문자 안에 있는 내용 제거
1 |
|
- 정규식을 사용하여 괄호안에 있는 문자열을 ““로 대체 한것이다.
특정 문자 안에 있는 내용 추출하기
1 |
|
이번 과제에서도 이 추출하는 부분이 필요했는데 나는
1 |
|
🥲공부 할 내용
- 디자인 패턴 공부의 필요성을 느꼈다.
- 다른 사람들의 코드를 보면서 공부를 하다 보면 꽤 복잡해보이는 패키지 구조를 사용하는데 아직 관련 지식이 부족하여 눈에 들어오지 않는다.
10월 17일 (목)
16일에 시험이 있었는데 15일에 요구사항 분석하고 코딩하랴 셤 공부하랴 시간조절을 못해서 날밤을 공부만 하다보니 집와서 기절을 해버렸다.
오늘은 논리적으로 안맞었던 부분들과 테스트 코드 작성을 했다.
🚀오늘 한 작업
요구사항중에 이런 문장이 있다. 나는 처음에 커스텀 구분자를 지정하면 커스텀 구분자’만’을 이용하여 숫자를 구분한다고 생각하여 커스텀 구분자를 추출하여 그걸 바로 이용했다.
1 |
|
하지만 테스트 코드를 작성중 기본 구분자와 커스텀 구분자를 같이 사용한다면?
이라는 생각을 하게 되었고, 기본 구분자는 말그대로 ‘디폴트’ 당연히 포함되어야 하는게 맞는것 같다는 생각이 들었다.
1 |
|
그래서 기본 구분자와 커스텀 구분자와 합쳐서 반환하는 방식으로 변경을 했다.
😶🌫️오늘 공부한 내용
예외 상황 테스트
예상한 예외가 발생하는지 테스트 하기 위해서는 여러 방법이 있으나 좀더 가독성이 좋은assertThatThrownBy에 대해 알아봤다.
1 |
|
이런식으로 사용할 수 있다. assertThatThrownBy()안에 람다식으로 예외가 발생하는 함수를 넣고 .isInstanceOf()
에 예상하는 예외 넣으면 된다.
🥲공부 할 내용
- 과거 선배님들의 코드 분석
- 과거 우테코를 거치신 선배님들의 코드들을 보면 코드 리뷰가 달려있고 거기서 얻을 수 있는 내용이 많았다.
- 일급 컬렉션 공부
- 지금 나의 코드는 문자열에서 숫자를 뽑은 값을 단순히 리스트로만 저장하고 있는데 그래서 일급 컬렉션으로 바꿔서 의미도 부여하고 안에서 처리할 수 있는 로직들을 추가 할 수 있기 때문에 조금더 구조적으로 바뀔것 같아 다시 공부를 해보고 리팩토링 해봐야겠다.
10월 18일 (금)
오늘은 미리 학교 시험 공부를 좀 해두고 선배님들의 코드 분석과 일급 컬렉션 공부를 하고 적용을 해봤다.
🚀오늘 한 작업
1 |
|
1 |
|
1 |
|
이런식으로 딱히 구조 생각을 하지 않고 기능단위로 클래스 나눠서 작성을 했었다.
근데 대부분의 우테코 합격 선배들의 코드를 분석한 결과
1 |
|
거의 대부분이 이런식이거나 여기서 조금 변형된 구조였다. 흐름은 보면
1 |
|
이런식이다. 이런 구조를 Layered Architecture라고 부른다고 한다.
이 블로그에서 아주 자세히 설명이 되어있다. [아키텍쳐] Layered Architecture란? (feat. 자동차 경주 미션 예시) (tistory.com)
가장 핵심은 관심사의 분리를 달성하기 위해 레이어로 나눈것이고 이는 각 계층의 응집도를 높이고 - 하나의 모듈이나 클래스가 단일하고 잘 정의된 목적을 가진다 - 관련된 기능들을 함께 그룹화 한다 - 모듈 내부의 요소들이 서로 밀접하게 연관되어 있어야 한다. 결합도를 낮춰서 - 모듈 간의 의존성을 최소화 - 각 모듈이 독립적으로 작동할 수 있도록 한다. - 한 모듈의 변경이 다른 모듈에 미치는 영향을 줄인다
애플리케이션의 재사용성과 유지보수성을 높이기 위해서 사용된다고 한다. (controller 레이어는 domain 레이어에 대해 알지못하고 service 레이어만 알고 있는 상태(의존) )
Controller는 service를 의존하도록하였고
1 |
|
Sevice도 domain만 의존하도록 구현을 하였다.
1 |
|
기존에 IntegersExtractor.class가 하던 역할을 SplitNumbers라는 일급컬렉션에게 주어 Split된 숫자 리스트를 가지도록 구현을 했다.
1 |
|
이렇게 구조를 개선했더니 각각의 계층이 어떤 역할을 하는지 한눈에 보여 알아보기 쉽게 되었다.
😶🌫️오늘 공부한 내용
일급컬렉션
일급이라는 의미는 다른 요소에게 사용 가능한 모든 연산을 지원하는 요소를 말하는데 여기서 사용가능한 모든 연산이라는건
- 변수로 할당될 수 있다.
- 파라미터로 전달될 수 있다
- 함수의 결과로 반환될 수 있다. 이런 것들을 의미한다.
그래서 일급 컬렉션은 이런 연산이 가능한 컬렉션이다 라는 의미이다.
일급 컬렉션의 특징은
- 컬렉션을 포장하면서 컬렉션만을 유일하게 필드로 가는 객체로
- 컬렉션을 다른 객체와 동등한 레벨로 다룰 수 있게 된다.
- 컬렉션을 추상화 하여 의미를 담을 수 있고, 가공 로직의 보금자리가 생긴다.
- 이 컬렉션에 대해 다양한 로직들을 추가 할 수 있다
- 만약 getter로 컬렉션을 반환할 일이 생긴다면, 외부 조작을 피하기 위해 새로운 컬렉션으로 만들어서 반환해줘야한다.
- 만약 그냥 반환한다면 외부에서 이를 변경하게 되는 일이 생길 수 있다.
🥲공부 할 내용
- 오브젝트 책 공부
- 간단한 이번주 문제 같은 경우에는 쉽게 할 수 있었지만 앞으로 남은 주차동안 나오는 미션은 정말 어려워 질 것으로 예상되기 때문에 복잡한 객체를 만들어야 하는 상황이 생기기 때문에 미리 공부를 시작해봐야겠다.
- java8 lamda식 공부
- 모던 자바 인 액션이라는 책을 다시 봐야겠다. 직접 코딩을 하려니 즉각적으로 나오지 않고 찾아보게 되어서 공부할 필요성을 느꼈다.
10월 22일 (화)
🚀1주차 후기
두근두근 했던 우테코 프리코스 1주차가 끝이 났습니다. 과제를 처음 봤을 때 첫인상은 오잉? 그냥 백준에서 나올법한 문제다 너무 간단한 문자열 자르기 아닌가? 라고 생각을 했었습니다. 근데 자꾸 구현을 하면서도 방향을 잃더라구요 생각보다 구현을 하면서 가지가 너무 많이 있었고 줄기를 계속 이어나가고 나중에 가지를 쳤어야 했는데 그렇지 못했던것 같습니다. 다음주차 때는 요구사항의 굵직한 흐름을 기반으로 줄기를 먼저 구현하고 리팩토링하면서 가지를 쳐봐야겠습니다.
처음 디스코드에 들어가서 인사말을 나누고 여러분들이 올려주신 내용들도 보면서 내가 부족한 부분이 뭔지 고민을 했던 한주였던것 같습니다. 근데 뭔가 답답한 기분이 드네요. 제 스스로를 점검 해보자면 이상과 현실의 괴리?라고 할까 제가 너무 이상이 높은것 같습니다. 그래서 과제를 하든 공부를 하든 뭐를 하든 이상만 높고 노력과 실력은 그에 못 미치니 마음만 급해지고, 다시 힘들어하고의 반복인것 같네요..
우테코 지원 서류 1번 문항을 적을 때 나는 어떤 사람인가를 고민을 많이 했습니다. 다시 그 글을 보니 저는 실패에 대한 불안감과 거절 되었을 떄의 불안감이 있어서 코드리뷰를 요청한다던지 리뷰를 한다던지 비교적 소극적인것 같습니다. 하지만 용기를 내서 몇번의 구애를 했지만 단 하나의 리뷰도 받지를 못했네요;;;
제 코드입니다. 리뷰해주실분…. ㅋㅋㅋ 1주차 코드
하지만 저는 3번 프리코스 목표 설정 문항에서 겁도 없이 자극이 되어주는 사람이 목표다라고 했습니다. ㅋㅋㅋㅋ 일단 계속 구애를 해보려고 합니다. 되든 안되든요. 저는 제 코드가 잘짜였다고는 생각하지만 뭔가 스킵 할만한 코드는 아닐거라고 생각하는데 ㅠㅠㅠ
프리코스 과정자체가 이런 난관(?)을 극복해 나가는 기회가 되겠지라고 생각하려고 합니다. 다음 미션은 자동차 경주 미션인데 열심히 공부하고 구현해서 다음주차에는 많은 리뷰를 받고 해봐야겠습니다. 한가지 걸리는건 아직 시험이 너무 많이 남았다는거… 두마리 토끼를 잡고 싶은데 힘드네요