👋 Hello, I am Seung-ho Ham

🧑🏻‍💻 A Developers who create code that changes the world

전체 글 113

서비스 레이어란 무엇이고, 왜 필요한가?

아키텍처를 설계한 것을 보면서 어떤 api는 DB에 바로 접근하는 것을 볼 수 있었고, 어떤 api는 서비스 레이어를 거쳐 db에 접근하는 것이 있었다. 이를 통해 왜 서비스 레이어를 사용하는가에 대한 궁금증이 생겼다.  서비스 레이어란 무엇일까?서비스 레이어는 애플리케이션에서 비즈니스 로직(업무 규칙)을 처리하는 중간 계층이다. API 레이어는 요청과 응답만 처리하고, 서비스 레이어는 데이터 가공 및 검증 등 비즈니스 로직을 담당한다. 서비스 레이어가 없다면?서비스 레이어가 없으면 비즈니스 로직과 API 로직이 섞이게 된다.같은 로직이 반복되면 유지보수가 어려워지고, 로직이 복잡해지면 API 레이어가 비대해지며, 로직 수정 시 API 코드까지 수정해야한다. 원래는 API 레이어가 요청을 받아 비즈니스 ..

Development/APIs 2024.12.18

리눅스에서 YUM으로 패키지 설치 시 다른 레포지토리(repo)가 동작하는 이유

로키 리눅스에서 yum 명령어로 kong 패키지를 설치하는 과정에서 많은 kong패키지 뿐만 아니라 다른 많은 것들이 동작했던 이유가 궁금해서 찾아 보았다.  결론부터 말하자면 현재 시스템에 다양한 레포지토리( PostgreSQL, Grafana, InfluxData, Docker, Rocky Linux 기본 레포지토리 등)가 활성화되어 있었고 yum 명령은 패키지와 그 의존성을 설치하기 위해 시스템에 설정된 모든 활성화된 레포지토리를 확인하기 때문이다. 레포지토리(repo)레포지토리는 특정 소프트웨어와 의존성 패키지들이 저장된 중앙 서버 또는 로컬 디렉터리리눅스 운영체제는 레포지토리를 통해 소프트웨어를 관리함 RHEL/CentOS/Rocky는 yum과 dnf 패키지 관리자를 사용하여 패키지를 검색, ..

카테고리 없음 2024.12.17

가상화 없이 프로젝트 환경 구축 - HashiCorp Nomad를 활용한 대체 솔루션

프로젝트를 시작하며 가장 큰 제약 사항은 컨테이너 가상화 도구(Docker 등)를 사용할 수 없다는 점 원인은 보안상의 이유로 가상화를 원천 차단하는 프로그램이 실행되고 있었기 때문  HashiCorp사의 Nomad란?경량화된 오케스트레이션 도구로,Docker 같은 컨테이너뿐만 아니라 바이너리 파일, JAR, 파이썬 스크립트 등 다양한 작업을 배포하고 관리할 수 있음 - 컨테이너 가상화 없이도 작동할 수 있다는 점에서 적합한 선택 작동 원리서버 - 클라이언트1,2,3 ...서버가 중심이 되어 클라이언트들에게 작업(JOB)을 지시하고, 서버와 소통하며 리소스를 효율적으로 관리하고 장애에 빠른 대응을 함 여러가지 서비스(몽고디비 등)를 JOB Specification(작업정의)하여 HCL(HashiCorp ..

Devops 2024.12.16

HTTP 204 상태 코드 처리 오류

API에서 고객 데이터를 삭제하는 DELETE 요청을 처리하던 중, 데이터는 정상적으로 삭제되었지만 " Delete failed "라는 메시지만 반환되었음if code == 200: return {'message': 'Customer deleted successfully'}, 200else: return {'message': 'Delete failed'}, 500 MongoDB 응답 값을 출력해봤고, 삭제가 정상적으로 완료되었음에도 불구하고 204 상태 코드가 반환된다는 것을 확인DELETE 요청이 성공적으로 처리되었을 때 204 No Content도 반환될 수 있기 때문에, 이를 반영해 코드를 수정  HTTP 상태 코드 200 OK: 요청이 성공적으로 처리됐고, 일반적으로 반환할 데이터가 있..

Development/APIs 2024.09.20

고객 관리 프로젝트 구조 분석하기 - 각 Layer의 역할

DB - MongoDB / Framwork - Flaskapi-customer-manager├── common│ ├── conf│ │ ├── __init__.py│ │ ├── ConfigControl.py│ │ └── parser_toml.py│ ├── db│ │ ├── __init__.py│ │ ├── influxdb_interface.py│ │ ├── mongodb_control.py│ │ └── mongodb_interface.py│ └── system_protos│ ├── __init__.py│ ├── base_model.py│ ├── conv_time.py│ ├── datetime_calc.p..

Development/APIs 2024.09.12

고객 정보 CRUD api 구현

[진행 중인 작업]고객 정보 관리 API의 등록, 조회, 수정, 삭제 기능을 개발MongoDB의 데이터베이스와 연동하여 CRUD 기능을 구현하고 테스트 날짜 형식 변환 문제클라이언트와 서버 간 날짜 형식 불일치로 인해 "time data does not match format" 오류 발생 ISO 8601 형식(예: '%Y-%m-%dT%H:%M:%SZ')으로 일관되게 날짜를 파싱하고 변환하여 클라이언트와 서버 간의 형식 차이를 해결  Swagger 문서의 잘못된 필수 필드 설정Swagger 문서에서 필수 필드와 선택적 필드가 제대로 구분되지 않아 사용자가 모든 필드를 입력해야 하는 문제 발생 required 속성을 명확히 설정하여 필수 필드만 사용자가 입력하도록 변경  날짜 필드 자동 설정 문제 고객 등록..

Development/APIs 2024.09.11

BPMN을 활용한 고객 관리 프로세스 다이어그램 설계

BPMN (Business Process Model and Notation)을 활용하여 고객 관리 프로세스에 대한 다이어그램 설계 고객 등록, 로그인/로그아웃, 회원탈퇴, 개인정보 수정과 같은 기능이 포함 BPMN 다이어그램 설명1. 고객 시스템 접근 및 초기 선택고객 시스템 접근: 사용자가 시스템에 처음 접근하는 단계고객 행동 선택: 사용자가 고객 등록 또는 로그인 작업을 선택1-1. 고객 등록 프로세스고객 등록 요청: 고객이 시스템에 등록을 요청고객 정보 입력: 이름, 연락처, 이메일 등 필요한 정보를 입력필수 필드 검증: 서버가 필수 입력 필드의 유효성을 검증필드 검증 결과 - 검증 시 DB 접근유효한 경우: 비밀번호 해시 생성 후 고객 정보를 데이터베이스에 저장 - DB 접근누락된 경우: 에러 메..

Development/NoSQL 2024.09.09

MongoDB와 관계형 데이터베이스, 데이터 타입과 설계 방식의 차이

[궁금했던 내용들]1. ObjectId란 무엇인가?MongoDB에서 ObjectId는 각 문서를 고유하게 식별하기 위해 사용되는 데이터 타입입니다. 모든 문서는 _id 필드를 가지고 있으며, 기본적으로 이 필드에는 ObjectId가 할당됩니다. ObjectId는 12바이트 크기의 고유한 식별자로 다음과 같은 정보를 포함합니다4바이트: 유닉스 타임스탬프 (문서가 생성된 시간)5바이트: 머신 ID (서버를 식별)3바이트: 프로세스 ID (MongoDB 프로세스를 식별)3바이트: 자동 증가하는 카운터 (같은 초에 생성된 ObjectId를 구별)이러한 구조를 통해 ObjectId는 전 세계에서 고유성을 유지하며, 시간 정보도 포함하고 있어 언제 생성되었는지 확인할 수 있습니다. 2. 왜 ObjectId를 사용하..

Development/NoSQL 2024.09.06

리눅스 원격 연결 시 에러

문제 상황:리눅스 서버에 SSH로 원격 접속하려고 했음. 하지만 "Connection refused" 또는 "Timed out" 오류가 발생해서 접속할 수 없었음. 서버는 고정 IP로 설정되어 있었음.원인 찾기:고정 IP 주소 중복 설정: 네트워크에서 여러 장치가 동일한 고정 IP 주소를 사용하도록 설정되어 있었음.DHCP 서버 문제: DHCP 서버가 고유한 IP 주소를 각 장치에 제대로 할당하지 못하거나, IP 주소가 만료되지 않고 다른 장치에 재사용되었을 수 있었음.네트워크 설정 오류: 라우터나 스위치 등의 네트워크 장비 설정 오류로 IP 주소가 중복되었을 가능성이 있었음.해결하려고 시도했던 방법:기본 설정 확인:서버의 IP 주소와 포트 번호가 올바른지 확인했음.서버에 직접 접속해서 SSH 설정 파일..

Devops 2024.09.05

요구사항 정의서 작성

요구사항 정의서는 프로젝트에서 필요한 모든 요구사항을 명확하게 정의하고 문서화한 것 주로 소프트웨어 개발 프로젝트에서 많이 사용되며, 고객과 개발팀이 동일한 이해를 가지도록 돕는 중요한 문서  요구사항 정의서는 프로젝트의 방향을 정하고, 개발 과정에서 발생할 수 있는 혼란을 방지한다. 또한, 프로젝트가 완료된 후에도 고객이 원하는 결과물을 제공했는지 평가하는 기준이 된다.  요구사항 정의서에 포함되어야 할 내용요구사항 정의서에는 다음과 같은 항목이 포함되어야 합니다기능 요구사항: 시스템이 어떤 기능을 제공해야 하는지를 명확하게 정의비기능 요구사항: 시스템이 기능 외에도 갖춰야 할 특성, 예를 들어 성능, 보안, 확장성 등을 정의세부내용 및 요건: 각 요구사항이 어떻게 구현될지에 대한 구체적인 설명이 필요..

Development/NoSQL 2024.09.04

Windows, Linux 시스템 모니터링 설정 및 문제 해결

최근 Windows와 Linux 환경에서 Telegraf, InfluxDB, Grafana를 사용해 시스템 모니터링을 설정하는 작업을 수행하면서 다양한 문제를 겪었습니다. Windows와 Linux에서 Telegraf, InfluxDB, Grafana를 사용하여 시스템 모니터링을 설정하면서 겪은 문제들과 해결 방법   1. Telegraf Windows 서비스 설정 오류 해결 - sc.exe 명령어는 윈도우 파워쉘이 아닌 cmd창에 입력해야한다. (관리자 권한으로 명령 프롬프트 실행)- sc.exe delete "Telegraf" 로 기존 서비스 삭제 시에 삭제 반영까지 조금 걸린다.   2. InfluxDB에서 Windows와 Linux의 데이터를 구분하여 수집하기- Windows와 Linux에서 각각..

Devops 2024.09.02

Telegraf/Influxdb/Grafana 설정 오류

telegraf.conf 파일에서 잘못된 옵션을 사용하거나 누락된 설정으로 인해 오류가 발생.notepad .\telegraf.conf 로 conf 파일의 잘못된 옵션 수정기본적으로 사용 가능한 옵션들이 모두 작성되어있으며 사용할 것 외엔 주석 처리가 되어있었음주석 처리 되지 않은 옵션과 중복되지 않게 추가하여 주어야 하며, 필요한 옵션을 찾아 주석을 지워줘야함 InfluxDB에 데이터가 표시되지 않음Telegraf의 로그 파일을 확인하여 데이터 수집 및 전송 과정에서 오류가 발생했는지 확인하고, Telegraf를 테스트 모드로 실행하여 데이터가 제대로 수집되고 있는지 확인해야함telegraf --config telegraf.conf --test Grafana 대시보드에 데이터가 표시되지 않음Grafan..

Devops 2024.08.30

Telegraf, InfluxDB, Grafana를 활용한 Window/Linux 리소스 모니터링 구축

- Telegraf: 다양한 시스템 메트릭(CPU, 메모리, 디스크 사용량 등)을 수집하는 에이전트- InfluxDB: 시계열 데이터베이스로, Telegraf가 수집한 데이터를 저장- Grafana: InfluxDB에 저장된 데이터를 시각화하여 모니터링 대시보드를 구축하는 도구 설치 및 설정 과정 (Windows & Linux)1) Telegraf 설치 및 설정 (Windows)Telegraf 다운로드 및 설치# PowerShell에서 Telegraf 다운로드wget https://dl.influxdata.com/telegraf/releases/telegraf-1.31.2_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.31.2_windows_amd64...

Devops 2024.08.30

리눅스에서 HDD 마운트 및 자동 마운트 설정

1. 리눅스에서 추가 HDD 마운트하기리눅스 시스템에 새로운 HDD를 추가했을 때, 디스크를 사용하려면 먼저 파티션을 생성하고 파일 시스템을 만들어야 합니다. 그 후, 특정 디렉토리에 마운트하여 사용할 수 있습니다. 1-1. 파티션 생성새로운 HDD를 확인하고 파티션을 생성하기 위해 fdisk 명령어를 사용합니다.sudo fdisk /dev/sdbfdisk가 실행되면 다음 옵션을 사용하여 새로운 파티션을 만듭니다.n: 새 파티션 생성p: Primary 파티션 선택파티션 번호 지정 (예: 1)첫 번째 섹터와 마지막 섹터는 기본값을 사용합니다.w: 변경 사항을 저장하고 fdisk를 종료 1-2. 파일 시스템 생성새로 생성된 파티션 /dev/sdb1에 파일 시스템을 생성합니다.sudo mkfs.ext4 /de..

Devops 2024.08.28

MongoDB CRUD와 문법

MongoDB에서의 CRUD(Create, Read, Update, Delete) 작업은 데이터베이스에서 데이터를 삽입하고, 조회하고, 수정하고, 삭제하는 기본적인 작업을 말합니다.1. Document 입력 - insertOne, insertManyinsertOne: 한 개의 document(문서)를 생성합니다.insertMany: 여러 개의 document를 한 번에 생성합니다.// 하나의 문서를 추가 (insertOne)db.test_2.insertOne( { title: "MongoDB Guide", author: "Jane Doe", views: 100 })// 여러 개의 문서를 추가 (insertMany)db.test_2.insertMany([ { title: "Python Tutor..

Development/NoSQL 2024.08.27

MongoDB 기본 명령어와 비교,논리 연산자

데이터베이스 및 컬렉션 관리show dbs // 모든 데이터베이스 목록 보기use test // 특정 데이터베이스 사용 (없으면 생성)show collections // 현재 데이터베이스의 컬렉션 목록 보기db.stats() // 현재 데이터베이스의 통계 정보 확인db.dropDatabase() // 현재 데이터베이스 삭제db.test_2.drop() // 특정 컬렉션(test_2) 삭제db.createCollection("test_5", { capped: true, size: 1234, max: 100 }) // 새..

Development/NoSQL 2024.08.26

물류 로봇을 위한 경로 계획 알고리즘

자율주행 물류 로봇이 창고나 공장에서 효율적으로 움직이려면 경로 계획 알고리즘이 필수적입니다. 경로 계획 알고리즘은 로봇이 최적의 경로를 찾아 장애물을 피하면서 목표 지점에 도달하도록 도와줍니다. 이 과정은 Global 경로 계획과 Local 경로 계획으로 나눌 수 있습니다. 1. Global 경로 계획 알고리즘Global 경로 계획은 로봇이 전체 환경을 파악하고 출발점에서 목표 지점까지의 경로를 설계하는 과정입니다. 물류 로봇에서 자주 사용되는 Global 경로 계획 알고리즘은 다음과 같습니다A* 알고리즘: 이 알고리즘은 휴리스틱 함수를 사용해 최단 경로를 찾습니다. 정확하고 효율적인 경로를 제공하여 널리 사용됩니다.Dijkstra 알고리즘: A*와 비슷하지만, 휴리스틱을 사용하지 않고 출발점에서 모든..

Logistics Domain 2024.08.23

자율 주행 로봇의 핵심 기술 분석

자율 주행 로봇이란?자율 주행 로봇은 사람의 개입 없이 주어진 환경에서 스스로 경로를 탐색하고 장애물을 피하며 목표 지점으로 이동하는 로봇입니다. 이 로봇들은 다양한 센서와 알고리즘을 사용하여 주변 환경을 인식하고 주행 경로를 결정합니다.  1. 자율 주행 로봇의 위치 인식 기술자율 주행 로봇이 스스로 자신의 위치를 파악하는 기술에는 다양한 방법이 있습니다. 여기에는 다음과 같은 대표적인 기술이 포함됩니다 SLAM (Simultaneous Localization and Mapping): 로봇이 미지의 환경에서 실시간으로 자신의 위치를 인식하면서 동시에 환경의 지도를 만드는 기술입니다.GPS: 주로 실외에서 사용하는 위성 기반 위치 추적 시스템으로, 넓은 영역에서 정확한 위치 정보를 제공합니다.RFID 기..

Logistics Domain 2024.08.22
반응형