네트워크 인터페이스(Network Interface)란 컴퓨터나 라우터와 같은 장치가 외부 네트워크, 즉 인터넷과 연결될 수 있게 해주는 다리 같은 역할을 하는 것입니다. 이 다리는 두 가지 방식으로 존재할 수 있습니다:

  1. 하드웨어 (Hardware): 물리적으로 존재하는 장치, 예를 들어, 랜 카드나 와이파이 어댑터가 이에 해당합니다. 이 장치들은 컴퓨터에 꽂혀서 네트워크 케이블이나 무선 신호를 통해 인터넷에 연결됩니다.
  2. 소프트웨어 (Software): 가상적으로 존재하는 네트워크 인터페이스로, 프로그램에 의해 만들어집니다. 예를 들어, 가상 네트워크 어댑터가 이에 해당합니다. 이 소프트웨어는 물리적 장치 없이도 네트워크 기능을 수행할 수 있게 해줍니다.

정리하자면, 네트워크 인터페이스는 컴퓨터가 인터넷과 같은 외부 네트워크와 연결될 수 있도록 해주는 중요한 요소입니다. 하드웨어와 소프트웨어 두 가지 형태로 존재할 수 있으며, 각자 역할이 있습니다.

물리적 네트워크

이더넷 포트

이더넷 포트는 LAN 케이블을 사용하여 물리적 유선 연결을 제공합니다. 이것은 주로 데스크톱 컴퓨터, 노트북에 표준으로 구현되며, 이 포트를 통해 라우터와 모뎀에 직접 연결됩니다. 이더넷 연결은 안정적이고 빠른 인터넷 연결을 제공하며, 특히 대량의 데이터 전송이나 낮은 지연이 필요한 경우에 적합합니다.

Wi-Fi 어댑터

Wi-Fi 어댑터는 무선 연결을 통해 네트워크에 액세스하는 데 사용됩니다. 현대에서는 거의 모든 디바이스에는 Wi-Fi 기능이 내장되어 있어 특히 스마트폰이나 노트북 등에서 일반적. Wi-Fi는 구성이 비교적 간단하며 케이블이 필요없이 연결할 수 있는 이점이 있지만 유선 연결보다 속도와 신뢰성이 낮다는 약점도 있습니다.

기타 네트워크 하드웨어

이 외에도 Bluetooth 어댑터(주로 주변기기 연결에 사용) 및 모바일 데이터 연결(스마트폰 및 일부 노트북에서 사용)과 같은 다양한 네트워크 연결 옵션이 있습니다. 이들은 특정 용도와 상황에 맞게 선택됩니다.

논리적 네트워크

IP 주소

  • 정의: 네트워크에서 장치를 식별하는 고유한 숫자 레이블입니다.
  • 중요성: 장치 간의 정확한 통신 및 데이터 송수신에 필수.

서브넷 마스크

  • 목적: 네트워크 주소와 호스트 주소 부분을 구별하는 데 사용됩니다.
  • 네트워크 세분화: 네트워크를 더 작은 부분으로 분할하여 관리 및 보안을 향상시킵니다.

기본 게이트웨이

  • 역할: 로컬 네트워크 외부의 다른 네트워크 (일반적으로 인터넷)에 대한 액세스 포인트.
  • 중요성: 로컬 네트워크의 장치가 인터넷 및 기타 외부 네트워크에 액세스하는 데 필요합니다.

DNS 서버

  • 기능: 도메인 이름(예: www.example.com)을 IP 주소로 변환.
  • 사용자 경험: 웹 사이트에 대한 액세스를 쉽고 빠르게 할 수 있습니다.

DHCP

  • 총칭: Dynamic Host Configuration Protocol.
  • 기능: 네트워크의 장치에 IP 주소 및 기타 네트워크 정보를 자동으로 할당합니다.
  • 장점: 네트워크 관리를 단순화하고 수동 구성 오류를 줄입니다.

MAC 주소

  • 정의: 네트워크 인터페이스의 물리적 주소.
  • 중요성: 네트워크의 장치를 하드웨어 수준에서 식별합니다.

네트워크 인터페이스의 작동 원리

네트워크 인터페이스는 컴퓨터와 다른 장치가 네트워크에 연결하여 데이터를 주고받는 "입" 역할을 합니다.

  1. 데이터 수신
    • 네트워크로부터의 데이터(패킷)가 네트워크 인터페이스에 도착.
    • 물리적 인터페이스(예: 이더넷 포트)는 이러한 전기 또는 무선 신호를 수신하고 이를 디지털 데이터로 변환합니다.
    • 변환 된 데이터는 다음에 장치의 OS 또는 특정 애플리케이션에 의해 처리 대상이되도록 내부 네트워크 스택으로 전송된다.
  2. 데이터 처리
    • OS는 수신한 데이터를 적절한 애플리케이션으로 라우팅합니다. 예를 들어, 웹 브라우저, 메일 클라이언트, 파일 공유 시스템 등.
    • 데이터는 필요에 따라 추가로 처리되며 결국 사용자에게 표시되거나 파일로 저장됩니다.
  3. 데이터 전송
    • 데이터를 전송할 때, 애플리케이션은 데이터를 네트워크 스택에 저장한다.
    • 데이터는 패킷으로 분할되어 네트워크 인터페이스로 전송된다.
    • 네트워크 인터페이스는이 디지털 데이터를 전기 신호 또는 무선 신호로 변환하여 네트워크로 전송합니다.

결론

네트워크 인터페이스는 컴퓨터나 다른 장치가 네트워크에 연결하기 위한 포인트입니다. 이렇게 하면 장치가 네트워크를 통해 데이터를 송수신할 수 있습니다.

주요특징

  1. 물리적 및 논리적 인터페이스
    • 물리적 인터페이스: 하드웨어 장치(예: 이더넷 포트, Wi-Fi 어댑터).
    • 논리적 인터페이스: 소프트웨어를 통한 네트워크 연결 설정(예: IP 주소, 서브넷 마스크).
  2. 프로토콜 지원
    • 네트워크 인터페이스는 TCP/IP와 같은 네트워크 프로토콜을 지원합니다.
  3. 데이터 송수신
    • 데이터 패킷의 송수신을 실시해, 네트워크상에서의 커뮤니케이션을 가능하게 합니다.

용도

  • 인터넷 연결
  • 근거리 통신망(LAN)에 연결
  • 무선 통신(Wi-Fi, Bluetooth 등)

LAN과 WAN의 특징

    • LAN (Local Area Network)
    • : 제한된 범위, 예를 들어 오피스 빌딩, 학교, 가정 등의 소규모 지역 내 네트워크를 나타냅니다.
    • WAN (Wide Area Network)
    • : 도시, 국가 또는 국가를 가로 질러 광범위한 네트워크를 나타냅니다. 인터넷은 WAN의 예.정의와 범위
  1. 연결 방법
    • LAN
    • : 이더넷 케이블이나 Wi-Fi를 사용하여 장치를 연결하는 것이 일반적입니다.
    • WAN
    • : 일반적으로 전용 통신 회선, 위성 링크, 휴대 전화 네트워크 등을 사용하여 연결됩니다.
    그래서 LAN과 WAN의 차이점은?다만 명확하게 구별할 수 있다고 하면, 그것이 통신 사업자의 개재 유무입니다. 유선 케이블을 이용하여 도쿄와 오사카를 연결하는 경우, 기본적으로 통신 사업자가 개재합니다.
    • LAN과 WAN 모두 네트워크를 가리키는 용어
    • LAN과 WAN은 커버하는 영역의 크기가 다르다.
      • LAN(Local Area Network)
      • : 일반적으로 한 건물이나 캠퍼스 내와 같은 제한된 범위 내에서 네트워크를 가리킨다.
      • WAN (Wide Area Network)
      • : 광범위한 네트워크로 도시나 국가를 가로질러 접속된다 ※인터넷은 가장 광범위한 WAN의 예
    • WAN 구축에는 기본적으로 통신사업자가 개재한다
  2. 요약
    사실 대답은 명확하게 정해져 있지 않습니다. "어떤 범위에서 어느 범위까지가 LAN이고, 더 큰 경우 WAN"이라는 정의는 존재하지 않습니다. 이용되고 있는 기술이나 네트워크 범위의 넓이 등으로부터 종합적으로 판단 하고 있다는 것이 대답이 됩니다.

  • 유니캐스트: 하나의 특정 목적지
    • 예) 웹사이트 방문
  • 멀티캐스트: 여러 특정 대상
    • 예) 라이브 스트리밍 전송
  • 브로드캐스트: 네트워크의 모든 대상
    • 로컬 네트워크에서 모든 장치 검사
     

3가지 방법

이 세가지 통신 형식은 대상 수와 범위에 따라 구별됩니다.

유니캐스트는 네트워크에서 일대일 통신 형태를 가르킵니다. 일상 생활에서 인터넷을 이용할 때, 많은 통신이 유니캐스트를 기반으로 하고 있습니다.

  • 효율적
    • 특정 수신처로의 데이터 송신이 확실하게 행해지기 때문에 통신이 효율적임
  • 신뢰성
    • 일대일 통신이므로 데이터 송수신에 높은 신뢰성을 가짐

멀티 캐스트는 일대다 통신 형태를 말합니다. 이 통신 형태는 특정 수신자 그룹을 향해 데이터를 효율적으로 전달하는 기법으로서 특히 스트리밍 서비스에서 자주 사용됩니다.

  • 대역 효율
    • 복수의 수신자에게 동시에 데이터를 송신함으로써 네트워크의 대역을 효율적으로 이용할 수 있음
  • 자원 절약
    • 하나의 데이터 패킷을 많은 수신자에게 전달하기에 서버 및 네트워크 리소스의 사용을 최소화 할 수 있음

브로드캐스트는 네트워크에서 한 쌍의 전체 통신 형태를 가리킵니다. 하나의 소스 장치가 네트워크의 모든 장치에 데이터를 동시에 전송하는 방법입니다.

  • 대역 소비
    • 브로드캐스트는 네트워크상의 모든 디바이스에 정보를 전송하기 때문에 대역폭을 대량으로 소비할 수 있음
  • 네트워크 혼잡
    • 많은 양의 브로드 캐스트 통신이 발생하면 네트워크가 혼잡하여 성능이 저하 될 수 있음

'1일 1네트워크 > 제 1장: 네트워크의 기초' 카테고리의 다른 글

리피터 / 리피터 허브란?  (0) 2025.02.18
이더넷(Ethernet)이란?  (0) 2025.02.14
네트워크 인터페이스란?  (0) 2025.02.13
LAN과 WAN  (0) 2025.02.12
네트워크란 무엇인가?  (0) 2025.02.10

네트워크란 컴퓨터와 장치가 서로 연결되어 정보와 리소스를 공유할 수 있는 시스템을 의미

  • [네트워크] = 여러가지 기기가 서로 접속하여 통신하는 구조
  • 상호 통신을 위해서는 공통 규칙 필요
  • 인터넷은 세계 공통 규칙으로 운영되는 세계 최대 네트워크

역사 1: 네트워크가 성립한 배경

  • 컴퓨터가 등장한 초기에는 1대의 컴퓨터가 독립해 기능하고 있음
  • 컴퓨터가 발명되고 점점 더 많은 장면에서 데이터와 리소스 공유가 필요해짐

역사 2: APRANET 등장

  • 여러 대의 컴퓨터를 연결하여 원격지에서의 정보 공유 및 컴퓨터 자원 이용 목적
  • 패킷 교환이라는 통신 방식 확립

역사 3: 인터넷

  • 전 세계 컴퓨터 네트워크가 서로 연결되는 인터넷 탄생
  • 인터넷이라고 해도 결국 하나 하나의 디바이스가 상호 접속된 것

역사 4: 프로토콜

  • 전 세계적으로 컴퓨터와 장치가 통신하려면 장치가 서로 정해진 규칙에 따라 통신해야함
  • 이 때문에 세계 전체에서 통신 프로토콜 정의
  • 네트워크 엔지니어의 공부라면 이 통신 프로토콜의 학습하는 것

네트워크의 주요 구성 요소

프로토콜

TCP/IP · HTTP · FTP · DHCP · DNS 등 데이터 통신과 관련된 프로토콜을 이해한다.

 

네트워크 토폴로지

스타, 버스, 링, 메쉬, 트리 등 네트워크의 물리적 및 논리적 구조를 배웁니다.

 

네트워크 장치

중계기 , 스위치, 라우터 , 방화벽 , 액세스 포인트 등 네트워크 장치의 기능과 구성 방법을 습득합니다.

 

IP 주소 및 서브넷 마스크

IPv4 및 IPv6 주소 , 서브넷 마스크 , CIDR 표기법, 서브넷 분할 방법을 이해합니다.

 

DNS(Domain Name System)

DNS 메커니즘, A 레코드, CNAME 레코드, MX 레코드 등의 기본 레코드 유형을 배웁니다.

 

라우팅 프로토콜

OSPF , RIP , BGP 등의 라우팅 프로토콜의 기본 원리와 설정 방법을 습득한다.

 

네트워크 보안

방화벽, VPN, 암호화, 인증, IDS/IPS 등 네트워크 보안을 보장하기 위한 기술과 정책을 배웁니다.

 

무선 네트워크

Wi-Fi의 규격, 무선 주파수, 채널, 액세스 포인트, SSID, 암호화 방식(WPA2/WPA3) 등을 이해한다.

 

문제 해결

ping, traceroute, nslookup, Wireshark 등 네트워크 문제를 진단하고 해결하기 위한 도구와 방법을 습득한다.

 

네트워크 설계 및 관리

네트워크 아키텍처, 대역폭 관리, QoS, 트래픽 쉐이핑, 내결함성, 네트워크 모니터링 등 효율적이고 안정적인 네트워크 시

스템을 구축하고 유지하는 방법을 배웁니다.

 

정리

정의 : 디바이스끼리를 접속해, 데이터나 자원의 공유·교환을 하는 시스템.

통신 프로토콜 : TCP/IP: 인터넷의 기본 프로토콜입니다.

HTTP/HTTPS: 웹 페이지를 검색하는 데 사용됩니다.

FTP: 파일 전송을 위한 프로토콜.

SMTP, IMAP, POP3: 이메일 송수신과 관련된 프로토콜.

 

네트워크 유형 : LAN(Local Area Network): 소규모 범위(사무실 및 가정)의 네트워크.

WAN (Wide Area Network) : 대규모 범위 (도시와 국가 간)를 연결하는 네트워크.

useState vs useSWR vs Redux

1. useState

  • 장점
    • 간단한 로컬 상태 관리
    • 별도 설정 없이 사용 가능
    • 컴포넌트 내부 상태 관리에 최적
  • 단점
    • 복잡한 상태 관리에 부적합
    • 상태 공유가 어려움
    • 전역 상태 관리 불가

2. useSWR

  • 특징
    • 데이터 페칭과 캐싱에 특화된 훅
    • 실시간 데이터 동기화
    • 자동 재검증 및 캐시 관리
  • 장점
    • 간편한 데이터 로딩 상태 관리
    • 캐시 및 재검증 기능
    • 성능 최적화
  • 단점
    • 주로 원격 데이터 페칭에 특화
    • 복잡한 상태 관리에는 부적합

3. Redux

  • 장점
    • 복잡한 전역 상태 관리
    • 상태 변경의 예측 가능성
    • 디버깅 용이
    • 미들웨어 지원
  • 단점
    • 보일러플레이트 코드 많음
    • 초기 설정 복잡
    • 상대적으로 학습 난이도 높음

사용 추천 상황

  1. useState:
    • 간단한 컴포넌트 내 상태 관리
    • 소규모 프로젝트
  2. useSWR:
    • 데이터 페칭이 주요 관심사
    • 실시간 데이터 동기화 필요
    • API 요청 최적화
  3. Redux:
    • 대규모 애플리케이션
    • 복잡한 상태 관리
    • 상태 추적과 디버깅 필요
    • 여러 컴포넌트 간 상태 공유

결론

상황과 요구사항에 따라 적절한 상태 관리 방식을 선택하는 것이 중요합니다. 각 방식은 고유의 장단점을 가지고 있어 프로젝트의 특성을 고려해야 합니다.

한줄평 : 7.0 / '사실 너는 이미 가지고 있어' 라고 말해주는 동화. 100년전 책이지만 예상치 못한 문제해결하는 방법이 기억에 남는다.

 

새로 가입한 독서모임에서 책을 '오즈의 마법사'로 선정했다.

밀리의 서재에 있길래 출퇴근 시간에 가볍게 읽으며

동화로 읽었던 '오즈의 마법사'와 무엇이 다른지 궁금해하며 읽었다.

 

결론은 크게 다르지 않았다고 생각한다.

길을 가다가 허수아비, 양철 나무꾼, 사자를 만났고

앞으로 벌어지는 문제를 해결하고 집으로 돌아간다.

 

각자 자신만의 소원을 이루기 위해 오즈의 마법사가 있는 곳으로

다 함께 모험을 떠나며 여러 가지 문제를 맞닥트린다.

 

그 과정을 보면서 나는 계속 똑같은 생각이 들었다.

'문제를 해결하는 아이디어를 계속 내는 허수아비는 왜 자신은 멍청하니까 뇌가 필요하다 할까?'

'남들을 생각하는 따뜻한 심장을 가지고 싶은 양철 나무꾼이 가장 여려 보이네'

'자신이 겁쟁이라는 사자가 무서운 적이 나타나면 가장 앞장서서 친구를 지켜주는구나'

 

그리고 오즈가 조건으로 걸었던 문제를 해결하면

모두 소원을 이루어주기로 했다.

도로시 일행은 문제를 해결했고 보상을 받을 때

사실 사기꾼이었던 오즈는

대충 형식적으로 만든 뇌와 심장을 허수아비와 양철 나무꾼에게 넣어주었고,

사자에게는 용기가 생기는 녹색 액체를 주었다.

 

모두 거짓말이지만 오즈의 일행들은 모두 진실이라 믿으니까

더욱 지혜롭고, 감정을 느끼며, 용감해진 기분으로 기뻐했다.

이걸 보며 '플라시보 효과'를 제대로 느끼는 구나~ 라는 생각이 들었다.

 

도파민에 절어있는 나는 동화가 아닌 오즈의 마법사는 어떤 잔학성과 선정성이 나오고,
동화에서 알 수 없었던 해결 방법이 나올 거라 기대했지만
'사실 모두 네가 가지고 있던 거야!'라는 뻔한 스토리는 아쉬웠다.
그렇지만 뻔한 교훈과 해피엔딩은 나쁘지 않았달까?

 


 

오즈의 마법사 독후감

1. 개요

「오즈의 마법사(The Wonderful Wizard of Oz)」는 1900년 출간된 라이먼 프랭크 바움(L. Frank Baum)의 대표적인 아동 판타지 소설입니다. 이 작품은 캔자스의 소녀 도로시가 회오리바람에 휩쓸려 오즈의 나라로 가게 되면서 벌어지는 모험을 그린 이야기로, 미국 문학의 고전으로 자리잡았습니다. 이 책은 후에 1939년 주디 갈랜드 주연의 영화로 제작되어 더욱 유명해졌습니다.

2. 작가 소개

라이먼 프랭크 바움(1856-1919)은 미국의 소설가이자 아동 문학 작가입니다. 그는 뉴욕주에서 태어나 여러 직업을 거친 후 아동 문학에 뛰어들었습니다. 「오즈의 마법사」는 그의 가장 성공적인 작품으로, 이후 오즈 시리즈로 13권의 속편을 출간했습니다. 바움은 당시 아동 문학의 교훈적이고 무거운 톤에서 벗어나 상상력과 재미를 중시하는 새로운 스타일의 판타지를 개척했다는 평가를 받습니다.

3. 등장인물

  • 도로시 게일: 캔자스에 사는 소녀로, 회오리바람에 휩쓸려 오즈의 나라에 도착합니다. 용기와 따뜻한 마음을 지닌 인물입니다.
  • 토토: 도로시의 반려견으로, 그녀의 여정을 함께합니다.
  • 허수아비: 뇌를 얻기 위해 도로시와 동행하는 캐릭터로, 사실은 이미 지혜를 갖고 있습니다.
  • 양철 나무꾼: 심장을 얻기 위해 여행에 합류하지만, 이미 가장 따뜻한 마음을 지니고 있습니다.
  • 겁쟁이 사자: 용기를 찾아 함께 여행하지만, 위기 상황에서 진정한 용기를 보여줍니다.
  • 오즈의 마법사: 에메랄드 시티의 통치자로 알려진 인물로, 사실은 속임수로 사람들을 다스리는 평범한 사람입니다.
  • 동쪽/서쪽의 악한 마녀: 악의 세력을 대표하는 인물들입니다.
  • 북쪽/남쪽의 착한 마녀: 도로시를 돕는 선한 마녀들입니다.

4. 줄거리 요약

캔자스의 농장에 살던 소녀 도로시는 회오리바람에 휩쓸려 반려견 토토와 함께 신비한 오즈의 나라로 떨어집니다. 그녀의 집은 착륙하면서 서쪽의 악한 마녀를 깔아 죽이게 되고, 이로 인해 도로시는 북쪽의 착한 마녀 글린다로부터 죽은 마녀의 마법의 은구두를 받게 됩니다.

고향으로 돌아가길 원하는 도로시는 글린다의 조언에 따라 에메랄드 시티에 사는 오즈의 마법사를 찾아가기로 결심합니다. 여정 중에 도로시는 뇌를 원하는 허수아비, 심장을 원하는 양철 나무꾼, 용기를 원하는 겁쟁이 사자를 만나 함께 여행하게 됩니다.

에메랄드 시티에 도착한 일행은 오즈의 마법사를 만나지만, 마법사는 서쪽의 악한 마녀를 물리쳐야만 그들의 소원을 들어주겠다고 합니다. 도로시 일행은 마녀를 찾아가지만, 우연히 도로시가 물을 뿌리면서 마녀가 녹아 사라지게 됩니다.

임무를 완수하고 돌아온 일행은 오즈가 사실은 마법사가 아닌 속임수로 사람들을 다스리는 평범한 사람임을 알게 됩니다. 그럼에도 오즈는 허수아비에게는 밀짚 대신 핀과 바늘로 채운 뇌를, 양철 나무꾼에게는 천으로 만든 심장을, 사자에게는 용기의 물약을 주어 그들의 소원을 이루어줍니다.

도로시를 위해 오즈는 열기구를 준비하지만, 토토를 쫓아가던 도로시는 열기구를 타지 못하게 됩니다. 결국 도로시는 글린다의 도움으로 은구두의 마법을 이용해 토토와 함께 캔자스의 집으로 돌아가게 됩니다.

5. 책을 통해 생각해볼 점

「오즈의 마법사」는 단순한 아동 판타지 소설을 넘어서 깊은 메시지를 담고 있습니다.

첫째, 이 작품은 자신이 원하는 것이 사실은 이미 자신 안에 있다는 깨달음을 전합니다. 허수아비는 뇌를 원했지만 이미 지혜로웠고, 양철 나무꾼은 심장을 원했지만 이미 따뜻한 감정을 지니고 있었으며, 사자는 용기를 원했지만 위기 상황에서 진정한 용기를 보여주었습니다.

둘째, 겉모습과 실체의 차이에 대해 생각해볼 수 있습니다. 오즈의 마법사는 강력한 마법사로 알려졌지만 사실은 속임수를 쓰는 평범한 사람이었습니다. 이는 권위와 권력의 실체에 대한 통찰을 제공합니다.

셋째, 도로시가 고향을 그리워하는 모습은 '집'의 의미와 가치에 대해 생각하게 합니다. 화려한 에메랄드 시티보다 소박한 캔자스의 농장을 그리워하는 도로시의 모습은 가정과 소속감의 중요성을 일깨웁니다.

마지막으로, 이 작품은 협력과 우정의 가치를 보여줍니다. 서로 다른 목표를 가진 등장인물들이 함께 여행하며 서로를 돕고 결국 각자의 소원을 이루는 과정은 다양성을 존중하고 협력하는 공동체의 모습을 보여줍니다.

「오즈의 마법사」는 100년이 넘는 세월 동안 사랑받아온 고전으로, 시대를 초월한 보편적 가치와 메시지를 담고 있는 작품입니다. 화려한 판타지 세계를 배경으로 하지만, 결국은 인간의 내면과 관계에 대한 이야기를 전하고 있습니다.

'독후감' 카테고리의 다른 글

[독후감] 고도를 기다리며  (3) 2025.02.28
[독후감] 그리스인 조르바  (3) 2024.08.30
생체리듬의 중요성: 시간 제한 다이어트  (1) 2024.08.20

Next.js와 HeidiSQL을 사용하여 파일 첨부 및 데이터베이스 저장하는 방법

파일 저장 접근 방법

파일을 데이터베이스에 저장하는 방법은 주로 두 가지가 있습니다

1. BLOB 데이터 타입 사용
2. 파일 경로 저장 및 실제 파일은 서버에 저장

BLOB 데이터 타입을 사용한 직접 저장 방법
1. 데이터베이스 테이블 구조 설정


CREATE TABLE uploaded_files (
    id INT AUTO_INCREMENT PRIMARY KEY,
    filename VARCHAR(255),
    file_data LONGBLOB,
    file_type VARCHAR(100),
    uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);




2. Next.js API 라우트 구현

import { NextApiRequest, NextApiResponse } from 'next';
import mysql from 'mysql2/promise';

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    if (req.method === 'POST') {
        try {
            // 데이터베이스 연결 설정
            const connection = await mysql.createConnection({
                host: 'localhost',
                user: 'your_username',
                password: 'your_password',
                database: 'your_database'
            });

            // 파일 데이터 추출 (multipart/form-data 사용 가정)
            const { originalFilename, mimetype, buffer } = req.body;

            // 파일을 데이터베이스에 저장하는 쿼리
            const [result] = await connection.execute(
                'INSERT INTO uploaded_files (filename, file_data, file_type) VALUES (?, ?, ?)',
                [originalFilename, buffer, mimetype]
            );

            await connection.end();

            res.status(200).json({ message: '파일 업로드 성공', fileId: result.insertId });
        } catch (error) {
            res.status(500).json({ message: '파일 업로드 실패', error: error.message });
        }
    } else {
        res.status(405).json({ message: '허용되지 않은 메서드' });
    }
}


주의사항

1. 파일 크기 제한: BLOB 타입은 큰 파일을 저장할 수 있지만, 성능과 데이터베이스 용량에 영향을 줄 수 있습니다.

2.보안  
   - 파일 업로드 시 파일 유형, 크기 제한
   - 악성 파일 검사
   - 인증/권한 확인

3. 대안적 접근
   - 파일은 서버나 클라우드 스토리지에 저장
   - 데이터베이스에는 파일 경로만 저장

파일 업로드 프론트엔드 예시

import { useState } from 'react';
import axios from 'axios';

export default function FileUpload() {
    const [selectedFile, setSelectedFile] = useState<File | null>(null);

    const handleFileUpload = async () => {
        if (!selectedFile) return;

        const formData = new FormData();
        formData.append('file', selectedFile);

        try {
            const response = await axios.post('/api/upload', formData, {
                headers: { 'Content-Type': 'multipart/form-data' }
            });
            console.log('파일 업로드 성공:', response.data);
        } catch (error) {
            console.error('파일 업로드 실패:', error);
        }
    };

    return (
        <div>
            <input 
                type="file" 
                onChange={(e) => setSelectedFile(e.target.files?.[0] || null)}
            />
            <button onClick={handleFileUpload}>업로드</button>
        </div>
    );
}




추천 패키지
- 파일 업로드: `multer`, `formidable`
- 데이터베이스 연결: `mysql2`

이 방법은 파일을 직접 MySQL 데이터베이스에 BLOB 형태로 저장하는 방법입니다. 대용량 파일이나 많은 파일을 다룰 경우 파일 시스템이나 클라우드 스토리지를 고려하는 것이 좋습니다.

'코딩공부 > Next.js' 카테고리의 다른 글

[Next.js] URL: 쿼리파라미터와 동적라우팅 방식  (0) 2025.03.05
Next.js의 오류처리  (4) 2024.10.31
Next.js의 Layout과 Template  (1) 2024.10.31

서버 컴포넌트와 클라이언트 컴포넌트는 React의 새로운 기능이라, 많은 타사 패키지들이 아직 "use client" 지시어를 추가하지 않은 상태예요. "useState", "useEffect", "createContext"와 같은 클라이언트 전용 기능을 사용하는 컴포넌트들은 클라이언트 컴포넌트 안에서만 작동하고, 서버 컴포넌트에서는 작동하지 않아요.

예시

acme-carousel이라는 패키지를 설치했다고 가정해봐요. 이 패키지에는 <Carousel /> 컴포넌트가 있어요. 이 컴포넌트는 useState를 사용하지만 아직 "use client" 지시어가 없어요.

  • 클라이언트 컴포넌트 내에서 사용
'use client';
import { useState } from 'react';
import { Carousel } from 'acme-carousel';

export default function Gallery() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setIsOpen(true)}>View pictures</button>
      {/* Carousel을 클라이언트 컴포넌트 내에서 사용하기 때문에 작동해요 */}
      {isOpen && <Carousel />}
    </div>
  );
}

 

  • 서버 컴포넌트 내에서 사용
  • Next.js는 <Carousel />이 클라이언트 전용 기능을 사용하고 있다는 걸 알 수 없기 때문에 에러가 발생해요.
import { Carousel } from 'acme-carousel';

export default function Page() {
  return (
    <div>
      <p>View pictures</p>
      {/* 에러 발생: `useState`는 서버 컴포넌트 내에서 사용할 수 없어요 */}
      <Carousel />
    </div>
  );
}

해결 방법

서버 컴포넌트 안에서 사용할 수 있도록 클라이언트 컴포넌트를 감싸는 방법이 있어요:

1. 클라이언트 컴포넌트를 감싸기

'use client';
import { Carousel } from 'acme-carousel';
export default Carousel;`

2. 서버 컴포넌트 내에서 사용

 

import Carousel from './carousel';

export default function Page() {
	return ( 
    <div> <p>View pictures</p>     {/* 이제 Carousel을 서버 컴포넌트 내에서 사용할 수 있어요 */}
    <Carousel />
    </div> );
    }

 

일반적으로 대부분의 타사 컴포넌트는 클라이언트 컴포넌트 내에서 사용될 것이기 때문에, 특별한 처리가 필요 없을 거예요. 그러나 React 상태와 컨텍스트를 사용하는 제공자(provider)는 예외로, 애플리케이션의 루트에서 필요할 수 있어요.

+ Recent posts