[Springboot] HTTP 기초와 Spring Controller·REST 개요
목차
OSI 7계층과 HTTP

- 1~4계층: 네트워크 인프라 영역 (KT, U+ 등 통신사가 담당)
- 5계층 세션(Session): 두 클라이언트·서버 간 통신 연결을 관리
- 6계층 표현(Presentation): 데이터를 표현 가능한 형식으로 변환 (OS 간 차이 처리)
- 7계층 응용(Application): 모든 데이터를 받아 사용 가능하게 하는 계층 → HTTP가 여기에 위치
HTTP (HyperText Transfer Protocol)
- 통신 7계층 중 응용 계층에 정의된 통신 규약
- 서버와 클라이언트가 메시지를 전달하는 형식을 정의
HTTP 요청 구조 (Request)
HTTP 요청은 RequestLine + Header + Body 로 구성된다.
| 구성 요소 | 내용 |
|---|---|
| RequestLine | HTTP 메서드(GET 등) + 경로(Path) + HTTP 버전 |
| Header | 요청에 관한 메타 정보 (key-value 쌍) |
| Body | 실제 전송 데이터 (없을 수도 있음) |
요청을 받을 때 기대해야 하는 것: 경로·헤더·바디
응답으로 보내줘야 하는 것: 상태 코드(Status)·바디
Content-Type 헤더
- 응답/요청 바디가 어떤 형식인지를 나타내는 핵심 헤더
- REST API에서 가장 많이 쓰는 것은 JSON 형식
- 아무리 몰라도 Content-Type의 용도는 반드시 알아둬야 한다
HTTP Status Code
| 범위 | 의미 |
|---|---|
| 2xx | 정상 처리 |
| 4xx | 클라이언트 측 오류 (404: 존재하지 않는 경로) |
| 5xx | 서버 내부 오류 (500: Internal Server Error) |
클라이언트 잘못인지 서버 잘못인지 구분하는 분류 정보는 반드시 알아야 한다.
URL (Uniform Resource Locator)

URL의 각 구성 요소:
| 구성 요소 | 설명 |
|---|---|
| Scheme | 프로토콜 (http://, https://, ssh:// 등) |
| Userinfo | 사용자 정보 (옵셔널, 자주 쓰지 않음) |
| Host | 요청을 실제로 처리할 서버 주소 |
| Port | 포트 번호 (옵셔널, HTTP 기본값: 80) |
| Path | 서버 내 경로 (/index.html 등) |
| Query | ? 이후 파라미터 (예: 특정 기사 URL의 ? 뒤 내용) |
| Fragment | # 이후 값, 프론트엔드 반응형 웹에서 특정 섹션 지정 용도 |
https://sports.news.naver.com/index.nhn
위처럼 경로까지만 있는 경우도 있고, 특정 기사로 들어가면 ? 이후 쿼리가 붙는다.
# Fragment는 React·Vue 등 SPA(Single Page Application) 프레임워크에서도 활용된다.
Domain
- 네트워크 도메인 또는 IP 자원을 식별하는 특별한 문자열
- IP 주소(예:
125.209.222.142)는 기억하기 어려우므로, 사람이 찾기 쉽도록 도메인(예:www.naver.com)을 사용 - HTTP 내부에는 도메인 정보가 없음 — 브라우저가 DNS를 통해 IP로 변환한 뒤 요청을 보냄
HTTP 기본 포트는 80, 스킴에 따라 사용 포트가 결정된다.
다른 포트를 넣어도 URL이 틀린 것은 아니지만, 해당 포트에 서비스가 없으면 동작하지 않는다.
Spring으로 구현한다면?

개발 직군 구분
| 직군 | 역할 |
|---|---|
| 인프라 | 물리 서버 구축 및 호스팅 담당 |
| DevOps | CI/CD 자동화, 배포 관리 도구 (CircleCI, Kubernetes 등) 운영 |
| 백엔드 | 서비스 로직 구현, WAR/JAR 결과물 생성 |
Spring 주요 어노테이션

@Controller
- 일반적으로 요청의 Path를 다루는 컴포넌트
- Spring의 MVC 구조에서 View(JSP 등)를 반환할 때 사용
ModelAndView를 통해 어떤 파라미터를 전달할지 정의
@RequestMapping
- Path 상의 상세 경로를 설정하는 데 사용
- Controller 클래스에 붙이면 상위 경로로 적용 가능
- HTTP 요청/응답 속성(Content-Type, HTTP 메서드 등)을 정의할 수 있음
@ResponseBody
- 반환값을 HTTP 응답의 Body에 직접 삽입하기 위한 어노테이션
- 없으면 Spring이 반환값을 View 이름으로 해석하려 시도함


@RestController vs @Controller
| 어노테이션 | 특징 |
|---|---|
@Controller | View(HTML/JSP) 반환 목적, MVC 패턴 |
@RestController | @ResponseBody가 기본 내장, 명확한 데이터(JSON 등) 전송 목적 |
REST 설계 원칙

REST는 성능·확장성·간편함·가시성·이식성을 위한 설계 제약사항 모음이며, HTTP 전용으로 만들어진 것은 아니다.

| 제약 | 설명 |
|---|---|
| 1. Client-Server | 클라이언트(프론트)와 서버(백)가 분리됨 |
| 2. Stateless | 요청에 상태 정보를 포함하지 않음 |
| 3. Cacheable | 응답이 캐시 가능 여부를 명시 |
| 4. Layered System | 클라이언트는 서버 내부 계층을 알 필요 없음 |
| 5. Code on Demand | (옵셔널) 서버가 실행 가능한 스크립트를 전달 가능 |
Uniform Interface

- Resource identification in requests: 개별 자원이 요청 자체에 식별자로 내재되어 있음
- 실제 자원이 아닌 **자원의 표현(Representation)**이 전달됨