@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' 을 뿌려라" 라는 의미이다.
또한 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 |