본문 바로가기

[부트캠프] IT 코딩 부트캠프 후기/[Let's TIL😶‍🌫️] FastCampus

[Let's TIL✍️] 코딩 18 : 4 Week_ 추가 강의 : pagination

스스로에게 재미있다고 생각하는, 모바일 청첩장 코드를 마저 해보기

01. 코드 스니펫 살펴보기

1) 색상 정의해서 사용하기 (.root)

1-1) 이렇게 css에서도 color를 마치 변수처럼 설정할 수 있음

 

이는 필요한 색상이 많아지고
웹사이트가 성장할수록,
각 코드를 
#ffffff
 이렇게 입력하는 것보다 변수명으로 쓰는 것이 좋기 때문이다.

 

 

1-2) 이를 쓰려면 var함수를 이용해서 사용한다.

 

TIP🤖 Var 함수 

var 함수를 이용하여 CSS 앞부분에 선언한 값을 변수로 사용할 수 있다. 

 

2) 글꼴 사용 (font-face)

글꼴을 사용하고 싶을 때 쓰는 css 문법이다.







- font-family : 이 폰트를 적용할 때 사용할 이름
- src : 그 폰트의 경로 (주소에 파일이 들어가 있다.) 만약 내가 가지고 있는 font 라면, /static을 입력해서 쓰면 된다.
- font-weight : 폰트 굵기
- font-style : 밑줄 등 스타일

 

2-1) 이렇게 class 안에서 font-family 지정

= 이 폰트를 가져다 쓸 수 있게 된다

3) 단위 vh (높이 등에 사용한다.)

%, px 를 쓸 수도 있지만,
height (높이)에서 vh는
우리가 보는 화면에 세로를 가득 채운 길이
(= 세로 길이의 전체 길이)

: 왜 그냥 100%로는 안쓸까?
우리 생각처럼 작동하지 않기 때문이다.
즉, 100%= 높이에서는 100vh라 써야 정상작동

 

- 즉 이렇게 썼다면 가로 세로로 화면을 꽉 채우게 쓴 것이다.

 

4) background 살펴보기

 

background-position: center center;
= 위치가 가운데 
background-size: cover;
사이즈는 px이런 단위가 아닌
cover (덮거나) contain (들어가게)

background-repeat: no-repeat;
position: relative;

 

5) 태그는 겹치는 일이 없었으나, image의 경우 겹쳐서 쓸 수도 있다.

 
이 경우에 first 그리고 first .overlay를 만들고
position: relative;

.first .overlay {
position: absolute; (절대값)
top: 0;
left: 0;
이렇게 설정을 해두었다.

 

absolute
이 first 네모 안에서 (100%/100vh의 값) overlay는
마음대로 위치를 지정하겠다는 의미

즉 top과 left가 0,0 인 overlay를 맨 위로 올리고

width: 100%;
height: 100%;
크기는 동일하게 100%로 맞추어서 겹쳐졌다.

 

first 안에서 firstoverlay가 움직이는데,
마음대로 위치를 지정하는 absolute 를 가지고,
0,0 = 맨 위로 가게 되고,
크기가 100%로 동일하므로 first와 겹치게 되는 이미지

 


02. <모바일 청첩장> 방명록 page 나누기

(=pagination 만들기)

TIP🤖페이지네이션을 위해서는 limit과 skip을 활용한다.

 

1) 백엔드 코드 수정 _ limit과 skip

 

여기를 수정한다.
limit : 몇 개만 가져오겠다
guestbooks = mongo.db['wedding'].find().limit(3)

 

이렇게 하면, 3개만 가져오게 된다. 즉 3개로 개수를 제한해서 페이지네이션을 하는데,
건너뛰는 부분도 필요하다.

 

skip : 건너뛰는 함수

즉 몇 개는 건너뛰고, 몇 개는 제한해서 가져올 것인지 limit과 skip 함수를 사용하여 표현한다.

1-1) 그런데 이때 limit은 고정이지만 skip은 페이지가 넘어갈 수록 쌓여가기 때문에

1page =3 , 2page = 6, 3page=9 ...
즉 skip(0), skip(3), skip(6) ...
각각의 limit과 skip에 변수를 설정해야 한다.

 

1-2) 이를 토대로 변수를 만든다. page는 3개라고 가정하고,

page = 3
limit = 3
skip = (page - 1) * limit

 

이렇게 작성한 후에, limit과 skip에 변수를 넣어주면 된다.

2) 이제 가정했던 page말고 진짜 page를 '입력'받아보자.

이때 사용할 것 : Query string

 

네이버에서 fast campus를 검색했을때 나오는 주소
https://search.naver.com/search.naver?where=nexearch&sm=top_sug.pre&fbm=0&acr=2&acq=fastca&qdt=0&ie=utf8&query=fast+campus

= 이 주소에 접속할 때 이런 data
(?where=nexearch&sm=top_sug.pre&fbm=0&acr=2&acq=fastca&qdt=0&ie=utf8&query=fast+campus)를
전달하고 싶다는 뜻

 

우리는 여기서 /?page=1 이런식으로 값을 받는 방법을 살펴본다.

2-1) page 바꿔보기

page = request.args.get('page', 1)

- request : 사용자의 요청을 다뤄주는 변수
- args 안에서 꺼내오기
- 그런데 page가 없는 경우를 대비해 기본값으로 1page를 넣어준다 ('page', 1)

 

이는 사용자가 요청한(request한) 그 주소에 page라는 데이터가 있으면 가져오고, 그게 아니면 1을 사용한다

: 이렇게 하면 페이지네이션 끝!

 

but, 문자형이 기본값이라 숫자형으로 변환해줘야 한다.

 

TIP🤖 페이지 번호를 숫자형으로 변환하기

페이지네이션을 위해 쿼리로 페이지번호를 받을 경우,

전달받은 해당 값은 "문자열str"이기 때문에 "숫자형int"으로 변환해야 한다. 

 
 

 

2-2) int 넣어서 변환

3) 저장 후에, 브라우저로 가서 page 주소에 따라 살펴본다

 주소 표시줄에 입력한 page에 따라서 바뀌는 것을 볼 수 있다.
page=1

 

 

 


03. <모바일 청첩장> 방명록 pagination 버튼 만들기

 

1) index.html에 가서 table 바로 아래에 입력하기

<div class="pagination"></div>

 

 

 

2) class 안에 page 링크 만들기

 

- 링크를 만들고, 현재 주소로 이동을 하는데 <a href ="링크">
- 이때 Query string 추가

 

필요한 만큼 page 추가

전체 data를 알아야 page를 표시할 수 있으므로
app.py 즉 python에서 전체 data가 몇 개 있고, pagination은 어떻게 표현해야 하는지에 대한 
정보를 전달해줘야 한다.

 

2-1) 전체 개수 가져오기

mongo.db['wedding'].find()

find를 복사해서 개수 가져오기

count_documents 함수 사용

이 안에 몇 개가 들었는지 개수를 가져옴

 

 

TIP🤖 find 함수와 달리, 모든 값을 세기위해 빈값{} (빈 딕셔너리 변수) 넣어주기

이제 max_page 번호를 계산해서 list로 전달해보자

max_page = count / limit

 

원래 페이지를 limit 으로 나누면 되는데 문제는 이렇게 작성하면 3의 배수가 아닌 경우 버림 처리가 된다.

이를 방지하기 위해 올림으로 계산하려면 어떻게 할까?

 

: 이를 계산하기 위해 math라는 파이썬 패키지를 가져온다.

 

 

import math
max_page = math.ceil(count / limit)

 

반복문 사용에 나왔던

range 함수를 이용해 page 리스트 만들어보기

TIP🤖 범위 지정

우리가 알던 range는 range(10)이면 0-9 까지 나왔는데

range(1,10)

이렇게 쓰면 시작범위를 지정해주고, 이는 1-10이 아닌!!! 1-9까지가 나오게 된다.

(= 입력한 10 미만으로 나온다는 뜻)

 

이를 활용해보면,

 

 
pages = range(1, max_page + 1)

이렇게 우리가 원하는 값으로 만들 수 있다.

2-2) 이제 만든 값을 전달해주자

앞서 만든 diff 처럼 pages=pages 이렇게 쓰면 전달!

그런데 이게 반드시 같지는 않아도 된다는데.. 이해가 필요한 부분이다.

 

2-3) 앞서 만든 html 부분을 for문으로 만들기

 

{% for p in pages %} {% endfor %}

p를 변수로 했고, 이걸 사용해서 넣으면 된다. 

 

 

<a href="/?page={{ p }}">{{ p }}</a>

이제 반복하면서 a 링크가 쭉 생성될 것임

 

 

 

2-3) 이제 실행 후 브라우저를 보면, 페이지 링크가 밑에 생성된다!

 

3) 이제 링크 css 적용하기

.pagination a {} 태그 사용
.pagination a {
color : var(--black);
padding : 5px;
border-radius: 5px;
background-color: #fff;
margin: 5px;}
 글씨 색상 : 블랙
내부여백과 둥글게 하기 지정 (5px) >> 내부여백이 있게 해서 버튼처럼 보이게 한다.
배경색 : 흰색
외부여백 : 5px 지정!

 

.pagination {
margin-top: 20px;
}
= 페이지네이션 자체 외부여백도 적용

 

마지막으로

padding 의 가로 부분도 10px 적용한 모습

padding : 5px 10px;

버튼만들기 끝!

 


 

부록 강의

01. <모바일 청첩장> 아코디언 만들기

 아코디언 기능을 통한 계좌번호 안내 만들기

(with. 부트스트랩)

아코디언이란?

: 접었다 폈다 할 수 있는 버튼을 제공해주고 하나만 펼쳐지게 하는 기능

1) 부트스트랩에 접속

componant 밑에 collapse로 들어와서, Accordian example 아래의 sample 코드 복사하기

2) VScode에서 index.html 파일에 붙여넣기

새 div row행 만들기 (div 태그)

<div class="row2"></div>

그 안에 복사한 코드 붙여넣기

 

 

2-1) 코드 정리하기

TIP🤖 자동 formatting하기

ctrl + A 하면 전체가 선택되고

여기서 Shift + Alt + F 누르면 자동으로 formatting !

 

 

 

브라우저에서 확인하니 우리가 원하는 형태와 다르다. 

 

그 이유는? 부트스트랩 설치를 아직 안했기 때문이다.

3) 부트스트랩을 설치해준다

 

3-1) 부트스트랩 4. 버전에서 css와 JS를 복사해서 붙여넣고 들여쓰기 맞추기

 

그런데, 브라우저에서 확인하니, 다른 부분들이 이동하거나 변화되었음

 

 

그 이유는?

 

 

우리가 사용중인 class row는 사실 부트스트랩에서도 사용하는 class 속성이라서, 부트스트랩을 가져오기 전에 내가 만든 row는 괜찮았지만 지금 row가 또 적용되는 상황 (두 row가 같이 적용)

TIP🤖 css 이름 작성하기

부트스트랩에서 사용중인 CSS 클래스 명과 내가 작성한 CSS 클래스 명이 충돌되지 않도록 주의해서 작성한다. 

 

해결

기존의 row 이름을 변경 row1

html, css에서 모두 변경해준다.

3-2) 부트스트랩 글자크기가 적용되었으므로 이부분도 변경

기존의 h2에서 > h4로 작아지게 함

<h4>방명록 남기기</h4>

4) 아코디언 부분 수정

계좌 필요한 두 개 남기고 하나는 삭제 (기본값 : 3개)

계좌 이름 변경, 은행과 번호 넣기

제목 넣어주기

전체 변경

 일단 완성!


오늘의 소감 ✍️

코딩을 너무 오랜 시간 했더니 눈이 빠질 것 같...지만

어쨌든 확실히 청첩장이 좀 더 재밌다 (사진+꾸미기가 들어가서 그런듯하다.)

자율 스터디에선 방장님을 주축으로해서

직접 당당마켓 코드를 다시 짜봤는데....

이거 너무 어렵기도 하고 오류가 정말 많이 일어났다 ㅋㅋㅋㅋㅋㅋㅋ

코드 복붙이나 수정 잘하는 것도 정말 능력이다 싶었다.