개발공부/부스트캠프

[부스트캠프] 6주차. 공부도 했지만 딴짓도 했지요!

장아장 2023. 10. 15. 16:09

솔직히 이기적일 수 있지만, 혼자 다른 공부를 엄청하긴 했다...ㅋㅋㅋㅋ

6주차에는 5주차 과제에서 조금 더 수정하는 부분들이 많긴 했다. 

자세하게 어떤 부분을 했다고 이야기할 순 없기에, 조금 추상화 시켜야겠다. 

(백엔드 특 : 추상화, 객체지향 개좋아함)


조금 더 객체지향적이게?

부스트캠프의 과제가 정확히 무엇인지 이야기할 순 없다. 하지만 비슷한 예시를 들어보자. 

class Sentence {

    nouns:string[];
    verbs:string[];

    constructor(inputString:string) {
        inputString.split(" ").forEach(words => {
            //띄어쓰기로 나눈 단어들을 의미에 따라 인스턴스 배열에 넣는다. 
        })
    }
}

이런 코드가 있다고 생각해보자. 

여기에서 Sentence라는 객체를 만들어두고, 이 부분에서 각 배열을 가져온 후 이를 사용한다고 하면, 객체지향적일까? 

자바를 공부하던 나에게, 각 단어들이 자기가 할 일을 하고, 단어의 배열들이 할 일을 하게 하는 것이 더 좋은데

나는 왜 이런 똥을 쌌을까 라는 생각도 들었다. 

 

이런 부분들의 코드를 약간만 손보자는 생각으로 했다. 

 

const WORD_TYPE = {
    NOUN:"noun",
    VERB:"verb"
}

사용해야 할 enum을 구현한 후, 

interface Word {
    getType():string;
    getWord():string;
}

class Words {

    private words:Word[]

    getWords():Word[] {
        return this.words;
    }

    getType():string {
        throw new Error("not extended!");
    }

    addWord(word:Word):void {
        this.words.push(word);
    }
}

추상화 시킬 부분들을 만들어두고, 

class Noun implements Word {

    private word:string;

    constructor(word:string) {
        this.word = word;
    }

    getType() {
        return WORD_TYPE.NOUN;
    }

    getWord() {
        return this.word;
    }
}

class Verb implements Word {

    private word:string;

    constructor(word:string) {
        this.word = word;
    }

    getType() {
        return WORD_TYPE.VERB;
    }

    getWord() {
        return this.word;
    }
}

class Nouns extends Words {

    constructor(){
        super();
    }
    getType():string {
        return WORD_TYPE.NOUN;
    }
}

class Verbs extends Words {

    constructor(){
        super();
    }
    getType():string {
        return WORD_TYPE.VERB;
    }
}

추상화된 부분들을 구체화 시킨 뒤, 

class Sentence {

    nouns:Nouns
    verbs:Verbs

    constructor(inputString:string) {
        inputString.split(" ").forEach(words => {
            //띄어쓰기로 나눈 단어들을 의미에 따라 인스턴스 배열에 넣는다. 
        })
    }
}

이를 기존 코드에 집어넣는 식으로 리펙토링 했다. 

 

생산적인 부분에서 빠르게 구현이 되지 않지만, 좋은 점도 있었다. 

예를 들어, 

형용사, 부사도 파싱해서 따로 사용할 수 있게 해주세요

라는 요청이 온다면, 여기에서 Adverbs, Adjectives라는 컬렉션 객체와, 이에 대한 객체를 만들고 집어넣어주면 끝이다. 

과제 구현이 후딱 끝난김에, 이런 식으로 조금 더 구조적으로 활용성이 좋게 만드는 과정을 했다.

 

이후에 또 뭘 할까 라는 생각을 했다. 


Nest.js...?

네이버 부스트캠프 8기의 마지막 6주는 팀 프로젝트를 한다고 했다. 

이에 대한 대비로 Nest.js와 Type-ORM을 공부해보기로 했다. 

 

부스트캠프를 통해서 각 라이브러리, 모듈 등이 어떻게 동작하는지를 공부하고 직접 구현해보았다면, 

이번엔 그걸 극한으로 이용하는 프로젝트를 만들 준비를 해보자는 생각이었다. 

 

내 깃헙의 리포지토리를 보니, 예전에 자바스크립트도 모르는데 타입스크립트의 Nest.js를 공부하려다가 실패한 기록이 있었다

(어찌보면 당연한 것 같다. 불어를 쓸 줄 모르는데 불문학을 작성하는 기분이랄까...)

 

이걸 그대로 clone해 가져온 후, 기존 로직들을 전부 밀어버리고 과제로 나오는 내용들을 전부 직접 구현해보고 있었다. 

확실히 큰 장점이 2개 있었다. 

 

일단 자바스크립트를 알고, 타입스크립트를 아니 코드를 쓰기 쉬웠다

(이게 내가 제일 기대한 부분이다. 스프링은 자바를 아니까 쓰기 수월한 것 처럼, 네스트도 js/ts를 아니 쓰기 수월했다)

이 장점은 이어져, 내가 자바에서, JPA에서 쓰면서 좋았던 것들을 Nest.js에서 가져오고, js의 장점이 있으니 조금 더 좋은 프로젝트가 될 수 있다는 기대를 가지게 했다. 

또한, 자바 때 스프링 시큐리티를 아무것도 모르고 쓰다가, 구글링으로 '그냥 이렇게 쓰는구나'하고 끝나는 경험이 없었다.

직접 만들어본 경험 덕인지, 이를 이해하려는 노력을 더욱 해볼 수 있었다. 

(확실히 부스트캠프에서 그냥 노드js를 공부한다라고 하기엔, 그 이상의 무언가를 배우게 되었다)

 

두 번째로는, 아무래도 심적 여유인 것 같다. 

Nest.js를 통한 나 스스로의 목적이 있다.

부스트캠프 과제에서 주는 모든 과제는 라이브러리 없이, 직접 코드로 만들고, 

라이브러리를 극한으로 활용하는 Nest.js를 만들어봐야겠다는 생각이다. 

 

학교에서 캡스톤 프로젝트를 할 때, 호돌맨의 요절복통 개발쇼를 보았다.

여기에서 호돌맨님의 말씀이 와닿았다. 

맨날 해본걸로 하지말고,
자바로 해봤다면 Node.js로 해보고,
뷰를 써봤으면 리액트로도 해보세요

그래서 나의 Nest.js를 통한 목적을 제대로 잡고 열심히 달려봐야겠다. 

부스트캠프...오모시로이..🔥(네다씹!!!)

 

그러면...twenty thousand...🔥