Corgi [spring] java 제네릭 타입 List<NameValuePair>
본문 바로가기
코딩/스프링(Spring)

[spring] java 제네릭 타입 List<NameValuePair>

by 짱아아빠 2024. 4. 17.
반응형

java 코드 중 List<NameValuePair> 접하여 한번 찾아보게 되었다. 

 

  • List: 리스트는 배열과 유사한 데이터 구조로, 여러 항목을 순서대로 저장할 수 있는 컬렉션입니다. 리스트는 크기를 동적으로 조절할 수 있어, 필요에 따라 항목을 추가하거나 삭제할 수 있습니다.
  • <NameValuePair>: 제네릭은 자바에서 클래스나 메소드를 정의할 때 타입을 파라미터화할 수 있도록 해줍니다. <NameValuePair>는 특정한 타입의 요소들을 저장하는 리스트를 생성할 때 사용되는 파라미터화된 타입입니다.

NameValuePair는 이름-값 쌍의 데이터를 나타내는 인터페이스입니다. 주로 HTTP 요청과 같은 곳에서 사용되며, 각 이름은 문자열이고, 해당하는 값은 문자열이나 기타 타입일 수 있습니다. 주로 NameValuePair를 사용하여 키와 값을 쌍으로 묶어 데이터를 표현하거나 전달합니다.

 

예를 들어 코드를 보면

 

 

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // List<NameValuePair> 생성
        List<NameValuePair> pairList = new ArrayList<>();

        // NameValuePair 추가
        pairList.add(new BasicNameValuePair("name", "John"));
        pairList.add(new BasicNameValuePair("age", "30"));
        pairList.add(new BasicNameValuePair("city", "New York"));

        // 리스트 출력
        for (NameValuePair pair : pairList) {
            System.out.println("Name: " + pair.getName() + ", Value: " + pair.getValue());
        }
    }
}

 

이렇게 Map 을 사용하는거처럼 key값을 넣어 사용할수 있습니다.

 

저는 이걸 컨트롤러로 전송하였을때 HttpServletRequest request 에서

GET인지 POST에 따라 키값을 꺼내는 코드가 조금 다릅니다

 

- . GET

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

public class HttpClientExample {

    public static void main(String[] args) throws IOException, URISyntaxException {
        // GET 요청을 보낼 URL 설정
        String url = "http://localhost:8080/getExample";

        // NameValuePair 리스트 생성 및 데이터 추가
        List<NameValuePair> params = new ArrayList<>();
        params.add(new BasicNameValuePair("name", "John"));
        params.add(new BasicNameValuePair("age", "30"));

        // GET 요청 생성 및 파라미터 추가
        URI uri = new URI(url + "?" + URLEncodedUtils.format(params, "UTF-8"));
        HttpGet httpGet = new HttpGet(uri);

        // HttpClient 생성 및 요청 전송
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            httpClient.execute(httpGet);
        }
    }
}

 

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Controller
public class GetExampleController {

    @GetMapping("/getExample")
    @ResponseBody
    public String handleGetRequest(HttpServletRequest request) {
        List<NameValuePair> params = URLEncodedUtils.parse(request.getQueryString(), StandardCharsets.UTF_8);
        // 데이터 추출 및 처리
        StringBuilder result = new StringBuilder();
        for (NameValuePair pair : params) {
            result.append("Name: ").append(pair.getName()).append(", Value: ").append(pair.getValue()).append("\n");
        }
        return result.toString();
    }
}

 

 

반응형

 

- . POST

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class HttpClientExample {

    public static void main(String[] args) throws IOException {
        // POST 요청을 보낼 URL 설정
        String url = "http://localhost:8080/postExample";

        // NameValuePair 리스트 생성 및 데이터 추가
        List<NameValuePair> params = new ArrayList<>();
        params.add(new BasicNameValuePair("name", "John"));
        params.add(new BasicNameValuePair("age", "30"));

        // POST 요청 생성 및 파라미터 추가
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        // HttpClient 생성 및 요청 전송
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            httpClient.execute(httpPost);
        }
    }
}

 

import org.apache.http.NameValuePair;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;

@Controller
public class PostExampleController {

    @PostMapping("/postExample")
    @ResponseBody
    public String handlePostRequest(@RequestBody List<NameValuePair> data) {
        // 데이터 처리
        StringBuilder result = new StringBuilder();
        for (NameValuePair pair : data) {
            result.append("Name: ").append(pair.getName()).append(", Value: ").append(pair.getValue()).append("\n");
        }
        return result.toString();
    }
}

 

 

이렇게 요청을 할때 GET과 POST 를 httpPost인지 httpGet인지 구분해서 요청을 해서 사용할수있는데요 

Post요청 데이터를 처리할때 포문을 쓰지않고 Spring[] 로 값을 request.getParameterMap(); 값을 받아
키값을 꺼내어 사용할수도 있습니다.

반응형

댓글