즐겁게, 코드
12월 3일 TIL : 스프링 기초, 라우트, Automatic Batching 본문
BE
1. 스프링 실행 포트 수정하기
스프링은 기본적으로 8080 포트에서 실행된다.
수정을 위해서는 application.properties 파일에 다음 설정을 추가한다.
// src/main/resources/application.properties
server.port=8081
2. 화이트리스트 페이지 대체하기
기본적으로 보여줄 페이지가 없다면 에러 페이지를 보여주게 된다.
/resources/static
폴더에 정적 HTML을 추가해 대체 페이지를 추가할 수 있다.
3. 라우트 설정하기
특정 경로와 페이지를 매핑하고 싶다면 다음과 같이 작성해 활용한다.
@Controller
public class TodoController {
@GetMapping("/todo")
public String todo() {
return "todo"; // <---- /resources/templates 경로의 todo.html을 리턴한다.
}
}
4. @GetMapping VS. @RequestMapping
@GetMapping 어노테이션
@GetMapping("/경로")
public string SomeController {
return "SomeRoute"
}
- RequestMapping보다 깔끔하다.
- 이름에서 HTTP Method를 추론할 수 있어 직관적이다.
- 스프링 4.3 부터 등장했다.
@RequestMapping 어노테이션
@RequestMapping(value = "/경로", method = RequestMethod.GET)
public string SomeController {
return "SomeRoute"
}
- 하나의 어노테이션으로 모든 메서드에 대응할 수 있어 유연하다.
- 스프링 초기 버전부터 존재했다.
FE
1. Automatic Batching
- 리액트 17까지는 이벤트 핸들러에 대해서만 배치 렌더링을 지원했다.
const handleInputChange = (e: Event) => {
const value = e.target.value;
setInput(value);
setNickName(value);
}
// handleInputChange가 실행되면 한번만 리렌더가 일어난다.
즉, setTimeout, fetch 등 비동기 동작에서는 렌더링이 일괄로 처리되지 못했다.
fetch('/todo').then(() => {
setTodo(); // 한 번 리렌더링됨.
setUserState(); // 두 번 리렌더링됨.
});
=> 리액트 18부터는 이벤트 핸들러를 비롯한 비동기 동작들에서도 배치 렌더링을 지원한다.
그러나, 만약 배치 렌더링이 필요하지 않은 경우에는 flushSync 함수를 중간에 실행해준다.
예시 : 배치 렌더링
버튼을 누르면 state를 2번 업데이트하도록 작성한다.
import { useState } from "react";
function App() {
const [state, setState] = useState(0);
const handleClick = () => {
setState((state) => state + 1);
setState((state) => state + 1);
// batch update로 인해 모든 상태 업데이트를 마친 뒤 리렌더링한다.
};
console.log(`State: ${state}`);
return (
<div>
/* 버튼을 5회 클릭한다. */
<button onClick={handleClick}>업데이트</button>
</div>
);
}
export default App;
예시 : flushSync를 사용한 non-batch 렌더링
버튼을 누르면 state를 flushSync의 콜백 내에서 1번, flushSync 밖에서 1번 업데이트하도록 작성한다.
import { useState } from "react";
import { flushSync } from "react-dom";
function App() {
const [state, setState] = useState(0);
const handleClick = () => {
flushSync(() => {
setState((state) => state + 1);
});
// flushSync의 콜백에서 setState가 실행된 이후 리렌더가 일어난다.
// 이 때, flushSync에 다수의 setState가 있어도 리렌더는 한번만 일어난다.
// = 즉, flushSync가 일종의 리렌더 스코프를 제공함을 알 수 있다.
setState((state) => state + 1);
// setState가 실행된 이후 리렌더가 일어난다.
};
console.log(`State: ${state}`);
return (
<div>
/* 버튼을 5회 클릭한다. */
<button onClick={handleClick}>업데이트</button>
</div>
);
}
export default App;
반응형
'🧺 일상다반사 > TIL' 카테고리의 다른 글
JPA 이슈 디버깅 기록, JpaRepository는 무엇인가 (0) | 2023.12.10 |
---|---|
12월 9일 : MySQL 접속 오류, DTO와 엔티티, 자바의 List 인터페이스 (3) | 2023.12.09 |
12월 4일 TIL : mySQL 의존성 오류, DTO, Lombok (0) | 2023.12.04 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆