H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • 요청 메소드란
  • HTTP 요청
  • GET 방식 요청
  • POST 방식 요청
  • Content-Type
  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain
  • 웹 서비스의 주소 설계 방식
  1. Web
  2. Back-end
  3. Spring Boot
  4. Spring Controller

요청 메소드

이 문서에서는 전통적인 요청 방식인 GET, POST에 대한 이해와 활용법에 대해서 살펴본다.

Previous경로 변수 처리NextRedirect

Last updated 2 years ago

요청 메소드란

요청 메소드(Request method)란 클라이언트가 웹 서버에게 요청의 목적과 종류를 알리는 수단이다. 요청 메소드는 GET, POST뿐 아니라 HEAD, PUT, DELETE, OPTIONS, TRACE, CONNECT등 다양하지만 대부분의 웹서버는 보안상의 이유로 GET, POST (혹은 OPTIONS) 만을 허용하므로 전통적인 웹은 GET, POST를 기반으로 구성된다.

OPTIONS는 GET, POST, HEAD 요청이 아닌 다른 요청들을 보낼 경우 해당 요청이 전송 가능한지 확인하기 위하여 사전에 검사하는 요청 방식이다.

HTTP 요청

HTTP 요청은 편지에 비교할 수 있다. 편지는 크게 편지봉투와 편지지로 나눌 수 있으며, 각각 작성하는 내용이 다르다. 편지봉투는 편지의 올바른 전송을 위한 정보(ex - 수신,발신인 정보)를 작성하며 편지지는 실제로 전달하고 싶은 내용을 작성한다. 이를 HTTP 요청에 비교하면 다음과 같이 표현할 수 있다.

  • 편지봉투 - Message Header

  • 편지지 - Message Body

실제 메세지의 형태는 다음처럼 하나로 이루어져 있으며, Header와 Body 사이에는 빈 줄이 하나 포함되도록 설계되어 있다.

구체적인 방식에 따라 Body가 존재하거나 존재하지 않을 수 있다.

GET 방식 요청

GET /home/ HTTP/1.1
Host: www.sysout.co.kr
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Cookie: JSESSIONID=292F247447712B53629CDEE22BAFF0AF
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Pragma: no-cache
Cache-Control: no-cache

GET 요청은 Message body를 가질 수 없다. 위 메세지에서 첫 줄을 제외한 나머지 부분은 모두 요청 헤더(Request Header)이며, name : value 형식으로 작성되어 있다. 페이지를 불러오면서 전달해야할 내용이 있다면 주소를 이용하여 요청 파라미터(Request Parameter) 혹은 경로변수(Path Variable) 형태로 서버에 전달해야 한다.

Spring Controller에서는 GET 요청을 다음 Annotation으로 처리한다.

  1. @RequestMapping(value="주소", method=RequestMethod.GET)

  2. @GetMapping("주소")

2번의 경우 Spring 5 이상의 환경이 필요하다.

또한 요청 파라미터와 경로 변수를 각각 다음 Annotation으로 처리한다.

  • 요청 파라미터 - @RequestParam , @ModelAttribute

  • 경로 변수 - @PathVariable , @ModelAttribute

캐싱 기능 설정

GET 요청은 캐싱 기능을 설정하여 응답 속도를 향상시킬 수 있다. 캐싱 기능을 사용하면 한 번 접속한 페이지의 내용을 브라우저에 캐시하여 재 요청 시 차이점을 비교하여 추가 요청 전송 여부를 판단한다.

POST 방식 요청

POST /home/link/regist HTTP/1.1
Host: www.sysout.co.kr
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 180
Origin: https://www.sysout.co.kr
DNT: 1
Connection: keep-alive
Referer: https://www.sysout.co.kr/home/link/regist
Cookie: JSESSIONID=17AD73B28B9D4233B527FF17B1F509C1; JSESSIONID=292F247447712B53629CDEE22BAFF0AF
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Pragma: no-cache
Cache-Control: no-cache

url=https%3A%2F%2Fdocs.sysout.co.kr&field=%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC&name=Hacademy+Docs&explain=%EA%B0%9C%EB%B0%9C+%EB%AC%B8%EC%84%9C+%EB%B8%94%EB%A1%9C%EA%B7%B8&agree=on

POST 요청은 서버에 데이터를 전송하기 위한 방식이다. 따라서 Message Body를 가질 수 있다. Message Body에 작성될 내용의 형태는 Content-Type 헤더로 표시하며, 내용의 크기는 Content-Length 헤더로 작성한다.

Spring Controller에서 POST 요청 데이터를 처리하기 위해 다음 Annotation을 제공한다.

  1. @RequestMapping(value="주소", method=RequestMethod.POST)

  2. @PostMapping("주소")

또한 전송되는 데이터를 다음 Annotation으로 처리할 수 있다.

  • @RequestParam , @ModelAttribute

POST 요청의 경우 전송되는 Message Body가 Percent encoding 처리되기 때문에 웹서버에서 별도의 Encoding 처리 코드를 작성하거나 도구를 설정해야 한다.

Spring은 CharacterEncodingFilter를 통해 원하는 형태로의 인코딩이 가능하도록 지원한다.

Content-Type

Content-Type 헤더에는 Message Body의 형태를 기입한다. 다음 종류가 있다.

  • application/x-www-form-urlencoded

  • multipart/form-data

  • text/plain

application/x-www-form-urlencoded

multipart/form-data

text/plain

일반 텍스트를 전송할 때 사용한다.

웹 서비스의 주소 설계 방식

앞서 살펴본 GET과 POST 요청은 각자의 특징이 존재한다. 이것을 웹에서 어떻게 조화롭게 사용할 것인가를 고민하기 위해 홈페이지의 기능을 다음과 같이 크게 구분해본다.

  1. 데이터를 입력해서 등록한다.

  2. 등록된 데이터를 조회한다

  3. 등록된 데이터를 수정한다

  4. 등록된 데이터를 삭제한다

1번은 Create, 2번은 Read, 3번은 Update, 4번은 Delete에 해당하는 작업이다. 첫 글자를 합쳐서 CRUD라고 한다. 레거시 웹은 이 네 가지를 이용하여 대부분의 기능을 구현한다.

  • Create - 회원 가입, 게시글 작성, 상품 등록 등

  • Read - 회원 정보, 회원 목록, 게시글 목록, 게시글 검색, 게시글 상세, 상품 목록, 상품 상세정보 등

  • Update - 회원정보 수정, 비밀번호 변경, 게시글 수정, 상품정보 변경

  • Delete - 회원 탈퇴, 게시글 삭제, 상품정보 삭제

등록과 수정의 경우 정보를 입력해야 하기 때문에 두 개의 페이지가 필요하다. 조회/검색의 경우 한 개의 페이지가 필요하고, 삭제의 경우도 부가 기능을 구현하지 않는다면 정보 입력이 필요하지 않아 한 개의 페이지로 처리 가능하다.

최근들어 한 페이지에서 모든 작업을 구현하는 SPA 방식이 유행하면서 하나의 페이지에서 무수히 많은 기능들을 구현하려 하는 경향이 있다. 이는 웹의 응용 방식이며 GET, POST 외에도 PUT, DELETE 등 다양한 방식을 사용하여 처리한다. 지금 다룰 내용이 아니므로 생략한다.

하나의 페이지만 필요한 경우에는 GET/POST를 원하는 대로 사용하면 되며 다음 특징을 주의하면 된다.

  • GET 방식은 <a>, <script>, <form> 등 다양한 방식으로 요청 생성이 가능하다.

  • GET 방식은 주소와 요청 파라미터를 포함하여 256 byte까지 작성이 가능하다.

  • POST 방식은 데이터 전송에 대한 크기 제약이 없다.

  • POST 방식은 새로고침을 누를 경우 데이터가 재전송 되며 브라우저에 확인창이 출력된다.

등록이나 수정처럼 입력 페이지를 포함하여 두 개의 페이지가 필요한 경우는 다음과 같은 주소 설계가 가능하다.

  1. 입력 페이지와 처리 페이지의 주소를 다르게 하여 GET, POST 요청을 자유롭게 사용

  2. 입력 페이지와 처리 페이지의 주소를 맞추고 GET, POST 요청을 구분하여 사용

레거시 웹의 주소 설계 방식은 SOA(Service Oriented Architecture)를 따른다. 주소를 봤을 때 어떤 기능인지 떠올라야 한다. 다음 예시를 통해 비교할 수 있다. 예시에서는 회원 가입을 각각의 방식에 맞게 설계하였을 때 주소의 형태를 살펴볼 수 있다.

  • 1번 방식

    • 입력 페이지 - /member/join_input

    • 처리 페이지 - /member/join_process

  • 2번 방식

    • 입력 페이지 - /member/join[GET]

    • 처리 페이지 - /member/join[POST]

일반적으로 1번보다 2번 방식을 더 선호하는 이유는 다음과 같다.

  1. 주소를 동일하게 하여 기능의 통일성을 강조할 수 있다.

  2. 보안에 가장 취약한 GET 요청이 Database와 연결된 요청이 되지 않도록 한다.

GET 요청은 서버의 자원을 가져오기 위한 방식이다. 서버에서 특정 페이지를 불러오기 위한 대부분의 요청이 GET 요청 형태이다. 다음 내용은 에 대한 요청 메세지이다.

요청 파라미터와 같은 형의 데이터, 알파벳이 아닌 값은 처리된다. <form> 태그에서 post 전송 시 기본값이다. key=value가 세트로 전송되어 하나의 key에 하나의 value가 매핑된다.

파일과 같이 보낼 정보가 많아서 로 전송이 불가능한 경우 사용하는 방식이다. boundary헤더에 설정된 값을 경계선으로 하여 내부에 데이터를 담도록 구성되어 있다. Spring에서는 MultipartResolver에 의해 처리된 결과물을 MultipartRequest 또는 MultipartFile 형태로 받을 수 있다.

따라서 GET → 입력페이지 → POST → 등록/수정 형태의 처리 방식으로 처리하고, 모든 작업을 마치면 현재 페이지에 머무는 것이 아닌 다른 페이지로 처리하는 형태로 페이지를 설계한다.

에 대한 자세한 내용은 다음 문서를 참고한다.

H'academy 메인페이지
Percent encoding
Redirect
Redirect
Redirect
application/x-www-form-urlencoded
퍼센트 인코딩Wikipedia
HTTP 요청 메서드 - HTTP | MDN
메소드별 상세 설명이 있는 MDN 문서 링크
편지봉투(Header)와 편지지(Body)
Create 작업 예시 - 회원 가입
(좌)요청 메세지 (우)응답 메세지 (출처 )
https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
Logo
Logo