DB 테이블을 설계할 때는 데이터 모델링을 신중하게 고려해야 한다. 정규화(normalization) 방식 : 여러 테이블로 나누는 방식 역정규화(denormalization) 방식 : 적은 수의 테이블에 많은 칼럼을 포함하는 방식 각각의 방식은 장단점이 존재하며, 어떤 방식이 더 좋은지는 상황에 따라 달라진다 정규화 장점 중복 데이터의 최소화 데이터 일관성 유지 쿼리 최적화 단점 JOIN 연산 필요 : 데이터를 검색할 때 JOIN 연산을 사용해 여러 테이블을 합쳐야 하므로 성능 저하 가능성이 있다. 복잡성 증가 : 많은 테이블과 관계가 있을수록 데이터를 이해하고 관리하기 어려워진다. 역정규화 장점 데이터 검색 성능 향상 : JOIN 연산을 줄이고 데이터를 한 곳에 집중시켜 검색 속도를 높일 수 있다. ..
깔끔하게 정리하면서 코드를 작성해보겠다고 파일을 나눠놨더니 import를 많이 쓰게 됐다. 배운거 써먹는 기분으로 신나게 썼는데 순환 임포트에 관한 오류가 떴다. 처음에는 이게 뭔소린가 했는데 모듈을 막 가져다 쓰면 안된다는 말이었다. 수업 시간에 임포트할 때는 자세하게 가져올 부분을 입력하라고 했었는데 지금 와서야 제대로 이해가 됐다. 순환 임포트 외에도 모듈을 임포트할 때 주의해야할 사항들에 대해 간단히 정리해보려고 한다. 1. 모듈 이름 충돌 모듈 이름은 파이썬의 내장 모듈이나 다른 라이브러리와 충돌되지 않아야 한다. # math.py def add(a, b): return a + b # main.py import math result = math.add(1, 2) 파일명을 math.py로 함으로써..
RPG 게임을 할 때는 몬스터 정보만 파일로 만들어서 해서 무난하게 넘어갔는데, 이번에 도서관 관리 시스템을 작업하면서 생각보다 많은 파일을 만들어야 했다. 거기다가 한 데 모아서 정보를 출력할 수 있게 판다스 기능까지 추가하려고 하니 정신이 없어졌다. 파일을 불러와서 작업하는 게 많다는 생각이 들었고 이번 기회에 파일 입출력에 관해서 정리하는 것이 좋을 것 같았다. .txt 파일 with open('example.txt', 'w') as file: file.write('안녕하세요!\n') file.write('파일 쓰기 예제입니다.\n') file.write('파이썬으로 텍스트 파일을 쓸 수 있어요!\n') with open('example.txt', 'r') as file: contents = fil..
RPG 게임에는 포션이 꼭 필요하다. 그래서 처음 자바로 만들 때 계획은 회복약을 다양하게 만들어서 리스트를 만든 다음에 캐릭터가 선택해서 적용되게 하는 것이었다. 하지만 처음 시도한 미니 프로젝트다보니 코드를 작성하는게 너무 어려웠고, 결국 포션의 종류는 하나로 한정시킬 수 밖에 없었다. 그래도 단순하게 작성했기 때문에 당시에 큰 문제 없이 코드를 만들었다. 하지만 파이썬으로 옮기는 작업을 하면서 욕심이 생기기 시작했고 포션 종류를 하나 더 추가하기로 했다. 그렇게 하자마자 문제가 발생했다. 단 한 종류를 더 추가했을 뿐인데 어째서! 라는 생각이 들면서 그냥 원래대로 할까 하는 마음이 생겼지만 그렇게 하면 발전이 없다는 생각에 될 때까지 해보기로 했다. 포션을 사용했는데 수량이 변하지 않는 문제부터 해..
지금 하는 프로젝트들은 콘솔로 실행해 보는 것이 전부다. 그래서 콘솔창에 출력을 깔끔하게 하기 위해서 아래 코드처럼 구분선을 하나하나 넣어왔다. def unit_info(self): print("-----------------------------------------") print("┌ 캐릭터명 : " + self.get_name()) print("│ 체력 : " + str(self.get_hp()) + " / " + str(self.get_max_hp())) if self.equipped_weapon: print("└ 장착무기 : " + self.equipped_weapon.get_name()) print("└ 공격력 : " + str(self.get_min_damage()) + " ~ " + str..
RPG 게임 간단 구현 java 프로젝트를 파이썬으로 바꾸면서 시작부터 막혀버렸다. abstract class Unit { private String name; private int health; private int maxHealth; private int attack; private int randomAttack; private int maxDamage; private int minDamage; Unit() { } Unit(String name, int health, int maxDamage, int minDamage) { this.name = name; this.health = health; this.maxDamage = maxDamage; this.minDamage = minDamage; } St..