✔ @RestController
@Controller + @ResponseBody의 기능을 제공해줌
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
✔ @RestController에서도 @Valid를 사용하여 데이터의 유효성 검사를 할 수 있음
@PostMapping("/api/v1/members")
public CreateMemberResponse SaveMemberV1(@RequestBody @Valid Member member) {
memberService.join(member);
}
✔ www.naver.com?key=value같은 은 값은 @RequestParam으로 받을 수 있음
@PostMapping("/login")
public String login(@Valid @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult,
@RequestParam(value ="redirectURL",defaultValue = "/")String redirectURL, HttpServletRequest request) {
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지않습니다.");
return "login";
}
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember);
return "redirect:"+redirectURL;
}
✔ 어플리케이션 파일은 가장 최상단에 위치해야함, 왜냐하면 어플리케이션 파일보다 상단에 있는 Mapping들이 인식되지 않기때문임
✔ 엔티티에 api사용을 위한 validation 옵션을 넣으면 안됨, 엔티티는 값이 바뀔 수 있음, 하지만 엔티티가 변하면 api스펙이 변하기 때문에 api를 위한 별도의 클래스를 만들어 줘야함(DTO같은것), 또한 수 많은 서비스에 대응하기위해서는 엔티티로는 감당할 수 없기 때문에 데이터 전송을 위한 클래스를 만들어야함
✔ 일반적인 form의 Post 전송할때의 데이터 형식
Content-Type:
application/x-www-form-urlencoded
✔ Json의 Post 전송할때의 데이터 형식
✔ Json이나 일반적으로 보내는 form이나 post로 보낼때 http패킷바디에 데이터를 담아서 보낸다는 것은 같음
단지 그 내용의 형식이 다른 것
✔ @Data의 의미 : @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode의 기능을 제공해줌
/**
* Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check
* all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor.
* <p>
* Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
* <p>
* Complete documentation is found at the project lombok features page for @Data</a>.
*
* @see Getter
* @see Setter
* @see RequiredArgsConstructor
* @see ToString
* @see EqualsAndHashCode
* @see lombok.Value
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
/**
* If you specify a static constructor name, then the generated constructor will be private, and
* instead a static factory method is created that other classes can use to create instances.
* We suggest the name: "of", like so:
*
* <pre>
* public @Data(staticConstructor = "of") class Point { final int x, y; }
* </pre>
*
* Default: No static constructor, instead the normal constructor is public.
*
* @return Name of static 'constructor' method to generate (blank = generate a normal constructor).
*/
String staticConstructor() default "";
}