[인공지능사관학교: 자연어분석A반] 기업연계 프로젝트 10일차

Suhyeon Lee·2025년 10월 17일

기획 발표 진행

  • 발표 후 들어온 질문 정리 & 내가 한 답변 기록정리 & 내가 한 답변 기록
    1. 서비스는 QR 코드로만 접근 가능한지?
      • QR 코드 자체가 링크로 연결되는 거라 QR 코드 외의 방식으로도 접근 가능하게 만들 수는 있음
    2. 챗봇이 이미지, 동영상을 제공하는지? 그냥 검색하는 것과 차이를 모르겠다.
      • 프로젝트 목표가 "자연어로 설명"하는 것이기 때문에 이미지, 동영상을 보여주는 건 고려하지 않았음
      • 단, PDF 안에 있는 이미지에 대해 자연어로 설명할 수 있게 구현할 예정이고 그렇기 때문에 단순 검색과 구별된다고 말할 수 있음

네이버 클라우드 특강

GPU 서버 사용-PPT

목표
1 디지털 전환을 위한 기술 습득
2 클라우드, AI 기술 습득

디지털 전환(Digital Transformation, DX) 시대

  • 정보통신기술(ICT)을 적용해 기존의 전통적 구조를 디지털 구조로 전환하는 과정
    • 사물인터넷(IoT), AI, 클라우드 컴퓨팅, 빅데이터 솔루션 등을 플랫폼으로 활용하여 전통적인 운영 방식과 서비스 등을 혁신하는 것을 의미함

클라우드 시장 점유율

  • 국내 CSP(Cloud Service Provider, 클라우드 서비스 공급자)
    • 네이버 클라우드: 20.5%
      • 국산 CSP 중 1위
      • 일반 기업 + 공공기관 모두 가능
      • 보안인증제도 (CSAP) 취득 → 공공기관 클라우드 서비스 가능
  • 해외 CSP의 국내 점유율
    • AWS: 60.2%
    • Microsoft Azure: 24%
    • 해외 CSP의 경우 일반 기업

네이버 클라우드 사용 서비스

  1. 개인
  2. GPU 서버 제공
    • [Server 서비스]
  3. 생성형 AI
    • [CLOVA Studio]
  4. AI 서비스
    • Chatbot, OCR 등

GPU 서버 제공

  • E-Commers, Retail(소규모)
    • Load Balance
    • Security Monitorinig
      • IDS/IPS
    • Object Storage
      • On-Premise와 클라우드의 가장 큰 차이점: 스토리지가 외부로 분리되어 있음
  • 12개 서브넷 기준 네트워크
    • AWS와 달리 별도로 Load Balancer, NAT(나트) 생성해야 함
      • NAT: 사설 IP들이 외부로 소통하기 위한 것. 공유기 생각하면 됨. (나갈 때 쓰는 거). 네트워크 주소를 변환
      • Load Balancer: 들어올 때 씀
    • 구성
      • 데이터센터 이중화를 위해 두 개씩 사용함
        • 네이버에서는 C클래스 16개(/20)를 기준으로 나눠야 한다는 것만 공식적으로 말함
      • 실무적으로 위와 같이 사용(공식 문서까지는 아니지만 다들 이렇게 씀)
  • Public Subnet
  • Private Subnet
    • 모든 서버는 private에 놓아야 함: 보안 문제
    • 외부와의 연결이 어려움 → Load Balance를 통해 외부에서 들어올 수 있음
      • 외부와의 소통은 "공인 IP"
      • 서버는 모두 다 사설 IP → /23 부여: 서버를 가장 많이 생성해야 하기 때문
  • Pri-DB Subnet
    • 외부로 통신되면 안 됨: 고립되어 있어야 함
    • WAS Server와만 통신 → 비즈니스 로직 처리
    • 보안 그룹/방화벽
  • Public NAT Subnet
    • 연동 시 NAT Server 공인 IP를 둘 다 알려줘야 함(Pub-NAT1, Pub-NAT2)

AWS와의 비교

IP 수량 확인

  • 서버는 253개 할당 가능
    • 네트워크/브로드캐스트/게이트웨이 빼야 해서
  • 클라우드에서는 ip가 총 5개 빠져서 6번부터 시작함

실습

  • 명명법
    • 이름에 dev → 개발, prd → 서비스(상용 서비스)
  • 네트워크 액세스 제어 리스트(Network Access Control List)
    • 차단/허용 관리
    • 적용 기준: 서브넷 단위
    • 기본 설정 없음
  • ACG(보안 그룹): 서버 NIC(Network Interface Card; 랜카드) 단위로 할당됨
    • 허용 관리
    • 기본 설정 있음: 0.0.0.0/0(anywhere) → 보안 취약하므로 꼭 수정해야 함
      • 22번 포트: SSH(Secure Shell) 프로토콜을 위한 기본 포트 → 리눅스 서버/PuTTY 접속
      • 3389번 포트: 원격 데스크톱 프로토콜(RDP)을 위한 기본 포트 → 윈도우 서버
  • Outbound 규칙
    • ping
    • TCP(전송 조절 프로토콜)
  • 웹 서버 홈페이지가 안 뜬다면
    • 데몬 확인
    • 보안 열어주기
  • DB 서버(MySQL)
    • ACG에서3306 포트 열어야 함(오라클은 1521)
      • 기본은 deny
  • init script

우분투보다 로키를 더 많이 쓰시던데 로키가 우분투에 비해서 더 이점이 있는 건가요?

  • private load balancer는 쿠버네티스(Kubernetes) 할 때 씀

다른 반 수강자 분이 네이버 클라우드 서버 생성&정지 공부 차원에서 영상(10분)을 제작하셨다고 함
https://www.youtube.com/watch?v=M66zflrf-z8&t=3s

실습 관련 자료


정보처리기사 실기

기출문제: 숫자↔문자

#include <stdio.h> // (a)

int main() { // (b)
    char* p = "KOREA";
    printf("%s\n", p);        // (1)
    printf("%s\n", p+1);      // (2)
    printf("%c\n", *p);       // (3)
    printf("%c\n", *(p+3));   // (4)
    printf("%c\n", *p+4);   // (5)
    return 0;
}

(0) #include <stdio.h>: 표준 입출력 함수를 쓰기 위한 헤더 선언

  • C언어에서 표준 입출력 기능을 사용하도록 해주는 명령문
  • #include
    • 프로그램에서 특정 파일의 내용을 불러와 쓸 수 있게 해주는 역할
  • <stdio.h>
    • 표준 입력(키보드 등)과 표준 출력(모니터 등)과 관련된 함수(예: printf, scanf)들이 들어있는 파일 이름임
    • "standard input output header file"의 약자
  • #include <stdio.h>를 맨 위에 써야 printf, scanf 같은 입출력 함수를 자유롭게 쓸 수 있음
    (printf, scanf 등 화면에 글자를 출력하거나 입력 받을 때 반드시 필요)
    • 없는 경우, 컴퓨터가 printf 함수가 뭔지 모르기 때문에 printf를 썼을 때 오류 발생
      (함수를 알 수 없다고 나옴)

(b) int main() {...}: 프로그램 실행의 시작점을 만듦

  • C 프로그램은 반드시 main 함수를 포함해야 함
    • main 함수는 운영체제가 프로그램 실행 시 가장 먼저 호출하는 함수
    • main 함수가 없으면 컴파일은 가능할 수 있으나, 실행 시 어떤 부분부터 실행해야 할지 알 수 없으므로 오류 발생
      • 글로벌(전역) 변수 선언은 main 밖에 할 수 있지만, printf 함수 호출문처럼 실행되는 코드(실행 코드 줄)는 반드시 함수 내부여야 하고 보통은 main 함수 안에 넣음

각 printf가 출력하는 값

  • printf는 print formatted의 약자임
    • '프린트에프'라고 읽는다
    • 서식 지정자(format specifier)를 활용해 데이터를 원하는 모양으로 출력하는 C언어의 표준 출력 함수

(1) printf("%s\n", p);

  • "KOREA" 전체 문자열을 출력
  • 이유
    • 포인터 p가 "KOREA"의 첫 글자를 가리킴
    • %s는 해당 주소부터 null 문자('\0')까지 출력
      • 그래서 %s로 문자열을 출력하면 전체 문자열이 나옴

(2) printf("%s\n", p+1);

  • "OREA"를 출력
  • 이유
    • p+1은 문자열의 두 번째 문자를 가리킴

(3) printf("%s\n", *p);

  • 'K'를 출력
  • 이유
    • *p는 "KOREA"의 첫 문자(K)를 의미
    • %c는 인자로 전달된 값 하나만 문자로 출력
      • 주로 문자 하나(char) 혹은 해당 주소를 역참조한 값(*p)에 사용

(4) printf("%s\n", *(p+3));

  • 'K'를 출력
  • 이유
    • p+3은 "KOREA"에서 4번째 문자를 가리킴
      • 0부터 세면 K(0), O(1), R(2), E(3)

(5) printf("%s\n", *p+4);

  • 'O'를 출력
  • 이유
    • *p + 4는 'K'의 ASCII 코드에 4를 더한 값
      • K'의 ASCII는 75
      • 75 + 4 = 79
      • ASCII 79에 해당하는 문자는 바로 'O'
표현동작 원리결과
printf("%c\n", *(p+4));p의 4번째 위치에 있는 문자 출력 (즉 'A')'A'
printf("%c\n", *p+4);*p(첫글자)의 ASCII 코드에 4 더한 값의 문자 출력'O'

*p+4는 글자 문자 코드값에 4를 더한 것이고 *(p+4)는 포인터가 4칸 움직인 후의 글자를 선택하는 것

핵심 포인트와 원리

  • 문자열과 포인터
    • "KOREA"는 메모리에 K O R E A '\0'로 저장됨
      • 문자열 상수 저장 구조: 마지막에 항상 \0이 있다!
    • char* p = "KOREA";에서 p는 'K'의 주소를 가리킴
  • 포인터 산술
    • p+n은 n번째 문자의 주소를 의미
    • *(p+n)은 n번째 문자의 을 의미
  • %s%c의 차이
    • %s는 해당 위치부터 null까지의 문자열 전체
    • %c는 딱 한 글자만 출력

포인터(pointer)

  • C 언어 등에서 변수의 메모리 '주소값'을 저장하는 변수
    • 어떤 변수의 값이 아니라, 그 값이 저장된 메모리 위치를 기억하는 것이 포인터임
      • 변수는 값(예: 5, 3.14, 'A')를 저장
      • 포인터는 '그 값이 저장된 장소의 주소'를 저장
#include <stdio.h>

int main() {
    int a = 5;      // a라는 변수에 5 저장
    int *p = &a;    // p는 a의 주소를 저장하는 포인터(p points to a)
    // &: 주소 연산자
    printf("%d\n", *p);   // *p는 a가 가리키는 값(5)을 출력: 포인터의 역참조(dereference)
    return 0;
}
  • p는 "a가 저장된 메모리 주소"를 갖고 있고, *p는 "그 주소에 저장된 값", 즉 5를 가리킴
    • &a : 변수 a의 메모리 주소
    • int *p : 정수형 변수의 주소를 담을 수 있는 포인터 변수 선언
  • *을 꼭 써야 하는 이유
    • "p가 int 값이 아니라, int 값을 저장하는 주소를 담는 변수라는 뜻"을 알려주기 때문
  • 비교: int p = &a; vs int *p = &a;
    • int p = &a;
      • p의 타입이 그냥 int임 → 주소(보통 큰 숫자)를 그냥 정수 변수에 저장하는 격
      • 제대로 된 포인터 연산이 안 되고, 메모리 접근 오류가 날 수 있음
    • int *p = &a;
      • p는 "int 값을 저장하는 공간의 주소"를 저장하는 포인터 타입임
      • 이 선언 덕분에 *p처럼 p가 가리키는 곳의 값을 읽거나 쓸 수 있게 됨

int *p;는 "int형 변수를 가리키는 포인터 타입"
char *q;는 "char형 변수를 가리키는 포인터 타입"
float *r;는 "float형 변수를 가리키는 포인터 타입"

  • C언어에서 *는 "이 변수는 포인터!"라고 알려주는 신호
    • 포인터를 쓰면 컴파일러가 타입에 따라 메모리 접근(4바이트, 8바이트 등)을 올바르게 처리
    • 예시
      • int a = 5; 선언 후 int *p = &a;라고 하면 p는 "a의 주소"라는 정수값을 담고 있고, *p(역참조, 간접참조)는 그 주소가 가리키는 실제 값(여기선 5)를 가져옴
    • 포인터 변수 자체에 저장된 "주소값"을 보고 싶을 때
      • printf("%p\n", p); // p에 저장된 주소값 출력 (16진수)
        %p : 주소값을 16진수로 안전하게 출력
      • printf("%d\n", p); // p에 저장된 주소값 출력 (10진수, 권장X)
        %d : 10진수로 출력하지만, 시스템/컴파일러마다 제대로 보장되지 않을 수 있어 권장되지 않음
  • 포인터를 사용하는 이유
    • 포인터는 변수나 함수의 주소를 직접 가리키기 때문에, 다음과 같은 상황에서 유용
      • 여러 값의 주소를 전달하는 함수 인자
      • 동적 메모리 할당 (malloc, free 등)
      • 배열/문자열 조작
      • 참조 변수(값 변경 목적)
위치*의 의미예시설명
선언부포인터 타입 선언int *p;p는 int형 변수를 가리키는 포인터임을 선언
실행문포인터 역참조 연산 (값 접근)*p 또는 printf("%d", *p);p가 가리키는 주소에서 값을 읽어옴

*가 사용되는 문맥에 따라 의미가 달라지며, 이를 제대로 구별하는 것이 C포인터 이해의 핵심

  • 왜 '역참조(dereference)'라고 할까?
    • 포인터가 가리키는 메모리 위치로 가서 값을 취하는 것이기 때문
    • p가 변수 a의 메모리 주소를 저장한 포인터라면 *p는 그 주소에 저장된 실제 값을 읽어오는 연산임
  • 추가: 포인터 선언 시 asterisk(*)의 위치
    • 위치는 문법적으로 아무런 차이가 없음: 아래 세 가지 모두 ptr이 'int형 데이터를 가리키는 포인터 변수'라는 뜻으로 동작
      • int *ptr;
      • int* ptr;
      • int * ptr;
    • 단, 여러 개의 포인터 변수를 한 번에 선언할 때는 주의가 필요
      int* a, b;    // a는 포인터, b는 일반 int 변수
      int *a, *b;   // a, b 모두 포인터
      • 각각의 변수 앞에 명확히 붙여주는 것이 가장 좋다
      • 자료형(int, char 등)과 *가 결합 → "이 타입의 데이터를 가리키는 포인터"
      • 변수명 바로 앞의 *가 붙어서 포인터 타입임을 명시
      • 여러 변수는 각 변수명마다 *가 있어야 모두 포인터로 선언됨

JAVA 메서드 관련

1) static 메서드는 타입 기준 호출

A obj = new B();
obj.f(); // A.f() 실행

2) 인스턴스 메서드는 동적 바인딩

A obj = new B();
obj.g() // B.g() 실행

3) 생성자 호출 순서 super() 중요

  • 부모→자식 순으로 올라가서 호출됨
profile
2 B R 0 2 B

0개의 댓글