이전 글에서는 Spring Boot에서 첫 번째 컨트롤러를 만들고,
브라우저에서 /hello 주소로 접속했을 때 문장이 출력되도록 해봤습니다.
http://localhost:8080/hello
처음에는 결과가 나오는 것만 봐도 신기합니다.
그런데 여기서 한 가지 의문이 생깁니다.
“주소창에 /hello를 입력했을 뿐인데, 왜 Java 코드가 실행될까?”
이번 글에서는 이 흐름을 아주 기초부터 정리해보겠습니다.
이번 글의 목표는 딱 하나입니다.
주소를 치면 왜 코드가 실행되는지 이해하기
먼저 전체 흐름부터 보기
브라우저에서 아래 주소로 접속한다고 해보겠습니다.
http://localhost:8080/hello
이때 내부에서는 대략 이런 일이 일어납니다.
브라우저에 주소 입력
↓
브라우저가 Spring Boot 서버에 요청 보냄
↓
Spring Boot가 /hello 주소를 확인
↓
@GetMapping("/hello")이 붙은 메서드 찾음
↓
해당 Java 메서드 실행
↓
결과를 브라우저에 응답
즉, 주소를 입력하면 브라우저가 서버에 요청을 보내고,
Spring Boot는 그 요청에 맞는 코드를 찾아 실행합니다.
URL이란?
URL은 웹에서 특정 자원을 찾기 위한 주소입니다.
예를 들어 아래 주소를 보겠습니다.
http://localhost:8080/hello
이 주소는 여러 부분으로 나눠서 볼 수 있습니다.
| 부분 | 의미 |
|---|---|
http | 통신 방식 |
localhost | 내 컴퓨터를 가리키는 주소 |
8080 | 서버가 열려 있는 포트 번호 |
/hello | 서버 안에서 찾을 경로 |
처음에는 전부 외우려고 하지 않아도 됩니다.
일단 이렇게 이해하면 됩니다.
URL은 브라우저가 서버에게 “어디로 요청을 보낼지” 알려주는 주소입니다.
localhost는 무엇일까?
localhost
localhost는 내 컴퓨터 자신을 가리키는 이름입니다.
쉽게 말하면, 브라우저가 인터넷 어딘가의 서버로 가는 것이 아니라
지금 내 컴퓨터에서 실행 중인 서버로 요청을 보내는 것입니다.
Spring Boot를 내 컴퓨터에서 실행하면,
그 서버도 내 컴퓨터 안에서 켜집니다.
그래서 브라우저에서 아래 주소로 접속할 수 있습니다.
http://localhost:8080
이 말은 이렇게 해석할 수 있습니다.
내 컴퓨터에서 실행 중인 8080번 서버에 접속하겠다.
8080은 무엇일까?
8080
8080은 포트 번호입니다.
포트는 쉽게 말하면 컴퓨터 안의 여러 문 중 하나입니다.
내 컴퓨터에서는 여러 프로그램이 동시에 실행될 수 있습니다.
예를 들어:
- 웹 서버
- 데이터베이스
- 메신저
- 개발 서버
이런 프로그램들이 동시에 동작할 수 있습니다.
그래서 컴퓨터는 포트 번호를 이용해
어떤 프로그램으로 요청을 보낼지 구분합니다.
Spring Boot는 기본적으로 8080 포트를 사용합니다.
그래서 기본 실행 후에는 보통 아래 주소로 접속합니다.
http://localhost:8080
/hello는 무엇일까?
/hello
/hello는 서버 안에서 요청을 구분하는 경로입니다.
이전 글에서 우리는 이런 코드를 작성했습니다.
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello Spring Boot";
}
여기서 중요한 부분은 이 코드입니다.
@GetMapping("/hello")
이 뜻은 다음과 같습니다.
/hello 주소로 GET 요청이 들어오면
아래 메서드를 실행하세요.
그래서 브라우저에서 아래 주소로 접속하면
http://localhost:8080/hello
Spring Boot는 /hello에 연결된 메서드를 찾고,
그 메서드를 실행합니다.
GET 요청이란?
GET 요청은 서버에서 데이터를 가져올 때 많이 사용하는 요청 방식입니다.
처음에는 어렵게 생각하지 않아도 됩니다.
브라우저 주소창에 주소를 입력해서 접속하는 것도
보통 GET 요청입니다.
예를 들어 브라우저에 이렇게 입력합니다.
http://localhost:8080/hello
그러면 브라우저는 서버에게 이렇게 말하는 것과 비슷합니다.
/hello 주소에 해당하는 내용을 보여주세요.
이게 GET 요청입니다.
즉, GET 요청은 보통 다음 느낌입니다.
서버야, 이 주소에 해당하는 정보를 보여줘.
브라우저는 단순히 화면만 보여주는 도구가 아니다
초보 때는 브라우저를 그냥 화면을 보는 도구로 생각하기 쉽습니다.
하지만 웹 개발 관점에서 브라우저는 서버에 요청을 보내는 클라이언트입니다.
흐름은 이렇습니다.
브라우저 = 요청을 보내는 쪽
서버 = 요청을 받고 응답하는 쪽
예를 들어 사용자가 주소창에 /hello를 입력하면,
브라우저는 Spring Boot 서버에 요청을 보냅니다.
그러면 Spring Boot 서버가 요청을 처리하고 응답을 돌려줍니다.
브라우저는 그 응답을 화면에 보여줍니다.
Spring Boot는 요청을 어떻게 찾을까?
Spring Boot는 실행될 때 컨트롤러들을 확인합니다.
예를 들어 아래 클래스가 있다고 해보겠습니다.
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello Spring Boot";
}
}
Spring Boot는 @Controller가 붙은 클래스를 보고
“이 클래스는 요청을 처리할 수 있겠구나”라고 인식합니다.
그리고 @GetMapping("/hello")을 보고
“GET 방식으로 /hello 요청이 오면 hello() 메서드를 실행해야겠구나”라고 연결해둡니다.
그래서 요청이 들어오면 바로 해당 메서드를 찾을 수 있습니다.
실제 요청 흐름 다시 보기
브라우저에서 아래 주소를 입력합니다.
http://localhost:8080/hello
그러면 흐름은 이렇게 이어집니다.
1. 브라우저가 localhost:8080 서버로 요청을 보냄
2. 요청 경로는 /hello
3. 요청 방식은 GET
4. Spring Boot가 @GetMapping("/hello")을 찾음
5. hello() 메서드 실행
6. "Hello Spring Boot" 문자열 반환
7. 브라우저가 문자열을 화면에 보여줌
이 흐름을 이해하면
Spring Boot에서 컨트롤러가 왜 필요한지 조금씩 감이 잡힙니다.
주소와 코드가 연결되는 핵심
아래 두 부분이 서로 연결됩니다.
브라우저 주소:
http://localhost:8080/hello
Java 코드:
@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot";
}
즉, /hello라는 주소와 hello() 메서드가 연결됩니다.
이 연결을 해주는 것이 @GetMapping입니다.
처음에는 이렇게 기억하면 됩니다.
브라우저 주소의 /hello
↕
@GetMapping("/hello")
만약 주소가 다르면 어떻게 될까?
코드에는 이렇게 적혀 있습니다.
@GetMapping("/hello")
그런데 브라우저에서 아래 주소로 접속하면 어떻게 될까요?
http://localhost:8080/hi
이 경우에는 /hi에 연결된 메서드가 없기 때문에
Spring Boot는 요청을 처리할 메서드를 찾지 못합니다.
그래서 에러 페이지가 나오거나,
404 Not Found가 나올 수 있습니다.
404는 쉽게 말하면 이런 뜻입니다.
해당 주소에 연결된 내용을 찾을 수 없습니다.
즉, 주소와 @GetMapping의 경로가 맞아야 합니다.
localhost:8080까지만 접속하면 왜 에러가 날까?
처음 Spring Boot를 실행하고 아래 주소로 접속하면
http://localhost:8080
에러 페이지가 나올 수 있습니다.
이것은 서버 실행 실패가 아닐 수 있습니다.
이유는 간단합니다.
우리는 /hello 주소만 만들었고,
/ 주소는 아직 만들지 않았기 때문입니다.
즉, 아래 주소는 만들었습니다.
/hello
하지만 아래 주소는 아직 만들지 않았습니다.
/
그래서 localhost:8080에서 에러가 나도,
localhost:8080/hello에서 정상 출력된다면 괜찮습니다.
자주 헷갈리는 부분
1. URL과 파일 경로를 헷갈리는 경우
/hello는 컴퓨터 안의 파일 경로가 아닙니다.
예를 들어 /hello라는 폴더나 파일이 실제로 있는 것이 아닙니다.
/hello는 Spring Boot가 요청을 구분하기 위한 주소 경로입니다.
이 경로는 아래 코드와 연결됩니다.
@GetMapping("/hello")
2. 서버를 실행하지 않고 주소를 입력하는 경우
Spring Boot 서버가 실행되지 않았다면
브라우저에서 localhost:8080/hello로 접속해도 연결되지 않습니다.
먼저 서버를 실행해야 합니다.
서버가 실행되면 터미널에 보통 이런 문장이 보입니다.
Tomcat started on port 8080
Started DemoApplication
3. 포트 번호를 다르게 입력하는 경우
Spring Boot가 8080 포트로 실행 중인데
브라우저에서 8081로 접속하면 연결되지 않습니다.
http://localhost:8081/hello
이 주소는 8081 포트에 서버가 있을 때만 동작합니다.
기본 설정이라면 보통 8080을 사용합니다.
오늘 배운 것
이번 글에서는 URL과 요청 흐름을 정리했습니다.
핵심은 아래와 같습니다.
- URL은 서버에 요청을 보내기 위한 주소
localhost는 내 컴퓨터를 의미8080은 Spring Boot 서버가 사용하는 기본 포트/hello는 서버 안에서 요청을 구분하는 경로- 브라우저 주소창에 입력하면 보통 GET 요청이 전송됨
@GetMapping("/hello")이 해당 요청과 Java 메서드를 연결함
정리
브라우저에서 주소를 입력하면 단순히 화면이 열리는 것이 아닙니다.
브라우저는 서버에 요청을 보내고,
Spring Boot는 그 요청에 맞는 컨트롤러 메서드를 찾아 실행합니다.
이번 글의 핵심은 이 흐름입니다.
주소 입력
→ 브라우저가 서버에 요청
→ Spring Boot가 경로 확인
→ @GetMapping과 연결된 메서드 실행
→ 결과 응답
이 흐름을 이해하면
앞으로 @RequestParam, @PostMapping, API 응답을 배울 때 훨씬 덜 헷갈립니다.
다음 글에서는 /hello?name=kim처럼
주소에 값을 담아 서버로 보내는 방법을 정리해보겠습니다.