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
  • Redirect란?
  • Spring Controller에서의 Redirect
  • Redirect가 필요한 상황
  • Controller와 Mapping 구현
  • Controller 구현
  • Mapping 구현
  • 접속 확인
  • 통합 Mapping 구현
  • HttpServletResponse 사용
  • Redirect 접두사 사용
  • RedirectView 사용
  • RedirectAttributes
  • Redirect 접두사 사용 시
  • RedirectView 사용 시
  • 주의사항
  • 절대 경로에 대한 처리
  • Redirect는 Get방식이다
  • 소스 코드
  • Github
  • ExchangeController
  1. Web
  2. Back-end
  3. Spring Boot
  4. Spring Controller

Redirect

Spring Controller에서 Redirect 처리하는 방법에 대해 살펴본다

Redirect란?

Redirect란 클라이언트(브라우저)에게 재접속을 지시하는 행위를 말한다. 예를 들어 다음과 같은 상황이라고 볼 수 있다.

ex) 고객센터에 걸려온 전화

(상담원) 안녕하십니까? Hacademy입니다.

(고객) 안녕하세요. 열혈강사 채널에 광고 문의하려고 전화했는데요

(상담원) 네 그러십니까. 죄송하지만 열혈강사 채널 관련 문의는 다른 팀에서 전담하고 있는데요. (번호를 알려준다) 이 번호로 다시 연락 주시겠습니까? (Redirect 처리)

(고객) 네 알겠습니다. (안내받은 번호로 전화를 건다)

Spring Controller에서의 Redirect

Spring Controller에서는 필요에 따라 Redirect를 사용할 수 있다. 사용하는 방법은 여러 가지가 있다.

  1. HttpServletResponse 객체를 사용하는 방법

  2. URL에 redirect 접두사를 표기하는 방법

  3. RedirectView를 사용하는 방법

Redirect가 필요한 상황

Redirect가 필요한 상황을 만들기 위해 boot04redirect 프로젝트를 생성한다. 간단한 환율 계산기를 만들 예정이다.

Controller와 Mapping 구현

우리가 만들 기능은 두 가지이다.

  • /usd2krw - 달러($)를 원화(₩)로 변환하여 출력하는 기능 (View 없이 구현)

  • /krw2usd - 원화(₩)를 달러($)로 변환하여 출력하는 기능 (View 없이 구현)

Controller 구현

우선 ExchangeController라는 클래스를 생성한다.

ExchangeController.java
@Controller
public class ExchangeController {

}

Mapping 구현

작성 시점의 환율로 계산하여 사용자에게 출력하도록 Mapping을 구현한다.

작성 시점인 2022.08.29 기준 환율은 다음과 같다

  • 1 KRW = 0.00074 USD

  • 1 USD = 1347.15 KRW

ExchangeController.java
@GetMapping("/usd2krw")
@ResponseBody
public String usd2krw(@RequestParam double usd) {
	double krw = 1347.15 * usd;
	return usd + "(USD) → "+krw+"(KRW)";
}
@GetMapping("/krw2usd")
@ResponseBody
public String krw2usd(@RequestParam double krw) {
	double usd = 0.00074 * krw;
	return krw+"(KRW) → "+usd+"(USD)";
}

접속 확인

Spring Boot App을 실행한 뒤 다음 주소로 접속하여 정상적으로 작동되는지 확인한다. 각각 100달러와 10000원에 대한 환전 결과이다.

통합 Mapping 구현

지금은 서로 다른 URL로 각각 KRW→USD, USD→KRW 를 처리하고 있으나 이를 하나의 URL로 합쳐서 처리할 수도 있지 않을까 하는 의문이 든다. 이를테면 주소에 mode라는 이름의 파라미터를 추가하여 하고자 하는 작업을 알려주는 방법을 사용할 수 있다.

  • http://localhost:8080/exchange?mode=usd2krw&amount=100

  • http://localhost:8080/exchange?mode=krw2usd&amount=10000

가능하다면 한 페이지에 많은 기능이 있는 것이 좋으므로 /exchange라는 주소를 만들고, 대신 mode에 따라 /usd2krw와 /krw2usd로 redirect 하도록 처리한다. 그림으로 표현하면 다음과 같다.

HttpServletResponse 사용

/exchange1 매핑을 만들어 mode, amount 파라미터를 수신하고 redirect 처리하도록 구현하는 Mapping은 다음과 같다. Redirect는 JSP/Servlet 기본 응답 객체인 HttpServletResponse에서 지원하므로 매개변수에 추가하며, IOException이 발생하므로 예외 전가 처리까지 해야 한다.

@GetMapping("/exchange1")
@ResponseBody
public void exchange1(@RequestParam String mode, @RequestParam double amount, HttpServletResponse response) throws IOException {
	if(mode.equals("usd2krw")) {
		response.sendRedirect("usd2krw?usd="+amount);
	}
	else if(mode.equals("krw2usd")) {
		response.sendRedirect("krw2usd?krw="+amount);
	}
}

현재 페이지에서는 사용자에게 반환할 내용이 없으므로 반환형은 void를 사용하였다. 접속하면 다음과 같이 Redirect 처리 됨을 확인할 수 있다. 자세히 살펴볼 내용은 개발자 도구에서 기록이 남는다는 것과, 주소가 /exchange가 아니라는 점이다.

크롬 개발자 도구에서 네트워크 이력을 확인하면 다음과 같이 Redirect가 되었음을 확인할 수 있다.

Redirect 접두사 사용

Spring에서는 redirect: 접두사로 redirect 처리가 가능하다. 단, View Resolver를 사용해야 한다. /exchange2 를 만들어 redirect 접두사를 사용하여 처리하도록 구현한다.

@GetMapping("/exchange2")
public String exchange2(@RequestParam String mode, @RequestParam double amount) {
	if(mode.equals("usd2krw")) {
		return "redirect:usd2krw?usd="+amount;
	}
	else if(mode.equals("krw2usd")) {
		return "redirect:krw2usd?krw="+amount;
	}
	return null;
}

접속 테스트를 하면 정상적으로 Redirect가 이루어지는 것을 확인할 수 있다.

RedirectView 사용

Spring에서는 Redirect만을 위한 RedirectView 클래스를 제공한다. /exchange3을 만들고 테스트를 위한 코드를 작성한다.

@GetMapping("/exchange3")
public RedirectView exchange3(@RequestParam String mode, @RequestParam double amount) {
	if(mode.equals("usd2krw")) {
		return new RedirectView("usd2krw?usd="+amount);
	}
	else if(mode.equals("krw2usd")) {
		return new RedirectView("krw2usd?krw="+amount);
	}
	return null;
}

반환형으로 RedirectView를 설정하고 객체를 반환하도록 코드를 구성한다. 객체 내부에는 Redirect 목표 매핑 주소를 작성한다.

테스트 시 정상적으로 Redirect 됨을 확인할 수 있다.

RedirectAttributes

Redirect 할 때 파라미터를 작성하는 것이 번거로운 경우가 많다. 파라미터는 ?와 &를 사용하여 작성해야 하므로 수식이 지저분해지는데, RedirectAttributes는 Model과 동일한 방법으로 Redirect시 파라미터를 처리할 수 있도록 Spring에서 제공하는 도구이다.

매개변수에 선언한 뒤 Model처럼 key=value 형식으로 데이터를 추가한다. redirect 접두사와 RedirectView 등 Spring에서 지원하는 기능에서 사용할 수 있다.

Redirect 접두사 사용 시

@GetMapping("/exchange2-1")
public String exchange2_1(@RequestParam String mode, @RequestParam double amount, RedirectAttributes attr) {
	if(mode.equals("usd2krw")) {
		attr.addAttribute("usd", amount);
		return "redirect:usd2krw";
	}
	else if(mode.equals("krw2usd")) {
		attr.addAttribute("krw", amount);
		return "redirect:krw2usd";
	}
	return null;
}

RedirectView 사용 시

@GetMapping("/exchange3-1")
public RedirectView exchange3_1(@RequestParam String mode, @RequestParam double amount, RedirectAttributes attr) {
	if(mode.equals("usd2krw")) {
		attr.addAttribute("usd", amount);
		return new RedirectView("usd2krw");
	}
	else if(mode.equals("krw2usd")) {
		attr.addAttribute("krw", amount);
		return new RedirectView("krw2usd");
	}
	return null;
}

주의사항

Redirect를 처리할 경우의 주의사항은 다음과 같다.

절대 경로에 대한 처리

  • JSP/Servlet 방식일 경우 절대경로를 사용하려면 HttpServletRequest 객체를 통한 계산이 필요하다(1번 방식)

    • 상대 경로 - response.sendRedirect("usd2krw?usd=100")

    • 절대 경로 - response.sendRedirect(request.getContextPath()+"/usd2krw?usd=100")

  • Spring에서 제공하는 방식(2번, 3번 방식)일 경우 경로 앞에 /를 적으면 절대경로로 인식한다.

    • redirect 접두사(2번 방식)를 사용하는 경우

      • 상대 경로 - return "usd2krw?usd=100"

      • 절대 경로 - return "/usd2krw?usd=100";

    • RedirectView를 사용하는 경우

      • 상대 경로 - return new RedirectView("usd2krw?usd=100")

      • 절대 경로

        • return new RedirectView("/usd2krw?usd=100")

        • return new RedirectView("usd2krw?usd=100", true)

Redirect는 Get방식이다

  • 원칙적으로 POST방식처럼 파라미터를 숨겨서 전송하는 것이 불가능하다.

  • 예외적으로 HttpSession을 사용하는 Flash value 방식을 지원한다.

    • (주의) Flash value는 새로고침 시 소멸한다.

소스 코드

Github

ExchangeController

ExchangeController.java
package com.hacademy.boot04.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.RedirectView;

@Controller
public class ExchangeController {
	@GetMapping("/usd2krw")
	@ResponseBody
	public String usd2krw(@RequestParam double usd) {
		double krw = 1347.15 * usd;
		return usd + "(USD) → "+krw+"(KRW)";
	}
	@GetMapping("/krw2usd")
	@ResponseBody
	public String krw2usd(@RequestParam double krw) {
		double usd = 0.00074 * krw;
		return krw+"(KRW) → "+usd+"(USD)";
	}
	//[1] HttpServletResponse를 사용한 Redirect
	@GetMapping("/exchange1")
	@ResponseBody
	public void exchange1(@RequestParam String mode, @RequestParam double amount, HttpServletResponse response) throws IOException {
		if(mode.equals("usd2krw")) {
			response.sendRedirect("usd2krw?usd="+amount);
		}
		else if(mode.equals("krw2usd")) {
			response.sendRedirect("krw2usd?krw="+amount);
		}
	}
	//[2] Redirect prefix를 사용한 Redirect
	@GetMapping("/exchange2")
	public String exchange2(@RequestParam String mode, @RequestParam double amount) {
		if(mode.equals("usd2krw")) {
			return "redirect:usd2krw?usd="+amount;
		}
		else if(mode.equals("krw2usd")) {
			return "redirect:krw2usd?krw="+amount;
		}
		return null;
	}
	//[2-1] Redirect prefix를 사용한 Redirect + RedirectAttributes 사용
	@GetMapping("/exchange2-1")
	public String exchange2_1(@RequestParam String mode, @RequestParam double amount, RedirectAttributes attr) {
		if(mode.equals("usd2krw")) {
			attr.addAttribute("usd", amount);
			return "redirect:usd2krw";
		}
		else if(mode.equals("krw2usd")) {
			attr.addAttribute("krw", amount);
			return "redirect:krw2usd";
		}
		return null;
	}
	//[3] RedirectView를 사용한 Redirect
	@GetMapping("/exchange3")
	public RedirectView exchange3(@RequestParam String mode, @RequestParam double amount) {
		if(mode.equals("usd2krw")) {
			return new RedirectView("usd2krw?usd="+amount);
		}
		else if(mode.equals("krw2usd")) {
			return new RedirectView("krw2usd?krw="+amount);
		}
		return null;
	}
	//[3-1] RedirectView를 사용한 Redirect + RedirectAttributes 사용
	@GetMapping("/exchange3-1")
	public RedirectView exchange3_1(@RequestParam String mode, @RequestParam double amount, RedirectAttributes attr) {
		if(mode.equals("usd2krw")) {
			attr.addAttribute("usd", amount);
			return new RedirectView("usd2krw");
		}
		else if(mode.equals("krw2usd")) {
			attr.addAttribute("krw", amount);
			return new RedirectView("krw2usd");//상대경로
//			return new RedirectView("krw2usd", true);//절대경로
		}
		return null;
	}
}
Previous요청 메소드NextSpring Actuator

Last updated 2 years ago

http://localhost:8080/usd2krw?usd=100
http://localhost:8080/krw2usd?krw=10000
https://github.com/hiphop5782/spring-boot/tree/main/boot04redirectgithub.com
RedirectAttributes는 Model을 확장한 형태이다