[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 따라하기 - 5

THOVY·2022년 6월 23일
0

따라하기

목록 보기
5/20

시작👊

어제 있던 오류를 오늘 고쳐놓고 시작하자

테스트 실패 오류

HelloControllerTest.java 파일을 이용해 HelloController 가 잘 작동하는 지 test 하려 했는데, Failed to read candidate component class 라는 에러가 나왔었다.

어제 하루종일 씨름하다 오늘 한 20분 생각하고 찾아보고 만지니 딱 작동했다.

프로젝트 이름을 오른쪽 클릭한 다음 모듈 설정에 들어가서 언어수준을 바꿔봤다. SDK 설정을 11 로 바꿨다.

원래 언어 수준을 바꾸는 건 줄 알고 언어 수준을 JAVA 8 로 바꿨었다.

그게 아니라 SDK 를 바꿔야한다. SDK 가 뭐지? 😅;;

참고: stackoverflow : how to resolve Failed to read candidate component class exception?

아무튼 COMMENT 를 읽어보면 SPRING 5.1이 JAVA 14를 지원하지 않으니까 LOWER JAVA VERSION 으로 바꿔야한다고 한다. 나는 8 로 바꿨는디... 생각하다가. SDK 를 바꿔볼까 해서 바꾸니까 된다. SDK 가 뭔지 몰라서 생긴 나의 멍청한 실수다. 그런데 java 8 이 아니라 언제 어디서 또 오류가 발생할지 모른다. 부라난 나으 콛으

열심히 하자. 도비야!

테스트를 통과했으니 실제로도 되는지 확인해보자

테스트 코드로 검증했지만, 아직 의심됩니다. 그럼 수동으로도 실행해서 정상적으로 값이 출력되는지 한번 확인해보겠습니다.

좋습니다. 가시지여.

  1. 메인 Application.java 에 가서 main 메서드를 실행해본다.


    ?
    아 주소가 틀렸구나. 그래도 서버가 잘 실행되니 기분이 좋습니다.
    localhost:8080/hello



    타란~

테스트 코드의 결과와 같은 것을 알 수 있습니다. 브라우저로 한 번씩 검증은 하시되, 테스트 코드는 꼭 따라해야합니다. 그래야만 견고한 소프트웨어를 만드는 역량이 성장할 수 있습니다!
테스트 코드로 먼 저 검증 후, 정말 못 믿겠다는 생각이 들 땐 프로젝트를 실행해 확인한다는 점 명심해주세요!

예! 명심하겠습니다!



롬복

lombok 설치하기

하기 전에 깃 커밋 해봤다. 음 그냥 해봄..ㅎ

일단 이클립스와 달리 인텔리제이는 플러그인을 이용해 롬복을 쉽게 설치할 수 있다.

  1. build.gradle 에 가서 dependencies 안에 implementation('org.projectlombok:lombok') 라고 적어준다. 책에선 compile 이라고 하지만 우린 compile 대신 implementaion 을 적는다.

  2. 플러그인 마켓플레이스에 가서 lombok 을 검색해본다.

    없네...?

하..진짜..


아니 이러면 내가 책을 산 이유가 없잖아요. 하나 할 때마다 안 되서 일일이 다 검색하면서 할거면 책을 왜 봐. 목차만 갖고 찾아가면서 하면 되겠네. 되는게 없어서 하나하나 다 찾으면서 하다가 책 편 지 4일 5일짼데 이제 68페이지야. 이게 말이 돼?
라고 하기엔 나는 너무 무식하고 저자는 너무 친절하신 걸🥰

느리지만 천천히 따라해봅시다. 화이팅!

롬복은 넘어가자 ..ㅎ

롬복은 프로젝트마다 라이브러리를 추가하고, 어노테이션 처리 활성화를 체크해줘야합니다.



롬복으로 리팩토링하자

롬복을 깔았으니 기존 코드를 롬복으로 리팩토링 해보자.

이 프로젝트가 지금처럼 작은 규모가 아닌 큰 규모의 프로젝트였다면 롬복으로 전환할 수 있었을 까요? 쉽지 않았을 것입니다. 어떤 기능이 제대로 작동될 지 안 될 지 예측할 수 없기 때문입니다. 하지만 우리는 쉽게 변경할 수 있습니다. 테스트 코드가 우리의 코드를 지켜주기 때문입니다.

키야~ 테코 박수👏👏

  1. web 하위에 dto 패키지를 만든다.
    앞으로 모든 응답 Dto는 이 곳에 추가한다.

  2. 패키지 안에 HelloResponseDto.java 를 생성한다.

  3. 코드를 짜준다.

// HelloResponseDto.java

package com.prac.webservice.springboot.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
}

@Getter : 선언된 모든 필드의 get 메서드를 생성한다.

@RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성해 줍니다. final이 없는 필드는 생성자에 포함시키지 않습니다.

  1. 테스트를 해보자

만들어진 Dto 패키지를 그대로 test 패키지에도 만드다.

  1. test 에 새로 만들어진 dto 패키지 안에 HelloResponseDtoTest.java 라고 만든다.
  2. 코드를 채워넣는다.
// HelloResponseDtoTest.java

package com.prac.webservice.springboot.web.dto;

import static org.assertj.core.api.Assertions.assertThat;

public class HelloResponseDtoTest {
    
    public void 롬복_기능_테스트(){
        
        // given
        String name = "test";
        int amount = 1000;
        
        // when
        HelloResponseDto dto = new HelloResponseDto(name, amount);
        
        // then
        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
    
}
  1. 실행해보자
    ...?

해결해보자.

alt + F12 를 눌러 터미널을 열어준다.

./gradlew wrapper --gradle-version 4.10.2 를 입력해준다.

알겠어요. 고마워요. 저보다 나은 제이가 알아서해주세요.

참고: p74 테스트코드에서 발생하는 에러

항상 잘 읽고 세팅하도록하자. 환경설정을 대충 하지 말자.

됐다! test 가 정상적으로 작동하는 걸 보니 Dto 가 잘 작동하겠어.

이 test 에서 해본 건 Dto 에 적어놓은 @Getter@RequiredArgsConstructor 생성자가 자동을 잘 생성되었나~ 확인한 거임.

작동 잘 하니 다행입니다. 좋습니다.


Hellocontroller 에 새로운 메서드를 추가해보자

Dto 가 잘 작동하니 Controller 에 Dto 메서드를 만들어보자.

  1. Hellocontroller.javahelloDto 라는 메서드를 만들어주자.
// Hellocontroller.java

    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){
        return new HelloResponseDto(name, amount);
    }

@RequestParam 은 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다. 여기에서는 외부에서 보내준 name, amount 를 메서드 파라미터에 저장하게 되겠지?

  1. Controller 에 코드를 추가했으니 test 에도 테스트코드를 적어넣자.
HelloControllerTest.java

    @Test
    public void helloDto가_리턴된다() throws Exception{
        String name = "hello";
        int amount = 1000;

        mvc.perform(get("/hello/dto").param("name",name)
                .param("amount", String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                .andExpect(jsonPath("$.amount", is(amount)));
    }

이 코드를 작성할 때 import 가 자동으로 되던데, is 메서드를 작성할 때 import 되는 게 쓰자마자 빨간 줄이 그이며 에러를 발생시켰다. 그래서 import static org.hamcrest.Matchers.is; 이거는 책보고 손으로 따라 써줬다. 작동해보기 전에 알 수 있어서 참 다행이야... 작동하면서 오류 났으면 또 울었지.

param : API 테스트를 할 때 사용될 요청 파라미터를 설정하는 것. Controller 로 입력된 파라미터를 보내는 거지.
jsonPath : JSON 응답값을 필드별로 검증할 수 있는 메서드. $ 뒤에 필드명을 명시해놓자.

휴 2장을 마무리 했다.

profile
BEAT A SHOTGUN

0개의 댓글