[Spring/SpringBoot] 02. Spring/SpringBoot 웹 개발 기초

거북이·2024년 4월 1일
0

Spring/SpringBoot/JPA

목록 보기
2/6
post-thumbnail

📌MVC - Controller

MVC패턴의 C에 해당하며, Controller는 View와 Model사이에서 데이터 흐름을 제어한다.
사용자가 접근한 URL에 따라 요청을 파악하고 어떤 HTTP 메서드를 호출할 것인지 파악한 후 맞는 동작을 실행하는 것이다.

package hello.springboot.controller;

import hello.springboot.domain.Member;
import hello.springboot.service.MemberService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/members")
public class MemberController {

    private MemberService memberService;

    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping("/new")
    public String createForm() {
        return "members/createMemberForm";
    }

    @PostMapping("/new")
    public String create(MemberForm memberForm) {
        Member member = new Member();
        member.setName(memberForm.getName());
        memberService.join(member);
        return "redirect:/";
    }

    @GetMapping("")
    public String list(Model model) {
        List<Member> list = memberService.findMembers();
        model.addAttribute("members", list);
        return "members/memberList";
    }
}

📌API

Spring에서는 @RequestBody, @ResponseBody 어노테이션을 명시해주게 되면 스프링 컨테이너 내에 있는 HttpMessageConverter에 의해서 데이터 변환 과정을 거치게 된다.

예를 들어, 클라이언트가 서버로 데이터를 전송할 때, Json형식의 Request로 요청했을때, Java에서는 해당 Json형식의 데이터를 Java객체로 변환해야 통신이 정상적으로 수행된다는 것이다.

데이터를 변환하여 처리 후 다시 클라이언트로 응답을 보낼 때, Java객체를 Json형식으로 보내야 한다. 이 데이터 변환 과정을 @RequestBody, @ResponseBody 어노테이션이 수행해준다.

GET메서드로 요청을 하는 경우 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라 URI의 파라미터로 전달되므로 이 때는 아래와 같이 @RequestParam 어노테이션을 사용한다.

package hello.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {
        // "data"라는 속성 이름에 "테스트"라는 데이터를 넣어라.
        model.addAttribute("data", "테스트");
        // 템플릿 명칭과 매칭(hello.html)
        // [1]. 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(View Resolver)가 화면을 찾아서 처리한다.
        return "hello";
    }

    // Error : Resolved [org.springframework.web.bind.MissingServletRequestParameterException:
    // Required request parameter 'name' for method parameter type String is not present]
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-mvc";
    }

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello-string " + name;
    }

    @GetMapping("hello-api")
    @ResponseBody
    // Hello : 객체
    // 자바 객체의 경우 Json 형식으로 데이터를 만들어 반환한다.
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName("테스트");
        return hello;
    }

    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

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

📌출처

인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@RequestBody와 @ResponseBody

0개의 댓글