목록Spring (102)
개발놀이터
본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *입력 폼 처리 지금부터 타임리프가 제공하는 입력 폼 기능을 적용해서 기존 프로젝트의 폼 코드를 타임리프가 지우너하는 기능을 사용해서 효율적으로 개선해보자 -th:object : 커맨드 객체를 지정한다. -*{...} : 선택 변수 식이라고 한다. th:object에서 선택한 객체에 접근한다. -th:field : html태그의 id, name, value 속성을 자동으로 처리해준다. 랜더링 전 랜더링 후 th:object를 적용하려면 먼저 해당 오브젝트 정보를 넘겨줘야한다. @GetMapping("/add") public String addForm(Model..
본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *반복 타임리프에서 반복은 th:each를 사용한다. 추가로 반복에서 사용할 수 있는 여러 상태 값을 지원한다. 반복 시 오른쪽 컬렉션 ${users}의 값을 하나씩 꺼내서 왼쪽 변수에 담아서 태그를 반복 실행한다. th:each는 List 뿐만 아니라 배열, Iterable, Enumeration을 구현한 모든 객체를 반복에 사용할 수 있다. Map도 사용할 수 있는데 이 경우에 변수에 담기는 값은 Map.Entry이다. 반복 상태 유지 기능 -index : 0부터 시작하는 값 -count : 1부터 시작하는 값 -size : 전체 사이즈 -even, odd..
본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *기본 객체들 타임리프는 기복 객체들을 제공한다. 1. ${#request} 2. ${#response} 3. ${#sesison} 4. ${#servletContext} 5. ${#locale} 그런데 #request는 HttpServletRequest객체가 그대로 제공되기 때문에 데이터를 조회하려면 request.getParameter("data")처럼 불편하게 접근해야 한다. 이런 점을 해결하기 위해 편의 객체도 제공한다. HTTP요청 파라미터 접근 ${param.paramData} HTTP세션 접근 ${session.sessionData} 스프링 빈 접..
*변경감지(Dirty Checking)와 병합(merge) 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. em.persist로 넣을 때 혹은 em.find 등으로 디비에서 값을 가져올 때 영속성 컨텍스트에 데이터들이 들어간다. 임의로 만든 엔티티가 식별자를 가지고 있으면 준영속 엔티티로 간주한다. 준영속 엔티티를 수정하는 2가지 방법 1. 변경감지(Dirty Checking) 2. 병합(merge) 1. 변경감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법이다. 트랜잭션 안에서 엔티티르 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경 감지가 작동해 데이터베이스에 update 쿼리가 날아간다. 2. 병합 병합의 동작 방식 1. merge()를..
*RedirecAttribute 파라미터에 RedirectAttribute 를 추가해주면 기능을 사용할 수 있는데 public String item(RedirectAttributes, redirectAttributes) 이렇게 추가해주면 사용 가능하다 redirectAttributes.addAttribute(attributeName, attributeValue) 이렇게 사용 가능하다. redirectAttributes.addAttribute("itemId", itemId); 이렇게 쓰면 뷰 템플릿을 호출할 때 return "/basic/item/${itemId}" 이렇게 경로변수로 사용할 수 있다. 경로변수로 사용되지 못한 addAttribute는 쿼리 파라미터로 넘어가게 된다. redirectAttri..
*타임리프 간단한 문법 *타임리프 선언http://www.thymeleaf.org"> *속성 변경 th:href="@{/css/bootstrap.min.css}" -href="value1"를 th:href="value2"의 값으로 변경한다. -타임리프 뷰 템플릿을 거치게 되면 원래 값을 th:xxx값으로 변경한다. 만약 값이 없다면 새로 생성한다. -html을 그대로 볼 때는 href 속성이 사용되고, 뷰 템플릿을 거치면 th:href의 값이 href로 대체되면서 동적으로 변경할 수 있다. -대부분 html속성을 th:xxx로 변경할 수 있다. *타임리프 핵심 -핵심은 th:xxx가 붙은 부분은 서버사이드에서 렌더링되고, 기존 것을 대체한다. th:xxx이 없으면 기존 html의 xxx속성이 그대로 유지..
*로깅 롬복의 @Slf4j어노테이션 사용 or private final Logger log = LoggerFactory.getLogger(getClass()); 올바른 로그 사용법 log.info("username={}", username); *요청 매핑 @RequestMapping(value = "/hello-basic" method = "RequestMethod.GET") 이거 두개를 합친것이 바로 @GetMapping *@ResponseBody 이거 쓰면 return 값을 문자열로 반환했을 때 HTTP메시지 바디에 꽂혀서 전송됨 *@PathVariable 경로 변수 /username/{username} 이런식으로 URL을 템플릿화 시켜서 보냄 가져오는 방법 public String getPathVa..
*HTTP 응답 - HTTP API, 메시지 바디에 직접 입력 -response.getWriter를 이용한 출력 @GetMapping("/response-body-string-v1") public void responseBodyV1(HttpServletResponse response) throws IOException { response.getWriter().write("ok"); } -ResponseEntity를 이용한 출력 (상태코드 같이 출력 가능) @GetMapping("/response-body-string-v2") public ResponseEntity responseBodyV2(HttpServletResponse response) { return new ResponseEntity("ok", ..
*HTTP 응답 - 정적 리소스, 뷰 템플릿 스프링에서 응답 데이터를 만드는 방법은 크게 3가지이다. 1. 정적 리소스 : ex) 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적리소스를 사용한다. 2. 뷰 템플릿 사용 : ex) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다. 3. HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP메시지 바디에 JSON같은 형식으로 데이터를 실어 보낸다. 1. 정적 리소스 스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META-INF/resources src/main/resources는 리..
*HTTP 요청메시지 - JSON -InputStream으로 읽어오는 방식 @PostMapping("/request-body-json-v1") public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("messageBody={}", messageBody); HelloDa..