스프링 Controller 및 Mapping애노테이션 이해하기

심현민·2025년 1월 4일
0

Spring

목록 보기
2/18

스프링 컨트롤러 및 Mapping 애노테이션을 공부하면서 이해가 안 되던 부분을 정리해보았다.

컨트롤러

  • 스프링 프레임워크에서 사용자의 요청을 받아서 적절한 응답을 생성

여기서 말하는 사용자의 요청적절한 응답은 다음과 같다.

사용자의 요청

  • 클라이언트가 서버에 보내는 정보

간단하게 얘기해서 클라이언트는 사이트에 접속하는 '본인'이라고 생각하면 되고,
서버에 보내는 정보는 우리가 사이트에 접속해서 상품을 구매하거나 상품 페이지에 접속을 하는 다양한 '행위'에 대한 정보라고 생각하면 된다.

그리고 이러한 정보들을 우리가 서버에 보낼 때 이에 대해 적절한 응답을 생성해야 한다.

적절한 응답

  • 클라이언트가 보낸 요청에 대해 적절한 정보를 담고 있는 웹 페이지를 보여줘야 한다.

사용자가 상품 페이지를 열고 싶은데 이상한 페이지가 뜨면 안되기 때문이다.
또한, 잘못된 링크에 대해서 오류 페이지도 적절하게 띄어야 한다.


이러한 전반적인 것을 다루기 위해
컨트롤러에서 요청을 받아 적절한 응답을 생성해주는 부분을 정의하는 것이다.

또한, 요청에 대해 적절한 응답을 생성하기 위해서 사용하는 것이
@RequestMapping, @GetMapping, @PostMapping이다.

@GetMapping

  • HTTP GET 요청을 처리하는 메서드를 지정

쉽게 말해서 주소창에 URL을 입력하고 엔터를 치면 브라우저가 서버에 GET 요청을 보내는 것

다음과 같이 입력하면 "/api"라는 URL로 GET 요청을 하는 것이다.

코드로 보면

@GetMapping("api")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }

String 반환 타입

반환 타입이 String인 이유는Spring-MVC가 문자열 반환 값을 뷰의 이름으로 해석하기 위해서이다.

Model model 파라미터

Model model 형태를 보면 어디서 파라미터를 넣어줘야 하나?라고 생각할 수 있는데 그런 걱정할 필요가 없다.

Spring이 자동으로 해당 파라미터를 주입해주기 때문이다.

그리고 주입할 때 참조값으로 주입하기 때문에,

model.addAttribute("data", "hello!!");

key : "data"
value : "hello!!"

형태로 속성을 정의할 수 있다. 자바에 Map<key,value> 자료구조가 있는데 이 자료구조를 메서드의 참조값으로 받아서 키, 값 쌍을 put 해준다고 생각하면 된다.

map.put("data", "hello!!");

addAttribute
: 컨트롤러가 뷰에 데이터를 전달할 때 사용



@PostMapping

  • 클라이언트가 특정 URL로 POST 요청을 보낼 때 호출될 메서드 정의
  • 주로 서버로 데이터를 전송하는 데 사용된다.

예를 들어 @PostMapping("member/new")와 같이 사용할 때
member/new URL로 들어오는 POST 요청에 대해 처리해주게 된다.

코드로 알아보자

...

<form action="/members/new" method="post">
        <div class="form-group">
            <label for="name">이름</label>
            <input type="text" id="name" name="name" placeholder="이름을 입력하세요">
        </div>
        <button type="submit">등록</button>
    </form>
    
...

다음과 같이 form 태그 안에서 method = "post" 방식을 사용하고 있고
ìnput 태그를 통해 데이터를 입력하면 입력된 데이터가 전송된다.

@PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        //회원 가입이 끝난 후 홈화면으로 보내는 커맨드
        return "redirect:/";
    }

이후 Spring이 입력받은 값을
MemberForm 객체에 name 필드에 자동으로 바인딩 한다.

public class MemberForm {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

필드에 자동으로 바인딩 되면 이제 해당 객체의 메서드를 통해 레포지토리에 정보를 담거나 따로 조작할 수 있는 것이다.

정리

@GetMapping: 서버의 상태를 변경하지 않는다.

@PostMapping: 서버의 상태를 변경할 수 있는 요청이다. 데이터 생성, 수정, 삭제 등의 작업을 수행한다.



@RequestMapping

  • POST, GET에 국한되지 않고 유연하게 사용할 수 있음

다양한 HTTP 메서드 처리

@RequestMapping(value = "/items", method = {RequestMethod.GET, RequestMethod.POST})

다음과 같이 GET, POST 요청에 대해 모두 응답해주는 메서드를 정의하거나

URL 패턴 매핑

@RequestMapping("/items")

URL 요청에 대해 매핑해주거나

컨트롤러 클래스에 적용

@Controller
@RequestMapping("/api")
public class SimpleController {

    @GetMapping("/hello")
    @ResponseBody
    public String Hello() {
        return "hello";
    }
}

다음과 같은 형태로 하나의 페이지를 묶고 그 안에 포함되어 있는 다른 페이지를 구성할 수 있다.

예를 들어 /api/hello와 같이 페이지가 서로 마치 하나의 디렉토리처럼 묶이게 된다.

profile
혼자 성장하는 것보다 함께 성장하는 것을 선호합니다.

0개의 댓글