Share
Sign In

TIL 웹개발

내일배움캠프에서 공부한 내용을 복습니다.
서경태
TIL 웹개발 - RESTful API란?
RESTful API는 웹 서비스 개발에서 많이 사용하는 아키텍처 스타일 중 하나입니다. Django에서는 Django REST Framework(DRF)를 이용하여 쉽게 RESTful API를 구축할 수 있습니다. RESTful API와 Django에 대해 이해하는 데 도움이 될 만한 개념들을 아래에 설명할게요. 1. RESTful API란? REST(Representational State Transfer)는 자원을 네트워크 상에서 정의하고 자원에 대한 주소를 지정하는 아키텍처 스타일입니다. RESTful API는 이 REST 원칙을 따르는 API를 의미합니다. RESTful API의 주요 특징: 자원(리소스) 기반: REST는 모든 것을 자원으로 간주합니다. 예를 들어, 사용자, 게시물, 댓글 등이 자원으로 표현됩니다. HTTP 메서드 사용: CRUD 작업을 HTTP 메서드로 매핑합니다. GET: 자원의 조회 POST: 자원의 생성 PUT: 자원의 전체 수정 PATCH: 자원의 부분 수정 DELETE: 자원의 삭제 URL 설계: 자원은 고유한 URL로 접근됩니다. 예를 들어, GET /users/는 사용자 목록을, GET /users/1/은 특정 ID를 가진 사용자를 조회합니다. 무상태성: REST API는 무상태성을 유지해야 합니다. 즉, 서버는 각 요청을 독립적으로 처리하며, 이전 요청의 상태를 기억하지 않습니다. 표준화된 응답: 주로 JSON 형식으로 데이터를 주고받습니다. 2. Django에서 RESTful API 구현하기 Django REST Framework (DRF): Django에서 RESTful API를 쉽게 구축할 수 있도록 도와주는 라이브러리입니다. DRF는 직렬화, 인증, 권한 부여, 요청 처리 등의 기능을 제공합니다. 핵심 컴포넌트: Serializer: Django 모델 인스턴스를 JSON으로 직렬화하거나, JSON 데이터를 모델 인스턴스로 역직렬화하는 역할을 합니다. ViewSet: API의 논리를 처리하는 뷰를 그룹화한 것입니다. DRF에서는 일반적으로 ViewSet을 사용하여 CRUD 기능을 구현합니다. Router: ViewSet과 URL을 자동으로 연결해주는 역할을 합니다. 이를 통해 RESTful URL 패턴을 쉽게 설정할 수 있습니다. 예시 코드:
  • 서경태
서경태
TIL 웹개발 - Django의 cleaned_data 활용
모델 폼을을 사용해 값을 받은 후 그 값을 다시 반환하거나 사용할때 cleaned_data를 사용할 수 있다. 팀프로젝트에서 해시태그 기능을 만들때 cleaned_data를 사용해 중계테이블의 값을 가져왔다. 해시태그와 아티클의 모델을 만들고 아티클에 해시태그를 M:N 필드로 가져와 article_hashtag 중계테이블을 만든 상태다. 모델폼은 만드는데 hashtags를 상속받지 않고 오버라이딩한다. 이유는, 상속받아 폼에 적용하면 hashtag테이블에 생성된 것 중 선택하는 양식으로 나오기 때문이다. 보통 해시태그는 선택이 아니라 직접 작성하기 때문에 위 코드처럼 오버라이딩해서 Textfield로 지정한다. views.py 에서는 모델폼을 사용해 값을 입력받는 로직이다. 하지만 form이 만들어지고 save를 했다고 해도 article_hashtags 중계 테이블에는 데이터가 저장되지 않는다. 이때 form의 cleaned_data 요소를 사용해 hashtag값을 반환해 따로 저장한다. form.is_valid()를 통해 유효성 검사를 통과화면 cleaned_data 딕셔너리가 생성되고 데이터가 cleaned_data 딕셔너리에 추가된다. 각 필드의 이름이 딕셔너리의 키(key)가 되고 입력한 내용이 값(value)로 저장된다. 만약 내가 아티클을 아래와 같이 작성하고, 타이틀: 아이폰 신상 공개 내용: 아이폰이 새로나왔어요! 해시태그: 아이폰 if form.is_valid()를 지나 해시태그 내용응 반환하고 다시 해시태그 테이블에서 그 값으로 중계테이블에 추가한다.
  • 서경태
서경태
TIL 웹개발 - Git 활용
git init 현재 디렉토리를 깃 저장소로 초기화한다. .git 폴더가 생성됨으로써, 해당 디렉토리가 깃으로 관리되는 프로젝트가 된다. git status 현재 작업 디렉토리의 파일 상태를 확인할 수 있다. 어떤 파일이 수정되었는지, 어떤 파일이 스테이징되지 않았는지 등을 보여준다. git add <파일명> 특정 파일을 스테이징 영역에 추가한다. 예를 들어, git add example.txt를 입력하면 example.txt 파일이 커밋 대상에 포함된다. git add . 현재 디렉토리의 모든 변경 파일을 스테이징 영역에 추가한다. 자주 쓰이지만, 정확히 어떤 파일이 추가되는지 항상 확인하는 게 좋다. git commit -m "커밋 메시지" 스테이징된 파일들을 커밋한다. "커밋 메시지" 부분에 해당 커밋에 대한 설명을 적는다. 이 메시지는 프로젝트 히스토리를 이해하는 데 중요하다. git log 커밋 히스토리를 조회할 수 있다. 각 커밋의 해시, 작성자, 날짜, 메시지 등을 확인 가능하다. git branch 현재 브랜치를 확인하거나, 브랜치를 목록으로 보여준다. 새로운 브랜치를 생성하거나 삭제할 때는 -d 옵션 등을 추가로 사용한다. git branch <브랜치명> 새로운 브랜치를 생성한다. git branch feature를 입력하면 feature라는 이름의 새로운 브랜치가 만들어진다. git checkout <브랜치명> 다른 브랜치로 전환한다. 예를 들어, git checkout develop을 입력하면 develop 브랜치로 이동한다. git merge <브랜치명> 특정 브랜치를 현재 브랜치로 병합한다. 주로 새로운 기능을 개발한 브랜치를 main 브랜치에 병합할 때 사용한다. git remote add origin <원격 저장소 URL> 로컬 저장소와 원격 저장소를 연결한다. 보통 origin이라는 이름으로 많이 쓰인다. git push origin <브랜치명> 로컬 브랜치의 커밋을 원격 저장소에 푸시한다. 보통 main이나 develop 같은 브랜치를 푸시한다. git pull 원격 저장소에서 최신 변경 사항을 가져오고, 현재 브랜치에 병합한다. 푸시하기 전에 자주 사용하게 된다. git clone <원격 저장소 URL> 원격 저장소를 로컬에 복제한다. 원격에 있는 프로젝트를 그대로 내 컴퓨터로 가져올 수 있다.
  • 서경태
서경태
TIL 웹개발 - Django form, model 등등 찾아보기
Django를 배우다보니 어느순간 기억하는데 한계가 오기 시작한다. 그 이유는 import하는 함수, 데코레이터, 모델, 폼 등등 너무 복잡하기 때문인데... 이참에 정리해보고 여기서 한번에 확인하자.. (자동 완성은 from 머시기도 다 찾아주나...) Accounts 관련 로그인 / 로그아웃 기능 auth_login(request, user)를 사용한다. user가 없는 경우 request.user를 사용한다. 로그아웃할때 자동으로 세션를 삭제해준다. 로그인 폼 현재 프로젝트에서 사용되는 사용자 모델 가져오는 기능 커스텀 사용자 모델을 사용하는 경우, settings.py에 AUTH_USER_MODEL을 설정해야한다. AUTH_USER_MODEL를 설정하지 않으면 기본 사용자 모델을 사용한다. 회원가입 / 회원 정보 수정 폼 비밀번호 변경 폼 데코레이터
  • 서경태
서경태
TIL 웹개발 - Django에서 커스텀 폼 사용하기
Django에서 제공되는 Form을 커스텀해서 사용하는 방법에 대해 알아보자. 회원 정보를 수정하는 페이지를 만들때, 간편하게 UserChangeForm을 사용할 수 있다. 하지만 이 폼에는 아래 이미지처럼 일반 회원이 굳이 접하지 않아도 되는 필드들이 나온다. 그래서 커스텀 폼을 사용해 필요한 내용만 나오도록 조정한다. 먼저 forms.py에서 쟝고에서 제공하는 UserChangeForm을 임포트한다. CustomUserChangeForm을 만들고 ()안에 UserChangeForm을 넣어 상속을 받는다. class Meta: model = get_user_model() 은 모델폼을 만든 것이다. fields를 리스트로 만들어 안에 필요한 내용을 채운다. 코드처럼 이름과 이메일 주소만 기입하도록 설정했다. 처음 이미지와 달리 깔끔하게 필요한 정보만 기입하도록 수정했다.
  • 서경태
서경태
TIL 웹개발 - Django쟝고에서 Decorator 데코레이터 사용하기
Django에서 데코레이터는 웹 애플리케이션의 특정 기능을 쉽게 구현할 수 있도록 도와준다. 주로 인증, 권한 관리, 보안, 캐싱 등의 기능을 위해 사용된다. @login_required : 로그인된 사용자만 접근 가능 @permisison_required : 특정 권한이 있는 사용자만 접근 가능 @crsf_exempt : CSRF 검사를 비활성화 @require_http_mothods : 지정된 HTTP 메소드만 허용 @require_POST: POST 요청만 허용 @cache_page: 지정된 시간동안 캐싱하여 출력 성능 향상 @transaction.atomic: 하나의 트랜잭션으로 모든 DB작업 처리 위 데코레이터들은 쟝고에서 주로 사용되는 것들인데 이제 하나씩 알아보자. @login_required 사용자가 로그인하지 않은 상태에서 이 데코레이터가 사용된 뷰에 접근하면 로그인 페이지로 다이렉트를 하는 기능 제공한다. 이렇게 사용하면 my_view에 접근하기 위해 로그인이 필요하고 로그인하지 않은 경우 로그인 페이지로 이동한다. (물론 로그인 페이지가 있는 경우) 이때 두 가지 방법으로 로그인 페이지를 login_required와 연결할 수 있다. 직접 login_url 설정 @login_reqired 데코레이터 함수를 보면 다음과 같이 작성되어 있다. 여기서 login_url = None으로 되어있는데 이 부분을 로그인 페이지로 설정하면 데코레이터가 정상적으로 작동한다. accounts / login.html 설정 쟝고의 기본 설정에 따라 아래 그림처럼 페이지를 구성하면 @login_required를 사용할 수 있다. 로그인 페이지를 accounts 폴더에 위치시키면 쟝고가 알아서 해당 페이지를 리다이렉트해준다. 로그인 후에는 사용하던 페이지의 url을 next 파라미터에 저장해 다시 리다이렉트 해주니 굉장히 편리한 기능이다.
  • 서경태
서경태
TIL 웹개발 - Django form 정리
우선 form은 클라이언트가 데이터를 조회하거나 전송할 때 사용하는 태그(tag)다. 게시글을 작성하는 form을 작성하면 아래 코드와 같다. 제목과 내용을 작성해 form형태로 서버에 전달해 처리한다. 이 form 형태를 쉽게 처리하는 기능을 django에서 제공하는데 Django model form이다. 데이터베이스 모델에 대응하는 폼을 자동으로 생성해주는 기능으로 위 코드처럼 별도로 폼을 정의하지 않아도 된다. 그리고 데이터베이스 기준에 따라 (텍스트, 숫자 등) 형식을 맞추지 않을 경우 자동으로 경고 메시지를 보내주기도 한다. Django model form 모델과 폼의 자동 연결 ModelForm을 사용하면, Django 모델에 정의된 필드를 기반으로 자동으로 폼 필드가 생성된다. 예를 들어, 모델에서 Charfield, DateField 등이 있다면, 해당 필드에 맞는 html 폼 필드가 생성된다. 간편한 데이터 처리 모델 폼은 데이터의 유효성을 검사하고, 유효하다면 데이터베이스에 쉽게 저장할 수 있다. form.save() 메소드를 사용하면 폼데이터를 모델 인스턴스로 변환하고 저장할 수 있다. 유효성 검사 모델 폼은 모델에서 정의된 필드의 유효성 검사(예: 최대 길이, 필수 입력 여부)를 자동으로 처리한다. 추가적인 커스텀 유효성 검살르 쉽게 정의할 수 있다. 모델 폼 정의하는 방법 Article 데이터베이스 / models.py 현재 title과 content라는 데이터 베이스가 있는 경우,
  • 서경태
서경태
TIL 웹개발 - Django 시작하기
배운대로 써보는 djano 시작하기 기본적인 세팅부터 앱을 등록하는 방법까지 정리해본다. 아래 코드들은 모두 터미널에서 진행된다. 디렉토리를 잘 확인하고 진행해야한다. 가상 환경을 만들어준다. 가상 환경을 만들어주는 이유는 여러 프로젝트를 진행하는 경우 각 프로젝트의 버전을 유지하기 위해서다. A프로젝트에서 쟝고 3.2를 쓰고 B프로젝트에서 쟝고 4.2를 쓴다면 가상환경만 바꿔주면 문제 없이 작동한다.(고 한다. 안해봄.) Django를 설치한다. 이때 버전은 4.2를 설치하는데 이유는 LTS이기 때문인다. Django 4.2는 LTS(Long Term Support)다. LTS는 긴 보증 기간을 뜻하는데 안정성을 위해 보통 LTS 버전을 많이 사용한다. requirements.txt를 생성한다. requirements.txt에는 설치한 라이브러리의 이름과 버전이 적혀있다. 다른 사람이 이 프로젝트를 이어서 진행하거나 수정하는 경우 어떤 라이브러리와 버전이 설치되어있는지 확인할 수 있고 이 문서를 통해 바로 설치도 가능하다. Django 프로젝트 생성하기 "name" 부분에는 따옴표없이 프로젝트의 이름을 넣어준다. 그럼 바로 지정한 이름의 폴더가 생성되고 그 안에 django의 구조가 자동으로 만들어진다. 앱 생성 및 등록 프로젝트 폴더 안에 "app name"으로 폴더가 생성된다. 이제 settings.py를 찾아 그 안에 생성한 앱 이름을 넣어주면 기본세팅이 끝난다. 프로젝트 폴더 안에 같은 이름의 폴더가 하나 더 있다. 그 안에 setting.py가 있다. settings.py 안에 둘러보다보면 INSTALLED APPS = [] 가 있다. 이미 여러 가지가 채워져있는데 그 밑에 생서한 앱 이름을 추가하면된다.
  • 서경태
서경태
TIL 웹개발 - CS 모의 면접 정리
우선 CS 면접의 경험을 정리해보면, 왜 CS를 공부해야하는지 이제서야 알게 된 느낌이었다. 단순히 개념과 설명을 반복해서 표현하는게 아니라 각 개념들 간 관계를 알고 차이점까지 설명할 줄 알아야 실무에서도 적용할 수 있다. 주로 두 가지 개념에 대해 묻는다. 이렇게 두 가지를 물어보는 이유는 차이점이 존재하기 때문에 그 특징을 잘 설명하는 것이 중요하다. 배열, 연결리스트 자료구조에서 배열과 연결리스트는 모두 데이터를 저장하고 관리하는데 사용된다. 배열 연속적인 메모리 공간에 정하는 데이터 구조 고정 크기를 가지며 한번 선언되면 크기를 변경할 수 없다. → 이는 단점으로도 작용하는데 배열의 크기를 동적으로 변경할 수 없다. 인덱스를 사용해 데이터에 접근이 빠르다. → O(1)의 시간복잡도를 가진다. 삽입 및 삭제의 비효율성 → 배열 중간에 삽입하거나 삭제할 경우 나머지 요소들을 이동시켜야하므로 O(n)이 걸린다. 연결리스트 각 요소가 노드로 구성되고, 각 노드는 데이터와 다음 노드를 가리키는 포인터를 표함되는 데이터 구조 동적 크기로 필요에 따라 노드를 추가하거나 제거하여 크기를 동적으로 변경할 수 있다. → 각 노드는 효율적인 삽입/삭제 리스트의 중간에 요소를 삽입하거나 삭제하는데 O(1) 시간이 소요된다. → 반면 특정 위치를 찾는데 O(n)의 시간이 걸려 접근이 느리다. 비연속적 저장으로 메모리 활용이 유연하다. 프로세스와 스레드 프로세스 실행중인 프로그램의 인스턴스를 의미하며, 프로그램이 메모리에서 실행되는 상태를 말한다. 각 프로세스는 독립된 메모리 공간을 가지며, 다른 프로세스와 메모리 공간을 공유하지 않는다. 실행에 필요한 자원(파일, 메모리, CPU 등) 을 소유한다. 운영체제는 프로세스를 생성, 스케쥴링, 종료등의 작업을 관리한다.
  • 서경태
서경태
TIL 웹개발 - CS면접 대비 정리글
모의 CS면접을 하루 앞두고 기억나는대로 정리를 해보려한다. 컴퓨터 구조 컴퓨터는 네 가지 장치로 이뤄진다. CPU 컴퓨터의 뇌에 해당하며 연산을 담당한다. 주기억장치 = RAM , 메모리 보조기억장치에 저장된 프로그램을 실행시키면 주기억장치에 올라와 사용한다. 전원이 꺼지면 주기억장치에 담긴 메모리도 없어진다. 보조기억장치 HDD, SSD 등 컴퓨터가 꺼져도 유지되는 장치. 평소 보조기억장치에 저장되었다가 프로그램이 실행되면 주기억장치에서 작동한다. 입출력장치 마우스, 키보드, 모니터 등 컴퓨터에 입력 혹은 출력을 할 수 있는 것들을 말한다. 프로세스: 작업이 이루어지는 것을 말한다. 프로세스의 순서 신규, 준비, 실행, 대기, 종료 로 이루어진다. 프로그램을 불러오면 신규에서 준비단계로 넘어온다. 메모리의 할당을 마치면 준비에서 실행 단계로 넘어가 실행된다. 실행 중 입력이 필요하면 대기단계로 넘어간다. 입력을 마치면 다시 준비 단계로 넘어가고 실행단계에서 출력한다. 종료를 하면 실행에서 종료 단계로 넘어간다. 프로세스 구조
  • 서경태
서경태
TIL 웹개발 - 유연한 사고를 가져라
알고리즘 조금 풀어봤다고 모든걸 알고리즘으로 풀려고 하기 시작했다. 펠린드롬 관련 문제를 백트래킹으로 풀면 결국 풀리는거 아냐? 하고 시작했는데... 파이참이 계산을 하다가 꺼져버렸다... 그래서 아 이건 안되겠구나 싶어.. 다시 코드를 작성했다. 조금만 더 유연한 사고를 가지면 사실 펠린드롬은 1/2로 충분히 계산할 수 있고 경우의 수가 아니면 굳이 백트레킹을 사용할 필요도 없다. 결국 내가 작성한 코드는 시간 복잡도는 O(n^2)다. 이상한거에 매몰되어 시간을 낭비하지 말자. 공부시간이 줄어든다.
  • 서경태
서경태
TIL 웹개발 - 자료구조
기본적인 자료구조 연결리스트 스택 큐 해시테이블 힙 연결리스트 Array LinkedList 특정 원소 조회 O(1) O(N) 중간에 삽입 삭제 O(N) O(1) 데이터 추가 데이터 추가시 모든 공간이 다 차버렸다면 새로운 메로리 공간을 할당받아야한다. 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다. 정리
  • 서경태
서경태
TIL 웹개발 - 빅데이터 인공지능
빅데이터 데이터의 종류 정형 데이터 정량적이고 수치로 확인할 수 있거나 구조를 가지고 있는 데이터를 의미 시간, 시계열, 데이터, 금융 데이터 등등 비정형 데이터 수치적으로 확인할 수 없거나 구조를 띄지 않는 데이터를 의미 그림, 소리, 영상 등등 반정형 데이터 정형 데이터와 비정형 데이터의 성격을 두 개 다 가지는 데이터 DICOM, JSON, XML, 스마프톤에서 위치 값을 함께 저장하는 사진 데이터 전처리 데이터를 AI에게 학습시키기 전이나 분석하기 전에 적합한 형태로 가공하는 작업 빅데이터 단순히 많은 양의 데이터를 의미하는 것이 아님. 규모, 속도, 다양성 - 3가지의 특성을 가진다. 규모 - 굉장히 방대한 양의 유의미한 데이터 속도 - 데이터의 생성 및 처리 속도가 매우 빠름 다양성 - 데이터의 종류 뿐만 아니라 형식이 다양하다. 데이터 수집 계획 빅데이터를 구성하기 위해서는 ㅁ여확한 수집 계획이 필요
  • 서경태
서경태
TIL 웹개발 - 사고의 전환
프로그래머스 '숫자 문자열과 영단어' 문제를 풀다보니 문제를 해결하는 방식은 주어진대로 하는 것이 아님을 느꼈다. 문제의 내용은 s가 "one4seveneight" 이런식으로 주어지는데 숫자로 올바르게 변환하는 함수를 만드는 것이다. 먼저 나는 문제를 풀기 위해 영단어와 숫자가 일치하는 딕셔너리를 만들었다. 하지만 코드를 적다보니 딕셔너리를 사용하지도 않고 굉장히 단순하고 무식한 방법으로 풀었다. 문자열 s를 하나씩 풀어서 일치하는 조건의 값을 숫자로 돌려주는 함수다. 다른 사람의 문제 풀이를 보니 순서를 바꿔서 푸는 방법도 있었다. 내가 처음 생각했던 것도 딕셔너리로 만들어 s의 일부값이 딕셔너리 키값에 들어있다면 해당 숫자를 반환하는 식이었는데 이 코드는 아예 딕셔너리부터 시작해서 s에 해당하는 값을 찾았다. 그리고 answer를 문자열 그대로 사용해 replace로 키값과 밸류를 치환했다. 내가 항상 리스틀 만들고 그걸 다시 해답에 맞게 조합하거나 조작해서 출력하는 경우가 많은데 시간복잡도면에서 리스트를 사용하지 않는게 더 좋으니 앞으로 다른 방법도 고민해야한다. 딕셔너리의 특성도 잘 알고 있어야 한다. 반복문에서 num_dict.items()는 키-값 쌍을 반환한다. 그래서 key, value를 동시에 추출하는 것도 가능하다. 만약 key만 뽑거나 value만 뽑을때는 .keys / .values 라고 적어줘야 한다.
  • 서경태
서경태
TIL 웹개발 - 서버
클라이언트와 서버 클라이언트 요청을 보내는 사용자 서버 클라우드 서버 웹 서버 데이터베이스 서버 어플리케이션 서버 프록시 서버 데이터베이스 테이블 표 열 행 DBMS (데이터베이스 관리 시스템) RDBMS(관계형 데이터베이스 관리 시스템) MySQL PosgreSQL SQLite
  • 서경태
서경태
TIL 웹개발 - 소프트웨어 설계
자료 자료구조 데이터를 효과적으로 젖아하기 위해 어떤 논리나 규칙으로 자료를 모안호은 구조 선형 구조 자료간의 관계가 1:1로 순차적으로 나열되어 있는 것 배열 : 메모리상에 연속적인 공간에 데이터를 저장하는 방법 리스트 : 메모리상에 임이의 위치에 데이터를 저장하지만 각 데이터들이 앞뒤 관계를 갖게 하는 방법 스택 : 선입후출 방식의 자료구조. 히스토리 기능을 구현할 때 유용하고 DFS(깊이우선탐색), 후위연산, 백트래킹, 유효성 검사 등 다양한 곳에 사용된다. 큐 : 선입선출 방식의 자료구조. 작업스케쥴링 기능을 구현하거나 BFS(너비우선탐색), 티켓 시스템 등 다양한 곳에서 사용된다. 비션형 구조 자료들 간 관계가 1:N으로 나열되어 있는 것을 의미한다. 그래프: 노드와 간선으로 이루어진 자료구조 무방향 그래프 / 방향 그래프 / 가중치 그래프 트리: 그래프의 한 종류로 싸이클의 구조가 없어야 한다. 이진트리 : 각 부모노드의 자식 노드가 최대 2개인 트리 편향트리 : 한쪽으로만 자식을 갖는 트리 포화이진트리 : 이진트리에서 모든 부모가 2개의 자식노드를 갖는 이진트리 완전이진트리 : 이진트리에서 거의 모든 노드가 채워져 있으며 강한한 제일 왼쪽부터 채워져 있는 이진트리 프로그래밍 기본
  • 서경태
서경태
TIL 웹개발 - CS 기초 지식
메인보드 컴퓨터 본체 내부에 위치한, 주회로가 내장된 보드이다. CPU (Central Processing Unit) 컴퓨터의 두뇌 역할을 하는 실질적으로 모든 기능을 수행하는 요소 입력을 받은 명령을 해석/연산 한 후에 결과값을 출력장치로 전달하는 컴퓨터의 주요 부품 GPU (Graphic Processing Unit) 병렬 연산에 특화되어 이전에는 3D 그래픽을 처리하는데 많이 사용했지만 현재는 범용적으로 사용된다. 주기억장치 (RAM) 휘발성 메모리로 컴퓨터를 껏다 키면 메모리가 사라진다. DRAM SRAM 보조기억장치 비휘발성 메모리로 컴퓨터를 껐카 켜도 메모리가 사라지지 않는다. HDD : 물리적인 보조기억장치 SSD : 반도체에 전기 신호를 이용하여 데이터를 적재하는 보조기억장치 OS 운영체제란 사용자가 컴퓨터를 조작 및 제어하고 작업의 편의성을 제공하기 위한 '시스템 소프트웨어'입니다.
  • 서경태
서경태
TIL 웹개발 - 재귀함수, 그저 믿음 뿐
정확히 말하면, 머릿속에 함수 실행 순서를 그리려고 하지 말라는 것이다. 이유는 머릿속에서 재귀에 재귀에 재귀에 재귀를 따라가보면 어는 순간 핀트가 나가버리기 때문이다. 그래서 중요한 것은 재귀 함수의 중요한 부분에 초첨을 맞춰 문제를 풀어나가는 것이다. 재귀가 풀리는 4단계 접근법 재귀를 꼭 써야 하는가? 반복 대신 재귀를 써야하는 경우인지 생각해본다. 재귀함수를 사용해서 푸는 문제의 대부분은 반복을 사용해서도 풀수 있다. 복잡한 문제를 더 작은 문제로 쪼개고, 작은 문제를 반복적으로 풀고, 작은 답들을 조합해서 전체 문제를 해결한다. 그리고 일반적으로 성능은 반복문이 재귀함수보다 더 좋다. 그렇기에 꼭 재귀함수를 써야하는지 먼저 체크해본다. 베이스 조건 답을 바로 알 수 있는 가장 간단한 상황을 생각한다. 재귀함수는 무한루프에 빠질 경우가 많다. 그렇기에 베이스 조건을 가장 먼저 만들어야 한다. 베이스 조건에서 무엇을 return 해야할지 헷갈린다면 문제에서 요구한 답의 데이터 타입을 본다. 예시로 주어진 인풋 값을 보고, 답으로 만드는 방법을 생각하면 함수 실행 순서를 떠올린다. 그보다 문제에 초점을 맞춰 베이스 조건을 만들어보자. 분해 베이스 조건에 가까워지도록 인풋값을 조작한다. 예를 들어, n이라는 정수로 함수를 실행한다면, 자기 자신을 호출할때는 n-1을 넣는다. 그래야 재귀함수가 반복하면서 인풋값이 조금식 더 간단해진다. 재귀적 분해라고도 하는데 인풋값을 간단하게 만들어서 문제를 더 작게 만드는 것이다. 이 재귀적 분해에는 패턴이 보이기도 한다. 정수 : 수를 줄여나간다. n-1 or n-2 배열 : 앞의 숫자를 없애 길이를 줄인다. [1, 2, 3, 4] → [2, 3, 4] → [3, 4] 링크드 리스트 : 포인터가 가리키는 다음 노드가 input으로 들어간다.
  • 서경태
서경태
TIL 웹개발 - DFS, BFS
DFS(Depth Fisrt Search) 깊이우선탐색으로 말 그대로 연결된 노드 트리를 따라 끝까지 탐색 후 다시 올라와 나머지를 탐색한다. 위와 같은 노드 트리를 탐색한다면 순서는 아마 [0, 1, 3, 4, 2]가 될 것이다. DFS를 재귀함수로 구현한 코드다. 함수에 함수가 쓰여 조건이 달성될 때까지 반복한다. BFS( Breadth First Search) 너비우선탐색으로 노드트리를 위에서 아래로 차례대로 탐색하는 특징을 갖고 있다. DFS와 달리 BFS로 위 노드 트리를 탐색하면 [0, 1, 2, 3, 4]의 순서를 가진다. 코드로 표현하면 아래와 같다. deque를 사용해 탐색할 노드의 맨 앞에서부터 가져오기때문에 아래에서 위로 순차적인 탐색이 가능하다. dfs, bfs의 특징을 이용해 풀 수 있는 문제가 나뉘기도하고 혹은 두 방법으로 동일한 문제를 풀 수도 있다.
  • 서경태
서경태
TIL 웹개발 - 리스트(list)와 세트(set)의 시간 복잡도 차이
백준 11725번 문제를 푸는데 계속해서 시간초과로 난항을 겪고 있었다. 이 문제를 풀기 위해 내가 짠 코드는 다음과 같다. 파이참에서 실행시켰을때는 입출력 예제와 똑같이 나왔기에 이제 여기서 줄일 만한 곳을 찾기 시작했다. graph를 딕셔너리로 만들었는데 리스트로 변경하면 좀 더 시간이 줄어들까 싶어 시도했지만 역시나 실패였다. 그후 몇 가지 시도를 하다보니 코드가 아예 틀리기도 했다. 결국 나는 그를 찾아갔다. 거의 솔루션은 간단했다. 리스트(list)를 세트(set)로 변경하는 것이다. 위 코드 중 일부를 보면 입력값을 받아 그래프를 만든 후 부모 노드를 찾기 위해 bfs를 사용했다. def bfs_queue(start): parent = [0] * (n+1) visited = [start] q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.append(adj) def bfs_queue(start): parent = [0] * (n+1) visited = set([start]) q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.add(adj) visited는 방문한 노드를 중복 방문하지 않기 위해 만든 리스트다. if문에 인접 노드가 이미 visited에 없다면 아래 코드를 반복해서 실행한다. 이때 if adj not in visited의 시간 복잡도는 O(n)이다. 하지만 visited를 세트(set)로 바꾸면 시간 복잡도는 O(1)이 된다. 리스트와 세트의 연산 차이점을 나타낸 표를 참고해보면, 리스트(list)
  • 서경태
서경태
TIL 웹개발 - 파이썬 scope
Scope 파이썬에서 변수의 유효 범위를 말한다. 위치에 따라 작성한 코드가 작동하거나 작동하지 않을 수도 있고 때로는 원하는 대로 값이 안나올 수도 있다. 변수의 위치를 알맞게 작성해야 한다. LEGB rule 이 규칙에 따라 순서대로 작동한다. Local scope 함수 내부에서 선언된 변수나 함수로 그 범위에만 유효하다. Enclosed scope 외부함수에 정의되었지만 내부함수까지 사용된다. 주로 중첩 함수가 정의될 때 사용된다. Global scope 외부에 선언된 변수로 전체적인 범위에 유효하다. Built-in scope 파이썬 설치 파일 안에 바로 내장된 것으로 별다른 선언없이 실행된다. ex) len(), input(), print() 등
  • 서경태
👍
1
서경태
TIL 웹개발 - 해시테이블
해시테이블(해시 맵) 키, 밸류 구조로 딕셔너리형태의 자료형 자료를 저장하고 검색하는데 사용하는 중요한 기법 좋은 해시 함수의 조건 해시 함수 값 충돌의 최소화 쉽고 빠른 연산 해시 테이블 전체에 해시 값이 균일하게 분포 사용할 키의 모든 정보를 이용하여 해싱 해시 테이블 사용 효율이 높아야함 로드 팩터 해시테이블에 저장된 데이터 개수 n을 버킷의 개수 k 로 나눈 것 로드 팩터 비율에 따라 해시 함수를 재작성 할지, 크기를 조정할 지 결정한다. 로드팩터가 증가할 수록 해시 테이블 성능은 점점 감소하기에 해시테이블의 공간을 재할당한다. 해시 함수 해시 함수를 통해 키가 해시 값으로 변경되는 과정을 도식화 한 것이다. 윤아와 서현의 값은 해시 함수를 통해 동일한 2를 가지며 충동한 것을 알 수 있다.
  • 서경태
서경태
TIL 웹개발 - 알고리즘이란?
파이썬 과정을 마치고 알고리즘과 자료구조에 대한 강의를 시작했다. 알고리즘이란? 같은 문제를 풀더라도 공간적으로 시간적으로 더 효율적으로 풀기 위한 것 시간 복잡도 입력값과 문제를 해결하는데 걸리는 시간과의 상관관계를 말한다. 입력갓이 2배로 늘어났을 때 문제를 해결하는 데 걸리는 시간은 몇 ㅐ로 늘어나는지 보는 것. 공간 복잡도 입력값과 문제를 해결하는데 걸리는 공간과의 상관관계를 말한다. 입력값이 2ㅐ로 늘어났을 때 문제를 해결하는 데 걸리는 공간은 몇 배로 늘어나는지를 보는 것. 점근 표기법 알고리즘의 성능을 수학적으로 표기하는 기법으로 알고리즘의 '효율성'을 평가하는 방법이다. 빅오(Big-O) 표기범 최악의 성능이 나올때 어느정도 연산량이 걸릴지 표기 방법: O(N) N은 얼마나 계산하냐를 말하기 때문에 for문이 한번 있으면 O(N)으로 사용하고 for문이 2개 중첩된 알고리즘은 O(N제곱) 으로 표기한다. 빅 오메가(Big -Ω) 표기법 최선의 성능이 나올때 어느정도의 연산량이 걸릴지 표기 방법: Ω(1) 빅 오메가는 거의 사용하지 않는다. 왜냐하면 보통 최악의 경우를 대비하기때문. 최선은 가장 좋으면 1이지만 최악은.... 상상하기 싫다. 알파벳 찾기 문제