본문 바로가기

Spring/SpringBoot

SpringBoot- @GetMapping, @PostMapping

@GetMapping

 @GetMapping 어노테이션은 @RequestMapping 어노테이션의 method = RequestedMethod.GET의 축약형이다.

@GetMapping("/")
@RequestMapping(value = "/", method = RequestedMethod.GET)  //same

예를 들어 다음 코드를 보자

 

MemberForm.java

@Getter @Setter
public class MemberForm {  // Member를 위한 DTO

    @NotEmpty(message = "회원 이름은 필수입니다.")  // 값이 없는 경우 에러발생함
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

 MemberForm은 member에 데이터를 넘기기 위한 용도로만 쓰이기 위해서 작성된 DTO이다.

Member 객체에게 필요한 데이터를 받을 때 Member 객체를 생성한 다음 직접 받는 것이 아니라, MemberForm과 같은 DTO 객체를 생성해서 여기에 데이터를 받은 후 get 메서드를 통해서 데이터를 꺼내어 Member 객체에게 넣어준다.

 DTO는 계층간 데이터 교환만을 위해서 사용하는 객체로 getter, setter를 제외한 별도의 메서드를 갖지 않는다.

 

MemberController.java

@Controller
@RequiredArgsConstructor
@Slf4j
public class MemberController {
    // memberForm을 통해서 "members/new로 부터 회원 가입 데이터를 가져와 Member 객체에 집어넣어
    // 새로운 member 객체를 생성하고, 그 객체를 persist 하여 데이터를 서버에 저장
    private final MemberService memberService;


    // Get: 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하는 메서드
    @GetMapping("/members/new") //@RequestMapping(value = "/members/new", method = RequestMethod.GET)
    public String createForm(Model model) {
        // model 객체: Controller에서 생성한 데이터를 담아서 View로 전달할 때 사용하는 객체.
        model.addAttribute("memberForm", new MemberForm());
        // memberForm이라는 이름으로 MemberForm 객체가 view로 전달됨
        // 전달된 memberForm에 데이터를 담음

        log.info("Create Member");
        return "members/createMemberForm.html";
    }
}

 createForm() 메서드를 보면 @GetMapping 어노테이션이 사용되고 있다. 이 메서드에서 어노테이션과 return 값만 봐보자. 단순히 말해 @GetMapping 내부의 주소는 view가 나타날 주소이고, return 값은 해당 주소에 표시될 html의 이름이다.

 

즉,  createForm 메서드는 " 'localhost:8080/members/new' 주소에 'members/createMemberForm.html' 을 뿌려라" 라는 의미이다.

localhost:8080/members/new의 모습
화면에 뿌려진 createMemberForm.html의 모습

또한 createForm(Model model) 메서드에선 model이라는 매개변수가 존재하는데, 이는 뷰(html)에 정보를 전달하는 역할은 한다.

model.addAttribute("memberForm", new MemberForm());  
// html 문서에 "memberForm"이라는 이름으로 MemberForm 객체 전달

위의 createMemberForm.html을 보면

<form role = "form" action="member/new" th:object="${memberForm}" method = "post">

라는 태그가 있는데 여기서 th:object="${memberForm}"의 memberForm이 model.addAttribute("memberForm", new MemberForm());로 전달된 객체이다.

 

@PostMapping

 @PostMapping 어노테이션은 @RequestMapping 어노테이션의 method = RequestedMethod.POST의 축약형이다.

@PostMapping("/")
@RequestMapping(value = "/", method = RequestedMethod.POST)  //same

 GET이 해당 웹페이지에서 어떠한 데이터를 요청하는 메서드라면  POST는 받은 데이터를 바탕으로 서버에 새로운 리소스를 생성하거나 업데이트 하기 위해서 데이터를 보낼 때 사용한다. 

 

package jpabook.jpashop.controller;

@Controller
@RequiredArgsConstructor
@Slf4j
public class MemberController {
    // memberForm을 통해서 "members/new로 부터 회원 가입 데이터를 가져와 Member 객체에 집어넣어
    // 새로운 member 객체를 생성하고, 그 객체를 persist 하여 데이터를 서버에 저장
    private final MemberService memberService;

    // Post: 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 데 사용됩니다.
    @PostMapping("/members/new")
    public String create(@Valid MemberForm form, BindingResult result) {  //MemberForm의 @NotEmpty 어노테이션을 사용하기 위해서 @Vaild 어노테이션 붙임
        // GetMapping에서 데이터를 담은 MemberForm 객체를 가져옴
        if (result.hasErrors()) {  // 에러 발생시 (MemberForm의 name이 null인 경우)
            return "members/createMemberForm";
        }
        Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());
        Member member = new Member();
        member.setName(form.getName());
        member.setAddress(address);

        // memberForm이 가져온 데이터를 바탕으로 Member member 객체를 만들고 이를 서버에 저장
        memberService.join(member);
        return "redirect:/"; // 메인화면으로 돌아감
    }
}

 이번에는 PostMapping 예제이다.

GetMapping 시와 마찬가지로 "localhost:8080/members/new" 주소에서 동작한다.

이전 GetMapping에서 MemberForm 객체를 model.addAttribute("memberForm", new MemberForm());으로 넘겼었는데 @PostMapping에서는 매개변수(MemberForm form)로 해당 데이터를 가져온다. 해당 DTO로 가져온 데이터로 새로운 Member 객체를 생성해서 DB에 저장한다. return 값으로는 돌아갈 웹페이지의 주소를 반환한다.

 

이 예제에서는 데이터를 받아서 DB에 저장하는 코드를 작성했지만 POST라는 특성상 받아온 데이터를 바탕으로 얼마든지 가공을 하여 원하는 동작을 하도록 할 수도 있다.

'Spring > SpringBoot' 카테고리의 다른 글

SpringBoot- API  (0) 2023.07.04
SpringBoot- @Valid, @ResponseBody, @RequestBody  (0) 2023.06.28
SpringBoot- Controller  (0) 2023.06.25
SpringBoot- @Transactional  (0) 2023.06.22
SpringBoot- 테스트 케이스 작성 예시  (0) 2023.06.20