웹 개발/개념 정리

파라미터 / JSON 요청(2)에 따른 컨트롤러 ~ 와 제네릭 간단 설명

cha430 2025. 8. 1. 10:21

 

나중에 또 잊어버릴 나를 위해 예제를 하나 GPT에게 부탁했다

 

 

 

1. 파라미터로 보내기

 

application/x-www-form-urlencoded 형식이나 쿼리 파라미터처럼 보내야 한다.

 

@PostMapping("/user/register")
public ResponseEntity<?> registerUser(
    @RequestParam String name,
    @RequestParam int age,
    @RequestParam String email
) {
    // 하나하나 파라미터를 받음
    return ResponseEntity.ok("등록 완료");
}

 

 

**** @RequestParam은 GET이든 POST든 다 가능

(RequestBody는 POST만 가능)

 

다만 RequestParam 은 단일 파라미터이기 때문에 만약 Dto를 파라미터로 받고 싶으면

@ModelAttribute 를 쓴다.

 

@PostMapping("/user/save")
public ResponseEntity<?> saveUser(@ModelAttribute UserDTO userDTO) {
    return ResponseEntity.ok("사용자 저장됨: " + userDTO.getName());
}

 

 

근데 !! @ModelAttribute 가 기본값이라 생략해도 된다.

프론트에서 application/x-www-form-urlencoded 형식으로 보낸 요청을 Spring이 자동으로 @ModelAttribute 방식으로 처리

 

 

 

 

 

@RestController일 경우

반환 타입이 ResponseEntity<?> 가 아니라 Dto일 경우 Spring 이 자동으로 JSON으로 처리한다.

(내부적으로는 @ResponseBody가 적용된 것처럼 처리)

 

 

@Controller에서 DTO를 파라미터로 받고 @RequestBody를 생략하면,
👉 Spring은 @ModelAttribute 방식으로 처리한다.

 

 

JSON 으로 요청해놓고 @ModelAttribute로 받으면 Body를 읽지 않기 때문에 400에러

 

 

 

아.근데 여기에서 ResponseEntity<?> 는 중요하지 않다. Dto 로 해도 됨.

서비스 메서드의 반환 타입을 Dto로 하면 return 값 형식만 dto로 맞춰주면 문제 없음 

 

 

 

 

 

제네릭

<>로 쓰고

클래스나 메서드에서 사용할 데이터 타입을 미리 지정하지 않고 사용할 때 타입을 결정하는 기능이라고 한다.

 

 

대표적으로 List 같은 게 있다.

그래서 List<Dto> 이런식으로 쓰는 건가 보다... List<String> 도 가능하고..

List<String> strings = new ArrayList<>();
List<Integer> integers = new ArrayList<>();

ResponseEntity<?> (와일드카드)
→ 아무 타입이나 받아들이겠다는 뜻
→ 반환 타입을 구체적으로 지정하지 않고 유연하게 처리할 때 사용

 

 

 

그리고

List<String> strings = new ArrayList<>();
ArrayList<String> strings = new ArrayList<>();

 

 

이건 List는 인터페이스, ArrayList 는 구현 클래스다.

 

List 로 할 경우 다른 List 구현체로 쉽게 변경할 수 있다.

ArrayList로 할 경우 결합도가 높다. ArrayList만 가능하다.

 

List<String> strings = new ArrayList<>();
// 나중에 LinkedList로 바꾸고 싶으면
strings = new LinkedList<>();

 

이런식으로 변경 가능

 

 


 

제네릭 종류

 

 

1. Map

 

  • Map<K, V> — 인터페이스
  • 구현체 예:
    • HashMap<K, V> — 빠른 조회, 순서 없음
    • LinkedHashMap<K, V> — 입력 순서 유지
    • TreeMap<K, V> — 키 정렬 유지

 

Map<String, Integer> map = new HashMap<>();
map = new LinkedHashMap<>(); // OK, 타입 일치
map = new TreeMap<>();       // OK, 타입 일치

 

 

 

2. Set

  • Set<E> — 인터페이스
  • 구현체 예:
    • HashSet<E> — 빠름, 순서 없음
    • LinkedHashSet<E> — 입력 순서 유지
    • TreeSet<E> — 정렬 유지
Set<String> set = new HashSet<>();
set = new LinkedHashSet<>(); // OK
set = new TreeSet<>();       // OK

 

 

3. Queue

  • Queue<E> — 인터페이스
  • 구현체 예:
    • LinkedList<E> — 큐 및 리스트 기능
    • PriorityQueue<E> — 우선순위 큐
Queue<Integer> queue = new LinkedList<>();
queue = new PriorityQueue<>(); // OK

 

 

 

4. List

  • List<E> — 인터페이스
  • 구현체 예:
    • LinkedList<E> — 이중 연결 리스트로 구현 (삽입/삭제가 빠름. 노드 연결만 수정, 인덱스 접근은 느림 (O(n)))   : 삽입/삭제가 자주 일어날 때
    • ArrayList <E> — 내부적으로 배열로 구현 (인덱스 접근 빠름 (O(1))  : 조회 위주
    • Vector<E>   ArrayList와 비슷하지만 동기화(synchronized) 처리됨
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");

List<String> list2 = new LinkedList<>();
list2.add("cat");
list2.add("dog");