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, 요청 본문, 요청 해더 등을 설정 가능

 

 

 

 

문제설명

양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요.



예시

입출력예 #1
예제 1번의 n은 7로 홀수입니다. 7 이하의 모든 양의 홀수는 1, 3, 5, 7이고 이들의 합인 1 + 3 + 5 + 7 = 16을 return 합니다.
입출력 예 #2

예제 2번의 n은 10으로 짝수입니다. 10 이하의 모든 양의 짝수는 2, 4, 6, 8, 10이고 이들의 제곱의 합인 22 + 42 + 62 + 82 + 102 = 4 + 16 + 36 + 64 + 100 = 220을 return 합니다.

 

 

문제 풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1;i<=n;i++){
            if(n%2!=0&&i%2!=0){
                answer += i;
            }else if(n%2==0&&i%2==0){
                answer += i*i;
            }
        }        
        
        return answer;
    }
}

a.jsp에 import 되어있는 b.jsp를 수정하여도 a.jsp를 불러와도 반영되지 않아 해당 문제로 시간이 좀 걸렸다.

문제로는 동적 바인딩으로 import 되어 있어서였다.

해당 문제로 정적 바인딩과 동적 바인딩에 대해 알아 보았다.

 

우선 바인딩이란 무엇인가 ?

 

 

정적 바인딩

사용할 시점 : 컴파일 시점에 클래스 로드

실행 이전에 값이 확정되면 정적 바인딩이라고 한다.

컴파일 타임에 호출될 함수가 결정 되는 것으로, 함수는 기본적으로 정적 바인딩 된다

 

<%@ page import="sys_top.jsp" %>

정적으로 해당 a.jsp를 수정하지 않고 sys_top.jsp만 수정할 경우 수정한 내용이 반영되지 않는다

반영되게 하려면 a.jsp도 다시 컴파일을 해야 반영된다.

 

동적 바인딩

사용할 시점 : 런타임 시점에 클래스 로드

실행 이 후에 값이 확정되면 동적 바인딩이라고 한다

런타임에 호츨될 함수가 결정되는 것

 

<jsp:include file page=" sys_top .jsp" flush="true">

flush="true"일 겨우 강제로 컴파일하여 sys_top.jsp만 수정하여도 a.jsp가 바로 컴파일 되면서 반영됨

유연하게 변경된다는 장점이 있지만,

단점으로는 sys_top.jsp만 따로 컴파일이 돌게 되는 것으로 import를 해당 파일에 다 따로 선언해줘야한다.

+ Recent posts