본문 바로가기
Web

[Spring] getmapping, postmapping 개념과 차이

by DuncanKim 2022. 8. 16.
728x90

[Spring] getmapping, postmapping 개념과 차이

 

https://www.plugandtrack.com/en/services/on-site-thermal-mapping/

 

1. mapping Annotation이란?

 

스프링 부트 프로젝트를 하다보면 Controller class를 먼저 만들게 된다. 스프링 프로젝트를 실행시키고 나서 브라우저에 결과값을 한 번 띄워보려면, 메서드 위에 어노테이션을 붙이게 된다.

 

@Controller
@RequestMapping("/home")
public Controller{
    
    @ResponseBody
    public String showTest(){
        retrun "hi"
    }
}

 

처음 볼 때는 이 어노테이션이 무엇에 쓰이는 지, 어떤 상황에 쓰이는 지 잘 감이 안 온다. 컨트롤러...? 리퀘스트맵핑....? 리스폰스바디...?

그럼 System.out.println()을 하면 무엇이 달라지지...? 초보 개발자는 인텔리제이를 누르고 조용히 프로젝트 닫기를 누르고 다른 직업을 찾아... 볼 것 같다.

 

스프링 부트 자체를 쓰는 이유는 우리가 웹 페이지를 만들기 위해서이다. html, css, js로도 충분히 브라우저에서 만들 수 있다. 그렇지만, 회원 정보, 로그인 개념, 움직이는 페이지, 지도와 같은 정보를 페이지에 나타내는 것 등 우리가 '정보'를 정적으로 얻는 것에 그치지 않고 동적으로 무엇인가를 보고 싶을 때, 특별한 도구들이 필요하다.

 

그것에 필요한 것들은 서버, 네트워크, 통신 데이터 등등 많은 것들이 필요한데, 밀키트 마냥 모든 것을 해결해주는 것이 바로 스프링부트이며, 어떤 메서드에 어노테이션을 붙여서 그 메서드가 특정한 역할을 하게 만든다. 그 중에 URL, URI와 관련된 것들을 처리해주고 내부의 클래스들과 연결하거나, 아니면 외부로 데이터를 보내는 역할을 mapping annotation 들이 하는 것이다.

 

 

2. @RequestMapping

 

 @RequestMapping 어노테이션은 브라우저의 URL을 컨트롤러의 메서드와 이어줄(매핑할) 때 사용하는 스프링 프레임워크의 어노테이션이다. 클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용한다.

 

@RequestMapping("/home")
@Controller
public Controller1{
    
    public String showTest(){
        retrun "hi"
    }
}


@Controller
public Controller2{

    @RequestMapping("/home")
    public String showTest(){
        retrun "hi"
    }
}

 

위와 같이 클래스에도 사용할 수 있고, 메서드에도 사용할 수 있다. 만약 localhost:8080을 도메인으로 쓴다면, localhost:8080/home 을 통해 그 메서드를 실행할 수 있는 것이다.

 

기본형은 다음과 같다.

 

@RequestMapping(value="/post")
// value는 생략이 가능하다.

 

value 외에도 다른 파라미터들이 인자로 들어갈 수 있다. HTTP 요청 메서드나 헤더값에 따라 매핑되도록 -0=옵션을 제공한다. 메서드 레벨에서 정의한 @RequestMapping은 타입 레벨에서 정의된 @RequestMapping의 옵션을 상속 받는다. 참고로, 메서드 내에서 viewName을 별도로 설정하지 않으면 @RequestMapping의 path로 설정한 URL이 그대로 viewName으로 설정된다. 

 

 

3. @GetMapping

 

getmapping의 기본은 다음과 같다.

 

@GetMapping("/post")

 

getmapping이든 postmapping이든 requestmapping과 하는 역할은 같다. 입력한 값이 어떻게 붙어서 전송이 되느냐에 따라 차이가 난다. GetMapping 방식은 헤더에 내가 입력한 값을 그대로 url로 전송을 한다. 도메인에 localhost:8080/home?name=dong?password=1234 이런 식으로 url에 전송하고, 그와 관련된 데이터들을 보여주는 것이다.

 

이렇게 되면, 로그인과 같은 중요한 정보가 있는 경우, get 방식으로 정보를 전달하는 것은 올바르지 않다. 이럴 때 post 방식을 쓰면 된다.

 

 

4. @PostMapping 

 

postmapping의 기본은 다음과 같다.

 

@PostMapping("/post")

 

post 방식은 패킷에 입력한 값이 숨겨져서 전달된다. 만약 어느 메서드에서 post 방식으로 특정값을 다른 페이지에 보내는 경우, 이렇게 url이 전달된다. 한편 get 방식과는 달리, 데이터 캐싱을 하지 못한다. localhost:8080/home 과 같이 값이 표시되지 않고, 객체에 값이 포함되어 와서 getter, setter 방식으로 값을 집어넣거나 받아온다. 이렇게 되면 정보가 노출이 되지 않고, 클래스 안의 메서드에서 처리가 되기 때문에 보안에 있어서 get 방식보다 낫다고 할 수 있다.

 

 

 

 

5. @RequestMapping, @GetMapping, @PostMapping의 활용

 

RequestMapping을 어노테이션으로 하는 class가 있고, getmapping, postmapping이 하위에 있는 메서드에 붙어있다고 하자. 그렇다면, 공통적인 /home 안에 /page1, /page2로 분기하여 처리를 할 수 있다. 이렇게 중복하여 mapping을 처리할 수도 있는 것이다.

 

@Controller
@RequestMapping("/home")
public TestClass{
    @GetMapping("/page1")
    @ResponseBody
    public String showPage1() {
        return """
                <form method="POST" action="/page2">
                    <input type="number" name="age" placeholder="나이" />
                    <input type="submit" value="page2로 POST 방식으로 이동" />
                </form>
                """;
    }

    @PostMapping("/page2")
    @ResponseBody
    public String showPage2Post(@RequestParam(defaultValue = "0") int age) {
        return """
                <h1>입력된 나이 : %d</h1>
                <h1>안녕하세요, POST 방식으로 오셨군요.</h1>
                """.formatted(age);
    }

    @GetMapping("/page2")
    @ResponseBody
    public String showPage2Get(@RequestParam(defaultValue = "0") int age) {
        return """
                <h1>입력된 나이 : %d</h1>
                <h1>안녕하세요, GET 방식으로 오셨군요.</h1>
                """.formatted(age);
    }
}

 

만약 여기서 /page2를 url에 입력했다면, @ResponseBody 어노테이션(String을 웹브라우저에 출력해주는 기능)에 의해 페이지에는 'GET 방식으로 오셨군요'가 출력된다. 한편, 링크 이동을 통해 page2로 이동한다면 'post 방식으로 오셨군요.'가 출력된다. 이렇게 공통된 주소에서 mapping을 다양하게 사용하여 각각 분기 처리를 할 수도 있다.

728x90

댓글