오류

500에러

 

오류 원인

이클립스(Eclipse)에서 자바로 개발할 때, 메서드에서 throw e;로 예외를 다시 던졌고, 그 예외를 호출한 쪽에서 따로 처리해주지 않으면 해당 예외는 서블릿 컨테이너(예: 톰캣)까지 전파된다.

이때 적절한 예외 처리 핸들링이 없다면, HTTP 500 Internal Server Error가 발생하게 된다.

 

예시

public String someMethod() throws Exception {
    try {
        // 어떤 로직
    } catch (Exception e) {
        throw e; // 예외 다시 던짐
    }
}

 

someMethod를 호출한 곳에서 예외를 처리해주지 않는다면 500 오류 발생함.

해결 방안으로 호출한 곳에서 예외 처리해주거나, throw하지 않아야함.

 

오류

''근처의 구문이 잘못되었습니다. 

 

오류 원인

대부분 변수값이 제대로 안들어왔을때, TYPE이 맞지 않을때 발생한다

 

해결방안

''안에 컬럼명의 TYPE이 맞는지 데이터를 확인한다.

나같은 경우는 char였지만 예약어로 호출시 [] 대괄호로 감싸지 않고 호출하여 위와 같은 오류 발생하였다.

예약어 호출시 반드시 [] 대괄호로 감싸서 호출해야 한다.

 

application/x-www-form-urlencoded는 html의 form의 기본 Content-Type

요즘은 자주 사용하지 않지만 여전히 사용하는 경우가 종종 존재합니다.

(요즘은 application/json 많이 사용)

 

jsonx-www-form-urlencoded 차이

- application/json : {key: value}의 형태로 전송

- application/x-www-form-urlencoded : key=value&key=value의 형태로 전송

 

예시

    @Test
    @DisplayName("/posts 요청시 Hello world를 출력한다.")
    void test() throws Exception {
        //expection
        mockMvc.perform(post("/posts")
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                        .param("title","글제목입니다")
                        .param("content", "글 내용입니다")
                ) //application/json
                .andExpect(status().isOk()) // 통신이 정상일때
                .andExpect(content().string("Hello World"))
                .andDo(print()); // 요청한 로그 보기 위해
    }

 

 

해당 api 통신을 통해 값 가져오는 방법

 

1. @RequestParam String titile

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

 

2. @RequestParam Map<String, String>

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

 

3. @ModelAttribute

    @PostMapping("/posts")
    public String post(@ModelAttribute PostCreate params) {
        log.info("params ={}", params.toString());
        return "Hello World";
    }

@WebMvcTest 이란

- Spring Boot 테스트 어노테이션

- Sptring MVC 웹 계층의 테스트에 사용됨

- 서비스 계층, 데이터 액세스 계층, 외부 시스템과의 통신 등 다른 계층의 로직을 테스트하는 것이 아닌, 웹 계층의 로직만으로 테스트하려는 경우 사용

 

MockMvc 란

- HTTP 요청을 디스패처 서블릿에 전송하고 결과를 받아 테스트하는 데 사용됨

- API의 테스트 수행

- Spring MVC 구성요소를 사용하여 동작

- MockMvc 주입받아 사용할때 @WebMvcTest 어노테이션을 쓰지 않으면 "this.mockMvc" is null 오류 발생함

Cannot invoke "org.springframework.test.web.servlet.MockMvc.perform(org.springframework.test.web.servlet.RequestBuilder)" because "this.mockMvc" is null
java.lang.NullPointerException: Cannot invoke "org.springframework.test.web.servlet.MockMvc.perform(org.springframework.test.web.servlet.RequestBuilder)" because "this.mockMvc" is null

 

예제

@WebMvcTest
class PostControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @DisplayName("/posts 요청시 Hello world를 출력한다.")
    void test() throws Exception {
        //expection
        mockMvc.perform(get("/posts"))
                .andExpect(status().isOk()) // 통신이 정상일때
                .andExpect(content().string("Hello World"))
                .andDo(print()); // 요청한 로그 보기 위해
    }
}

 

MockMvc.perform 메서드

- MockHttpServletRequestBuilder 객체를 인자로 받음

MockHttpServletRequestBuilder 객체는 API 호출을 나타내며, HTTP 메서드, URL, 요청 본문, 요청 해더 등을 설정 가능

 

 

 

 

+ Recent posts