[Toy Projects] - JooHyeongLog

김주형·2022년 8월 17일
post-thumbnail

Reference

이 글은 다음을 참조하여 작성되었습니다. 배움의 기회를 얻어 감사합니다. 🙇🏻‍♂️


목적

  • 고수들의 코드 베끼는게 아니라 나의 성장을 위해 참고하기
  • 웹 서비스 제작에 필요한 공통적인 능력 기르기
  • 재사용성, 확장 가능성, 유연하고 변경 가능한 구조.. 등등 에 대한 고민하기
  • 부담 없이 감 잡는데 집중하기
  • 책과 강의는 참고만 하고,
    점진적으로 나의 사고 비율 높이기(제일 중요)

시작

환경설정

  • Java 11
  • Jar package 생성
  • Gradle
  • Spring Boot 2.6.10
    Dependencies :
    • Lombok
    • Spring Web
    • Spring Data JPA
    • H2 Database

작업하면서 추후 필요 플러그인 종속 예정


SPA 경험해보기

기존 html을 렌더링해주는 SSR 방식 대신,
React 또는 Vue + SSR 형태로
Javascript와 API 통신하는 구조 체험

Vue <-> API(JSON) 형태 채택

HelloWorld

@RestController
public class PostController {

    @GetMapping("/v1/posts")
    public String get(){
      return "Hello World";
  }
}
  • @Controller 종속되어있는 @RestController 사용
  • @RequestMapping(..)보다 단순한 @GetMapping 사용

테스트 케이스

⌘ + ⇧ + T : 해당 객체 테스트 케이스 생성 (IntelliJ)

@WebMvcTest
class PostControllerTest {

    @Autowired
    private MockMvc mockMvc; // 1

    @Test
    @DisplayName("/ return 'Hello World' when request 'posts'.") 
    @NotNull
    void test() throws Exception { // 2
        // expected
        mockMvc.perform(get("/posts"))
                .andExpect(status().isOk()) // 3
                .andExpect(MockMvcResultMatchers.content().string("Hello World")) // 4
                .andDo(print()); // 5
    }
}

1 : MockMvc 활용하여 실제 컨트롤러에 요청 날려보기
2 : 메서드 시그니처에 Exception 추가
3 : MockMvcResultMatchers.status().isOk(), 항상 status code 일치(200)해야 하는 것 까먹지 말기
4 : "posts" 요청 + status code 200 일시 기대되는 string 값("Hello World")
5 : MockMvcResultHandlers.print(), 웹 요청 summary 로깅


HTTP 메서드 사용하기

  • HTTP 메서드 종류
    • GET, POST(가장 많이 쓰임)
    • PUT, PATCH, DELETE
    • OPTIONS, HEAD, TRACE, CONNECT
  • HTTP 메서드의 각 기능별 특징, 역할, 사용처를 다 알아야 한다고 한다..

등록 기능 - POST

@RestController
public class PostController {

    @PostMapping("/posts")
    public String post(){
      return "Hello World";
  }
}
  • @GetMapping -> @PostMapping (메소드도 변경)

mockMvc는 일반적으로 Content-type을 /application/json 형태로 받는다. (직접 요청 or 요청 받을 시, x-www-form-urlencoded에서 json형태 사용으로 바뀌는 추세)

글 제목, 글 내용 데이터 전달 기능 추가를 위해 테스트 코드를 변경해보기

@WebMvcTest
class PostControllerTest {

    @Autowired
    private MockMvc mockMvc; 

    @Test
    @DisplayName("/ return 'Hello World' when request 'posts'.")
    @NotNull
    void test() throws Exception { 
        //
        // expected
        mockMvc.perform(post("/posts")
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                        .param("title","제목입니다.")
                        .param("content","내용입니다. ㅎ"))
                .andExpect(status().isOk()) 
                .andExpect(MockMvcResultMatchers.content().string("Hello World")) // 4
                .andDo(print()); 
    }
}

converToString

  • MediType 객체를 전달받은 뒤 String 형태의 값이 나오게 된다.
  • param()의 key-value는 둘 다 String 형태

테스팅 후 검증까지

테스트를 성공했다면 실제 서버에서 데이터를 받는 방법을 사용하여 검증해보아야 한다.
@RequestParam을 사용하여 String 형태의 key-value 객체를 생성해주고 로깅을 하는게 맞지만,
실제 서비스가 아닌 토이 프로젝트인 만큼 우선 System.out.println을 사용해보...지 말고!!
실전이라고 생각하고 롬복을 사용해보았다.
보편적인 공통 인터페이스 @Slf4j를 사용했다.

@Slf4j
@RestController
public class PostController {

    @PostMapping("/posts")
    public String post(@RequestParam String title, @RequestParam String content){
        log.info("title = {}, content = {}", title, content);
        return "Hello World";
  }
}

postTest

@PostMapping("/posts")
    public String post(@RequestParam Map<String, String> params ){
        log.info("params = {}",params);
        String title = params.get("title");
        return "Hello World";
  }

이런 식으로도 활용 가능

profile
우리스러움

0개의 댓글