Share
Sign In
TIL 웹개발
내일배움캠프에서 공부한 내용을 복습니다.
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이지만 최악은.... 상상하기 싫다. 알파벳 찾기 문제
서경태
TIL 웹개발 - flask, request, form
먼저 html에서 form 형태를 작성한다. <form action:'/ 보낼 곳' method = '방식'> action : 어디로 보낼지 정하는 것이다. 파이썬에서 라우트하는 곳으로 설정한게 된다. method : form에서 지원하는 방식은 여러가지가 있는데 보통 get과 post를 사용한다. get은 검색처럼 데이터를 요청할때 사용한다. post는 로그인처럼 정보를 서버에 전달할 때 사용한다. <select name="요청 이름" — — —> <option value ="값"></<option> 부트스트랩에서 사용한 셀렉트 방식으로 가위바위보를 골라서 제출하도록 했다. name : 파이썬이 요청 받을때 여기서 정해진 이름으로 데이터를 받는다. value : name이란 데이터의 값을 말한다. 예를 들어, 가위바위보 게임을 한다면 name은 내가 낼 패를 말하고 value는 가위, 바위, 보 처럼 선택한 값을 말한다. <input button type ='submit'> 버튼을 통해 제출되도록 설정했다. 라우트를 사용해 html의 데이터를 받는다. 위에서 본 action 과 methods를 먼저 써준다. methods는 html에서 post만 사용했는데 왜 둘 다 써야할까? 그 이유는, 사용자가 웹페이지를 처음 방문할 때 기본적으로 get 요청을 통해 페이지를 로딩한다. 따라서 get 메서드를 포함하지 않으면 로딩시 오류가 생길수 있다. get을 사용하지 않더라도 꼭 둘 다 써야함을 기억하자! user_choice = request.form['user_choice'] 로 name과 같은 값을 통해 value값을 매개변수(user_choice 앞에 거)에 지정한다. 이렇게 하면 form은 정상적으로 작동한다.
서경태
TIL 웹개발 - 두 class로 생성한 instance 연결, 공유하는 법
과제 내용을 보면 두 개의 class를 사용한다. 계정을 생성하는 Member 클래스 포스트를 생성하는 Post 클래스 각 클래스로 생성한 인스턴스를 리스트로 만들어 보여주는데 우리는 덧붙여 포스트를 삭제하는 기능을 넣었다. 그냥 __del__(소멸자: __init__과 반대)를 사용하면 되는거 되네 싶었는데, 실제 서비스에선 다른 사람이 내글을 마음대로 지운다면 진짜 개빡칠 것 아닌가? 그래서 아이디와 비밀번호를 기입해 포스트 삭제에 대한 권한을 부여한다. members = [m1, m2, m3] m1 = [name, username, password] Member 클래스로 만든 member 인스턴스와 인스턴스를 리스트로 만든 memebrs다. posts [p1, p2, p3] p1 = [title, content, author] Post 클래스로 만든 post 인스턴스와 인스턴스를 리스트로 만든 posts다. (단, author = username) 두 데이터를 연결시키는 방법은 post의 author 속성에 Member 클래스 인스턴스를 넣는 것이다. 그러면 아래 이미지처럼 사용할 수 있다. 그럼 p1 = [title, content, m1] 형태로 사용할수 있고 p1의 author를 알고 싶다면 p1.author.username을 사용하면된다. 그리고 만약 p1의 비밀번호를 알려면 p1.author.password를 사용하면 된다. elif select == '4': # 게시글 작성 while True: id_input = input("ID를 입력해주세요. ") member_matched = None for member in members: if id_input == member.username: member_matched = member break if member_matched: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == member_matched.password: print("게시글을 작성해주세요.") title = input("\n제목: ") content = input("내용: ") posts.append(Post(title, content, member_matched)) print("\n게시글 작성을 완료했습니다.") break else: print("패스워드가 일치하지 않습니다.") break else: print("ID가 존재하지 않습니다. ") 위 코드에선 게시글을 작성할 때, 아이디와 비밀번호를 확인한다. 확인이 맞으면(memebr_matched) 제목과 내용을 기입하고 posts 리스트에 post 객체가 추가되는데 여기서 author에 member_matched를 사용한다. member_matched는 아이디와 비밀번호로 찾은 member 인스턴스이다. elif select == '5': # 게시글 삭제 del_title = input("삭제할 게시글의 제목을 입력하세요. ") post_matched = None for post in posts: if del_title == post.title: post_matched = post break if post_matched: while True: id_input = input("ID를 입력해주세요. ") if id_input == post_matched.author.username: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == post_matched.author.password: posts.remove(post_matched) print(f'{post_matched.title}이 삭제되었습니다.') break else: print("패스워드가 일치하지 않습니다.") break else: print("아이디가 일치하지 않습니다.") 이렇게 게시글을 삭제할때, title을 검색해서 삭제할 post를 선택(post_matched라고 정의)하고 username과 password가 일치하면 삭제되는 기능이다. post_matched.author.username = member.username post_matched.author.password = member.password 기억하자. 두 클래스는 인스턴스를 공유할 수 있고 그 방법은 한 인스턴스를 다른 클래스의 속성으로 사용하면 된다.
서경태
TIL 웹개발 - Class 개념 정리
클래스(class) : 클래스는 객체를 생성하기 위한 청사진(설계도)입니다. 클래스는 데이터(어트리뷰트)와 행동(메서드)을 정의합니다. 객체(object) : 객체는 클래스의 인스턴스입니다. 클래스는 객체의 구조와 동작을 정의하고, 객체는 클래스에 정의된 구조와 동작을 실제로 구현한 것입니다. 인스턴스(instance) : 인스턴스는 클래스로부터 생성된 개별 객체를 의미합니다. 각 인스턴스는 독립적인 값을 가지며, 클래스에 정의된 속성과 메서드를 사용할 수 있습니다. 인스턴스 어트리뷰트(속성) : 인스턴스 어트리뷰트는 각 인스턴스마다 개별적으로 저장되는 데이터를 의미합니다. 보통 __init__ 메서드 내에서 정의됩니다. 클래스 어트리뷰트(속성) : 클래스 어트리뷰트는 클래스 자체에 속하는 변수로, 모든 인스턴스가 공유합니다. 메서드(methods) : 메서드는 클래스 내부에 정의된 함수로, 객체의 행동을 정의합니다. 메서드는 첫 번째 인자로 self를 받아 인스턴스의 속성과 상호작용합니다. 상속(inheritance) : 상속은 기존 클래스를 바탕으로 새로운 클래스를 정의하는 것입니다. 새로운 클래스는 기존 클래스의 속성과 메서드를 물려받습니다. 다형성(polymorphism) : 다형성은 동일한 메서드가 다른 객체에서 다르게 동작할 수 있게 하는 것입니다. 이는 주로 메서드 오버라이딩을 통해 구현됩니다. 캡슐화(encapsulation) : 캡슐화는 객체의 속성과 메서드를 외부에서 직접 접근하지 못하게 하고, 객체 내부에서만 접근할 수 있게 하는 것입니다. 보통 접근자와 설정자를 통해 구현됩니다. 추상화(abstraction) : 추상화는 객체의 복잡성을 줄이고, 필요한 부분만 노출하는 것입니다. 이는 추상 클래스를 통해 구현될 수 있습니다.
서경태
TIL 웹 개발 - class 이해하기 init, instance, method
팀프로젝트로 class를 사용하게 되었다. 하지만 class가 대략 미리 만들어놓고 나중에 또 쓰기 위한 거다 정도로 이해하고 있어서 이번 포스팅을 통해 이해해보기로 하자. init 일단, class 코드에 대해 찾아보면 항상 첫번째 함수는 __init__이 나온다. init은 아마 initiail, initiative, initiation 등의 약자로 우선적인 느낌을 가진 함수일 것이다. class 함수에서 init은 생성자(conductor)로 불리며 객체가 생성될 때, 자동으로 호출되는 특별한 메소드다. 좀 더 쉽게 이해하기 위해 역할에 대해 설명하면, 객체 초기화 : 객체가 생성될 때 필요한 초기 설정이나 값들을 초기화하기 위해 사용된다. 위 코드에서 이름과 나이에 대한 정보를 받는 프로그램을 만든다면 처음 데이터를 생성하는 역할을 한다는 것이다. 유연한 객체 생성 : 매개변수를 받아 객체 생성시 다양한 초기값을 설정할 수 있게 해줍니다. 그냥 새로운 객체를 생성할 때 이걸 사용해 쉽게 한다는 것이다. 위 코드 #객체생성 부분에서 보듯 person1 = class(데이터1, 데이터2) 를 넣어주면 바로 생성할 수 있다. 명확한 코드 구조 : class 함수의 기준이 되다보니 코드 구조가 한눈에 보기 쉽게 해준다. 추후 유지보수에도 도움이 된다. instance 인스턴스는 클래스에서 생성된 객체를 말한다. 위 코드에서 보면 person1, person2가 인스턴스에 해당한다. method 메소드는 클래스나 인스턴스에서 호출할 수 있는 함수를 말한다. 인스턴스 메소드 특정 인스턴스와 연관된 메소드로 self 매개변수를 통해 접근하고 조작한다. 위 코드에서 보면 def intoruduce(self): 가 인스턴스 메소드이다. 클래스 메소드 클래스 자체에 연관된 메소드로 데코레이터로 사용된다. 데코레이터는 다음 기회에 알아보자.
서경태
TIL 웹개발 - while 반복문 break, continue 사용하기
개인 과제로 주어진 두 문제 Up&Down 게임 만들기 가위, 바위, 보 게임 만들기 이 두 과제를 하는데 하루를 다 써버렸다... 핵심은 while 반복문 사용하기 사용법은 간단하지만 여러 조건들이 붙으며 구조를 잡는데 꽤나 애를 먹었다. 가장 어려웠던 부분은 게임을 한 차례 진행 후 새로 시작하는 것과 그 기록을 남기는 것. Up & Down 게임 우선 게임 내용은 쉽게 만들었다. 하지만 문제는 랜덤으로 나온 숫자가 코드를 실행할때마다 새롭게 생성이 되어 게임 진행이 안됨 게임을 마치고 다시 시작하는지 혹은 마치는지 + 기록 표시 1번의 문제는 구글링 하다보니 구조적으로 해결이 되었다. x는 컴퓨터가 만든 랜덤 숫자이고 n은 사용자가 입력한 숫자이다. (사실 input을 쓰면 터미널에서 진행할 수 있는지 모르고 처음엔 VS code에서 index.html을 만들었다... request함수 쓰려고...) x가 생성되고 n을 입력하며 힌트를 얻어 맞추면 끝나는데 n을 입력할때마다 x의 값도 바뀌니 게임 진행이 안되었다. 확률을 줄여나가는 게임인데 계속 1/100 확률 게임을 만들어 버린 것. 해결 방법은 x는 외부 while 반복문에 넣고 n은 내부 while 반복문에 위치해서 n = x 조건이 성립 될때까지 n의 변수를 입력하는 것이었다. 그리고 게임이 끝나면 다시 시작할지 그대로 종료할지 되묻는데 이때는 break와 exit()를 사용했다. while 반복문에서 break, continue 그리고 빈칸 break는 while 반복문이 조건을 성립하면 멈춘다. 위 코드의 경우 게임 재시작 의사를 물을 때 y를 누르면 내부 while 반복문이 종료되고 다시 외부 while 반복문이 시작되며 랜덤 숫자가 주어지고 게임이 진행된다. continue는 break과 달리 while 반복문 조건이 성립되면 건너뛰고 이어뛰는 함수다. (예외 처리에 사용 가능할지도?) 빈칸은 조건 성립이 안되었기에 처음부터 다시 도는 것이다. y or n을 고르는 단계에서 a,e,d같은 문자열이 입력될 경우 print("다시 입력해주세요.")라고 하면 y or n 선택 단계로 돌아간다.
서경태
TIL 웹 개발 - from ... import ...
파이썬 강의를 듣던 중 갑자기 궁금한게 생겼다. (난 왜 자꾸 이런거에 꽂히는 모르겠다...) 여러 함수들을 배우는데, request를 사용할 땐, 맨 위에 import requests를 써야 함수가 작동한다. datetime을 사용할 땐, 맨 위에 from datetime import datetime을 써야 함수가 작동한다. 오케이... 이렇게 맨 위에 뭔가를 적어야하는 것은 내장함수가 아니기 때문에 "나 이거 쓸래!" 라고 말해줘야 한다. 근데 왜 어떤건 from을 써야하고 어떤건 그냥 import만 써도되는지 궁금했다. 바로 ChatGPT에 물어봤다. (유료 구독하길 잘했다...) 우선 모듈과 클래스라는 개념이 있다. import 뒤에 오는게 모듈이고 함수를 작성할때 접두사로 사용하는 것이 클래스다. 모듈 내에 클래스가 있어서 모듈을 임포트하고 클래스써서 함수를 사용한다고 이해하면 쉽다. 그럼 이제 from을 왜 쓰느냐? GPT가 대답해준다. 이 모듈은 여러 클래스를 포함하는 모듈입니다. datetime 모듈 내의 datetime 클래스는 특히 자주 사용되기 때문에, 이를 편리하게 임포트하기 위해 다음과 같이 사용합니다: from datetime import datetime 이 방식은 datetime 모듈 내의 datetime 클래스를 직접 임포트합니다. 따라서 해당 클래스를 사용할 때 모듈 이름을 접두사로 사용할 필요가 없습니다. 예를 들어: current_time = datetime.now() 접두사로 datetime을 쓰는데 접두사를 사용할 필요가 없다고 알려준다. ??? 결론부터 이야기하자면, 모듈안에 여러 클래스가 있는 경우! from을 써서 문자열이 길어지는 것을 방지하는 것이다. 비교로 알아보면 좀 더 이해가 빠르다. import datetime(모듈) current_time = datetime(모듈).datetime(클래스).now() from datetime(모듈) import datetime(클래스) current_time = datetime(클래스).now() 이처럼 1번에서는 import만 쓸 경우, datetime 모듈을 쓸거야 라고 말하고 뒤에 datetime 클래스를 쓸거야 라고 해야한다. 반면에 2번처럼 from을 쓰면 datetime 클래스만 쓰면 된다. 앞서 GPT가 알려준 것처럼 datetime 모듈에는 여러 클래스가 있다. 그중 3가지를 써서 시차를 구하는 코드를 작성해보자. from datetime import datetime, timezone, timedelta import datetime utc_time = datetime.now(timezone.utc) print("Current UTC time:", utc_time)
서경태
TIL 웹개발 - 미니프로젝트
팀원을 소개하는 웹페이지 제작 프로젝트를 진행했다. 그 중에서 나는 팀원의 데이터를 정리하고 html에 연결하는 작업을 맡았는데 여러 시행착오가 있었다. SQLalchemy 데이터 베이스를 생성하고 SQLalchemy를 설치. pip install flask-sqlalchemy 이런 식으로 데이터 구조를 짠 후 하나씩 데이터를 채워 넣는데 이 부분이 굉장히 고된 작업이었다. flask shell에서 터미널 형태로 데이터를 넣다보니 한땀한땀 만드는 느낌. 데이터 포맷을 완성하고 다른 팀원이 만든 html과 연결하는 작업을 진행했다. 라우트 @app.route('/') def show_members(): members = Member.query.all() return render_template('index.html', data=members) 라우트 기본구조다. 가장 밑에 index.html로 html과 연결시켜주고. 데이터에 내가 만든 구조를 넣는다. 그럼 html에서 이렇게 {{ data[2].role }}로 표기하면 데이터 값이 나온다. 반복문을 사용해 최대한 노가다를 줄이려했지만 실피했다. 실패 원인은 모르겠다.... 마우스가 호버링하면 나오는 문구때문이지... 폴더 구조 다른 팀원이 만든 html과 css파일을 넣고 데이터베이스와 연결하니 실행이 되지 않았다. 그 원인은 폴더 구조. 아래와 같은 형태로 만들어야한다. gpt 센세가 알려줬다. 내친구 GPT 친구는 아니고 확실히 센세다. 결제해놓고 좀 후회했는데 이제 없으면 아무것도 못한다. 오늘 좀 괴롭혔더니 지혼자 꺼지더라... 그래도 고맙다.
서경태
TIL 웹 개발 - Flask 이해하기
GPT 가라사대 Flask는 Python으로 작성된 마이크로 웹 프레임워크입니다. Flask는 경량화된 웹 프레임워크로, 필요한 최소한의 핵심 기능만을 제공하여 사용자가 필요한 기능을 플러그인 형태로 추가할 수 있습니다. 이해하기 Flask는 2010년에 Armin Ronacher가 만든 웹 프레임워크이다. 이름 자체는 '플라스크' 라는 단어에서 영감을 받아 '작고 가벼운' 이라는 의미를 내포하고 있다. Django와 같은 큰 프레임워크와 대비되며 작은 프로젝트나 간단한 웹 애플리케이션을 빠르게 개발할 수 있는 마이크로 프레임워크다. 예제 from flask import Flask app = Flask(name) @app.route('/') def home(): return () if name == 'main': app.run(debug=True) from flask import flask 에 이어 render templates, request를 주로 사용하고 마지막엔 redirect, url_for까지 사용했다. redirection은 단순히 url만 복사해서 붙여넣기 하면 끝나는 단순한 기능으로 알았는데 그 안엔 여러 세팅들이 필요했다. 구조 @app.route('/') def home(): return () 위 코드를 기본 구조로 괄호 안에 페이지의 이름이 들어간다. 그리고 def 아래에는데이터를 넣고 웹에서 요청하면 데이터가 나올수 있도록 세팅한다. 처음에는 그냥 따라 쓰기만해서 구조가 눈에 들어오지 않았는데 오히려 각 기능들을 달고나니 구조가 조금씩 읽히기 시작했다.
서경태