인프런/스프링 MVC 1편19 끝)리다이렉트(RedirectAttributes),PRG 패턴(Post/Redirect/Get) 상품 수정 폼 컨트롤러 BasicItemController에 추가 상품 수정폼 이동 메소드 @GetMapping("/{itemId}/edit") //상품수정 폼으로 이동 public String editForm(@PathVariable Long itemId, Model model) { //수정하는 화면에서 상품내용이 보여야하므로 상품아이디를 받아 상품을 찾는다. Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/editForm"; } 상품 ID 상품명 가격 수량 상품 수정폼 이동url과 내용수정하는 url를 method만 다르게해서 구성할것이다. 그래서 th:action을 아무것도 주지않아.. 인프런/스프링 MVC 1편 2023. 1. 30. 18)타임리프 적용, @ModelAttribute의 추가 기능 상품상세 메소드BasicItemController에 상품상세를 보는 url매핑한 메소드를 만들어준다.@GetMapping("/{itemId}") //아이템 상세보기public String item(@PathVariable long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item";}상품상세 페이지를 타임리프가 동작하게끔 수정해보자. 기본적으로 추가해줄것해주고 테스트해본다.화면은 나오지만 값에 대한 렌더링이 되지않았으므로 고정된 기본값(value)이 나오는것이다.타임리프를 통해 va.. 인프런/스프링 MVC 1편 2023. 1. 29. 17)상품 도메인 개발,부트스트랩,타임리프 적용 Item.java // @Data는 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode를 제공하기에 핵심 도메인에서 사용하기에는 위험하다(예측하지못하게 동작하는경우가 있어서) @Getter @Setter // 자신이 판단하기에 필요한것만 가져와 사용하자. @NoArgsConstructor //아무 파라미터도 받지않는 생성자만듬 public class Item { private Long id; //repository에 아이템을 저장할떄 부여된다. private String itemName; private Integer price; //Integer를 쓰는 이유는 해당 값이 안들어갈수도 있는 경우 null이 들어갈것을 대비하기 위해서다.. 인프런/스프링 MVC 1편 2023. 1. 27. 16)스프링 MVC(웹페이지 만들기,웹 퍼블리셔,웹 프론트앤드) 패키지이름은 Group이름과 Artifact 이름을 합쳐서 만들어진다. 하지만 패키지이름에 "-" 와 같은 문자가 들어가면 안좋기 때문에 지우고 사용한다. 자바 패키지 네임은 가급적 특수기호같은것을 넣지않고 사용해야한다. web -> spring mvc와 tomcat을 위함 인텔리제이에서 프로젝트를 열때 프로젝트의 build.gradle을 선택해서 열어주자. (항상) 에러발생시 인텔리제이 build가 안되는 문제 , @SpringBootApplication (can not find) 1. file -> project structure에서 SDK, Language level 체크 2. file -> settings -> gradle 검색 -> gradle JVM 체크 3. gradle 클릭 후 refres.. 인프런/스프링 MVC 1편 2023. 1. 27. 15)HTTP 메시지 컨버터 , RequestMappingHandlerAdapter 구조 HTTP 메시지 컨버터 @ResponseBody가 있으면 HttpMessageConverter가 동작한다. 반환값에 따라 JsonConverter가 동작해야할지, StringConverter가 동작해야할지등 반환 데이터타입에 따른 컨버터가 동작한다. @ResponseBody가 있으면 HTTP 응답메시지 Body에 문자 내용을 직접 반환한다. 반환되는 값이 논리뷰이름으로 사용되는것이 아니므로 viewResolver대신 HttpMessageConverter가 동작한다. String을 반환하면 기본문자 처리담당인 StringHttpMessageConverter가 동작하고 기본 객체를 반환하면 기본객체 처리담당인 MappingJackson2HttpMessageConverter가 동작한다. (객체를 JSON으로 .. 인프런/스프링 MVC 1편 2023. 1. 26. 14)HTTP 응답 문자(v1~v3) JSON(v1~v2) ,@RestController V1 - HttpServletResponse 객체이용 @GetMapping("/response-body-string-v1") public void responseBodyV1(HttpServletResponse response) throws IOException { response.getWriter().write("ok"); } spring에게 HttpServletResponse를 전달받고, Writer를 받아 바디에 값을 넣어주는것이다 V2 - ResponseEntity , HttpEntity @GetMapping("/response-body-string-v2") public ResponseEntity responseBodyV2() { return new ResponseEntity("ok", HttpSt.. 인프런/스프링 MVC 1편 2023. 1. 26. 13)HTTP 응답 (정적리소스,뷰 템플릿) , Thymeleaf 스프링부트 설정 이전에는 http 요청에 대한 공부를 했으니 이번에는 HTTP응답에 대해 공부한다.HTTP 응답 - 정적리소스,뷰 템플릿정적리소스 스프링부트는 클래스 패스인 src/main/resources 아래에 /static, /public,/resources, /META-INF/resources 라는 디렉토리에 있는 정적 리소스를 제공한다.웹 브라우저에서 실행시 클래스패스는 빼고 그 이후 경로와 파일명을 이용해서 호출할 수 있다.http://localhost:8080/basic/hello-form.html 이런식 뷰 템플릿뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달한다. 일반적으로 HTML을 동적으로 생성하는 용도로 사용하지만, 다른 것들도 가능하다. 뷰 템플릿이.. 인프런/스프링 MVC 1편 2023. 1. 26. 12)HTTP요청 메시지 처리방법 [데이터타입 :JSON] (v1 ~ v4) HTTP요청 메시지 처리방법 [데이터타입 :JSON] 요청 메시지의 바디안에 JSON이 담겨왔을때 처리 방법 V1 - HttpServletRequest,Response 직렬화 - 객체에 저장된 데이터를 I/O 스트림에 쓰기(출력) 위해 연속적인(serial) 데이터로 변환하는 것 역직렬화 - I/O 스트림에서 데이터를 읽어서(입력) 객체를 만드는 것 이므로 여기서는 직렬화 = 객체 -> JSON 역직렬화 = JSON -> 객체 @Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new ObjectMapper();//json을 역직렬화하려면 ObejectMapper가 필요하다. @Post.. 인프런/스프링 MVC 1편 2023. 1. 26. 11)RequestParam 처리 방법 , HttpRequest 응답 방법 Http 요청파라미터-@ModelAttribute 요청된 파라미터 처리 - @ModelAttribute 실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야한다. 보통 다음과 같은 코드를 작성할 것이다. @RequestParam String username; @RequestParam int age; HelloData data = new HelloData(); data.setUsername(username); data.setAge(age); 스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다. 먼저 요청 파라미터를 바인딩 받을 객체를 만들자 (bind의 사전적의미 = 묶다) 바인딩 받을 객체 HelloData @Data // @Getter.. 인프런/스프링 MVC 1편 2023. 1. 26. 10)HandlerMethodArgument,RequestParam 처리 방법들 요청매핑 - API예시 실제 데이터가 넘어가는 부분은 생략하고, URL매핑만 URL은 똑같은데 Http Method로 행위를 구별한다. @RequestMapping("/mapping/users") @RestController public class MappingClassController { @GetMapping() public String user() { return "get users"; } @PostMapping() public String addUser() { return "post user"; } @GetMapping("/{userId}") public String findUser(@PathVariable String userId) { return "get userId =" +userId; } .. 인프런/스프링 MVC 1편 2023. 1. 25. 9)요청매핑 @RestController public class MappingController { private Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping("/hello-basic") public String helloBasic() { logger.info("basic"); return "ok"; } } @RequestMapping({"/hello-basic","/hello-go"}) public String helloBasic() { logger.info("basic"); return "ok"; } { } 안에 url를 여러개 넣어서 매핑할 수 있다. @RequestMapping(value = {"/hello-basic", "/hel.. 인프런/스프링 MVC 1편 2023. 1. 20. 8)스프링 MVC - 기본기능, 로깅(logging) 초기설정 스프링부트 application 실행해서 동작 테스트 로깅(logging) 간단히 알아보기 스프링부트를 생성하면 자동으로 추가되는 스프링부트스타터 안에 스프링부트 스타터 로깅이라는 라이브러리가 있고 그 안에 SLF4J와 Logback있는걸 확인할 수 있었다. slf4j가 다른 로그 라이브러리를 통합해서 만든 인터페이스 역할을 하는 라이브러리이다. LogTestController //@Controller 어노테이션을 사용하고, Mapping 메소드에서 String을 반환하면 뷰 이름으로 인식한다.( 받은 문자를 논리 뷰 이름으로 인식하여 뷰 리졸버를 이용하여 뷰를 생성하려고할것이다) @RestController// @RestController를 사용했을때 String을 반환하면, 그냥 String.. 인프런/스프링 MVC 1편 2023. 1. 19. 이전 1 2 다음