기획 발표 진행
- 발표 후 들어온 질문 정리 & 내가 한 답변 기록정리 & 내가 한 답변 기록
- 서비스는 QR 코드로만 접근 가능한지?
- QR 코드 자체가 링크로 연결되는 거라 QR 코드 외의 방식으로도 접근 가능하게 만들 수는 있음
- 챗봇이 이미지, 동영상을 제공하는지? 그냥 검색하는 것과 차이를 모르겠다.
- 프로젝트 목표가 "자연어로 설명"하는 것이기 때문에 이미지, 동영상을 보여주는 건 고려하지 않았음
- 단, PDF 안에 있는 이미지에 대해 자연어로 설명할 수 있게 구현할 예정이고 그렇기 때문에 단순 검색과 구별된다고 말할 수 있음
네이버 클라우드 특강
GPU 서버 사용-PPT
목표
1 디지털 전환을 위한 기술 습득
2 클라우드, AI 기술 습득
- 정보통신기술(ICT)을 적용해 기존의 전통적 구조를 디지털 구조로 전환하는 과정
- 사물인터넷(IoT), AI, 클라우드 컴퓨팅, 빅데이터 솔루션 등을 플랫폼으로 활용하여 전통적인 운영 방식과 서비스 등을 혁신하는 것을 의미함
클라우드 시장 점유율
- 국내 CSP(Cloud Service Provider, 클라우드 서비스 공급자)
- 네이버 클라우드: 20.5%
- 국산 CSP 중 1위
- 일반 기업 + 공공기관 모두 가능
- 보안인증제도 (CSAP) 취득 → 공공기관 클라우드 서비스 가능
- 해외 CSP의 국내 점유율
- AWS: 60.2%
- Microsoft Azure: 24%
- 해외 CSP의 경우 일반 기업
네이버 클라우드 사용 서비스
- 개인
- GPU 서버 제공
- 생성형 AI
- AI 서비스
GPU 서버 제공
- E-Commers, Retail(소규모)

- Load Balance
- Security Monitorinig
- 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 규칙
- 웹 서버 홈페이지가 안 뜬다면
- DB 서버(MySQL)
- ACG에서
3306 포트 열어야 함(오라클은 1521)
- init script
우분투보다 로키를 더 많이 쓰시던데 로키가 우분투에 비해서 더 이점이 있는 건가요?
- private load balancer는 쿠버네티스(Kubernetes) 할 때 씀
다른 반 수강자 분이 네이버 클라우드 서버 생성&정지 공부 차원에서 영상(10분)을 제작하셨다고 함
https://www.youtube.com/watch?v=M66zflrf-z8&t=3s
실습 관련 자료
정보처리기사 실기
기출문제: 숫자↔문자
#include <stdio.h>
int main() {
char* p = "KOREA";
printf("%s\n", p);
printf("%s\n", p+1);
printf("%c\n", *p);
printf("%c\n", *(p+3));
printf("%c\n", *p+4);
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);
(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;
int *p = &a;
printf("%d\n", *p);
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;
int *a, *b;
- 각각의 변수 앞에 명확히 붙여주는 것이 가장 좋다
- 자료형(int, char 등)과
*가 결합 → "이 타입의 데이터를 가리키는 포인터"
- 변수명 바로 앞의
*가 붙어서 포인터 타입임을 명시
- 여러 변수는 각 변수명마다
*가 있어야 모두 포인터로 선언됨
JAVA 메서드 관련
1) static 메서드는 타입 기준 호출
A obj = new B();
obj.f();
2) 인스턴스 메서드는 동적 바인딩
A obj = new B();
obj.g()
3) 생성자 호출 순서 super() 중요