알고리즘 문제풀이 - 페어프로그래밍
👇 문제 : 문자열 정렬하기 (1) 👇
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.
제한사항
1 ≤ my_string의 길이 ≤ 100
my_string에는 숫자가 한 개 이상 포함되어 있습니다.
my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다.
# isdigit 사용
def solution(my_string):
nums = []
for i in my_string:
if i.isdigit():
nums.append(int(i))
return sorted(nums)
# isnumeric 사용
def solution(my_string):
nums = []
for i in my_string:
if i.isnumeric():
nums.append(int(i))
return sorted(nums)
# try-except 사용
def solution(my_string):
nums = []
for i in my_string:
try:
nums.append(int(i))
except:
continue
return sorted(nums)
isdigit vs isnumeric
'''
num = '-3'
a = num.isdigit()
print(a) # False
num = '3'
b = num.isdigit()
print(b) # True
num = 'adfe'
c = num.isdigit()
print(c) # False
num = '-3'
d = num.isnumeric()
print(d) # False
'''
지연시간
isdigit < isnumeric < try-except (문자가 많을수록 오래걸림, 테스트케이스 간의 시간 차이가 큼)
파이썬 장고 실무 심화 1주차 : HTTP와 웹의 동작 방식
DRF 소개 - 프론트엔드와 백엔드를 나눈다는 의미
기존에 쓰던 방식 👉 MVT
url -> view 함수 -> html 템플릿 : 불편한 점 댓글같은 것도 작성시 새로고침
이 불편함을 해결하기 위해 나온 것이 AJAX (Asynchronous Javascript And XML, 웹페이지를 비동기적으로 처리함)
이에 맞게 장고 프로젝트도 프론트와 백엔드를 분리해서 작업
👉 이제부터 templates 작성 x
그래서 백과 프론트가 어떻게 통신을 하는디? 👉 Django Rest Framework!
포스트맨 설치 - Request와 Response 살펴보기
HTTP - 웹의 요청 흐름 살펴보기
HTTP : Hyper Text Transfer Protocol - HTML 을 전송하기 위해 처음 만들어짐
(HTML : Hyper Text Markup Language)
이론, 개념 이런 거 엄청 재미없어하는 나로서도 네트워크 관련된 부분은 꽤 재미있게 공부했던 기억이 있다.
👉 나중에 자세히 공부해보기 (네트워크) - 시간 나면 복습겸 한번 정리해봐야지
웹브라우저 흐름
1. DNS 조회
DNS Domain Name System
2. HTTP 요청 메시지 작성
3. Socket 라이브러리를 통해서 전달
4. TCP/IP 작성되고 이 안에 HTTP 메시지가 포함
프로토콜 계층
어플리케이션 👉 Socket Library 👉 TCP 👉 IP 👉 LAN 👉 인터넷
HTTP - HTTP 메시지의 구조 살펴보기
HTTP : Hyper Text Transfer Protocol
HTML 전송용으로 나왔으나 현재는 모든 형태를 전송
이미지, 음성, 영상 ,파일, JSON, XML
f12 > 네트워크 들어가면 해당 웹이 어떤 HTTP 버전 을 쓰는지 알 수 있다.
ex) h2 : HTTP2.0
HTTP 특징
👉 클라이언트 서버 구조
- Request Response 구조
- 클라이언트는 Request 를 보내고 Response 를 기다리게 된다.
- 분리가 중요한 이유
.. 데이터와 비즈니스 로직을 서버에 넣고 클라이언트에는 ui를 다 넣는다
.. 독립적인 진화 가능
.. 트래픽 폭주 시에 클라이언트는 그대로 두고 서버만 독립적으로 진화시키면 된다.
👉 stateless : 무상태 프로토콜
- 서버가 클라이언트 상태를 보존하지 않음
- 가게에서 주문을 할 때 중간에 다른 점원으로 바뀌는 것
- 응답서버를 쉽게 바꿀 수 있다.
- 세션 로그인은 상태가 있음. 최소한으로만 사용한다는 개념
👉 비연결성
- HTTP는 기본적으로 연결을 유지하지 않음. 연결 유지를 하지 않으면서 최소한의 자원 사용을 할 수 있다.
- 일반적으로 초단위 이하의 빠른 응답
- 서버 자원 효율적 사용
HTTP 메시지
HTTP 메서드
가장 중요한 것은 리소스 식별!
리소스란 : 회원이라는 개념 자체가 리소스이며 이것이 URI에 매핑 --> 메소드로!
안 좋은 설계
/read-member-list
/read-member-by-id
/create-member
/update-member
/delete-member
고친 예
회원목록 조회 /members -> GET
회원 조회 /members/{id} -> GET
회원 등록 /members/ -> POST
회원 수정 /members/{id} -> PUT, PATCH
회원 삭제 /members/{id} -> DELETE
리소스와 행위를 분리하는 것이 Restful API
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
메소드
- POST
등록, 메시지 바디를 통해 서버로 요청 데이터 전달
데이터 혹은 프로세스를 처리
(프로세스 처리 : 데이터가 없어도 프로세스 상태가 변경되는 경우 ex)배달시작 [POST] /orders/{orderID}/start-delivery)
JSON으로 조회 데이터를 넘기고 싶은데 GET 을 쓰기 힘든 경우에도 씀
그러나 GET은 캐싱을 할 수 있기 때문에 가능한 경우에는 GET을 쓴다.
- PUT
대체 혹은 생성
파일 붙여넣기, 없으면 만들어지고 있으면 덮어쓴다.
POST 와의 차이점 : 클라이언트가 URI를 지정해서 보냄.
- PATCH
부분 변경
- HEAD
GET 과 동일하지만 상태줄과 헤더만 반환함.
- DELETE
HTTP Form을 통한 데이터 전송
- 회원가입, 주문, 데이터 변경
- Get, Post 만 지원함
- 전송 데이터 url encoding 처리
- Content-Type : mulipart/form-data
: 파일을 같이 보낼 때. 바이너리 데이터 전송 시
다른 종류의 여러 파일과 폼의 내용 함께 전송 가능
HTTP API 을 통한 데이터 전송
- 회원가입, 주문, 데이터 변경
- server to server, app client, web client(AJAX)
- Content-Type : application/json
- Form 대신 JS 이용한 통신
- POST, PUT, PATCH 도 메시지 바디로 데이터 전송 가능
API 설계 예시
회원 관리 - 컬렉션 기반
- GET /members 👉 회원 목록
- POST /members 👉회원 등록
- GET /members/{id} 👉 회원 조회
- PATCH, PUT, POST /members/{id} 👉 회원 수정
- DELETE /members/{id} 👉회원 삭제
▶ 특징
- 클라이언트는 등록될 리소스의 URI를 모른다
- 서버가 리소스의 URI 생성
- /members가 컬렉션이 됨.
HTTP - HTTP 상태코드
1xx
요청이 수신되어 처리중, 거의 사용하지x
2xx
요청 정상 처리
- 200 OK
- 201 Created : 헤더에 location을 추가해 ㅐ로운 리소스의 uri를 알려줄 수 있다.
- 202 Accepted 요청은 접수
- 204 No Content : save 버튼으로 저장만 하고 화면 변화 필요 x
보통은 200 201만 거의 씀
3xx
추가 행동 필요
4xx
클라이언트 에러
- 잘못된 문법이나 오류의 원인이 클라이언트에 ㅆ음
- 400 : 요청 내용 다시 검토, API 스펙이 맞는지 확인
- 401 : 인증이 x
- 인증 vs 권한
: 인증(Authentication) - 로그인 x , 권한(Authorization) - 내가 운영자가 x
- 403 : 권한 x
- 404 : 리소스가 없거나 숨겨짐 ( 보통 개발하다보면 url이 틀렸을 때 많이 보게 됨)
5xx
서버에러
- 복구 후 재시도시 성공 가능
- 500 : 서버 내부 문제
- 503 : 서버 일시 과부하
GitHub 댓글