나중에 또 잊어버릴 나를 위해 예제를 하나 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");
'웹 개발 > 개념 정리' 카테고리의 다른 글
| [WebOrder] JSON 객체로 보내고 받기 (0) | 2025.10.28 |
|---|---|
| 파라미터 / JSON 요청(3) 최종 예제 (0) | 2025.08.05 |
| @RequiredArgsConstructor (0) | 2025.06.17 |
| resultType= DTO / MAP 차이 (0) | 2025.06.17 |
| SpringBoot, Vue 의 포트(port) 역할 (2) | 2025.05.22 |