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 이 아니라 언제 어디서 또 오류가 발생할지 모른다. 부라난 나으 콛으
열심히 하자. 도비야!
테스트 코드로 검증했지만, 아직 의심됩니다. 그럼 수동으로도 실행해서 정상적으로 값이 출력되는지 한번 확인해보겠습니다.
좋습니다. 가시지여.
localhost:8080/hello
임테스트 코드의 결과와 같은 것을 알 수 있습니다. 브라우저로 한 번씩 검증은 하시되, 테스트 코드는 꼭 따라해야합니다. 그래야만 견고한 소프트웨어를 만드는 역량이 성장할 수 있습니다!
테스트 코드로 먼 저 검증 후, 정말 못 믿겠다는 생각이 들 땐 프로젝트를 실행해 확인한다는 점 명심해주세요!
예! 명심하겠습니다!
하기 전에 깃 커밋 해봤다. 음 그냥 해봄..ㅎ
일단 이클립스와 달리 인텔리제이는 플러그인을 이용해 롬복을 쉽게 설치할 수 있다.
build.gradle
에 가서 dependencies
안에 implementation('org.projectlombok:lombok')
라고 적어준다. 책에선 compile 이라고 하지만 우린 compile 대신 implementaion 을 적는다.
플러그인 마켓플레이스에 가서 lombok
을 검색해본다.
없네...?
하..진짜..
아니 이러면 내가 책을 산 이유가 없잖아요. 하나 할 때마다 안 되서 일일이 다 검색하면서 할거면 책을 왜 봐. 목차만 갖고 찾아가면서 하면 되겠네. 되는게 없어서 하나하나 다 찾으면서 하다가 책 편 지 4일 5일짼데 이제 68페이지야. 이게 말이 돼?
라고 하기엔 나는 너무 무식하고 저자는 너무 친절하신 걸🥰
느리지만 천천히 따라해봅시다. 화이팅!
롬복은 넘어가자 ..ㅎ
롬복은 프로젝트마다 라이브러리를 추가하고, 어노테이션 처리 활성화를 체크해줘야합니다.
이 프로젝트가 지금처럼 작은 규모가 아닌 큰 규모의 프로젝트였다면 롬복으로 전환할 수 있었을 까요? 쉽지 않았을 것입니다. 어떤 기능이 제대로 작동될 지 안 될 지 예측할 수 없기 때문입니다. 하지만 우리는 쉽게 변경할 수 있습니다. 테스트 코드가 우리의 코드를 지켜주기 때문입니다.
키야~ 테코 박수👏👏
web 하위에 dto 패키지를 만든다.
앞으로 모든 응답 Dto는 이 곳에 추가한다.
패키지 안에 HelloResponseDto.java
를 생성한다.
코드를 짜준다.
// 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이 없는 필드는 생성자에 포함시키지 않습니다.
dto
패키지 안에 HelloResponseDtoTest.java
라고 만든다.// 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);
}
}
alt
+ F12
를 눌러 터미널을 열어준다.
./gradlew wrapper --gradle-version 4.10.2
를 입력해준다.
알겠어요. 고마워요. 저보다 나은 제이가 알아서해주세요.
항상 잘 읽고 세팅하도록하자. 환경설정을 대충 하지 말자.
됐다! test 가 정상적으로 작동하는 걸 보니 Dto 가 잘 작동하겠어.
이 test 에서 해본 건 Dto 에 적어놓은 @Getter
와 @RequiredArgsConstructor
생성자가 자동을 잘 생성되었나~ 확인한 거임.
작동 잘 하니 다행입니다. 좋습니다.
Controller
에 Dto 메서드를 만들어보자.Hellocontroller.java
에 helloDto
라는 메서드를 만들어주자.// 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 를 메서드 파라미터에 저장하게 되겠지?
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장을 마무리 했다.