TIL(22/12/09)

๊น€๊ทœํ˜„ยท2022๋…„ 12์›” 12์ผ
0

๐Ÿ’ป Today I Learned

URL Parameter ๊ฐ’ ์–ป๊ธฐ

ํ”„๋ก ํŠธ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋˜ ์ค‘ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก๋“ค์ด ๋ณด์ด๋Š” ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์„ ์„ ํƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ , ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ๋Š” ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์˜ ์›๊ฒฉ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ€์ ธ์™€์•ผํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฑ์—”๋“œ์—์„œ url์„ ์„ค๊ณ„ํ•œ๋Œ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒŒ์‹œ๊ธ€์˜ id ๊ฐ’์„ url ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ™์ด ์ „๋‹ฌ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

# articles/urls.py
urlpatterns = [
    path('', views.ArticleView.as_view(), name='article_view'),
    path('<int:article_id>/', views.ArticleDetailView.as_view(), 
]

๋จผ์ € JavaScript์˜ fetch ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก๋“ค์„ response๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ๊ฒŒ์‹œ๊ธ€์„ ์ƒ์„ฑํ•  ๋•Œ onclick ์†์„ฑ์„ ๋ถ€์—ฌํ•ด์„œ ์‹คํ–‰๋  ํ•จ์ˆ˜ ์•ˆ์— id ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

async function article_list() {
    const response = await get_articles()
    const data = await response.json()

    for (let i = 0; i < data.length; i++) {
        let id = data[i]['id']
        let title = data[i]['title']
        let comment = data[i]['comment_article']
        let category = data[i]['category']
        let user = data[i]['user']
        let date = data[i]['date']
        let time = data[i]['time']
        let like = data[i]['like']
        let views = data[i]['views']

        const article = `<tr>
                            <td>${id}</td>
                            <td>${category}</td>
                            <td align="left" id="article_id"token interpolation">${id})">${title} [${comment}]</td>
                            <td>${user}</td>
                            <td>${date}</td>
                            <td>${time}</td>
                            <td>${like}</td>
                            <td>${views}</td>
                        </tr>`
        const article_list = document.getElementById('article_list')
        article_list.insertAdjacentHTML('beforeend', article)
    }

๊ทธ ๋‹ค์Œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ๋ˆŒ๋ €์„ ๋•Œ id๊ฐ’์„ ๋ฐ›์•„ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ „๋‹ฌ๋ฐ›์€ id ๊ฐ’์„ url ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์ค€๋‹ค.

function replace_article_detail(article_id) {
    const url = `${frontend_base_url}/templates/main/article_detail.html?id=${article_id}`;
    location.href = url;
}

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์›๊ฒฉ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ response๋กœ ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๋‹ค์Œ

async function get_article_detail(article_id){
    const response = await fetch(`${backend_base_url}/articles/${article_id}/`, {
        method: "GET",
    })
    return response
}

๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์—์„œ ๋งŒ๋“  ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์›๊ฒฉ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ ์ด ๋•Œ ๋“ค์–ด๊ฐˆ id ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋„ฃ์–ด์ค˜์•ผ ํ• ์ง€ ์ •๋ง ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

async function LoadDeatail(article_id) {
  	// ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ id ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜
    const response = await get_article_detail(article_id)
    const data = await response.json()

    const title = document.getElementById('article_title')
    title.innerText = data['title']

    const author = document.getElementById('author_info')
    author.innerText = data['user'] + data['date'] + data['time']
    
    const views = document.getElementById('views')
    views.innerText = '์กฐํšŒ์ˆ˜ : ' + data['views']
    
    const likes = document.getElementById('likes')
    likes.innerText = '์ถ”์ฒœ์ˆ˜ : ' + data['like']
    
    const article_image = document.getElementById('article_image')
    article_image.src = `${backend_base_url}`+data['article_image']
    // article_image.setAttribute('src', `${backend_base_url}`+data['article_image'])

    const content = document.getElementById('content')
    content.innerText = data['content']
}

๊ตฌ๊ธ€๋ง์„ ํ•˜๋ฉด์„œ ๋ฐฉ๋ฒ•์„ ์ฐพ๋˜ ์ค‘ window.location.search๋กœ ํ˜„์žฌ ์œ„์น˜์˜ url์—์„œ Parameter ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , new URLSearchParams()๋กœ URLSearchParams๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ .get()์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด์—์„œ Parameter๋ฅผ ์ถ”์ถœ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

// ํ˜„์žฌ URL์˜ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’์„ ๊ฐ€์ ธ์˜ด -> ex)?id=1
const url_str = window.location.search
// url_str์˜ URLSearchParams ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const urlParams = new URLSearchParams(url_str);
// URLSearchParams ๊ฐ์ฒด์—์„œ id ๊ฐ’๋งŒ ์ถ”์ถœ -> ex)1
const article_id = urlParams.get("id");
profile
์›น๊ฐœ๋ฐœ ํšŒ๊ณ ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€