Jun4928 / wanted-pre-onboarding-challenge-BE-task-JAN.2023

JAN.2023 wanted 프리온보딩 챌린지 BE 사전과제
29 stars 36 forks source link

사전과제 제출 #53

Open Jake-huen opened 1 year ago

Jake-huen commented 1 year ago

사전과제

  1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요 아직 많은 기술적인 코드를 작성한 적은 없어서 Jpa에서 pagination을 사용한 경험을 공유하겠습니다.

        @DisplayName("게시글 정보를 입력하면, 게시글을 생성한다")
        @Test
        void givenArticleInfo_whenSavingArticle_thenSavesArticle() {
            // given
            ArticleDto dto = ArticleDto.of(LocalDateTime.now(), "Taeheon", "title", "content", "hashtag");
            given(articleRepository.save(any(Article.class))).willReturn(null);
    
            // when
            sut.saveArticle(dto);
    
            // then
            then(articleRepository).should().save(any(Article.class));
        }
  2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요

    레이어드 아키텍처는 애플리케이션의 컴포넌트를 유사한 것을 레이어로 묶어서 수평적으로 작성한 구조로 설계 방식에 따라 나누어지는데, 보통 3계층을 사용합니다.

    • 프리젠테이션 계층 : 클라이언트의 요청을 해석하고 비즈니스 계층에서 받은 결과를 응답하는 역할. UI나 API제공
    • 비즈니스 계층 : 애플리케이션의 기능을 정의하고 객체를 통해 세부 작업 수행. DDD 기반의 아키텍처는 도메인 계층을 분리하기도 한다.
    • 데이터 접근 계층 : 데이터베이스에 접근하는 작업 수행
  3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요

    의존성 주입이란, 클래스 간의 의존성을 클래스 외부에서 주입하는 것을 의미합니다. 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다는 의미입니다. 의존성 주입이 필요한 이유는 유지 보수를 위해서 라고 생각합니다. 프로그램의 크기가 커질수록 객체끼리 강한 결합이 생기면 수정할 때 너무 어려워서 의존성 주입이라는 새로운 설계 방식을 선택했다고 생각합니다. 객체 생성에 대한 책임을 Controller에게 위임할 수 있어서 수정 부분이 정해지기 때문입니다.

  4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요

    1. Optional : Optional은 Null Point Exception의 부담을 줄이기 위해 사용합니다. Optional은 Wrapper 클래스인데, 결과가 null이될 수 있고, null에 의해 오류가 발생할 가능성이 높을 때 사용합니다.
      Optional<School> selectedSchool = schoolRepository.findById(number);
    2. LocalDateTime : 데이터베이스를 구성할 때 만든 시간이나 수정한 시간을 기록할 때 Time API에 있는 LocalDateTime을 사용합니다.
      @Getter @Setter private LocalDateTime updatedAt; // 업데이트 시간
    3. enum : Intellij를 주로 사용하는데, 자동완성이나 오타, 컴파일 에러를 도출하기 위해서 enum을 가능하면 사용하고 있습니다.
      public enum SearchType {
      TITLE, CONTENT, ID, NICKNAME, HASHTAG
      }
  5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)

    type SomeFunctionReturnString = () => string
    
    function delay(f: SomeFunctionReturnString, seconds: number): Promise<string> {
        // 해당 함수 내부를 구현해 주세요
        return new Promise((success,fail)=>{
            setTimeout(()=>{
                try{
                    success(f());
                }catch(error){
                    fail(error);
                }
            },seconds*1000);
        });
    };
    
    const success = () => {
        return "successfully done";
    };
    
    const fail = () => {
        throw new Error("failed");
    };
    
    console.log('after 2 seconds');
    
    delay(success, 2)
        .then((res) => console.log(res))
        .catch((e) => console.log(e));
    
    delay(fail, 2)
        .then((res) => console.log(res))
        .catch((e) => console.log(e));
    **결과값**
    ```text
    $ ts-node delay.ts
    after 2 seconds
    successfully done
    Error: failed
  6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요

    구현해야될 것을 보고 어떤 구조와 방식으로 구현해야 될지 시작하기가 힘들었습니다. 수정이 필요하고 유지보수가 가능한 코드를 구현하는 방법을 터득하고 싶습니다.