Item 상세 @PathVariable URI에 변수가 들어가는 경우 처리해줄 때 사용하는 어노테이션이다. // 아이템 상세 @GetMapping("/{itemId}") public String item(@PathVariable long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; } Item 등록 메서드를 통해 기능을 구분지었다. (@GetMapping, @PostMapping) // 아이템 등록 @GetMapping("/add") public String addForm() { return "basic/addForm"; } // ..
🌱 Spring/MVC ①
Controller 생성 # @RequiredArgsConstructor Lombok 라이브러리의 @RequiredArgsConstructor 어노테이션은 final이 붙은 프로퍼티에 대한 생성자를 만들어준다. # @Autowired 의존 관계를 주입하는 방법 중 하나이다. ItemRepository인 itemRepository를 생성자를 통해 가져오게 된다. 만약 생성자가 하나라면 @Autowired를 생략 가능하다. # @PostConstruct 해당 빈의 의존관계가 모두 주입되고 나면 초기화 용도로 호출된다. String을 반환하여 뷰를 호출하는 @GetMapping 하나를 생성한다. Controller에서 생성한 데이터를 뷰에다가 전달하기 위해 Model 객체를 선언하고, addAttribute ..
우리는 MVC 패턴을 쓰기 때문에 항상 컨트롤러를 통해 뷰가 호출되어야 한다.(뷰 템플릿: Thymeleaf) 먼저 Item 객체를 생성한다. @Data 어노테이션을 통해 Lombok 의존성을 주입할 수도 있지만, Lombok에는 Getter와 Setter를 제외한 다른 기능들이 불필요하게 추가될 수 있다. 그러므로 @Getter, @Setter만 따로 추가하였다. @Getter @Setter public class Item { private long id; private String itemName; // quantity, price가 Null로 들어갈 수 있기 때문에 Int가 아닌 Integer로 선언 private Integer price; private Integer quantity; public..
HTTP Message Converter? HTTP API처럼 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 사용된다. @ResponseBody를 사용하면 HTTP Body에 문자 내용을 직접 반환하게 되는데, ViewResolver 대신에 HTTP Message Converter가 동작한다. HTTP Messge Converter는 Json이나 String 중 선택하여 데이터를 전달하게 된다. - 기본 문자 처리: StringHttpMessageConverter (String) - 기본 객체 처리: MappingJackson2HttpMessageConverter (Json) String이든 Json이든 HttpMessageConverter라는 인터페이스를 상속 받고 있다. // org.spr..
# responseBodyV1 서블릿을 직접 다룰 때 처럼 HttpServletResponse 객체를 통해서 HTTP 메시지 바디에 직접 ok 응답 메시지를 전달한다. response.getWriter().write("ok") # responseBodyV2 ResponseEntity 엔티티는 HttpEntity 를 상속 받았는데, HttpEntity는 HTTP 메시지의 헤더, 바디 정보를 가지고 있다. ResponseEntity 는 여기에 더해서 HTTP 응답 코드를 설정할 수 있다. HttpStatus.CREATED 로 변경하면 201 응답이 나가는 것을 확인할 수 있다. # responseBodyV3 @ResponseBody 를 사용하면 view를 사용하지 않고, HTTP 메시지 컨버터를 통해서 HT..
스프링(서버)에서 응답 데이터를 만드는 방법 3가지 ① 정적 리소스 예) 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다. ② 뷰 템플릿 사용 예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다. ③ HTTP 메시지 사용 HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. 정적 리소스 정적 리소스는 해당 파일을 변경 없이 그대로 서비스하는 것이다. 스프링 부트는 다음 디렉터리에 있는 정적 리소스를 제공한다. ① /static ② /public ③ /resources ④ /META-INF/resources /META-INF/resources는 리소스를 ..
다음은 HTTP 요청 메시지를 통해 데이터를 전달하는 세 번째 방법에 대해 알아본다. ③ HTTP message body에 데이터를 직접 담아서 요청 - HTTP API에서 주로 사용(JSON, XML...) - POST, PUT... 요청 파라미터(GET, POST)를 사용한 이전 두 가지 방법과는 다르게, HTTP Message Body를 통해 데이터가 직접 넘어오는 경우에는 @RequestParam, @ModelAttribute를 사용할 수 없다. Text 메시지 전송 먼저 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하는 실습을 한다. HTTP 메시지 바디의 데이터를 InputStream 을 사용해서 직접 읽을 수 있다. @Slf4j @Controller public class Req..
HTTP 요청 메시지를 통해 데이터를 전달하는 세 가지 방법 중 GET, POST 메서드를 통해 요청하는 경우 사용하는 방식이다. 먼저 요청 파라미터를 바인딩 받을 객체를 만든다. @Data 어노테이션은 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 자동으로 적용해준다. package hello.springmvc.basic; import lombok.Data; @Data public class HelloData { private String username; private int age; } 지금까지는 @RequestParam을 통해 username, age를 받고 새로운 객체를 선언한 다음에 그 값을 넣어줬었다. @..
HTTP 헤더 조회 # HttpServletResponse & HttpServletResponse # HttpMethod : HTTP 메서드를 조회한다. # Locale : Locale 정보를 조회한다. # @RequestHeader MultiValueMap headerMap : 모든 HTTP 헤더를 MultiValueMap 형식으로 조회한다. ※ MultiValueMap : 하나의 키에 여러 개의 값을 받을 수 있다. # @RequestHeader("host") String host : 특정 HTTP 헤더를 조회한다. 속성 - 필수 값 여부: required - 기본 값 속성: defaultValue # @CookieValue(value = "myCookie", required = false) Stri..
API 매핑하기 리소스를 계층으로 식별하는 방식으로 다음과 같이 사용한다. 데이터를 넘기거나, 오류 등은 처리하지 않았다. @RestController @RequestMapping("/mapping/users") public class MappingClassController { /** 회원 관리 API 회원 목록 조회: GET '/users' 회원 등록: POST '/users' 회원 조회: GET '/users/{userId} 회원 수정: PATCH /users/{userId} 회원 삭제: DELETE /users/{userId} */ @GetMapping public String user() { return "get users"; } @PostMapping public String addUser()..