ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”์Šค 2์ฃผ์ฐจ ํšŒ๊ณ  (2) — Redux
    ETC 2022. 3. 5. 21:39

    ์ฑ„์šฉ ๊ณผ์ œ๋ฅผ ํ•˜๊ฑฐ๋‚˜, ์ทจ์—…ํ•ด์„œ ํšŒ์‚ฌ๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋‚˜๋ฉด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฑฐ๋‹ค. (์–ด๋งˆ์–ด๋งˆํ•œ props drilling์œผ๋กœ ๋ชจ๋“  ๊ฑธ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ....) ๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ๋ฅผ ํ•˜๋ฉด์„œ redux, recoil ๊ฐ™์€ ์ „์—ญ ์ƒํƒœ ํˆด์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒŒ ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋‚˜๋Š” ์™œ ๊ทธ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋Š”์ง€?  ์•„๋ฌดํŠผ ์ด๋ฒˆ์—๋Š” ๋ฆฌ๋•์Šค๋ฅผ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ œ์˜€๊ณ , ์ด์ „์—๋„ Context API๋‚˜ ๋ฆฌ๋•์Šค ํŠœํ† ๋ฆฌ์–ผ (์ •๋„์ง€๋งŒ)์„ ํ†ตํ•ด ์‚ฌ์šฉํ•ด ๋ดค๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ฅ ๊ฑฑ์ •์€ ๋˜์ง€ ์•Š์•˜๋‹ค!

     

     

    ์šฐ์„  ์ด๋ฒˆ์—๋Š” ๊ณผ์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฑ๊ธˆ ์ •์‹ ์ด ์—†์—ˆ๊ณ ... swit ๊ณผ์ œ๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””์ž์ธ์€ ์–ด๋–ป๊ฒŒ ํ•˜์ง€ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ swit์€ ์ด๋ฏธ ์ž˜ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”์‹ ์ €์ด๊ธฐ ๋•Œ๋ฌธ์—~ ์›น ๋ฒ„์ „ ๋””์ž์ธ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. (๋””์ž์ธ์ด๋ผ๋„ ์‰ฝ๊ฒŒ ๊ฐ€์ž ๋งˆ์ธ๋“œ ๋งž๊ณ ์š” ํ”ผ๊ทธ๋งˆ ์‚ฌ์šฉ์ด๋ผ๋“ ์ง€ ๋””์ž์ธ์€ ์ „์ฒด์ ์œผ๋กœ ์กฐ๊ธˆ ์ž์‹  ์—†์—ˆ์Œ ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํšŒํ”ผํ•œ ๊ฒƒ์ด ๋‚˜์ค‘์— ํ˜„์‹ค๋กœ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค)

     

     

    ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฑด์ง€ ๋ฆฌ๋•์Šค ํˆดํ‚ท์„ ์‚ฌ์šฉํ•  ๊ฑด์ง€๋„ ํšŒ์˜ํ•  ๋•Œ ๋งํ–ˆ์—ˆ๋Š”๋ฐ, C์–ธ์–ด๋ถ€ํ„ฐ ๋ฐฐ์šด ์ „๊ณต์ž ์ž…์žฅ์—์„œ๋Š” ์—ญ์‹œ ์–ด๋ ค์šด ๊ฑธ ๋จผ์ € ๋ฐฐ์›Œ ๋ด์•ผ ๋‹ค์Œ์— ๋ฐฐ์šธ ๊ฒƒ๋„ ์‰ฝ๊ณ ...... (๋งˆ์น˜ C๋‚˜ ์ž๋ฐ” ๋ฐฐ์šฐ๋‹ค๊ฐ€ ํŒŒ์ด์ฌ์„ ์ฒ˜์Œ ๋ฐฐ์› ์„ ๋•Œ ์‰ฌ์› ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ) ๊ทธ๋ž˜์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ํŒ€์› ๋ถ„๋“ค์ด ์ข‹์•„์„œ ๊ทธ๋ ‡๊ฒŒ ํ•ด ์ฃผ์…จ๋‹ค. ๋‚ด ์˜๊ฒฌ๋งŒ์€ ์•„๋‹ˆ์—ˆ๊ฒ ์ง€?

     

     

    ์š”๊ตฌ ์‚ฌํ•ญ์— ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋ฉ”์‹œ์ง€๋Š” ์˜†์— * ํ‘œ์‹œ๊ฐ€ ๋ถ™๋Š”๋‹ค๊ณ  ํ•ด์„œ ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ๊ฒ ๋‹ค~ ํ–ˆ๊ณ , ์ด๋ฅผ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ ๊ตฌํ˜„ํ•˜์ž๊ณ  ํ•˜์…”์„œ ์กฐ๊ธˆ ์˜ค๋ฒ„์ŠคํŽ™์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์—ˆ์œผ๋‚˜ ๋‹คํ–‰ํžˆ๋„ localStorage + redux ์กฐํ•ฉ์œผ๋กœ ์ž˜ ํ•ด๊ฒฐํ–ˆ๋‹ค.

     

     

     

    ์•„๋ฌดํŠผ ์‹œ์ž‘~

    1. useFetch & json-server

    ์œ„ ์Šค์ƒท์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด 5๋ช…์ด ๋– ๋“ค๊ณ  ์žˆ๋Š” ์ฑ„ํŒ…์ด ๋ฏธ๋ฆฌ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ชฉ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๊ณ  ์ €๋ฒˆ์— ์‚ฌ์šฉํ–ˆ๋˜ json-server๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์–ด๋– ๋ƒ~ ์ œ์•ˆํ–ˆ๋Š”๋ฐ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ์ €๋ฒˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  custom hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค ์‹ถ์–ด์„œ useFetch ํ›…์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

    import { useEffect, useState } from 'react';
    
    const useFetch = (url) => {
        const [state, setState] = useState();
        useEffect(() => {
            const request = async () => {
                const json = await (await fetch(url)).json();
                console.log(json);
            };
            request();
        }, []);
        return state;
    };
    
    export default useFetch;

     

     

     

     

     

    2. ๋ฉ”์‹œ์ง€ ๋‹ต์žฅ ๊ธฐ๋Šฅ

    ํ˜‘์—…์„ ํ•˜๊ธฐ ์ „ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด๋‹ˆ๊นŒ ๋ฉ”์‹œ์ง€ ์ž…๋ ฅ, ๋‹ต์žฅ, ์‚ญ์ œ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. ๊ทผ๋ฐ ์ด ๋ถ€๋ถ„์ด ๋ญ”๊ฐ€ ํ˜‘์—…ํ•  ๋•Œ ๋”ฑ๋”ฑ ๋‚˜๋ˆ ์ง„ ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ ์กฐ๊ธˆ ๊ณค๋ž€ํ•  ๊ฒƒ ๊ฐ™์•„์„œ redux store ๋ถ€๋ถ„์„ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ  ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

    import { createStore } from 'redux';
    
    export const FETCH = 'FETCT';
    export const ADD_MESSAGE = 'ADD_MESSAGE';
    export const REPLY_MESSAGE = 'REPLY_MESSAGE';
    export const REMOVE_MESSAGE = 'REMOVE_MESSAGE';
    
    export const addMessage = (userId, userName, profileImage, content) => ({
        type: ADD_MESSAGE,
        userId,
        userName,
        profileImage,
        content,
    });
    export const replyMessage = () => ({ type: REPLY_MESSAGE });
    export const removeMessage = () => ({ type: REMOVE_MESSAGE });
    
    const initialState = [];
    
    const todoReducer = (state = initialState, action) => {
        switch (action.type) {
            case FETCH:
                return (state = action.value);
    
            case ADD_MESSAGE:
                return state.concat({
                    userId: action.userID,
                    userName: action.userName,
                    profileImage: action.profileImage,
                    content: action.content,
                    date: new Date(),
                });
            default:
                return state;
        }
    };
    
    const store = createStore(todoReducer);
    
    export default store;

    ๋Œ€์ถฉ ์ด~~ ๋ ‡๊ฒŒ Fetch๋ถ€ํ„ฐ ๋จผ์ € ํ•ด ๋ณด๊ธฐ.

     

    ๋‚˜๋Š” ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ์ด์–ด์„œ ๊ทธ๋žฌ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, fetch ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ^^ ๊ทธ์น˜๋งŒ ํ•ด๊ฒฐ ๋ชป ํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ์—†๋‹ค๊ณ  ๋‚ด๊ฐ€ ๋˜ ํ•ด๋ƒ„! ๋‚ด๊ฐ€ํ•ด๋ƒ„!

     

     

     

    ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋งก์€ ๋‹ต์žฅ ๊ธฐ๋Šฅ์€ ๋‹ต์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ ์‚ฌ๋žŒ, ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ, (ํšŒ์‹ ) ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€๋ฅผ ์ž…๋ ฅ์ฐฝ์— ์ž๋™ ์ž…๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด  `${๋ณด๋‚ธ ์‚ฌ๋žŒ}\n${๋ฉ”์‹œ์ง€}\n(ํšŒ์‹ )\n` ์ด๋Ÿฐ ๋ฌธ์ž์—ด์„ redux๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ž…๋ ฅ์ฐฝ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ–ˆ๋‹ค. ์ฒดํฌ๋ฐ•์Šค์— ์น˜์—ฌ์„œ ๊ทธ๋žฌ๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋‚˜๋ฆ„ ์‰ฌ์› ์Œ...

     

     

     

     

     

     

     

     

    3. ์ž…๋ ฅ์ฐฝ์— ๋งž์ถฐ์„œ ์Šคํฌ๋กค ๋‚ด๋ฆฌ๊ธฐ

    ์ด๋Ÿฐ์‹์œผ๋กœ ์ž…๋ ฅ์ฐฝ์ด ์ปค์ง€๋ฉด ์ž…๋ ฅํ•œ ์ฑ„ํŒ…๋„ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋‹ค. ์™œ๋ƒ๋ฉด ์Šค์œ—์ด ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฒผ์Œ.... ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์˜€์Œ.

     

    ๊ทธ๋Ÿฐ๋ฐ ๊ธฐ์กด ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋‘˜์„ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ...... ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค! 

     

    ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•˜๋Š” Div์— useRef๋ฅผ ์ด์–ด ์ฃผ๋Š” ๊ฑด๋ฐ, ๊ทธ๊ฑธ ์ƒ์œ„์—์„œ ์ •์˜ํ•˜๊ณ , ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ์ปดํฌ๋„ŒํŠธ์™€ ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ์— ๋ชจ๋‘ ์ „๋‹ฌํ•œ๋‹ค.

     

    const Main = () => {
        const MsgBoxRef = useRef();
    
        return (
            <Messages MsgBox={MsgBoxRef} />
            <NewMessage MsgBox={MsgBoxRef} />
            )
    }

    ์ด๋Ÿฐ ์‹์œผ๋กœ! (Messages๊ฐ€ ์ถœ๋ ฅ ๋‹ด๋‹น์ด๊ณ  NewMessage๊ฐ€ ์ž…๋ ฅ ๋‹ด๋‹น)

     

     

    ๊ทธ๋ฆฌ๊ณ  Messages์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋“ค์„ ๊ฐ์‹ธ๋Š” ์ „์ฒด div์— MsgBox๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค€๋‹ค.

    const Messages = (props) => {
    
        return (
            <S.StyledMessages ref={props.MsgBox}>
               // ์ƒ๋žต
        )
     }

     

     

     

    ์ž…๋ ฅ์ฐฝ ๋ฐ•์Šค ํฌ๊ธฐ์— ๋”ฐ๋ผ Messages์˜ ์ถœ๋ ฅ div ์Šคํฌ๋กค์„ ๋งจ ๋ฐ‘์œผ๋กœ ๋‚ด๋ฆฌ๋Š” ํ•จ์ˆ˜๋Š” NewMessage ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•ด ์คฌ๋‹ค. 

    const scrollHandler = () => {
            MsgBox.current.scrollTo({
                top: MsgBox.current.scrollHeight,
            });
        };
    
    useEffect(() => {
        scrollHandler();
    }, [scrollHeight]);

    ์ด๋Ÿฐ ์‹์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ MsgBox์˜ ์Šคํฌ๋กค์„ ๊ฐ€์žฅ ๋ฐ‘์œผ๋กœ ๋‚ด๋ฆฌ๊ณ , ์ž…๋ ฅ์ฐฝ์˜ ๋†’์ด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” scrollHeight๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค scrollHandler๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ž‘์„ฑํ•ด ์ฃผ๋‹ˆ๊นŒ ์ž˜๋์Œ. 

     

     

     

     

     

     

     

    4. ์ž…๋ ฅ์ฐฝ ์•ˆ์— ์ „์†ก ๋ฒ„ํŠผ

    ์ด๊ฑด ๋งˆ๊ฐ ๊ธฐํ•œ์ด ์žˆ์–ด์„œ ์ ๋‹นํžˆ ํƒ€ํ˜‘ํ•˜๊ณ  ์ œ์ถœํ•œ ๊ฑด๋ฐ, ์ถ•์†Œํ•˜๋ฉด ์ € ๋ฒ„ํŠผ์ด ์ž…๋ ฅ์ฐฝ์„ ๋น—๋‚˜๊ฐ„๋‹ค...... ๐Ÿคฆ๐Ÿป ๋ฌผ๋ก  ์‹œ๋„ํ–ˆ๋˜ ๊ฑด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

     

    1. input ์ฐฝ absolute, button๋„ absolute ์„ค์ •ํ•˜๊ธฐ

    ์ด๊ฑด ์ถ•์†Œํ•ด๋„ ๋ฒ„ํŠผ์ด input ์ฐฝ ์•ˆ์— ์ž˜ ! ์–Œ์ „ํžˆ! ์žˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ญ๋ƒ๋ฉด 3๋ฒˆ์—์„œ ์“ด ์ž…๋ ฅ์ฐฝ์— ๋งž์ถฐ ์Šคํฌ๋กค ๋‚ด๋ฆฌ๋Š” ๊ฒŒ ์•ˆ ๋œ๋‹ค.

     

    2. input ์ฐฝ relative, button๋งŒ absolute ์„ค์ •ํ•˜๊ธฐ

    ์œ„ ์Šค์ƒท์ด ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ ๊ฒฐ๊ณผ๋‹ค. ์Šคํฌ๋กค์ด ๋” ์šฐ์„ ์ˆœ์œ„๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ์ถ•์†Œ๋งŒ ์•ˆ ํ•˜๋ฉด ๋ฒ„ํŠผ์ด ์ž˜ ์žˆ์œผ๋‹ˆ๊นŒ(...) ์ผ๋‹จ์€ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.

     

     

    ๊ทธ๋ฆฌ๊ณ  ํ•ด์ƒ๋„๋งˆ๋‹ค ๋ฒ„ํŠผ ์œ„์น˜๋„ ์•ฝ๊ฐ„ ๋‹ฌ๋ž๋Š”๋ฐ, ์ด๊ฑด ๋ฒ„ํŠผ ์Šคํƒ€์ผ์€ rem์œผ๋กœ ํ•˜๊ณ , input์—์„œ๋Š” px๋กœ ์„ค์ •ํ•ด์„œ ์กฐ๊ธˆ ๋‹ฌ๋ž๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋˜‘๊ฐ™์ด px๋กœ ๋ฐ”๊พธ๋‹ˆ๊นŒ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋‹ค๋ฅด์ง„ ์•Š์•˜๋‹ค.

     

    ์˜ˆ์ „ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋ฆฌํŒฉํ† ๋ง ํ•˜๊ณ  ์žˆ์–ด์„œ ์ข€ ํ›„์ˆœ์œ„์ง€๋งŒ ์–˜๋„ ์•„๋ฌดํŠผ ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ด๋‹ค.

     

    ๐Ÿคฆ๐Ÿป

     

     

     

     

    + 22.04.01 

    textarea์™€ button์˜ ๋ถ€๋ชจ์ธ div์™€ form์˜ align-items ๊ฐ’์„ center์—์„œ flex-end๋กœ ๋ฐ”๊พธ๋ฉด์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ์–ด๋–ค ํ•ด์ƒ๋„์—์„œ๋“  ๋ฒ„ํŠผ์ด ์ธํ’‹ ์ฐฝ ์•ˆ์— ๋“ค์–ด๊ฐ€๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์•Œ์•˜๋Š๋ƒ ํ•˜๋ฉด, textarea์˜ height๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด textarea๊ฐ€ div์— ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜์—ˆ์œผ๋‚˜ ์ดˆ๊ธฐ์—๋Š” div์˜ ์ •๋ ฌ์„ center๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— textarea์— ์—ฌ๋ฐฑ์ด ์ƒ๊ฒผ์—ˆ๊ณ , ๊ทธ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์˜ position์„ absolute๋กœ ์„ค์ •ํ•˜๊ณ  bottom ๊ฐ’์„ 0์œผ๋กœ ์ฃผ์—ˆ์„ ๋•Œ textarea์—์„œ ์‚ด์ง ๋น„๊ปด๋‚˜๊ฐ€๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. ํ•œ์ฐธ ๋™์•ˆ ๋‚ด ๋จธ๋ฆฌ๋ฅผ ์•„ํ”„๊ฒŒ ํ–ˆ๋˜ ์ฅ๊ณ  ์žˆ๋˜ ์ˆ™์ œ๋ฅผ ๋“œ๋””์–ด ํ•ด๊ฒฐํ•ด์„œ ๋ฟŒ๋“ฏํ•˜๋‹ค! 

     

    absolute์™€ relative ๋ฌธ์ œ์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์— focus๋ฅผ ๋งž์ถ”๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์š”์ธ์„ ๋ชจ๋‘ ์‚ดํŽด์•ผ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ๊ธˆ ๊นจ๋‹ซ๊ฒŒ ๋œ๋‹ค. 

     

     

    ์ด๊ฒŒ ๋˜๋„ค!

     


     

    ๊ทธ๋ž˜๋„ ์ „ ๊ณผ์ œ์— ๋น„ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋Š๊ปด์ ธ์„œ ์งง์€ ์‹œ๊ฐ„์— ๊ต‰์žฅํ•œ ์„ฑ์žฅ์„ ํ•ด๋ƒˆ๊ตฌ๋‚˜! ์‹ถ์—ˆ๋‹ค. ๊นƒํ—ˆ๋ธŒ์— ์ด์Šˆ ๊ด€๋ฆฌ๋„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ผ์ • ๊ด€๋ฆฌ์— ์œ ์šฉํ–ˆ์„ ํ…๋ฐ ์ง€๊ธˆ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ์•„์‰ฝ๋‹ค. ์ด๋•Œ์ฏค ๋˜๋‹ˆ ๋ฐฐํฌ๋Š” ๊ฑฐ์˜ ๊ธฐ๋ณธ์ด ๋ผ์„œ Netlify๋ฅผ ํ†ตํ•œ ๋ฐฐํฌ๋Š” ์•„์ฃผ ์ˆ˜์›”ํ•˜๊ฒŒ ํ–ˆ์—ˆ๋˜ ๊ธฐ์–ต์ด. ใ…Žใ…Ž ๋ฆฌ๋•์Šค๋„ ๋” ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค. ๊ฐ€๋…์„ฑ ์žˆ๋Š” ๋ฆฌ๋•์Šค ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์€๊ทผ ๊นŒ๋‹ค๋กญ๊ณ  ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค.

     

     

     

    ์ „์ฒด ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”. ๐Ÿฅฐ

     

    GitHub - console-lo9/messenger: ๋ฉ”์‹ ์ € ๊ณผ์ œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋‹ด์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค

    ๋ฉ”์‹ ์ € ๊ณผ์ œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋‹ด์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. Contribute to console-lo9/messenger development by creating an account on GitHub.

    github.com

     

    ๋Œ“๊ธ€

Designed by Tistory.