[Spring] 2일차

김민지·2026년 4월 10일

kosa-Spring

목록 보기
2/13

1. Spring MVC & HTTP 정리

Controller vs RestController

@Controller 는 클라이언트 요청이 들어오면 View로 이동한다. View는 Thymeleaf 같은 템플릿 엔진을 통해 HTML을 만들고, ui와 data가 합쳐진 완성된 HTML을 브라우저에 전달한다. 브라우저는 받은 HTML을 그대로 보여주기만 하면 된다. 즉, Controller가 데이터를 직접 주는 게 아니라 템플릿 엔진이 템플릿 안의 ui를 자동으로 찾아서 실행하고 완성된 html을 만드는 역할을 담당한다.

@RestController 는 View 없이 클라이언트 요청에 바로 응답한다. Java 객체를 반환하면 Jackson이 자동으로 JSON 또는 XML 형태로 직렬화해서 응답 본문에 담아 전달한다.

@Controller@RestController
응답 형태HTML (템플릿 엔진 필요)JSON/XML
View 존재 여부O (Thymeleaf 등)X
반환값View 이름 (String)Java 객체
주 용도화면이 있는 MVCREST API

요청 매핑

클래스 위에 @RequestMapping(”/경로”) 를 붙이면 공통 경로를 지정할 수 있다. 메소드별로 세부 경로를 추가해서 URL을 구성한다.

@Controller
@RequestMapping("/users")
public class UserController {

    @GetMapping("/info")       // GET /users/info
    @PostMapping("/join")      // POST /users/join
    @PutMapping("/{id}")       // PUT /users/1
    @DeleteMapping("/{id}")    // DELETE /users/1
}

2. HTTP 메서드

GET

경로 뒤에 데이터가 ?key=value 형태로 붙는다. 단순한 데이터 조회 요청에 사용하낟. Postman에서는 Params 탭에 작성한다.

POST

요청 Body에 데이터를 담아 전송한다. 로그인, 회원가입처럼 서버에 특정 작업을 요청할 때 사용한다. 데이터 크기 제한이 없다. Postman에서는 Body 탭에 작성한다.

PUT / PATCH

수정 요청에 사용한다. PUT은 전체 수정, PATCH는 일부 수정이지만 실무에서는 대부분 PUT을 사용한다.

DELETE

삭제 요청에 사용한다.

HTTP 구조

HTTP 메시지는 세 부분으로 구성된다.

시작행 (딱 한 줄) : GET /users/1 HTTP/1.1
헤더 (여러 줄) : Content-Type, Authorization 등
바디 (POST 전용): 전송할 데이터

POST 방식으로 전송할 때는 항상 Body에 데이터를 넣어야 한다. Body에 데이터를 넣는 방식은 여러 가지가 있다. 대표적으로

Body 형식설명사용 상황
x-www-form-urlencodedkey=value 문자 전송기본 폼 전송
form-data멀티파트 형식파일 첨부 시 사용
raw (JSON)JSON 문자열 직접 전송REST API 요청

파라미터 바인딩

데이터를 받는 방식은 어떤 Body 형식으로 보냈느냐에 따라 달라진다.

@PathVariable

URL 경로 자체에 값을 포함해서 보낼 때 사용한다. URL의 {변수명}과 매핑되며, 변수명이 다를 경우 @PathVariable("실제경로명")처럼 명시한다.

@RequestParam

URL 뒤에 ?key=value 형태로 붙는 쿼리 파라미터를 받을 때 사용한다.

@ModelAttribute

x-www-form-urlencoded 또는 form-data로 보낸 경우 사용한다. key=value 형태의 데이터를 DTO 객체에 자동으로 바인딩한다.

@RequestBody

Postman의 raw(JSON)으로 보낸 경우 사용한다. JSON 문자열을 DTO 객체로 자동 변환한다.

@RequestPart

form-data로 파일을 포함한 데이터를 보낼 때 사용한다. 문자 파트와 파일 파트를 각각 따로 받는다. 파일이 클 때는 BufferedReader로 조금씩 읽어서 메모리를 절약한다.

@RequestHeader

HTTP 헤더에 담긴 값을 받을 때 사용한다.


@Slf4j 로그 출력, 클래스 위에 붙이면 로그를 출력할 수 있다.

3. HTTP 상태 코드

일단 실습하면서 나온 것만 간단히 정리하겠다.

코드의미
200요청 성공
201생성 성공 (POST)
400잘못된 요청 (클라이언트 오류)
401인증 필요
403권한 없음
404리소스 없음
500서버 내부 오류

4. 보충 개념

공부하면서 생겼던 의문점 등

  • readline과 성능 — 줄 수가 많을수록 반복 횟수가 늘어나므로 처리 시간이 길어진다. 단, 한 줄에 모든 데이터를 넣는다고 해서 반드시 빠른 것은 아니고, 파싱 방식에 따라 달라진다.
  • 티켓팅 대기열과 서버 부하 — 티켓팅 시 대기 인원을 표시하는 이유는 동시 접속자가 많아지면 서버가 다운될 수 있기 때문이다. 일정 인원만 서버 안으로 들이고 나머지는 대기시키는 방식으로 서버를 보호한다. Spring WebFlux의 논블로킹(Non-blocking) 방식을 사용하면 이런 대규모 동시 접속 상황을 더 효율적으로 처리할 수 있다.
profile
안녕하세요

0개의 댓글