Spring Boot 프로젝트를 처음 만들고 실행까지 했다면,
이제 직접 코드를 작성해서 브라우저에 문장을 띄워볼 차례입니다.

처음에는 이런 생각이 들 수 있습니다.

“서버는 실행됐는데, 내가 만든 화면은 어떻게 보여주지?”
“주소창에 /hello를 입력하면 왜 코드가 실행되는 거지?”
@Controller, @GetMapping은 대체 무슨 역할이지?”

이번 글에서는 아주 간단한 컨트롤러를 만들어서
브라우저에 직접 만든 문장을 출력해보겠습니다.

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

브라우저에서 내가 만든 문장 보기


오늘 만들 기능

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

http://localhost:8080/hello

아래 문장이 보이게 만들겠습니다.

Hello Spring Boot

아주 단순하지만,
이 흐름이 Spring Boot 웹 개발의 가장 기본입니다.


컨트롤러란?

컨트롤러는 사용자의 요청을 받아서 응답을 돌려주는 역할을 합니다.

쉽게 말하면, 컨트롤러는 안내 데스크 같은 역할입니다.

예를 들어 사용자가 브라우저에 이렇게 입력합니다.

http://localhost:8080/hello

그러면 브라우저는 Spring Boot 서버에게 요청합니다.

/hello 주소에 해당하는 내용을 보여주세요.

이때 컨트롤러가 그 요청을 받고,
어떤 응답을 줄지 결정합니다.

즉, 컨트롤러는 이런 일을 합니다.

요청을 받는다
→ 어떤 주소인지 확인한다
→ 알맞은 메서드를 실행한다
→ 결과를 응답으로 돌려준다

파일 만들기

먼저 src/main/java 아래에 컨트롤러 파일을 하나 만듭니다.

예를 들어 프로젝트 패키지가 com.example.demo라면
아래 위치에 파일을 만들 수 있습니다.

src/main/java/com/example/demo/HelloController.java

파일 이름은 이렇게 합니다.

HelloController.java

처음에는 메인 클래스가 있는 패키지와 같은 위치에 만드는 것이 가장 안전합니다.

예를 들어 메인 클래스가 여기에 있다면

com.example.demo

컨트롤러도 같은 패키지에 두면 됩니다.

com.example.demo.HelloController

첫 번째 컨트롤러 코드

아래 코드를 작성합니다.

package com.example.demo;

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

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello Spring Boot";
    }
}

코드를 작성했다면 Spring Boot를 실행한 뒤
브라우저에서 아래 주소로 접속합니다.

http://localhost:8080/hello

브라우저에 아래 문장이 나오면 성공입니다.

Hello Spring Boot

코드 하나씩 보기

처음 보면 코드가 짧아도 낯설 수 있습니다.

특히 아래 세 가지가 중요합니다.

@Controller
@ResponseBody
@GetMapping

하나씩 천천히 보겠습니다.


@Controller

@Controller
public class HelloController {
}

@Controller는 이 클래스가 컨트롤러 역할을 한다는 표시입니다.

Spring Boot에게 이렇게 알려주는 것입니다.

이 클래스는 웹 요청을 처리하는 클래스입니다.

즉, HelloController
브라우저에서 들어온 요청을 처리할 수 있는 클래스가 됩니다.

쉽게 말하면 @Controller
“이 클래스는 안내 데스크입니다”라고 붙여놓은 이름표입니다.


@GetMapping

@GetMapping("/hello")

@GetMapping은 특정 주소로 들어온 요청을
어떤 메서드와 연결할지 정하는 역할을 합니다.

여기서는 이렇게 적었습니다.

@GetMapping("/hello")

이 뜻은 다음과 같습니다.

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

그래서 브라우저에서 아래 주소로 접속하면

http://localhost:8080/hello

Spring Boot는 이 메서드를 실행합니다.

public String hello() {
    return "Hello Spring Boot";
}

즉, /hello 주소와 hello() 메서드를 연결해주는 것이
@GetMapping("/hello")입니다.


GET 요청이란?

처음에는 GET 요청을 어렵게 생각하지 않아도 됩니다.

브라우저 주소창에 주소를 입력해서 접속하는 것도
보통 GET 요청이라고 보면 됩니다.

예를 들어 사용자가 주소창에 이렇게 입력합니다.

http://localhost:8080/hello

그러면 브라우저는 서버에게 이렇게 요청합니다.

/hello 내용을 보여주세요.

이것이 GET 요청입니다.

즉, GET 요청은 보통
서버에서 어떤 정보를 가져올 때 사용하는 요청입니다.


@ResponseBody

@ResponseBody

@ResponseBody는 메서드가 반환한 값을
그대로 응답 본문에 넣겠다는 뜻입니다.

예를 들어 아래 메서드는 문자열을 반환합니다.

public String hello() {
    return "Hello Spring Boot";
}

여기에 @ResponseBody가 붙어 있기 때문에
브라우저에는 문자열이 그대로 출력됩니다.

Hello Spring Boot

만약 @ResponseBody가 없다면 Spring은
"Hello Spring Boot"라는 문자열을 화면에 출력하는 대신,
화면 파일 이름처럼 찾으려고 할 수 있습니다.

지금은 화면 파일을 만들 것이 아니라
문자열을 바로 보여주고 싶기 때문에 @ResponseBody를 붙입니다.


전체 흐름 정리

브라우저에서 /hello에 접속했을 때 흐름은 이렇습니다.

브라우저에서 /hello 요청
        ↓
Spring Boot 서버가 요청을 받음
        ↓
@GetMapping("/hello")을 찾음
        ↓
hello() 메서드 실행
        ↓
"Hello Spring Boot" 반환
        ↓
@ResponseBody 덕분에 문자열이 그대로 브라우저에 출력

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

Spring Boot 백엔드 개발은 결국
이 흐름을 계속 확장하는 과정입니다.


실행하기

Spring Boot를 실행합니다.

Gradle 프로젝트라면 터미널에서 아래 명령어를 사용할 수 있습니다.

./gradlew bootRun

Maven 프로젝트라면 아래 명령어를 사용할 수 있습니다.

./mvnw spring-boot:run

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

http://localhost:8080/hello

아래 문장이 보이면 성공입니다.

Hello Spring Boot

자주 하는 실수

1. 주소를 다르게 입력한 경우

코드에는 이렇게 적었습니다.

@GetMapping("/hello")

그러면 브라우저 주소도 정확히 /hello로 들어가야 합니다.

http://localhost:8080/hello

아래처럼 입력하면 다른 주소가 됩니다.

http://localhost:8080/Hello
http://localhost:8080/helloo

주소는 대소문자와 철자가 중요합니다.

2. 서버를 실행하지 않은 경우

코드를 작성해도 Spring Boot 서버를 실행하지 않으면
브라우저에서 접속할 수 없습니다.

먼저 애플리케이션을 실행한 뒤 접속해야 합니다.

서버가 실행되면 터미널에 보통 이런 로그가 보입니다.

Tomcat started on port 8080
Started DemoApplication

이런 문장이 보이면 서버가 켜진 것입니다.

3. 파일 위치가 잘못된 경우

처음에는 HelloController.java
메인 클래스와 같은 패키지 안에 두는 것이 좋습니다.

예를 들어 메인 클래스가 아래 패키지에 있다면

com.example.demo

컨트롤러도 같은 위치에 둡니다.

com.example.demo

패키지 위치가 너무 엉뚱하면
Spring Boot가 컨트롤러를 찾지 못할 수 있습니다.


@RestController는 뭐지?

나중에 Spring Boot 예제를 보다 보면
아래처럼 쓰는 코드도 자주 보게 됩니다.

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello Spring Boot";
    }
}

@RestController는 쉽게 말하면
@Controller@ResponseBody를 합친 것처럼 사용할 수 있습니다.

즉, 문자열이나 JSON 데이터를 바로 응답할 때 많이 사용합니다.

하지만 이번 글에서는 기초를 이해하기 위해
@Controller@ResponseBody를 따로 사용했습니다.

처음에는 따로 보는 것이 더 이해하기 좋습니다.


오늘 배운 것

이번 글에서는 첫 번째 컨트롤러를 만들어봤습니다.

핵심은 아래와 같습니다.

  • @Controller는 요청을 처리하는 클래스 표시
  • @GetMapping("/hello")/hello 주소와 메서드를 연결
  • @ResponseBody는 반환값을 브라우저에 그대로 출력
  • 브라우저에서 localhost:8080/hello로 접속하면 내가 만든 문장을 볼 수 있음

정리

이번 글에서는 Spring Boot에서 가장 기본적인 요청과 응답 흐름을 확인했습니다.

브라우저가 요청한다
→ 컨트롤러가 받는다
→ 메서드가 실행된다
→ 문자열을 응답한다

이 흐름이 Spring Boot 웹 개발의 출발점입니다.

지금은 단순히 문장 하나를 출력했지만,
나중에는 이 흐름을 이용해서 회원 조회, 게시글 작성, 로그인 같은 기능도 만들 수 있습니다.

처음에는 모든 어노테이션을 완벽하게 외우려고 하기보다,
아래 한 줄만 기억하면 됩니다.

@GetMapping으로 주소를 연결하고,
@ResponseBody로 반환값을 브라우저에 보여준다.

다음 단계에서는 URL과 GET 요청, 그리고 localhost:8080이 어떤 의미인지 조금 더 자세히 정리해보겠습니다.