기본적인 Map의 개념

Java에서 Map 인터페이스는 키-값 쌍을 저장하는 데 사용되는 자료구조입니다. Map은 인터페이스이기 때문에 직접 인스턴스화할 수 없으며, 대신 여러 구현체를 사용할 수 있습니다. 각 구현체는 서로 다른 특성을 가지고 있어, 사용 목적에 따라 적합한 구현체를 선택할 수 있습니다.

주요 Map 구현체:

  1. HashMap: 가장 일반적인 Map 구현체입니다. 키-값 쌍을 해시 테이블에 저장합니다. 키의 순서를 보장하지 않으며, null 키와 null 값을 허용합니다. 평균적으로 get과 put 연산은 O(1)의 시간 복잡도를 가집니다.
  2. LinkedHashMap: HashMap과 유사하지만, 삽입된 순서 또는 접근된 순서를 유지합니다. 이러한 특성 때문에 순회시 HashMap보다 약간 느릴 수 있습니다.
  3. TreeMap: 레드-블랙 트리를 기반으로 하는 Map 구현체입니다. 키에 대해 자연 순서 또는 Comparator에 의해 정의된 순서를 유지합니다. get, put, remove 연산은 O(log n)의 시간 복잡도를 가집니다.
  4. Hashtable: HashMap과 유사하지만 동기화됩니다. 멀티스레드 환경에서 안전하지만, 대부분의 상황에서는 Collections.synchronizedMap 또는 ConcurrentHashMap을 사용하는 것이 더 좋은 선택일 수 있습니다.
Map<KeyType, ValueType> map = new HashMap<>(); // HashMap 인스턴스 생성

map.put(key, value); // 키-값 쌍 추가
ValueType value = map.get(key); // 키를 사용하여 값 검색
map.remove(key); // 키-값 쌍 제거

boolean containsKey = map.containsKey(key); // 키 포함 여부 확인
boolean containsValue = map.containsValue(value); // 값 포함 여부 확인

int size = map.size(); // Map에 저장된 요소의 수
boolean isEmpty = map.isEmpty(); // Map이 비어있는지 확인

// Map 순회
for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    KeyType key = entry.getKey();
    ValueType value = entry.getValue();
    // 키와 값 사용
}

// 키 또는 값만 순회
for (KeyType key : map.keySet()) {
    // 키 사용
}
for (ValueType value : map.values()) {
    // 값 사용
}

map.clear(); // 모든 요소 제거

기본적인 map의 사용법

출처 : GPT


맵을 사용해 뷰에서 값을 컨트롤러로 받아와 바인딩 시킬 수 있다.

@Controller
public class MyController {

    @PostMapping("/submitData")
    public ModelAndView submitData(@RequestParam Map<String, String> dataMap) {
        // 데이터 처리 로직
        myService.processData(dataMap); // 서비스 레이어 호출

        ModelAndView modelAndView = new ModelAndView("resultPage");
        modelAndView.addObject("data", dataMap);
        return modelAndView;
    }
}

예를들어 뷰에서 name="age" value="12" 라고 되어 있는 요소를 전송하면 서버 컨트롤러에서

 

{ "age" : "12" }

 

라는 데이터가 map 객체에 자동으로 바인딩 된다.

이렇게 바인딩된 map 객체의 이름은 result 라고 한다면, 이 객체 result을 서비스로 보내 마이바티스 등의 매퍼에 파라미터로 보내 결과를 받아올 수 있다. 이 때에 마이바티스 XML 파일에서 파라미터의 값을 #{age}로 적어주면 age에 저장되어 있는 값이 자동으로 바인딩 된다.

예를들어

 

SELECT NAME, AGE

FROM HUMAN

WHERE AGE = #{age}

 

라는 쿼리문이 작성되어 있다면 위 경우 result에 저장된 age의 key 값을 자동으로 바인댕해 12가 입력 된다.

'Java' 카테고리의 다른 글

requestBody와 responseBody(보완예정)  (0) 2023.11.17

간단히 말하자면

 

requestBody는 클라이언트(뷰)에서 서버(컨트롤러)로 데이터를 보낼 때 사용한다.

뷰에서 전송된 데이터를 받기 위해 컨트롤러에서 @requstBody 어노테이션을 매개변수 자리에 적어줌.

주로 ajax를 이용한 비동기 방식의 전송에서 사용됨.

 

responseBody는 서버(컨트롤러)에서 클라이언트(뷰)로 데이터를 전송하기 위해 사용한다.

컨트롤러 매서드 위에 작성된다.

 

 // Ajax를 사용하여 데이터 전송
    $.ajax({
        type: "POST",
        contentType: "application/json",
        url: "/api/yourEndpoint", // 실제 서버 엔드포인트에 맞게 수정
        data: JSON.stringify(dataToSend),
        success: function (response) {
            // 성공 시 처리
            console.log("Data sent successfully");
            console.log(response);
        },
        error: function (error) {
            // 실패 시 처리
            console.error("Error sending data");
            console.error(error);
        }
    });

 

 

주로 이런 형식으로 데이터를 보내게 된다.

 

 

 

뷰에서 requestBody를 이용해 서버로 데이터를 전송할 때에는 주로 세가지 형식이 사용된다.

1. formData

2. json

3. xml

 

formData로 전송하면 서버에서는 @requestParm 어노테이션을 이용해 form 태그 내부에 있는 input 태그의 name 속성을 매핑해 데이터를 파싱한다. 파싱된 데이터는 setter를 이용해 객체에 저장해 주어야 한다.

 

json으로 보낼 경우에는 서버에서 @requestBody 어노테이션을 활용해 바로 객체에 매핑하고 저장할 수 있다.

// FormData에서 직접 JSON 객체 생성
var jsonData = {
    num: $('#insertForm input[name="num"]').val(),
    codeType: $('#insertForm select[name="codeType"]').val(),
    name: $('#insertForm input[name="name"]').val(),
    title: $('#insertForm input[name="title"]').val(),
    content: $('#insertForm textarea[name="content"]').val()
};

// Ajax 요청
$.ajax({
    type: "POST",
    url: "your_server_url",
    data: JSON.stringify(jsonData),  // JSON 데이터를 문자열로 변환
    contentType: "application/json",  // Content-Type을 application/json으로 설정
    success: function(response) {
        console.log('Success:', response);
    },
    error: function(error) {
        console.error('Error:', error);
    }
});

json 객체를 만들고 값을 가져온다음 ajax에서 data, contentType을 지정해주면 된다.

 

 

 

 

 

xml으로 데이터를 보내고 컨트롤러에서 파싱할 경우에는

@PostMapping(value = "/submitXml", consumes = MediaType.APPLICATION_XML_VALUE)
    public String handleXmlData(@RequestBody String xmlData) {
        // XML 데이터를 자동으로 파싱하여 처리
        System.out.println("Received XML data: " + xmlData);

        // 처리 로직...

        return "XML data received and processed successfully!";
    }

이런 형식으로 파싱해준다. 이때 받아온 xml 데이터는 문자열로 처리된다.

xml 라이브러리를 이용해 자동으로 매핑하는 방법이 주로 사용됨 (추후 작성)

'Java' 카테고리의 다른 글

map 사용법  (0) 2023.11.22

+ Recent posts