이전 글에서는 브라우저에서 아래 주소로 접속했을 때

http://localhost:8080/hello

컨트롤러 메서드가 실행되고,
문자열이 그대로 출력되는 흐름을 확인했습니다.

그런데 여기서 한 단계 더 가면 이런 생각이 들 수 있습니다.

“주소로 값을 같이 넘길 수는 없을까?”
kim 같은 이름을 브라우저에서 보내면 서버가 받을 수 있을까?”
@RequestParam은 정확히 뭘 해주는 걸까?”

이번 글에서는 아래 주소를 기준으로
주소에 값을 담아 서버로 보내는 가장 기본적인 방법을 정리해보겠습니다.

http://localhost:8080/hello?name=kim

이번 글의 목표는 딱 하나입니다.

주소로 값을 넘기는 법 이해하기


오늘 만들 기능

브라우저에서 아래 주소로 접속했을 때

http://localhost:8080/hello?name=kim

서버가 kim이라는 값을 받아서
아래처럼 응답하게 만들어보겠습니다.

Hello kim

즉, 이번에는 단순히 고정된 문장을 보여주는 것이 아니라
브라우저가 보낸 값을 읽어서 응답에 반영하는 것이 목표입니다.


먼저 전체 흐름부터 보기

아래 주소를 다시 보겠습니다.

http://localhost:8080/hello?name=kim

이 주소에서 일어나는 흐름은 대략 이렇습니다.

브라우저가 /hello로 요청
        ↓
추가 값으로 name=kim 전달
        ↓
Spring Boot가 @GetMapping("/hello") 메서드 찾음
        ↓
@RequestParam이 name 값을 받음
        ↓
메서드 안에서 그 값을 사용
        ↓
Hello kim 응답

즉, 이번 글의 핵심은
/hello 주소만 보는 것이 아니라
그 뒤에 붙는 ?name=kim 값까지 함께 읽는 것입니다.


query string이란?

주소에서 ? 뒤에 붙는 부분을 보겠습니다.

?name=kim

이 부분을 query string이라고 합니다.

쉽게 말하면,
주소 뒤에 덧붙여 보내는 추가 정보입니다.

구조는 보통 이렇게 생깁니다.

?key=value

예를 들면:

?name=kim

이 뜻은 이렇게 볼 수 있습니다.

name라는 이름표로 kim이라는 값을 보낸다

즉:

  • name → 파라미터 이름
  • kim → 실제 값

입니다.


파라미터란?

파라미터는 서버로 함께 넘기는 값이라고 생각하면 됩니다.

이번 예시에서는 아래 값이 파라미터입니다.

name=kim

여기서 서버가 필요한 것은:

  • 파라미터 이름 name
  • 그 안에 들어 있는 값 kim

입니다.

즉, 파라미터는
요청에 같이 실어 보내는 데이터라고 보면 됩니다.


첫 번째 코드

먼저 아래 코드를 작성합니다.

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam String name) {
        return "Hello " + name;
    }
}

이제 브라우저에서 아래 주소로 접속합니다.

http://localhost:8080/hello?name=kim

그러면 아래 결과가 나옵니다.

Hello kim

코드 하나씩 보기

이번 코드에서 새로 등장한 핵심은 이것입니다.

@RequestParam String name

이제 이 부분을 중심으로 보겠습니다.


@GetMapping("/hello")

이 부분은 이전 글과 같습니다.

@GetMapping("/hello")

이 뜻은 다음과 같습니다.

/hello 주소로 GET 요청이 오면
이 메서드를 실행하세요.

즉, 아래 주소의 기본 경로는 여전히 /hello입니다.

http://localhost:8080/hello?name=kim

여기서 Spring Boot는 먼저 /hello에 연결된 메서드를 찾습니다.


@RequestParam

이번 글의 핵심은 이 부분입니다.

@RequestParam String name

이 뜻은 이렇게 보면 됩니다.

요청에 들어온 파라미터 중에서
name 값을 꺼내서
name 변수에 넣어주세요.

즉, 아래 주소가 들어오면

http://localhost:8080/hello?name=kim

Spring Boot는 name=kim을 보고
kim이라는 값을 name 변수에 넣어줍니다.

그러면 메서드 안에서는 그냥 평범한 Java 변수처럼 사용할 수 있습니다.

return "Hello " + name;

그래서 결과가 다음처럼 나옵니다.

Hello kim

name=kim에서 무엇이 중요한가?

다시 이 부분을 보겠습니다.

?name=kim

여기에는 두 부분이 있습니다.

  • name
  • kim

name파라미터 이름이고,
kim실제 값입니다.

그래서 아래 코드와 연결됩니다.

@RequestParam String name

즉, 파라미터 이름이 맞아야 Spring Boot가 값을 제대로 가져올 수 있습니다.


전체 흐름 정리

브라우저에서 아래 주소를 입력합니다.

http://localhost:8080/hello?name=kim

그러면 내부 흐름은 이렇게 됩니다.

1. 브라우저가 /hello 주소로 요청
2. 추가 데이터로 name=kim 전달
3. Spring Boot가 /hello에 연결된 메서드 찾음
4. @RequestParam이 kim 값을 받음
5. 메서드 안에서 "Hello " + name 실행
6. Hello kim 응답

처음에는 이 흐름만 이해해도 충분합니다.


실행해보기

Spring Boot를 실행합니다.

Gradle 프로젝트라면:

./gradlew bootRun

Maven 프로젝트라면:

./mvnw spring-boot:run

실행 후 브라우저에서 아래 주소로 접속합니다.

http://localhost:8080/hello?name=kim

다음 문장이 보이면 성공입니다.

Hello kim

다른 값으로도 바꿔볼 수 있습니다.

http://localhost:8080/hello?name=lee

그러면 결과는 다음처럼 바뀝니다.

Hello lee

즉, 이제는 고정된 문자열이 아니라
주소로 받은 값에 따라 응답이 달라지는 것입니다.


자주 헷갈리는 부분

1. /hello?name=kim은 역할이 다릅니다

아래 주소를 보겠습니다.

http://localhost:8080/hello?name=kim

여기서:

  • /hello → 어떤 메서드를 실행할지 찾는 경로
  • name=kim → 그 메서드에 넘길 추가 값

입니다.

즉, 경로와 파라미터는 같은 것이 아닙니다.

2. 파라미터 이름이 다르면 값이 안 맞을 수 있습니다

코드가 아래처럼 되어 있다고 해보겠습니다.

public String hello(@RequestParam String name)

그러면 주소도 name으로 보내는 것이 가장 자연스럽습니다.

http://localhost:8080/hello?name=kim

그런데 아래처럼 보내면

http://localhost:8080/hello?user=kim

코드와 이름이 맞지 않아서 원하는 값이 안 들어올 수 있습니다.

3. ? 뒤가 없으면 값이 없을 수 있습니다

예를 들어 아래처럼 접속하면

http://localhost:8080/hello

name 값이 전달되지 않습니다.

즉, 이번 코드는
name=... 값을 같이 보낸다는 가정으로 동작하고 있습니다.


오늘 배운 것

이번 글의 핵심은 아래와 같습니다.

  • ?name=kim 같은 부분을 query string이라고 합니다
  • query string은 주소에 추가로 붙여 보내는 값입니다
  • name은 파라미터 이름이고 kim은 실제 값입니다
  • @RequestParam은 그 값을 메서드에서 사용할 수 있게 받아옵니다

정리

이번 글에서는 주소에 값을 담아서 서버로 보내는 가장 기본적인 방법을 정리했습니다.

핵심 흐름은 이렇습니다.

브라우저 주소에 값 추가
→ 서버가 그 값을 받음
→ @RequestParam으로 꺼냄
→ 메서드 안에서 사용

처음에는 아래 한 줄만 기억해도 충분합니다.

?name=kim으로 값을 보내고,
@RequestParam으로 그 값을 받는다.

이 흐름을 이해하면
앞으로 여러 값을 함께 보내거나,
폼 입력값을 처리하거나,
API 요청 데이터를 다룰 때도 훨씬 덜 헷갈립니다.