: Controller에 해당하며, 클라이언트의 요청을 직접적으로 전달 받는 계층
Spring Boot 기반의 애플리케이션이 정상적으로 실행되지 위해서는 main() 메서드가 포함된 애플리케이션의 시작점인 엔트리포인트 클래스를 작성해야 한다.
Spring Initializr
에 의해 엔트리포인트 클래스는 자동 생성된다.import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EntrypointClass {
public static void main(String[] args) {
SpringApplication.run(EntrypointClass.class, args);
}
}
💡주의할 점
엔트리포인트 클래스는 최상위 패키지에 존재해야 한다. 또한, 엔트리포인트 클래스로 인해 실행되는 모든 클래스는 엔트리포인트 클래스의 동일, 하위 패키지에 위치해야 한다.가능 😊👌
불가능 🤬👎
Controller
클래스에서 클라이언트의 요청을 처리하는 역할을 한다.@Controller
와 같은 역할을 하며, REST API의 리소스를 처리하기 위한 API 엔트포인트로 동작함을 정의한다. @RequestMapping("공통 URL")
💡일반적으로 공통 URL은 클래스 레벨에 정의하고 핸들러 메서드별로 달라지는 URI는 각각의 핸들러 메서드에 정의한다.
HTTP Method에 해당하는 단축 표현을 주로 사용하며 해당 애너테이션들은 메서드 레벨에 사용하는 것을 권장한다.
💡핸들러 메서드에 URI를 추가하는 방법!
@PatchMapping("/{member-id}") public ResponseEntity patchMember(@PathVariable("member-id") long memberId){ ... }
@PatchMapping
("/{member-id}") 와@PathVariable(
"member-id") long memberId
의 member-id는 같은 값을 말하며 해당 값은 memberId 파라미터로 받는다.
💡JSON의 직렬화와 역직렬화
직렬화 : JAVA 객체 -> JSON 형식
역직렬화 : JSON 형식 -> JAVA 객체
: Request Body를 하나의 객체로 전달 받는다.
💡getter/setter 애너테이션
해당 클래스에 @Getter/@Setter 애너테이션을 추가하면 자동으로 getter/setter 메서드가 추가된다.
RequestBody와 ResponseBody를 각각에 맞는 DTO클래스와 매핑시켜 직렬화, 역직렬화 시켜야 한다. 이때 사용하는 애터네이션이 @RequestBody
와 @ResponseBody
이다.
: JSON형식의 RequestBody를 DTO클래스의 객체로 변환시켜주는 애너테이션
Controller
클래스에서 해당 메서드의 파라미터에 추가한다.
@PostMapping
public ResponseEntity postMember(@RequestBody MemberPostDto memberDto) { ... }
: DTO 클래스의 객체를 Json 형식의 ResponseBody로 변환시켜주는 에너테이션
💡 핸들러 메서드의 리턴 타입이
RespontEntity
일 경우, 내부에서HttpMessageConverter
가 동작해 자동으로 Json형식으로 변환 시켜준다. -> @ResponseBody 생략 가능
: 클라이언트로부터 전달 받는 데이터들의 누락 및 오류 발생을 방지하기 위해서 진행하며, 프론트엔드에서 일차적으로 유효성 검증을 진행하지만, 이는 사용자의 편의성을 위해 진행하는 것이나 다름없어 서버에서도 한번 더 유효성 검증을 진행해야 한다.
@NotBlank
@Email
private String email;
@NotBlank(message = "이름은 공백이 아니어야 합니다.")
private String name;
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 '-'로 구성되어야 합니다.")
private String phone;
regexp(정규표현식)
과 일치하는 지 검증@PostMapping
public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) { ... }
@Validated
public class MemberController {
@PatchMapping("/{member-id}")
public ResponseEntity patchMember(@PathVariable("member-id") @Positive long memberId, @Valid @RequestBody MemberPatchDto memberPatchDto) {...}
}