1. 잡담
요즘 AI기술이 여러 분야에서 사용되고 있다. 가전 제품, 자동차, 휴대폰, 스마트팜 등 자연어를 기반으로 발전하고 있음.
이전까지의 기술 발전은 빠르게 변화하지 않아 세대가 바뀌지 않으면 큰 변화가 없었다. 지금은 AI혁명으로 급격한 기술발전이 일어나 여러가지 삶의 양식이나 배워야하는 정보가 바뀌고 있다. 어떤 방향으로 갈지는 기술이 안정화되기 전까진 알 수 없다. 하지만 안정화가 된다면 한동안 그 기술만 배워놓았다면 시대에 뒤떨어지는 일은 없을 것이다.
앞으로의 기술 발전의 주기는 점점 짧아질 예정이므로 그 때마다 늦지 않게 동향을 파악하고 공부하며 따라가야 할 것이다.
일단 방향을 잡았다면 계속해서 해나가자. 물론 그 방향이 요즘 추세와 맞지 않는 방향일 수 있으나, 이전까지 배우고 했던 내용은 코딩 근육이 되어 몸에 남아있다. 따라서 앞으로만 나아가고 동향을 파악하고 중간중간에 방향을 바꿔준다면, 충분히 경쟁력 있는 인력이 될 수 있다.
2. 로깅 (Logging)
로깅은 소프트웨어 실행 시 발생하는 이벤트를 기록하는 과정입니다. 로그를 사용하면 개발자가 코드 실행의 흐름을 이해하고, 문제가 발생했을 때 원인을 파악하는 데 도움이 됩니다.
2.1 기본 사용법
파이썬의 logging 모듈을 사용하면 로깅을 쉽게 구현할 수 있습니다. 기본적인 사용 예시는 다음과 같습니다.
import logging
# 기본 로거를 구성하고 로그 레벨을 설정
logging.basicConfig(level=logging.INFO)
# 로그 메시지 기록
logging.info("이것은 정보 로그입니다.")
logging.warning("이것은 경고 로그입니다.")
logging.error("이것은 에러 로그입니다.")
2.2 로거 설정
로깅 시스템은 매우 유연하게 설정할 수 있습니다. 파일에 로그를 기록하거나, 로그의 포맷을 지정하는 것도 가능합니다.
import logging
# 로그 파일 설정, 포맷 지정
logging.basicConfig(filename='example.log',
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logging.info("파일에 기록되는 로그 메시지입니다.")
2.3 로깅 설명 링크
: https://just-record.github.io/python/python-logging-1/
2.4 예제
- 일반적인 로깅 레벨
DEBUG | 개발 시 디버깅을 위해 정보 기록 |
INFO | 프로그램 실행 과정에서 발생하는 정보 기록 |
WARNING | 발생 가능한 문제 상황에 대한 경고 메시지 기록 |
ERROR | 에러 발생 시 에러 정보 기록 |
CRITICAL | 치명적인 오류로 프로그램 실행이 불가능한 상황 기록 |
- logging은 Python에서 로깅 기능을 제공하는 표준 라이브러리 모듈입니다.
- 기본적으로 로깅 레벨은 WARNING으로 설정되어 있어 따로 설정하지 않으면 warning레벨부터 출력된다.
- 로깅을 출력은 기본적으로 sysout 형태를 띈다.(콘솔창에 출력된다)
- 로깅도 문자열 포메팅을 지원한다.
- 로깅 핸들러는 로깅의 다양한 설정을 할 수 있게하고, 스트림이나 파일로 로깅 메세지를 보내는 기능을 포함한다.
- sys.stdout으로 스트림 연결해서 콘솔창에 띄운다.
- 스트림을 통해 네트워크 소켓으로도 보낼 수 있다.
- 파일 핸들러로 파일에 로그를 저장할 수 있다.
- 실무에선 엄청난 로그들이 파일에 저장되므로 로그들을 어떻게 저장하고 관리할지도 중요한 포인트이다.
- 로깅 포메터를 사용해서 로깅으로 출력되는 메세지의 포멧을 설정할 수 있다.
- 로그 필터링으로 로거 레벨을 따로 조정하거나 핸들러로 처리되는 로깅 파일을 필터링하여 보낼 수 있다.
- 실무에서 개발자는 setLevel(logging.DEBUG)로 해서 디버그를 하며 프로그래밍하고,
- 운영쪽엔 setLevel(logging.WARNING) 또는 setLevel(logging.INFO)를 줘서 로그를 확인하도록한다.
- 디버그를 주석표시하지 않아도 되므로 할 일이 많이 줄어들게 된다. sysout을 안하고 로깅을 하는 주된 이유이다.
- 불필요한 로그 저장 파일을 줄일 수 있어 효과적이다.
>> logger자체에 레벨이 warning이므로 파일 핸들러 레벨을 더 높은 DEBUG로 설정해도 warning까지만 저장하게된다.
- maxBytes: 로그 파일의 최대 크기를 지정
- backupCount: 오래된 로그 파일을 유지할 최대 개수
- 로그 회전 핸들러를 사용해서 로그가 저장되는 파일의 크기를 설정 할 수 있다.(하나의 텍스트 파일에 너무 많은 로깅을 남기면 파일을 여는데 한세월이 걸리고 검색하는데 너무 오랜 시간이 걸린다.)
- when: ‘S’, ‘M’, ‘H’, ‘D’, ‘W0’-‘W6’ - 로그 파일 회전 주기를 설정
- interval: 로그 파일 회전 간격 (when 매개변수와 함께 사용)
- backupCount: 최대 백업 파일 수
- 로거 파일을 시간 간격마다 생성해서 관리 할 수 있다.
3. YAML
YAML은 "YAML Ain't Markup Language"의 약자로, 설정 파일, 데이터 교환 등을 위해 설계된 인간 친화적 데이터 직렬화 표준입니다. JSON과 유사하지만, 가독성이 더 좋습니다. 텍스트 파일입니다.
3.1 기본 사용법
파이썬에서 YAML을 다루기 위해서는 PyYAML 패키지를 사용합니다. pip install PyYAML을 통해 설치할 수 있습니다.
import yaml
# YAML 문자열
yaml_str = """
a: 1
b:
- c
- d
- e
"""
# YAML 파싱
data = yaml.safe_load(yaml_str)
print(data)
3.2 YAML 파일 읽기
import yaml
# YAML 파일 읽기
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
print(config)
이렇게 로깅과 YAML은 각각 애플리케이션의 실행 정보를 기록하고, 구성 정보를 쉽게 관리하는 데 유용한 도구입니다. 로깅은 문제 해결과 모니터링에, YAML은 설정 관리에 주로 사용됩니다.
3.3 yaml 교육 링크
https://just-record.github.io/python/python-yaml/
3.4 yaml 예제
- 명령프롬프트 창에 pip install PyYAML이라고 입력하면 설치된다.
- YAML 파일을 불러와 document에 저장해 볼 수 있다.
- 데이터 직렬화가 되므로 yaml에 풀어쓴 텍스트가 한 줄로 포메팅 된 것을 볼 수 있다.
- yaml에 저장된 밸류값을 받아오려면 파일을 로드하고 대괄호에 데이터 이름과 키값을 입력하면 된다.
- 파이썬에서 .yaml 파일을 만들어낼 수 있다.
- 프로젝트를 진행할 때 host이름이나 port번호나 sql이름, 비밀번호, 로깅 레벨 등을 yaml로 만들어서 파이썬.py 파일을 열어서 수정하지 않아도 yaml파일을 열어 수정해 값을 변경해 줄 수 있다.
- 한글이 포함된 YAML 파일을 읽을 때는 encoding='utf-8' 옵션을 사용한다.
- encoding을 하지 않으면 오류가 발생해 한글을 읽어오지 못한다.
4. 수업하면서 배운 내용
4.1 DAO (Data Access Object)
DAO(Data Access Object)는 데이터베이스의 데이터에 접근하기 위한 객체로, 데이터베이스 연산을 수행하는 클래스 또는 인터페이스를 말합니다. DAO 패턴은 데이터 액세스 로직과 비즈니스 로직을 분리하기 위해 사용됩니다. 이를 통해 데이터베이스 연산을 추상화하고, 다양한 데이터 소스(DBMS, 파일 시스템, 외부 서비스 등)에 대한 접근 방식을 일관되게 유지할 수 있습니다.
DAO의 주요 기능:
- CRUD Operations: 데이터베이스에서 Create, Read, Update, Delete와 같은 기본적인 데이터 조작 기능을 수행합니다.
- 검색 기능: 특정 조건에 맞는 데이터를 찾기 위한 검색 기능을 제공합니다.
- 연결 관리: 데이터베이스 연결을 관리하고, 성능 최적화를 위한 연결 풀링(pooling) 같은 기능을 담당할 수 있습니다.
DAO의 장점:
- 재사용성 및 유지보수성: 데이터 액세스 로직을 중앙화함으로써 코드의 재사용성을 높이고 유지보수를 용이하게 합니다.
- 분리 및 추상화: 비즈니스 로직과 데이터 액세스 로직을 분리함으로써, 시스템의 각 부분이 독립적으로 발전할 수 있도록 합니다. 데이터 소스가 변경되어도 비즈니스 로직에는 영향을 미치지 않습니다.
- 테스트 용이성: 비즈니스 로직과 데이터베이스 로직이 분리되어 있어, 데이터베이스에 의존하지 않는 단위 테스트가 용이합니다.
class UserDAO:
def __init__(self, db_connection):
self.db_connection = db_connection
def get_user_by_id(self, user_id):
# 데이터베이스 연결 및 SQL 쿼리 실행
cursor = self.db_connection.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
result = cursor.fetchone()
cursor.close()
return result
def add_user(self, user):
# 사용자 추가 로직
cursor = self.db_connection.cursor()
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", (user.name, user.email))
self.db_connection.commit()
cursor.close()
위의 예에서 UserDAO 클래스는 사용자 데이터에 대한 접근을 추상화합니다. 이 클래스를 사용함으로써, 데이터베이스 스키마나 쿼리 구문이 변경되어도 비즈니스 로직 코드를 수정할 필요가 없어집니다. DAO를 사용하는 이러한 접근 방식은 애플리케이션의 유연성과 확장성을 크게 향상시킵니다.
4.2 예외처리와 throws 키워드
예외 처리는 프로그램 실행 중에 발생할 수 있는 예외적인 상황을 처리하는 메커니즘입니다. 자바에서 예외 처리는 try, catch, finally, 그리고 throw 및 throws 키워드를 사용하여 수행됩니다.
throws 키워드
throws 키워드는 메서드 선언부에 사용되며, 해당 메서드에서 처리하지 않고 발생할 수 있는 예외를 호출자(caller)에게 전달할 의도를 명시적으로 선언하는 데 사용됩니다. 즉, 이 메서드를 사용하는 코드가 해당 예외를 처리해야 함을 의미합니다.
예외 처리를 하지 않고 예외를 전파하려는 경우 throws를 사용합니다. 이는 주로 현재 메서드에서 해당 예외를 적절히 처리할 수 없거나, 예외를 처리하는 것이 메서드의 책임이 아닌 경우에 사용됩니다.
public void readFile(String fileName) throws IOException {
// 파일을 읽는 코드
// IOException이 발생할 수 있으며, 이 메서드를 호출하는 곳에서 이를 처리해야 함
}
이 예시에서 readFile 메서드는 IOException을 던질 수 있음을 선언합니다. 따라서 이 메서드를 호출하는 코드는 이 예외를 처리하거나, 다시 throws를 사용하여 예외를 자신의 호출자에게 전파해야 합니다.
예외 처리의 중요성
예외 처리는 프로그램의 안정성과 신뢰성을 향상시킵니다. 적절한 예외 처리를 통해 예상치 못한 상황에서도 프로그램이 그 기능을 지속할 수 있도록 하고, 사용자나 다른 시스템에 유용한 오류 정보를 제공할 수 있습니다. throws 키워드는 이러한 예외 처리 전략의 일부로서, 예외를 더 상위 레벨로 전파하여 더 적절한 곳에서 처리될 수 있도록 합니다.
댓글