-
- 서블릿 라이프 사이클
- 서블릿 로딩
- 서블릿 인스턴스 생성
- init() 메서드 한 번 호출
- 각 클라이언트 요청에 대하여 반복적으로 service() 메서드 호출
- destroy() 메서드 호출
- 웹소켓 라이프 사이클
- 연결(Connecting): 클라이언트가 서버에 연결을 시도합니다. 이 단계에서는 클라이언트가 웹 소켓 엔드포인트로 HTTP 헤더를 사용하여 연결 요청을 보냅니다.
- 핸드셰이크(Handshaking): 서버는 클라이언트의 연결 요청을 받고 웹 소켓 프로토콜을 인식합니다. 서버는 클라이언트와 핸드셰이크를 수행하여 프로토콜 버전, 압축 방법, 인증 등의 세부 사항을 협상합니다.
- 개방(Open): 핸드셰이크가 성공적으로 완료되면 서버와 클라이언트는 연결이 개방됩니다. 이제 양방향 통신을 할 수 있습니다.
- 메시지 교환(Message Exchange): 연결이 개방된 후에는 클라이언트와 서버 간에 메시지를 주고받을 수 있습니다. 클라이언트나 서버는 언제든지 메시지를 보낼 수 있으며, 상대방은 메시지를 수신하여 처리합니다.
- 닫기(Closing): 클라이언트나 서버가 연결을 닫고자 할 때 닫기 프로세스가 시작됩니다. 이 단계에서는 닫기 프레임을 교환하여 연결을 안전하게 종료합니다.
- 종료(Closed): 연결이 닫히면 클라이언트와 서버는 종료된 상태가 됩니다. 이후에는 더 이상 통신이 불가능합니다.

- 자바 객체 라이프사이클
- 로딩(Loading): 자바 가상 머신(JVM)에 의해 클래스 파일이 메모리에 로드됩니다. 클래스 파일은 클래스 로더를 통해 로딩되며, 필요한 클래스 및 리소스를 검색하고 메모리에 적재합니다.
- 검증(Verification): 로딩된 클래스 파일이 유효한 자바 바이트코드인지 검증됩니다. 문법적인 오류나 보안 문제가 있는지 확인합니다.
- 준비(Preparation): 클래스의 정적 변수(static variable)와 기본적인 데이터 구조가 할당되고 초기화됩니다. 이 단계에서는 정적 변수에 기본값이 할당됩니다.
- 초기화(Initialization): 클래스의 정적 변수 및 정적 블록(static block)이 초기화됩니다. 정적 변수에 명시된 값들이 할당되고, 정적 블록의 코드가 실행됩니다.
- 인스턴스화(Instantiation): 클래스의 인스턴스가 생성됩니다. new 키워드를 사용하여 객체를 생성하고, 인스턴스 변수와 인스턴스 블록(instance block)이 초기화됩니다.
- 사용(Usage): 인스턴스가 생성된 후에는 메서드 호출, 필드 참조 등과 같은 동작을 통해 프로그램이 실행되고 사용됩니다. 이 단계에서는 프로그램의 로직에 따라 객체의 상태가 변경될 수 있습니다.
- 소멸(Termination): 프로그램이 종료되거나 객체가 더 이상 사용되지 않을 때, 메모리와 리소스를 정리하고 소멸합니다. 이 단계에서는 필요한 정리 작업이 수행되고, 가비지 컬렉터가 동작하여 더 이상 참조되지 않는 객체를 수거합니다.
- React 라이프 사이클
- 마운트
- DOM이 생성되고 웹 브라우저상에서 나타나는 것을 마운트라고 한다
- 마운트 할 때 호출하는 메서드
- constructor(props)
- 클래스 생성자 메서드
- getDerivedStateFromProps(nextProps, prevState)
- props에 있는 값을 state에 넣을때 사용하는 메서드
- render
- UI렌더링 하는 메서드
- componentDidMount
- 컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드
- 비동기작업을 처리
- constructor(props)
- 업데이트
- props가 바뀔 때
- state가 바뀔 때
- 부모 컴포넌트가 리렌더링 될 때
- this.forceUpdate로 강제로 렌더링을 트리거 할 때
- 업데이트 할 때 호출하는 메서드
- getDerivedStateFromProps(nextProps, prevState)
- 마운트 과정에서 호출되며, 업데이트가 시작하기전에도 호출 됩니다
- shouldComponentUpdate(nextProps, nextState)
- boolean값을 반환하며, true일 때 다음라이프사이클메서드를 실행하고 false일때 작업을 중지합니다
- 이 메서드 안에서 props와 state는 this.props와 this.state로 접근하고, 새로 설정될 props또는 state는 nextProps와 nextState로 접근할 수 있습니다.
- render
- 컴포넌트를 리렌더링 합니다
- getSnapshotBeforeUpdate
- 컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드입니다.
- snapshot값을 전달받는데 주로 업데이트 하기 직전의 값을 참고할 일이 있을 때 활용 됩니다(예: 스크롤바 위치 유지)
- componentDidUpdate(prevProps, prevState, snapshot)
- 컴포넌트의 업데이트 작업이 끝난 후 호출되는 메서드 입니다
- getDerivedStateFromProps(nextProps, prevState)
- 언마운트
- 컴포넌트를 DOM에서 제거하는 것을 언마운트라고 합니다
- componentWillUnmount
- 컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드 입니다
- 마운트
- static
- 내부적으로 비동기 처리됨
- 에러 잡아내기
- ErrorBoundary.js를 만들어줘야한다
- 코드
- import React, { Component } from "react"; class ErrorBoundary extends Component { state = { error: false, }; componentDidCatch(error, info) { this.setState({ error: true }); console.log(error, info); } render() { if (this.state.error) return <div>에러가 발생 했습니다.</div>; return this.props.children; } } export default ErrorBoundary;
- App.js에서 컴포넌트를 부르기전에 <ErrorBoundary></ErrorBoundary>호출해서 처리한다
- 코드
- import React, { Component } from "react"; import LifeCycleSample from "./LifeCycleSample"; import ErrorBoundary from "./ErrorBoundary"; function getRandomColor() { return "#" + Math.floor(Math.random() * Math.pow(2, 24)).toString(16); } class App extends Component { state = { color: "#000000", }; handleClick = () => { this.setState({ color: getRandomColor(), }); }; render() { return ( <div> <button onClick={this.handleClick}>랜덤색상</button> <ErrorBoundary> <LifeCycleSample color={this.state.color} /> </ErrorBoundary> </div> ); } } export default App;
- Hook
- useState
- 클래스 초기화 블럭에 사용할 수 있다
- const [value, setValue] = useState(0);
- 첫번째 원소는 상태값, 두번째 원소는 상태를 설정
- 문자가 올 수도 있고 빈 문자가 올 수도 있고 숫자가 올 수도 있으며 기본값이 있을경우 기본값을 넣어준다
- 여러번 사용해도 상관 없다
- const [name, setName] = useState(""); const [nickname, setNickname] = useState("");
- 클래스 초기화 블럭에 사용할 수 있다
- useEffect
- componentDidMount와 componentDidUpdate 합친 형태로 봐도 무방하다
- componentDidMount는 초기로드 시 호출
- componentDidUpdate는 상태가 변경 되었을 시 호출
- 두번씩 호출 되는 경우 <React.StrictMode>를 지우면 된다
- index.js import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( //밑에 부분을 지우면 된다 ~~<React.StrictMode>~~ <App /> ~~</React.StrictMode>~~ ); s reportWebVitals();
- 특정 값이 업데이트 될 때만 실행하고 싶을때 []를 써주고 특정값을 써줘도 된다(보고싶은 배열 이름)
- useEffect(() => { // console.log("렌더링이 완료되었습니다."); // console.log({ name, nickname }); console.log("effect"); console.log(name); return () => { console.log("cleanup"); console.log(name); }; }, **[]**); //마운트 시에만 실행하고 싶을때 []를 입력한다 특정값만 보고싶을땐 특정 배열에 이름만 써주면 된다 [name]
- 뒷정리(cleanup)
- 사용 했던 함수를 return값에 다시 반환 해준다
- useEffect(() => { // console.log("렌더링이 완료되었습니다."); // console.log({ name, nickname }); console.log("effect"); console.log(name); return () => { console.log("cleanup"); console.log(name); }; }, **[]**); //마운트 시에만 실행하고 싶을때 []를 입력한다 특정값만 보고싶을땐 특정 배열에 이름만 써주면 된다 [name]
- 반환 해주고 다시 호출 하게 되면 언마운트하고 다시 리마운트 하는 것이다
- useReducer
- useState보다 더 다양한 컴포넌트 상황에 따라 다양한 상태를 다른 값으로 업데이트 해주고 싶을 떄 사용 하는 Hook이다
- 첫번째 파라미터에는 리듀서 함수를 넣고, 두번째 파라미터에는 해당 리듀서의 기본값을 넣어준다(useReducer(reducer, { value: 0 });)
const [state, dispatch] = useReducer(reducer, { value: 0 });- state는 현재 가리키고 있는 상태고 dispatch는 액션을 발생시키는 함수 이다
- useMemo
- 함수 컴포넌트 내부에서 발생하는 연산을 최저고하 할 수 있다
- 렌더링 과정에서 특정 값이 바뀌었을때만 연산을 실행하고 원하는 값이 바뀌지 않았다면 이전 연산했던 결과를 다시 사용하는 방식이다
mport React, { useCallback, useMemo, useRef, useState } from "react"; const getAverage = (numbers) => { console.log("평균값 계산중..."); if (numbers.length === 0) return 0; //reduce는 매개변수가 2개 이고 반환 값이 한개이다 const sum = numbers.reduce((a, b) => a + b); return sum / numbers.length; }; const Average = () => { const [list, setList] = useState([]); const [number, setNumber] = useState(""); const inputEl = useRef(null); const onChange = useCallback((e) => { setNumber(e.target.value); }, []); const onInsert = useCallback(() => { //input에 value값이 입력과 동시에 숫자로 변환 const nextList = list.concat(parseInt(number)); setList(nextList); setNumber(""); inputEl.current.focus(); }, [number, list]); //number 혹은 list가 바뀌것을때만 함수 생성 const avg = useMemo(() => getAverage(list), [list]); return ( <div> <input value={number} onChange={onChange} ref={inputEl} /> <button onClick={onInsert}>등록</button> <ul> {list.map((value, index) => ( <li key={index}>{value}</li> ))} </ul> <div> <b>평균값 : </b> {avg} </div> </div> ); }; export default Average; - useCallback
- 렌더링 성능을 최적화 해야 하는 상황에서 사용
- 이전에 만들어 놨던 함수를 재사용 할 수 있다
- 코드
- constr onChange = useCallback(e=>{...},[number, list]);
- useCallback에서 첫번쨰 파라미터에는 생성하고 싶은 함수를 넣고 두 번째 파라미터에는 배열을 넣으면 된다 위 코드 내용 처럼 하면 인풋 내용이 바뀌너 새로운 항목이 추가될 때 새로 만들어진 함수를 사용하게 된다
- useRef
- input의 값을 입력하고 버튼을 눌렀을때 ref로 input에 focus를 줄 수 있다
- 코드
- const inputEl = useRef(null); const onInsert = useCallback(() => { //input에 value값이 입력과 동시에 숫자로 변환 const nextList = list.concat(parseInt(number)); setList(nextList); setNumber(""); inputEl.current.focus(); }, [number, list]); //number 혹은 list가 바뀌것을때만 함수 생성 <input value={number} onChange={onChange} ref={inputEl} />
- 커스텀 Hook
- useState
- 컴포넌트 스타일링
- 서블릿 라이프 사이클
- 서블릿 로딩
- 서블릿 인스턴스 생성
- init() 메서드 한 번 호출
- 각 클라이언트 요청에 대하여 반복적으로 service() 메서드 호출
- destroy() 메서드 호출
- 웹소켓 라이프 사이클
- 연결(Connecting): 클라이언트가 서버에 연결을 시도합니다. 이 단계에서는 클라이언트가 웹 소켓 엔드포인트로 HTTP 헤더를 사용하여 연결 요청을 보냅니다.
- 핸드셰이크(Handshaking): 서버는 클라이언트의 연결 요청을 받고 웹 소켓 프로토콜을 인식합니다. 서버는 클라이언트와 핸드셰이크를 수행하여 프로토콜 버전, 압축 방법, 인증 등의 세부 사항을 협상합니다.
- 개방(Open): 핸드셰이크가 성공적으로 완료되면 서버와 클라이언트는 연결이 개방됩니다. 이제 양방향 통신을 할 수 있습니다.
- 메시지 교환(Message Exchange): 연결이 개방된 후에는 클라이언트와 서버 간에 메시지를 주고받을 수 있습니다. 클라이언트나 서버는 언제든지 메시지를 보낼 수 있으며, 상대방은 메시지를 수신하여 처리합니다.
- 닫기(Closing): 클라이언트나 서버가 연결을 닫고자 할 때 닫기 프로세스가 시작됩니다. 이 단계에서는 닫기 프레임을 교환하여 연결을 안전하게 종료합니다.
- 종료(Closed): 연결이 닫히면 클라이언트와 서버는 종료된 상태가 됩니다. 이후에는 더 이상 통신이 불가능합니다.

- 자바 객체 라이프사이클
- 로딩(Loading): 자바 가상 머신(JVM)에 의해 클래스 파일이 메모리에 로드됩니다. 클래스 파일은 클래스 로더를 통해 로딩되며, 필요한 클래스 및 리소스를 검색하고 메모리에 적재합니다.
- 검증(Verification): 로딩된 클래스 파일이 유효한 자바 바이트코드인지 검증됩니다. 문법적인 오류나 보안 문제가 있는지 확인합니다.
- 준비(Preparation): 클래스의 정적 변수(static variable)와 기본적인 데이터 구조가 할당되고 초기화됩니다. 이 단계에서는 정적 변수에 기본값이 할당됩니다.
- 초기화(Initialization): 클래스의 정적 변수 및 정적 블록(static block)이 초기화됩니다. 정적 변수에 명시된 값들이 할당되고, 정적 블록의 코드가 실행됩니다.
- 인스턴스화(Instantiation): 클래스의 인스턴스가 생성됩니다. new 키워드를 사용하여 객체를 생성하고, 인스턴스 변수와 인스턴스 블록(instance block)이 초기화됩니다.
- 사용(Usage): 인스턴스가 생성된 후에는 메서드 호출, 필드 참조 등과 같은 동작을 통해 프로그램이 실행되고 사용됩니다. 이 단계에서는 프로그램의 로직에 따라 객체의 상태가 변경될 수 있습니다.
- 소멸(Termination): 프로그램이 종료되거나 객체가 더 이상 사용되지 않을 때, 메모리와 리소스를 정리하고 소멸합니다. 이 단계에서는 필요한 정리 작업이 수행되고, 가비지 컬렉터가 동작하여 더 이상 참조되지 않는 객체를 수거합니다.

- React 라이프 사이클
- 마운트
- DOM이 생성되고 웹 브라우저상에서 나타나는 것을 마운트라고 한다
- 마운트 할 때 호출하는 메서드
- constructor(props)
- 클래스 생성자 메서드
- getDerivedStateFromProps(nextProps, prevState)
- props에 있는 값을 state에 넣을때 사용하는 메서드
- render
- UI렌더링 하는 메서드
- componentDidMount
- 컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드
- 비동기작업을 처리
- constructor(props)
- 업데이트
- props가 바뀔 때
- state가 바뀔 때
- 부모 컴포넌트가 리렌더링 될 때
- this.forceUpdate로 강제로 렌더링을 트리거 할 때
- 업데이트 할 때 호출하는 메서드
- getDerivedStateFromProps(nextProps, prevState)
- 마운트 과정에서 호출되며, 업데이트가 시작하기전에도 호출 됩니다
- shouldComponentUpdate(nextProps, nextState)
- boolean값을 반환하며, true일 때 다음라이프사이클메서드를 실행하고 false일때 작업을 중지합니다
- 이 메서드 안에서 props와 state는 this.props와 this.state로 접근하고, 새로 설정될 props또는 state는 nextProps와 nextState로 접근할 수 있습니다.
- render
- 컴포넌트를 리렌더링 합니다
- getSnapshotBeforeUpdate
- 컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드입니다.
- snapshot값을 전달받는데 주로 업데이트 하기 직전의 값을 참고할 일이 있을 때 활용 됩니다(예: 스크롤바 위치 유지)
- componentDidUpdate(prevProps, prevState, snapshot)
- 컴포넌트의 업데이트 작업이 끝난 후 호출되는 메서드 입니다
- getDerivedStateFromProps(nextProps, prevState)
- 언마운트
- 컴포넌트를 DOM에서 제거하는 것을 언마운트라고 합니다
- componentWillUnmount
- 컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드 입니다
- 마운트
- static
- 내부적으로 비동기 처리됨
- 에러 잡아내기
- ErrorBoundary.js를 만들어줘야한다
- 코드
- import React, { Component } from "react"; class ErrorBoundary extends Component { state = { error: false, }; componentDidCatch(error, info) { this.setState({ error: true }); console.log(error, info); } render() { if (this.state.error) return <div>에러가 발생 했습니다.</div>; return this.props.children; } } export default ErrorBoundary;
- App.js에서 컴포넌트를 부르기전에 <ErrorBoundary></ErrorBoundary>호출해서 처리한다
- 코드
- import React, { Component } from "react"; import LifeCycleSample from "./LifeCycleSample"; import ErrorBoundary from "./ErrorBoundary"; function getRandomColor() { return "#" + Math.floor(Math.random() * Math.pow(2, 24)).toString(16); } class App extends Component { state = { color: "#000000", }; handleClick = () => { this.setState({ color: getRandomColor(), }); }; render() { return ( <div> <button onClick={this.handleClick}>랜덤색상</button> <ErrorBoundary> <LifeCycleSample color={this.state.color} /> </ErrorBoundary> </div> ); } } export default App;
- Hook
- useState
- 클래스 초기화 블럭에 사용할 수 있다
- const [value, setValue] = useState(0);
- 첫번째 원소는 상태값, 두번째 원소는 상태를 설정
- 문자가 올 수도 있고 빈 문자가 올 수도 있고 숫자가 올 수도 있으며 기본값이 있을경우 기본값을 넣어준다
- 여러번 사용해도 상관 없다
- const [name, setName] = useState(""); const [nickname, setNickname] = useState("");
- 클래스 초기화 블럭에 사용할 수 있다
- useEffect
- componentDidMount와 componentDidUpdate 합친 형태로 봐도 무방하다
- componentDidMount는 초기로드 시 호출
- componentDidUpdate는 상태가 변경 되었을 시 호출
- 두번씩 호출 되는 경우 <React.StrictMode>를 지우면 된다
- index.js import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( //밑에 부분을 지우면 된다 ~~<React.StrictMode>~~ <App /> ~~</React.StrictMode>~~ ); s reportWebVitals();
- 특정 값이 업데이트 될 때만 실행하고 싶을때 []를 써주고 특정값을 써줘도 된다(보고싶은 배열 이름)
- useEffect(() => { // console.log("렌더링이 완료되었습니다."); // console.log({ name, nickname }); console.log("effect"); console.log(name); return () => { console.log("cleanup"); console.log(name); }; }, **[]**); //마운트 시에만 실행하고 싶을때 []를 입력한다 특정값만 보고싶을땐 특정 배열에 이름만 써주면 된다 [name]
- 뒷정리(cleanup)
- 사용 했던 함수를 return값에 다시 반환 해준다
- useEffect(() => { // console.log("렌더링이 완료되었습니다."); // console.log({ name, nickname }); console.log("effect"); console.log(name); return () => { console.log("cleanup"); console.log(name); }; }, **[]**); //마운트 시에만 실행하고 싶을때 []를 입력한다 특정값만 보고싶을땐 특정 배열에 이름만 써주면 된다 [name]
- 반환 해주고 다시 호출 하게 되면 언마운트하고 다시 리마운트 하는 것이다
- useReducer
- useState보다 더 다양한 컴포넌트 상황에 따라 다양한 상태를 다른 값으로 업데이트 해주고 싶을 떄 사용 하는 Hook이다
- 첫번째 파라미터에는 리듀서 함수를 넣고, 두번째 파라미터에는 해당 리듀서의 기본값을 넣어준다(useReducer(reducer, { value: 0 });)
const [state, dispatch] = useReducer(reducer, { value: 0 });- state는 현재 가리키고 있는 상태고 dispatch는 액션을 발생시키는 함수 이다
- useMemo
- 함수 컴포넌트 내부에서 발생하는 연산을 최저고하 할 수 있다
- 렌더링 과정에서 특정 값이 바뀌었을때만 연산을 실행하고 원하는 값이 바뀌지 않았다면 이전 연산했던 결과를 다시 사용하는 방식이다
mport React, { useCallback, useMemo, useRef, useState } from "react"; const getAverage = (numbers) => { console.log("평균값 계산중..."); if (numbers.length === 0) return 0; //reduce는 매개변수가 2개 이고 반환 값이 한개이다 const sum = numbers.reduce((a, b) => a + b); return sum / numbers.length; }; const Average = () => { const [list, setList] = useState([]); const [number, setNumber] = useState(""); const inputEl = useRef(null); const onChange = useCallback((e) => { setNumber(e.target.value); }, []); const onInsert = useCallback(() => { //input에 value값이 입력과 동시에 숫자로 변환 const nextList = list.concat(parseInt(number)); setList(nextList); setNumber(""); inputEl.current.focus(); }, [number, list]); //number 혹은 list가 바뀌것을때만 함수 생성 const avg = useMemo(() => getAverage(list), [list]); return ( <div> <input value={number} onChange={onChange} ref={inputEl} /> <button onClick={onInsert}>등록</button> <ul> {list.map((value, index) => ( <li key={index}>{value}</li> ))} </ul> <div> <b>평균값 : </b> {avg} </div> </div> ); }; export default Average; - useCallback
- 렌더링 성능을 최적화 해야 하는 상황에서 사용
- 이전에 만들어 놨던 함수를 재사용 할 수 있다
- 코드
- constr onChange = useCallback(e=>{...},[number, list]);
- useCallback에서 첫번쨰 파라미터에는 생성하고 싶은 함수를 넣고 두 번째 파라미터에는 배열을 넣으면 된다 위 코드 내용 처럼 하면 인풋 내용이 바뀌너 새로운 항목이 추가될 때 새로 만들어진 함수를 사용하게 된다
- useRef
- input의 값을 입력하고 버튼을 눌렀을때 ref로 input에 focus를 줄 수 있다
- 코드
- const inputEl = useRef(null); const onInsert = useCallback(() => { //input에 value값이 입력과 동시에 숫자로 변환 const nextList = list.concat(parseInt(number)); setList(nextList); setNumber(""); inputEl.current.focus(); }, [number, list]); //number 혹은 list가 바뀌것을때만 함수 생성 <input value={number} onChange={onChange} ref={inputEl} />
- 커스텀 Hook
- useState
- 컴포넌트 스타일링
- 서블릿 라이프 사이클