[Linux]부트캠프 - 파일 및 폴더 생성
파일 및 폴더 생성
dbtest(App)의 index.html로 이동 후 내용변경
<td><a href="detail/{{data.id}}">{{ data.mytitle }}</a></td>
templates에 detail.html 생성 후 작성
<body>
<h1>Detail</h1>
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" value="{{dto.myname}}" readonly></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" value="{{dto.mytitle}}" readonly></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" readonly>{{dto.mycontent}}</textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="목록" onclick="">
<input type="button" value="수정" onclick="">
<input type="button" value="삭제" onclick="">
</td>
</tr>
</table>
</body>
views.py로 이동 후 내용 추가
def detail(request, id): # id라는 변수로 값을 받아서 사용할 수 있게 도와준다.
return render(request, 'detail.html', {'dto': MyBoard.objects.get(id=id)})
urls.py로 이동
path('detail/<int:id>', views.detail, name='detail')
<int:id>
값이 넘어올 것이란 것templates에 insert.html 생성 후 작성
<body>
<h1>Insert</h1>
<form action="/insertres" method="post">
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" name="myname"></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="mytitle"></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" name="mycontent"></textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="취소" onclick="" />
<input type="submit" value="글작성" />
</td>
</tr>
</table>
</form>
</body>
views.py로 이동 후 내용 추가
from django.shortcuts import render, redirect
from django.utils import timezone
def insert_form(request):
return render(request, 'insert.html')
def insert_res(request):
myname = request.POST['myname']
mytitle = request.POST['mytitle']
mycontent = request.POST['mycontent']
result = MyBoard.objects.create(myname=myname, mytitle=mytitle, mycontent=mycontent, mydate=timezone.now())
if result:
return redirect('index')
else:
return redirect('insertform')
urls.py로 이동 후 내용 추가
path('insertform/', views.insert_form, name='insertform'),
path('insertres/', views.insert_res),
index.html의 글작성 button을 눌렀을 때 insert.html로 이동해 내용을 적고 거기서 글작성(submit)버튼을 누르면 index.html에 나타나게 만들어보자.
index.html 부분
<td colspan="4" align="right">
<input type="button" value="글작성" onclick="location.href='/insertform'"/>
</td>
index.html로 가서 글작성을 누르면 insert.html로 이동하는걸 확인할 수 있다.
여기서 내용 작성하고 글작성 버튼을 누르면 런타임에러가 뜬다.
insert.html 부분
<form action="/insertres/" method="post">
폼태그 머리부분에 action에 /를 추가하고 다시 내용을 작성하고 글작성을 누르면 403:Forbidden에러가 난다.
내용을 확인해보면 CSRF 부분에 문제가 있는 것 같다.
이 경우에 폼태그 머리부분 뒤에 {% csrf_token %}
를 붙여준다.(장고 복습 2번 참고, form태그 사용하면 무조건 csrf_token 사용하자!!!)
<form action="/insertres/" method="post">{% csrf_token %}
그리고 다시 작성해보면 잘 작성되는것을 확인할 수 있다.
detail.html의 수정버튼이 작동하게 만들어보자.
templates에 update.html 생성 후 작성
기존에 테이블에 작성된 내용을 수정하기 위한 html이다.
<body>
<h1>Update</h1>
<form action="/updateres/" method="post">{% csrf_token %}
<input type="hidden" name="id" value="{{dto.id}}" />
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" name="myname" value="{{dto.myname}}" readonly /></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="mytitle" value="{{dto.mytitle}}"/></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" name="mycontent">{{dto.mycontent}}</textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="취소" onclick="">
<input type="submit" value="수정">
</td>
</tr>
</table>
</form>
</body>
myname은 글 작성자이기 때문에 readonly로 설정해 수정할 수 없게 해놓았다.
views.py로 이동 후 내용 추가
def update_form(request, id):
return render(request, 'update.html', {'dto':MyBoard.objects.get(id=id)})
def update_res(request):
id = request.POST['id']
mytitle = request.POST['mytitle']
mycontent = request.POSt['mycontent']
myboard = MyBoard.objects.filter(id=id)
result_title = myboard.update(mytitle=mytitle)
result_content = myboard.update(mycontent=mycontent)
if result_title + result_content == 2:
return redirect('detail/'+id)
else:
return redirect('updateform/'+id)
참고 : 모델객체.objects.get()와 모델객체.objects.filter()의 차이
objects.get()
objects.filter()
urls.py로 이동 후 urlpatterns 안에 내용 추가
path('updateform/<int:id>', views.update_form, name='updateform'),
path('updateres/', views.update_res),
detail.html로 이동해 수정 버튼을 클릭했을 때 update페이지로 보내주는 링크를 작성해야한다.(js이용)
<input type="button" value="수정" onclick="location.href='/updateform/{{dto.id}}'">
update 앞에 /를 적어줌으로써 http://localhost:8000/updateform/id
로 갈수 있게 된다.
만약 /를 적지 않으면 /detail/updateform/id 이렇게 경로가 잡힌다.
{{dto.id}}
: 값을 같이 가지고 가겠다는 의미
다시 수정버튼 눌러서 확인
이제 update페이지에서 제목과 내용을 수정하고 수정버튼을 눌렀을 때 detail에 반영되게 만들어보자.
지금 상태에서 내용을 수정하고 수정버튼을 누르면 404에러가 난다.
그 이유는 아까와 같이 경로에 문제가 있어서다.
views.py로 이동해 update_res의 내용을 고쳐주자.
def update_res(request):
id = request.POST['id']
mytitle = request.POST['mytitle']
mycontent = request.POST['mycontent']
myboard = MyBoard.objects.filter(id=id)
result_title = myboard.update(mytitle=mytitle)
result_content = myboard.update(mycontent=mycontent)
if result_title + result_content == 2:
return redirect('/detail/'+id)
else:
return redirect('/updateform/'+id)
다시 update 페이지로 넘어가서 내용 수정 후 수정버튼을 눌러보자.
경로와 내용이 잘 수정된 것을 확인할 수 있다.
이번엔 detail페이지에서 삭제(delete)기능을 추가해보자.
views.py로 이동 후 내용 추가
def delete(request, id):
result_delete = MyBoard.objects.filter(id=id).delete()
if result_delete[0]:
return redirect('index')
else:
return redirect('detail/'+id)
urls.py로 이동 후 내용 추가
path('delete/<int:id>', views.delete),
detail.html로 이동해 삭제버튼 내용 수정
<input type="button" value="삭제" onclick="location.href='/delete/{{dto.id}}'">
삭제 버튼 누르고 결과 확인
참고 :https://docs.djangoproject.com/en/4.0/ref/databases/#mysql-notes
서버 종료 후 cd ..
myboard
라는 프로젝트 생성
django-admin startproject myboard
pip install mysqlclient
로 mysql 클라이언트 설치
(myweb) C:\Workspaces\workspace_django>pip install mysqlclient
Collecting mysqlclient
Downloading mysqlclient-2.1.0-cp39-cp39-win_amd64.whl (180 kB)
|████████████████████████████████| 180 kB 1.6 MB/s
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.1.0
myboard(App)의 settings.py로 이동(MySQL을 위한 세팅을 해주자.)
INSTALLED_APPS에 ‘myboard’ 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myboard',
]
DATABASES의 내용 변경
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql',
'USER' : 'root',
'PASSWORD' : '비밀번호~',
'HOST' : 'localhost',
'PORT' : '3306',
}
}
myboard(App)에 models.py 생성
from django.db import models
class MyBoard(models.Model):
myname = models.CharField(max_length=100)
mytitle = models.CharField(max_length=500)
mycontent = models.CharField(max_length=1000)
mydate = models.DateTimeField()
def __str__(self):
return str({'myname': self.myname, 'mytitle': self.mytitle, 'mycontent': self.mycontent, 'mydate': self.mydate})
myboard(App)에 templates라는 폴더 생성 후 그 안에 index.html 생성
원래 table
로 레이아웃 짜면 안된다. div
나 span
등 영역 태그와 CSS를 활용해야함.
<body>
<h1>Hello, {{ request.session.myname | default:"Django" }} with mysql</h1>
<table border="1">
<col width="50">
<col width="100">
<col width="500">
<col width="100">
<tr>
<th>번호</th>
<th>작성자</th>
<th>제목</th>
<th>작성일</th>
</tr>
{% if not list%}
<tr>
<th colspan="4">-------- 작성된 글이 없습니다 --------</th>
</tr>
{% else %}
{% for data in list %}
<tr>
<td>{{ data.id }}</td>
<td>{{ data.myname }}</td>
<td><a href="#">{{ data.mytitle }}</a></td>
<td>{{ data.mydate | date:"Y-m-d" }}</td>
</tr>
{% endfor %}
{% endif %}
<tr>
<td colspan="4" align="right">
<input type="button" value="글작성" onclick="">
</td>
</tr>
</table>
</body>
장고 documentation에서 문법 확인 : request.session.name | deafult: "django"
|
는 템플릿 필터를 칭한다.번호, 작성자, 제목, 작성일이 컬럼으로 들어가는 테이블을 만들어준다.
만약, {% if not list%}
list가 없다면 작성된 글이 없다고 출력
list가 있다면 list안의 값들을 반복문을 통해 그 요소들의 id, myname, mytitle, mydate를 가져온다.
{{ data.mydate | date:'Y-m-d'}}
: mydate의 날짜 형식을 설정myboard(App)에 views.py 생성
from django.shortcuts import render
from .models import MyBoard
def index(request):
return render(request, 'index.html', {'list': MyBoard.objects.all().order_by('-id')})
index라는 경로로 요청이 들어오면 index.html를 반환해주며, list에는 DB객체에 있는 모든 값을 내림차순으로 정렬해서 조회하고 저장해준다.
myboard(app)에 urls.py 로 이동
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
]
터미널 : cd myboard
모델 객체 만들기 : python manage.py makemigrations myboard
만들어진 모델 객체 데이터베이스에 적용 : python manage.py migrate
서버 가동 후 확인: python manage.py runserver
templates에 insert.html 생성
<textarea>
는 여러 줄의 긴 문장을 입력할 수 있는 태그다.
col
속성은 가로 크기, row
속성은 세로 크기<body>
<h1>Insert</h1>
<form action="/insertres/" method="post">{% csrf_token %}
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" name="myname"></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="mytitle"></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" name="mycontent"></textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="취소" onclick="">
<input type="submit" vlaue="글작성">
</td>
</tr>
</table>
</form>
</body>
views.py로 이동
from django.shortcuts import render, redirect
from .models import MyBoard
from django.utils import timezone
def insert_form(request):
return render(request, 'insert.html')
def insert_res(request):
myname = request.POST['myname']
mytitle = request.POST['mytitle']
mycontent = request.POST['mycontent']
result = MyBoard.objects.create(myname=myname, mytitle=mytitle, mycontent=mycontent, mydate=timezone.now())
if result:
return redirect('index')
else:
return redirect('insertform')
urls.py로 이동 후 urlpatterns안에 입력
path('insertform/', views.insert_form, name='insertform'),
path('insertres/', views.insert_res),
templates의 index.html로 이동 후 글작성
버튼을 눌렀을 때 onclick 속성 수정
<input type="button" value="글작성" onclick="location.href='/insertform/'">
서버에서 확인
상세정보창 만들기
index.html 에서 mytitle이 나오는 곳 <td>
태그에 href경로를 잡아준다.
<td><a href="{% url 'detail' data.id %}">{{ data.mytitle }}</a></td>
templates에 detail.html 생성
<h1>Detail</h1>
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" value="{{dto.myname}}" readonly></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" value="{{dto.mytitle}}" readonly></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" readonly>{{dto.mycontent}}</textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="목록" onclick="">
<input type="button" value="수정" onclick="">
<input type="button" value="삭제" onclick="">
</td>
</tr>
</table>
views.py로 이동 후 내용 추가
def detail(request, id):
return render(request, 'detail.html', {'dto': MyBoard.objects.get(id=id)})
urls.py의 urlpatterns에 내용 추가
path('detail/<int:id>', views.detail, name='detail'),
서버에서 확인
수정(update)창 만들기
templates에 update.html 생성
<body>
<h1>Update</h1>
<form action="/updateres/" method="post">{% csrf_token %}
<input type="hidden" name="id" value="{{dto.id}}" />
<!-- 글 번호 값 안보이게-->
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" name="myname" value="{{dto.myname}}" readonly /></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="mytitle" value="{{dto.mytitle}}"/></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" cols="60" name="mycontent">{{dto.mycontent}}</textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="button" value="취소" onclick="">
<input type="submit" value="수정">
</td>
</tr>
</table>
</form>
</body>
<input type="hidden">
: 글 번호값 안보이게
{{ dto.값 }}
: views.py에서 설정해준 ‘dto’의 값들
submit
버튼을 누르면 <form>
태그 내의 name
속성의 value
값들을 action
에서 정해준 경로(/updateres/
)로 POST
방식(method)으로 전달.detail.html의 수정버튼의 onclick 속성 변경
<input type="button" value="수정" onclick="location.href='/updateform/{{dto.id}}'">
views.py에 내용 추가
# 글 번호에 맞는 detail들의 값들을 가져온다.
def update_form(request, id):
return render(request, 'update.html', {'dto':MyBoard.objects.get(id=id)})
# 각 값을 받아서 수정해 templates에 보내주는 과정
def update_res(request):
id = request.POST['id']
mytitle = request.POST['mytitle']
mycontent = request.POST['mycontent']
myboard = MyBoard.objects.filter(id=id)
result_title = myboard.update(mytitle=mytitle)
result_content = myboard.update(mycontent=mycontent)
if result_title + result_content == 2: # 내가 원하는대로 동작했다면
return redirect('/detail/'+id) # 디테일로 가고
else: # 그게 아니라면
return redirect('/updateform/'+id) # 직전으로 돌아가라
detail에서 요청했을 때 그 detail이 가지고 있는 번호, 제목, 내용 값을 가져와야한다.
id가 id와 같은 객체를 찾아 dto에 반환해서 보내준다.
objects.filter(id=id)
: SQL의 WHERE 절 역할
result_?
: queryset중 적어준 값과 같은 결과를 찾아서 .update()
해줄 값 설정(SQL의 UPDATE의 SET 기능과 흡사)urls.py의 urlpatterns에 내용 추가
path('updateform/<int:id>/', views.update_form, name='updateform'),
path('updateres/', views.update_res),
path('updateres/')
는 update.html에서 <form>
태그의 action부분에서 그렇게 설정해줬기 때문에, submit 버튼을 누를 시에 views.update_res로 처리해달라고 요청한다.서버에서 확인
삭제 기능 만들기
detail.html 삭제 버튼 onclick 속성 변경
<input type="button" value="삭제" onclick="location.href='/delete/{{dto.id}}'">
views.py에 내용 추가
def delete(request, id):
result_delete = MyBoard.objects.filter(id=id).delete()
# id가 같은 객체의 queryset을 delete()해주고 result_delete에 저장
# print(result_delete)
if result_delete[0]: # result_delete는 튜플형태(,)
return redirect('index')
else:
return redirect('detail/'+id)
urls.py의 urlpatterns에 내용 추가
path('delete/<int:id>', views.delete),
삭제 기능 확인
detail.html에서 목록 버튼의 onclick 속성 변경
<input type="button" value="목록" onclick="location.href='/'">
/
는 root
를 뜻한다. 즉, index.html의 경로는 http://127.0.0.1:8000/
로 잡혀있다. 그래서 경로에 /
만 적어주면 index.html로 보내준다.상세 정보 페이지에서 목록버튼을 누르면 index페이지로 가는 것을 확인할 수 있다.
파일 및 폴더 생성
파일 시스템 탐색
도움말(man -> manual)
명령어 기초
유닉스(Unix)
특정 코드 지연 실행 - DispatchQueue.main.asyncAfter(deadline: )
Naming Conventions
안드로이드 폰과 맥북에어 M1 USB 테더링 성공
Simulator 풀 스크린 사용 방법
10807번 - 개수 세기
프로그래머스 Lv.1 풀이 코드 모음
프로그래머스 Lv.1 풀이 코드 모음
11047번 - 동전 0
11659번 - 구간 합 구하기 4
14888번 - 연산자 끼워넣기
9184번 - 신나는 함수 실행
24416번 - 알고리즘 수업 - 피보나치 수 1
2580번 - 스도쿠
9663번 - N-Queen
15652번 - N과 M (4)
15651번 - N과 M (3)
15650번 - N과 M (2)
25305번 - 커트라인
25304번 - 영수증
3003번 - 킹, 퀸, 룩, 비숍, 나이트, 폰
15649번 - N과 M (1)
2004번 - 조합 0의 개수
1676번 - 팩토리얼 0의 개수
9375번 - 패션왕 신해빈
1010번 - 다리 놓기
11051번 - 이항 계수 2
11050번 - 이항 계수 1
3036번 - 링
2981번 - 검문
1934번 - 최소공배수
2609번 - 최대공약수와 최소공배수
1037번 - 약수
5086번 - 배수와 약수
1358번 - 하키
1004번 - 어린 왕자
1002번 - 터렛
3053번 - 택시 기하학
2477번 - 참외밭
4153번 - 직각삼각형
3009번 - 네 번째 점
1085번 - 직사각형에서 탈출
11478번 - 서로 다른 부분 문자열의 개수
1269번 - 대칭 차집합
1764번 - 듣보잡
10816번 - 숫자 카드 2
1620번 - 나는야 포켓몬 마스터 이다솜
14425번 - 문자열 집합
10815번 - 숫자 카드
18870번 - 좌표 압축
10814번 - 나이순 정렬
1181번 - 단어 정렬
11651번 - 좌표 정렬하기 2
11650번 - 좌표 정렬하기
1427번 - 소트인사이드
2108번 - 통계학
10989번 - 수 정렬하기 3
2751번 - 수 정렬하기 2
2750번 - 수 정렬하기
22.06.25 ~ 27 부산 먹부림 기록
1436번 - 영화감독 숌
1018번 - 체스판 다시 칠하기
7568번 - 덩치
2231번 - 분해합
2798번 - 블랙잭
11729번 - 하노이 탑 이동 순서
2447번 - 별 찍기 - 10
17478번 - 재귀함수가 뭔가요?
10870번 - 피보나치 수 5
10872번 - 팩토리얼
9020번 - 골드바흐의 추측
4948번 - 베르트랑 공준
1929번 - 소수 구하기
11653번 - 소인수분해
2581번 - 소수
1978번 - 소수 찾기
10757번 - 큰 수 A+B
2839번 - 설탕 배달
2775번 - 부녀회장이 될테야
10250번 - ACM 호텔
2869번 - 달팽이는 올라가고 싶다
1193번 - 분수찾기
2292번 - 벌집
1712번 - 손익분기점
1316번 - 그룹 단어 체커
2941번 - 크로아티아 알파벳
5622번 - 다이얼
2908번 - 상수
1152번 - 단어의 개수
1157번 - 단어 공부
2675번 - 문자열 반복
10809번 - 알파벳 찾기
11720번 - 숫자의 합
11654번 - 아스키 코드
1065번 - 한수
4673번 - 셀프 넘버
15596번 - 정수 N개의 합
4344번 - 평균은 넘겠지
8958번 - OX퀴즈
25083번 - 새싹
Spark Bigdata Pipeline
Spark 3일차
Spark 2일차
1546번 - 평균
Spark 1일차
Hadoop🐘
3052번 - 나머지
2577번 - 숫자의 개수
2562번 - 최댓값
10818번 - 최소, 최대
Linux
MongoDB 조회 문제
MongoDB
1110번 - 더하기 사이클
10951번 - A+B - 4
Oracle 3️⃣
ORACLE 연습용 문제 만들기 숙제
10952번 - A+B - 5
Oracle 2️⃣
2480번 - 주사위 세개
Oracle Day1️⃣
Tensorflow
Big Data
2525번 - 오븐 시계
10871번 - X보다 작은 수
2439번 - 별 찍기 - 2
2438번 - 별 찍기 - 1
11022번 - A+B - 8
11021번 - A+B - 7
2742번 - 기찍 N
2741번 - N 찍기
15552번 - 빠른 A+B
8393번 - 합
10950번 - A+B - 3
9️⃣ 2739번 - 구구단
2884번 - 알람 시계
14681번 - 사분면 고르기
⛏크롤링(Crawling)
2753번 - 윤년
Django 복습 4️⃣
Django 복습 3️⃣
💯 9498번 - 시험 성적
1330번 - 두 수 비교하기
✖ 2588번 - 곱셈
➗ 10430번 - 나머지
Django 복습 2️⃣
Django 복습 1
MySQL 복습!
⁉10926번 - ??!
🆎1008번 - A/B
👩🦲 18108번 - 1998년생인 내가 태국에서는 2541년생?!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🎈✨경 축✨🎈
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
선형 자료구조(1일차에 이어서)
🆎10998번 - A×B
🆎1001번 - A-B
🆎1000번 - A+B
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐶10172번 - 개
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐱10171번 - 고양이
[해당 포스트는 유튜버 나동빈님의 영상을 참고했습니다.]
❤10718번 - We love kriii
🖐2557번 - Hello World
Today I Learned(TIL)📌 (2021.12.31)
Today I Learned(TIL)📌 (2021.12.30)
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[noitce!!] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!