[인공지능사관학교: 자연어분석A반] JavaScript (9) / 미니프로젝트 발표 / DB 특강

Suhyeon Lee·2025년 8월 27일

목차

Ⅰ. 오전 수업
	A. 1교시
		1. 지난 시간 복습
		2. 비동기 통신
        3. Ajax
	B. 2교시
		1. 실습
        :버튼을 눌러 API 호출 & 화면에 출력하기
	C. 3교시
		1. 실습 (cont.)

Ⅱ. 오후 수업
	A. 프로젝트 발표
	B. 프로젝트 피드백

Ⅲ. CAREER UP
	A. 데이터베이스 특강
      1. 데이터베이스란?
      2. 데이터 모델링
      3. 실습
      4. SQL

Ⅳ. 하루 돌아보기




Ⅰ. 오전 수업

A. 1교시

1. 지난 시간 복습

  • 노드 생성
    • 웹을 구성하는 가장 작은 단위를 노드라고 함
      • node.js의 node와는 조금 다른 개념
    • 노드 종류
      • 태그 노드
      • 컨텐츠 노드
      • 속성 노드
    • 실제 HTML 페이지에 있는 태그와 컨텐츠 속성들이 각각 쪼개져서 가장 작은 단위로 관리됨 == 태그 노드, 컨텐츠 노드, 속성 노드 개념
      • 컴퓨터는 태그는 태그끼리, 컨텐츠는 컨텐츠끼리, 속성은 속성끼리 따로 관리함
      • 서로가 포함을 시킬 수도 있고 결합을 시킬 수도 있는 개념이 존재함
  • 실습: 단순한 텍스트를 포함하는 요소 생성
    1. 태그 생성: document.createElement();
    2. 컨텐츠 생성: document.createTextNode();
      • 글자도 하나의 작은 단위(node)이므로 공간을 할당해서 넣어줌
    3. 태그와 컨텐츠 결합: .appendChild();
      • 부모-자식 관계를 이용
    4. 결합한 요소를 화면에 표출: .appendChild();
      • 미리 만들어 둔 공간을 가지고 와서 그 공간에 자식으로 넣어줌
  • 실습: 속성이 포함된 태그 생성
    • 방식 1: 속성 객체 호출해 값 할당 → img.src = ""
    • 방식 2: 속성 노드를 생성 → document.createAttribute();
  • 요소 제어 포인트: 순서를 잘 기억하자
    • 1) 태그 생성 2) 컨텐츠, 속성 생성 3) 태그 + 컨텐츠 + 속성 연결 4) 완성된 요소를 화면에 표출(div 태그에 넣어주기)
    • 태그 안에 태그 or 컨텐츠를 넣을 때는 자식으로 넣는다 → appendChild
    • 태그 안에 속성을 넣을 때는 자식이 아닌 key 값으로 넣는다.
    • 요소 삭제: img.remove();
  • 실습: To Do 리스트
    • input 태그는 모든 값을 'value'라는 속성에 저장하고 있음
      • innerText/innerHTML이 아닌 키 값 value를 통해 데이터 불러오기
    • 버튼 추가
      • 클릭하면 li 지우기: .remove();
    • checkbox 추가
      • input의 type을 checkbox로 설정하면 됨 (checkbox 태그가 따로 있는 게 아님)

금요일부터 본격적인 통신 → 내가 만든 프론트엔드와 백엔드를 서로 소통시키는 코드 작성
오늘 하는 통신은 가볍게 서버와 데이터를 주고받는 '비동기 통신'

2. 비동기 통신

  • 통신: 클라이언트의 요청을 받으면 서버가 해당하는 요청을 처리해서 응답하는 구조라 생각하면 편함
    • 요청과 응답 구조
    • 프론트앤드와 백엔드를 서로 연결하고 데이터를 보내고 받는 과정 → 구현하기 까다로움
      • 보안
      • 데이터 충돌
      • A로 보낸 데이터가 B로 나온다던지 등

form 태그에서 배웠던 게 통신에서 중요하게 쓰임! → action="주소", method="get/post"

  • 로그인 과정을 생각해보면 통신을 어느 정도 이해할 수 있음
  • 동기 통신과 비동기 통신
    • 동기(Synchronous) 통신
      • 화면 전체가 깜빡거리고 다른 페이지가 등장 (모든 화면, 데이터 초기화되고 새로로운 화면, 데이터를 받음)
      • 데이터를 주고 받은 후에 화면 전체가 바뀌면 동기 통신 → 화면 자체를 바꿔야 하는 경우
      • 동기 통신 대표 태그: form
      • blocking e.g., 티켓팅
    • 비동기(Asynchronous) 통신
      • 특정 부분만 전환 (클릭마다 요청해서 특정 영역의 데이터만 받아 옴)
      • 적은 양의 데이터를 빠르게 처리할 때 e.g., 채팅, 화면을 부드럽게 제작할 때
      • non-blocking

SPA(Single Page Application)와 토스 앱

SPA: 한 개의 Page로 구성된 Application
Angular, React, Vue 등 프론트엔드 기술들이 나오면서 크게 유행하고 있음
CSR(Client Side Rendering) 방식으로 만든 SPA 앱은 검색 엔진 최적화(SEO)가 어려움
토스 앱(동작 기반이 사실 앱 아니고 웹 페이지라고 함!) 기법이 비동기통신임 → 화면 전환이 매우 빠름
요즘은 SPA와 MPA를 합친 하이브리드가 뜨고 있다고 함
cf. MPA(Multi Page Application) → 대표 예시: 자바 기반 Spring

3. Ajax

(Asynchronous Javascript and XML)

  • 왜 필요한가?
    • 웹 페이지의 특정 부분만 초기화시켜야 사용자 눈에 부드럽게 보이기 때문
  • 비동기적 웹 앱 예시

동기로 만들면 한 글자 한 글자 누를 때마다 페이지가 새로 고침됨

  • Ajax란
    • Asynchronous Javascript and XML
    • 필요한 데이터만을 웹 서버에 요청해서 받은 후 클라이언트에서 데이터에 대한 처리를 진행하는 비동기적인 웹 어플리케이션을 제작하기 위한 웹 개발 기법
      • 필요한 데이터만을 요청 → 데이터 넘어오는 양 적음 → 속도 빠름
      • 화면이 부드럽게 동작함

비동기 통신
AJAX(Asynchronous JavaScript and XML)는 웹 애플리케이션에서 서버와 비동기적으로 데이터를 주고받는 기술을 총칭하는 개념
fetch()는 AJAX를 구현하는 방법 중 하나
→ jQuery Ajax: 비동기 HTTP 요청을 처리하기 위한 도구. jQuery 라이브러리에 의존.
→ Fetch API: JavaScript에서 HTTP 요청을 보내고 데이터를 가져오는 데 사용되는 API
→ async/await: 예약어. async/await를 사용하면 비동기 코드를 더 간결하고 읽기 쉽게 작성할 수 있음


B. 2교시

1. Ajax (cont.)

  • 동기 vs 비동기 통신 차이
    • 사용자 입장에서는 화면 갱신도 없고, 요청과 응답 사이 시간에도 다른 일을 할 수 있어 편리하고 빠른듯한 환경을 느낄 수 있음
  • API
    1. 기능 API: 내가 코드를 가져다 쓰기만 해도 기능이 만들어지는 것
      • 그래프
      • 지도
    2. 데이터 API: 내가 데이터만 요청해서 가지고 오는 것 (이미 정제된 데이터)
      • cf. 크롤링은 정제된 데이터가 없을 때만 사용 → 사이트 주소 뒤에 /robots.txt 해보기

Googlebot, daumoa: 크롤링 로봇 → 네트워크를 돌아다니면서 사이트 HTML 파일 수집 & 검색어 순위
웹 사이트가 가지고 있는 HTML 파일 수가 많을수록 검색 엔진이 최적화됨 (잘 잡힘)

2. 실습

  • 버튼을 눌러 영화진흥위원회 API 호출 & 화면 출력하기
  • ※ 중요 포인트 ※
    • JSON(객체) 형태의 데이터를 활용할 떄 객체는 .key, 배열은 [index]을 기억하자
  • 문서 확인
    • 요청 인터페이스: 내가 써야 하는 구조
    • 응답 구조: 넘어 온 데이터 사용 설명서
    • 응답 예시: sample code
  • 포인트
    • url에 어떤 값을 전달할 때 중요한 건 ? 다음 내용: query string

C. 3교시

실습 (cont.)

  • jQuery 방식으로 완성한 url에 데이터를 요청
const getData = () => {
  $.ajax({
    // 1. (필수) 요청할 서버의 url
    url: "★"
    // 2. (선택) 통신 방식
    , method: "get"
    // 3. (선택) 서버에게 넘겨줄 데이터 → 우린 없음
    // , data: "☆"
    // 4. (필수) 통신에 성공했을 때 처리할 방법
    , sucess: () => {
      alert("통신에 성공했습니다!");
    } 
    , error: () => {
      alert("통신에 실패했습니다…");
    }
  });
};

$.ajax 내부 중괄호(객체 리터럴 종료)에는 세미콜론 X
$.ajax 함수 호출 종료 시점에 세미콜론 O
const getData 함수 정의 종료 시점에 세미콜론 O
실행되지 않는 코드(예: 함수 선언 끝, 제어문 블록 끝 등)에는 세미콜론을 생략해도 문법적으로 가능하고 관례적으로 많이 생략합니다.

  • 객체 리터럴 내부에서는 프로퍼티 구분에 쉼표(,)만 사용하고 세미콜론 붙이지 않는다.
  • 객체 리터럴의 닫는 중괄호 뒤에는 세미콜론을 붙인다. (객체 리터럴이 값 표현식이기 때문)
  • 함수 호출문, 변수 할당문 같은 문(statement) 끝에는 세미콜론을 붙인다.
  • 함수 선언, 제어문 같은 코드 블록 문 뒤에는 세미콜론을 쓰지 않는다.
  • 함수 표현식 (function expression) 또는 화살표 함수 표현식 뒤에는 세미콜론을 붙인다. (변수 선언문의 끝에 해당하기 때문)
  • 데이터 받는 공간 추가: res 매개 변수 설정
const getData = () => {
  $.ajax({
    // 1. (필수) 요청할 서버의 url
    url: "★"
    // 2. (선택) 통신 방식
    , method: "get"
    // 3. (선택) 서버에게 넘겨줄 데이터 → 우린 없음
    // , data: "☆"
    // 4. (필수) 통신에 성공했을 때 처리할 방법
    , sucess: (res) => {
      console.log(res);
    } 
    , error: () => {
      alert("통신에 실패했습니다…");
    }
  });
};
  • 객체에서 원하는 값만 가져오기
    • 객체 안에 배열도 있음
const getData = () => {
  $.ajax({
    // 1. (필수) 요청할 서버의 url
    url: "★"
    // 2. (선택) 통신 방식
    , method: "get"
    // 3. (선택) 서버에게 넘겨줄 데이터 → 우린 없음
    // , data: "☆"
    // 4. (필수) 통신에 성공했을 때 처리할 방법
    , sucess: (res) => {
      console.log(res.boxofficeResult.dailyBoxOfficeList[0].movieNm);
    } 
    , error: () => {
      alert("통신에 실패했습니다…");
    }
  });
};
  • 반복문으로 1-10위 출력
const getData = () => {
  $.ajax({
    // 1. (필수) 요청할 서버의 url
    url: "★"
    // 2. (선택) 통신 방식
    , method: "get"
    // 3. (선택) 서버에게 넘겨줄 데이터 → 우린 없음
    // , data: "☆"
    // 4. (필수) 통신에 성공했을 때 처리할 방법
    , sucess: (res) => {   
      for(let i=0; i<res.boxofficeResult.dailyBoxOfficeList.length;i++){
        console.log(res.boxofficeResult.dailyBoxOfficeList[i].movieNm);
      }
    } 
    , error: () => {
      alert("통신에 실패했습니다…");
    }
  });
};
  • 코드 개선하기
    • 중복되는 부분 변수에 넣어서 쓰기

심화: error에서도 에러 정보 파라미터 받으면 status_code 등 확인 가능




Ⅱ. 오후 수업

A. 프로젝트 발표

  • 키워드별 뉴스 요약
    • 정규표현식 활용: 데이터 정제
    • 모델 성능 분석: ROUGE 스코어
    • 뉴스 데이터 수집: Naver API를 활용해 뉴스 데이터를 자동으로 수집하는 시스템 구축
    • 최종 요약 데이터 생성: AI 요약 모델 적용, 핵심 키워드 추출
    • 서버 구성
    • 서비스 구현
  • COINADVISOR
    • AI 기반 암호화폐 뉴스 분석 및 투자 전략 플랫폼
      • 금융 뉴스 데이터 기반 투자 긍부정 판단 챗봇
    • 서비스 흐름도
    • 데이터 수집: CRYPTOCOMPARE API 실시간 뉴스 엔드포인트
    • LLAMA3 감성 분석
      • LoRA(Low Rank Adaptation)를 활용해 파인튜닝: 인공지능 모델 중 자연어 처리(NLP) 분야에서 모델의 파라미터를 적은 양의 추가 파라미터로 조정하여, 새로운 테스크나 도메인에 적응시키는 기법
      • 기본 모델 + LoRA 어댑터 병합 작업 수행
    • GPT-OSS-20B 요약/번역
      • Unsloth 라이브러리 4비트 양자화 및 메모리 최적화 기술 적용 → 코랩 환경에서 사용할 수 있도록 조치
      • 큰 파라미터 수를 가진 모델이라 Llama 3 8B 모델을 사용하여 4bit 양자화와 LoRA를 활용해 파인튜닝하는 방식으로 GPU 자원 문제 해결
    • PARAPHRASE-MULTILINGUAL 문장 벡터 임베딩
      • 서로 다른 언어(영-한) 간 의미 유사도 분석
    • DB: postgreSQL + PGVECTOR
      • 뉴스, 분석 결과, 임베딩 벡터 저장
    • 개발 환경
  • 119 신고 텍스트 기반 긴급도 판단 모델
    • 정규표현식 활용해 의미 없는 발화 제거
    • 모델 후보 3가지
      • KoELECTRA
      • KLUE RoBERTa-base
      • RoBERTa-large
    • 데이터 불균형 보정을 위한 역비례 가중치 적용
    • 평가 지표: Macro F1 (클래스별 성능 균등 반영)
    • 카카오 API를 활용한 병원 위치 정보 제공
  • 계약서 위험조항 분석기
    • 사용 모델/언어/환경
    • 모델링 과정
    • 듀얼 AI 비교 분석 ★
      • RoBERTa 모델의 빠른 텍스트 분류 결과 제시
      • Gemini AI의 전문가 수준 심층 분석 결과 제시
      • 두 AI 모델의 판단이 다를 경우 차이점 명확히 알림
    • Gemini를 활용한 심층 분석
      • 약관 내 공정한 요고솨 불공정한 요소 분리해 제시
      • 판단의 근거가 되는 실제 법률 조항 명시
      • 사용자를 위한 권장 조치사항 제안 (Explainable AI)
  • 자기소개서 기반 면접 예상 질문 생성 서비스
    • 모델 조사 및 분석
    • KoGPT2 선정 이유
    • 서비스 구현
      • 지원 직무, 자기소개서 내용 입력하면 모델이 분석해 면접 질문 생성

B. 발표 피드백

  • 응답하지 않은 항목은 제외하고 총점&평가결과합계 표출하면 좋을 것 같다는 의견
  • 심사위원이 인공지능 전문가가 아닐 수 있으므로 타겟(페르소나)을 명확히 정하는 게 중요함 → 페르소나는 하나만!
    • 우리는 지금 상담사/학생 모두 타겟으로 정했는데 이럴 경우 각자의 페이지를 명확하게 나눠줘야 함 → 그런데 우리가 현재 구현한 화면은 경계가 명확하지 않음
    • 페르소나를 세분화하는 건 일단 하나를 정한 후에(예: 학생 → 학교 폭력을 겪고 있는 학생, 학대를 당하는 학생, 우울증을 겪는 학생 등)
    • 사실 학생 화면, 상담사 화면 나누려고 했는데 DB, 로그인 구현이 필요해서 못 했음😅
  • 목표: 로그인!! 구현하고 아래 내용 추가:
    • 상담사 화면 → 평가만(상담 학생 리스트 확인)
    • 학생이 새로 설문지 작성 → 상담사에게 알림
    • 학생 - 상담사/유관기관 1:1 연락 시스템
    • 거주지에 따른 상담사 배정
      • 쉬는 상담사, 상담사 자격증이 있지만 현업으로 하지 않고 있는 사람들도 상담사로 등록할 수 있도록 하면 상담사 부족 문제도 어느 정도 완화 가능
  • 화면을 누가 보는지, 어떻게 활용하는지 더 명확하게 제시할 것
  • 시연 영상에 소리 넣기
  • 지표 명확하게 제시하기
  • "사업성" 어필해야 함
    • 공익성 프로젝트라면 '정부와의 협약' 어필




Ⅲ. CAREER UP

A. Database

1. 데이터베이스란?

  • 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합
    -데이터(DATA)들의 모임(BASE)
  • 필요한 데이터를 저장하는 공간(서버)
    • 필요한 데이터? 추후에 불러올 필요가 있는 데이터!
  • 예시: 네이버 로그인
  • 데이터베이스를왜 배워야 할까?
    • 데이터베이스는 거의 모든 프로젝트에 필수적으로 존재
    • 데이터를 저장하는 공간인 만큼 높은 중요도와 필수성을 가지는 기술
    • 세상에는 데이터의 양이 점점 늘어나고 있기 때문에 데이터베이스라는 학문의 중요도 또한 점점 증가
      • 데이터를 저장하는 자료형(데이터 형태) 또한 점점 커져가고 있음

2. 데이터 모델링

집을 짓기 전에 하는 서류 작업의 일종이라 생각하면 쉬움!
집을 지으려면? → 계획 도면 작성 → 설계도 작성 → 시공 착수 → 집 완성!

  • 현실 대상을 데이터베이스로 저장할 수 있도록 설계 및 구축을 하는 과정
    • 데이터를 저장할 필요가 있는 현실 대상 → 개념적 데이터 모델링 → 논리적 데이터 모델링 → 물리적 데이터 모델링 → 데이터베이스로 표현 완료!

개념적 데이터 모델링

  • 복잡한 현실세계의 대상을 단순화, 추상화, 명확화하는 작업
  • 엔터티속성을 도출하고 엔터티 간의 관계를 설정하여 ERD로 그려내는 과정
    • '복잡한 현실세계의 대상'을 하나 선택해서 이해하면 쉬움
  • 엔터티(Entity)
    • 정보 저장을 위한 집합의 최소 단위
    • 업무에 필요하고 유용한 정보를 관리하기 위한 집합적인 것
      • 예: 가수, 영상, 회원 등
    • 엔터티 안에는 2개 이상의 인스턴스가 있어야 하며, 하나 이상의 속성이 있어야 하며, 하나 이상의 관계를 가진다.
  • 속성(attribute)
    • 엔터티의 공통적인 특징을 표현
    • 엔터티의 특징을 설명해 주는 것
      • 가수 엔터티의 '아이유' 성별은 여자, 소속사는 EDAM
    • 우리가 얻고자 하는 표현
    • 앞에서 소개한 '가수' 예시를 생각해보면:
      • 소속 그룹, 성별, 장르, 데뷔년도, 소속사 등이 '속성'에 해당
    • 대중적 속성도 있고 → 성별
    • 해당 엔터티만 가지는 속성도 있음 → 데뷔년도
    • 하나의 속성에는 하나의 속성값만 존재한다: 데이터베이스의 정규화 원칙
      • 하나의 속성에 여러 개의 값이 있는 다중값일 경우 별도의 엔터티를 이용하여 분리
      • 하나의 속성에 여러 값이 있는 경우 1차 정규화를 적용하여 속성 값을 개별적으로 나눕니다
      • 아이유의 소속사는 EDAM이며 청춘뮤직일 수 없다
  • 인스턴스(instance)
    • 엔터티 안에 있는 개별적인 것들
      • 예: <가수> 엔터티 안에 있는 각각의 대상: <아이유, 장범준, 안유진, 비와이, …>
  • 관계(relation)
    • 엔터티 사이의 관계
      • 엔터티들 사이에 관계가 있으면 관계를 관계명과 함께 기술하게 됨
    • 아래 두 엔터티는 무슨 관계일까?
      • 가수는 노래를 부른다
      • 노래는 가수에게 불려진다
      • 즉, 가수 엔터티와 노래 엔터티는 관계가 있다!
  • 실제 회사에서 사용하는 데이터 모델링
    • 개념적 모델링이 끝나면 아래와 같이 만들 수 있음
  • ERD ★
    • 엔터티(Entity)와 엔터티 간의 관계(Relationship)를 발견하고 이를 그림(Diagram)으로 표현하는 행위
      • 의사소통 효율성 UP!
    • 개념적 데이터 모델링의 최종 산출물
      • 개념적 데이터 모델링이 끝나면 무조건 ERD가 있어야 함
    • 표기법 두 가지: IE 표기법, Barker 표기법
      • 보통 IE 표기법을 사용
  • IE 표기법
    1. 엔터티를 그린다. (속성은 제외)
    2. 엔터티를 적절히 배치한다.
    3. 관계를 설정한다. (서로 관계가 있는 엔터티끼리 선으로 연결)
    4. 관계명을 기술한다. (생략 가능)
      • 요즘은 관계명은 생략하는 추세이긴 함
    5. 관계의 참여도(Cardinality) 기술
      • 참여도란? 엔터티 안의 인스턴스들이 얼마나 참여하는지를 의미
      • 1:1, 1:N, N:N 관계 등이 있으며, N 쪽에는 까치발(>)로 표시
    6. 관계의 필수 여부(Optionality) 기술
      • 필수 여부란? 엔터티 안의 인스턴스들이 반드시 참여하는지를 의미
      • 필수 참여는 (|) 표시, 선택 참여는 (O) 표시
      • 필수 참여 그리는 법
  • 실무 데이터베이스 ERD
    • 어려워 보이지만 관계 정의만 잘 한다면 누구든 가능

ERD 그려주는 서비스를 제공하는 곳이 엄청 많다고 함!
민준님이 "ERDCloud" 추천해주셨음
→ 장점: 실시간 공유가 가능하다

논리적 데이터 모델링

  • 설계도 작성에 해당
  • ERD를 기준으로 보다 상세한 구조를 작성한 것
  • 속성 입력, 식별자 선택, 정규화, 관계 설정 등을 정의하는 과정
  • 프로젝트 진행 시 데이터베이스 설꼐 원리를 찾을 때 참고 (설계도)
  • 작성 방법
    1. 속성을 아래로 모두 입력
    2. 각 엔터티에서 식별자(PRIMARY KEY) 선택
      • 식별자란? 엔터티가 가진 고유하고 유일한 특징
    3. 정규화 실시
      • 정규화: 중복되는 데이터가 저장되지 않도록 엔터티를 쪼개는 행위
      • 중복되는 데이터가 없을 때까지 쪼갬
      • 정규화가 모두 끝난 모델링 모습
      • 정규화 6개 과정 → 정보처리기사 실기 특강 참고
    4. 관계설정 구현(FOREIGN KEY)
    5. 속성 추가 → 현재 존재하는 속성들만으로는 요소들을 구분하기 어려울 때
      • 컴퓨터가 구분할 수 있도록 구분 코드 넣어주기
  • 논리적 모델링 완성

물리적 데이터 모델링

  • 실제 코딩을 통해 테이블을 생성하는 단계
  • 논리적 모델링 결과를 가지고 실제 DB 구축

3. 실습

Oracle xe 설치

  • 오라클 다운로드 접속 후 windows x64 설치 클릭
  • 대상 파일 압축 풀기 진행 후 폴더 열기 → DISK1 폴더 클릭 → Setup.exe 파일 실행
  • 아래 이미지 따라서 설치 진행
  • 설치 완료 후 검색창에 sql 입력 및 RUN SQL Command Line 실행하고 아래 내용 순서대로 입력
  • SQL DEVELOPER 설치
    • sqldev 다운로드 페이지 접속
    • Windows 32-bit/64-bit 설치
    • 동의 후 설치
      • 오라클 계정 로그인 필요
    • 압축 풀기 및 폴더 열기 → Sqldeveloper 폴더 클릭 → Sqldeveloper.exe 실행
      • 만약 sqldeveloper.exe 파일을 바탕화면에 두고 싶다면 드래그하지 말고! 위이콘 마우스우클릭 → 바로가기 생성 후 바로가기 아이콘을 바탕화면으로 이동
    • jdk 경로를 찾아 세팅
      • c:\program files\java 에서 jdk 폴더 찾아 더블클릭 (버전은 서로 다를 수 있음)
    • 환경설정 임포트 화면이 뜨면, 첫 설치이므로 아니오 선택
    • 아래와 같은 내용이 뜰 경우 체크하고 확인 클릭
  • SQL DEVELOPER 계정 연동
    • + 기호 버튼 클릭
    • 아래와 같이 계정을 입력하고 테스트 버튼을 눌렀을 때 상태: 성공이면 접속 클릭
    • Service 계정 활성화 확인
    • 파일 > 열기 > makeData.sql 데이터 불러오기
    • 커서 한번 위에 누르고 f5 누르기: 테이블 및 데이터 생성
    • 테스트 데이터 준비 완료
      • 테이블 안 뜨면 새로고침

강사님은 Oracle로 알려주셨지만 난 MySQL이 더 편해서 대충 이걸로 비슷하게 따라할 거임

  • MySQL 설치하기
    • MySQL community server
    • MySQL 인스톨 시 'Type and Networking' 설정은 MySQL 서버가 사용될 환경에 따라 Configuration Type을 선택하고, 네트워크 포트(기본값 3306)를 설정하는 단계입니다. 개발자 컴퓨터에서는 'Development Computer'를 선택하여 최소한의 리소스를 사용하고, 서버 환경에서는 'Server Computer' 등을 선택하여 필요한 리소스를 할당할 수 있습니다.
    • MySQL을 설치할 때 나오는 Hostname 입력 칸에는 MySQL 서버가 설치된 컴퓨터의 이름 또는 IP 주소를 입력해야 합니다. 대부분의 경우 MySQL 서버를 자신의 컴퓨터(로컬)에 설치했다면, 특별히 다른 설정을 하지 않았다면 아래 값 중 하나를 사용하면 됩니다:
      • localhost
      • 127.0.0.1
    • Hostname 확인 방법
      • 내 컴퓨터에서 MySQL 직접 설치했다면: 그냥 localhost 또는 127.0.0.1 입력
      • 원격 서버에 MySQL을 설치했다면: 그 서버의 IP 주소나 도메인 이름 입력 (예: 192.168.1.10, db.example.com 등)
    • 왜 Hostname이 필요한가?
      • Hostname은 MySQL Router가 실제로 MySQL 서버에 접속하는 주소
      • 설치 시 기본적으로 localhost로 쓰는 게 일반적이고, 대부분의 개인 개발 환경에서는 이 방식이 적합
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysql -u root -p
  • MySQL 클라이언트로 직접 접속이 성공했고 MySQL 서버도 정상 작동하는 것으로 확인되었으니, MySQL 서버 자체에는 문제가 없습니다. 설치 화면(MySQL Router Configuration)에서 "Test Connection"이 안 되는 이유는 다음 중 하나일 수 있습니다.
    • MySQL Router 설정에서 입력한 Hostname이나 포트, 사용자 정보가 실제 MySQL 서버 설정과 맞지 않음
    • MySQL Router가 MySQL 서버의 인증 방식이나 권한 문제로 접속 실패
    • 설치 프로그램의 네트워크 또는 방화벽 차단 문제
    • MySQL Router 설치가 복잡하거나 필요하지 않은 상황(예: 단순 개인 개발 환경)일 경우
  • 해결책 및 권장 사항
    • 만약 MySQL Router를 꼭 사용해야 하는 상황이 아니라면, 여기서 설치를 중단(Cancel)해도 무방합니다.
    • 단순히 MySQL 서버를 개발·분석 용도로 사용하려면 MySQL Router 없이도 충분히 작동합니다.
    • 이후 필요할 때 MySQL Router를 별도로 설치·설정해도 됩니다.
      -이미 MySQL 접속이 정상적으로 되는 상태라면 설치 화면에서 Cancel을 눌러 설치 과정을 종료해도 됩니다. 서버 사용에는 문제 없으며, Router가 필요하면 나중에 다시 설치·설정 가능합니다.

SQL Developer의 사용법

  • --: 주석문(한 줄 주석)
    • 코드에 영향을 주지 않는 설명문
  • 실행 단축키
    • 내가 실행하고자 하는 문장 위에 마우스 커서를 올려두고 CTRL + ENTER
SELECT *
FROM 직원;

SELECT *
FROM 부서;
  • SQL은 하나의 출력문에 하나의 엔터티만 출력되도록 설계되어 있음
  • ★★★하나의 문장이 끝났나는 것을 알려주기 위해서 세미콜론(;)이 필요하다★★★
    • 하나의 문장에는 하나의 세미콜론 필수(예외없음)
    • 안 쓰면 오류남

4. SQL

SELECT

① SQL 의미와 종류
② SQL 실행 순서
③ *와 DISTINCT, AS
④ NULL 함수
⑤ 자료형과 함수

① SQL 의미와 종류

  • SQL: Structured Query Language(구조화된 질의 언어)
    • 데이터베이스가 이해할 수 있도록 특정 문법에 맞춰서 질의하는 것
      • 예: 한국의 육하원칙(누가, 무엇을, …)
      • 예: 영어는 주어, 동사, 목적어, …
    • ※ 일반적인 영어 키워드를 사용
  • 예시
    • 원하는 내용을 컴퓨터가 이해할 수 있도록 SQL로 번역해야 함
  • 종류
    • DML의 SELECT만 알고 있어도 80% 이해 가능
  • 테이블이란?
    • 엔터티를 모델링하여 DB가 이해할 수 있게 만든 결과
    • 데이터를 저장하는 저장소 기능
    • 테이블은 2차원의 행, 열 형태를 유지
      • Pandas의 DataFrame과 유사
      • 예: 직원 테이블 → 10개의 행(튜플)과 9개의 열(컬럼)으로 구성

엔터티 → 테이블
속성(attribute) → 컬럼, 열
인스턴스(instance) → 튜플, 행

과제

  • 각 테이블 숙지하기
    • 부서, 직원, 직원연락처, 직원주소

추가: Oracle, SQLite, MySQL 주요 문법 차이점

  • 위에서 작성한 직원 및 부서 관리 코드 기준
  • 자료형, 날짜 처리, 제약조건, 기타 주요 문법 차이를 중심으로 구성
구문 항목OracleSQLiteMySQL
문자열 타입VARCHAR2(n)TEXTVARCHAR(n)
숫자 타입NUMBERINTEGERINT
날짜 타입DATETEXT (날짜를 'YYYY-MM-DD' 문자열로 저장)DATE
날짜 연산DATE 'YYYY-MM-DD' - 숫자 (가능)지원 안 함 (외부에서 계산 후 문자열로 삽입)지원 안 함 (외부에서 계산 후 삽입)
성별 컬럼 제약조건CHECK (성별 IN ('남','여'))CHECK(성별 IN ('남','여')) 가능ENUM('남', '여') 추천
기본키 선언ALTER TABLE ADD CONSTRAINT PK_... PRIMARY KEY(...)테이블 생성 시 PRIMARY KEY 직접 선언테이블 생성 시 PRIMARY KEY 직접 선언
외래키 선언ALTER TABLE ... ADD CONSTRAINT FK_... FOREIGN KEY(...) REFERENCES ...테이블 생성 시 FOREIGN KEY 직접 선언, 활성화 필요 (PRAGMA foreign_keys=ON)테이블 생성 시 FOREIGN KEY 직접 선언
제약조건 이름 지정가능 (CONSTRAINT 이름)권장하지 않음 (이름 지정 문법 차이)가능 (CONSTRAINT 이름)
DROP TABLE 문법DROP TABLE 테이블명DROP TABLE IF EXISTS 테이블명DROP TABLE IF EXISTS 테이블명
문자열 기본값작은따옴표 '문자열'작은따옴표 '문자열'작은따옴표 '문자열'
NULL 허용 기본컬럼별 NULL 허용 여부 명시 필요기본 NULL 허용기본 NULL 허용
BOOLEAN 타입 지원없음 (0,1 또는 CHAR(1) 사용)없음 (0,1 또는 INTEGER 사용)BOOLEAN(TINYINT(1)) 지원
트랜잭션 커밋COMMIT; 필요자동 커밋, 필요 시 수동 명령 필요자동 커밋, 필요 시 START TRANSACTION 사용 가능
날짜 입출력 포맷Oracle 내부 포맷 지원문자열 포맷 'YYYY-MM-DD' 지원날짜 타입 자체 지원
CASE 민감도일반적으로 대소문자 구분 안함SQL 문법 대소문자 무시대소문자 구분은 설정에 따라 다름
  • 요약
    • Oracle은 전문적인 타입과 날짜 연산을 강력히 지원하지만 MySQL과 SQLite는 상대적으로 단순한 타입과 문자열 기반 날짜 처리를 사용함.
    • SQLite는 가장 자유롭고 유연하지만 데이터 타입 엄격성이나 날짜 연산 등은 외부 처리 필요.
    • MySQL은 Oracle과 비슷한 기능을 제공하지만, 날짜 연산은 직접 기능 지원하지 않으며, ENUM 타입으로 성별 같은 컬럼 제약조건을 편리하게 설정 가능.
    • 제약조건 이름 지정과 외래키 활성화 방식이 각 DBMS별로 다름.

추가

  • Public Key Retrieval is not allowed 오류
    • MySQL 8.x의 인증 방식으로 인해 발생
    • 만약 사용하시는 DB가 Mysql 8.0 버전이고 public key retrieval is not allowed에러가 발생한다면 다음과 같은 옵션을 확인해 보셔야 합니다.
    • 속성
      • useSSL: DB에 SSL로 연결
      • allowPublicKeyRetrieval: 서버에서 RSA 공개키를 검색하거나 가져와야 하는지
  • 에러가 발생하는 원인은 useSSL=false로 설정하고 allowPublicKeyRetrieval 설정을 하지 않은 경우입니다. 따라서 다음과 같이 설정해주시면 해결하실 수 있습니다.
    • 접속 URL 설정
      • jdbc:mysql://localhost:3306/★데이터베이스명★?useSSL=false&allowPublicKeyRetrieval=true
      • 접속하는 datasource URL에 쿼리 파라미터로 위와 같이 설정
      • dbeaver의 "Edit Connection" → "Connection settings" → "URL" 부분에서 직접 수정 가능
    • 드라이버에서 설정
      - DBeaver 실행 → 좌측에서 연결하려는 데이터베이스를 우클릭 → "Edit Connection" → "Driver Properties" → properties 목록에서 allowPublicKeyRetrieval 항목을 찾거나 새 properties 추가 버튼 눌러서 '이름: allowPublicKeyRetrieval, 값: TRUE' 추가




하루 돌아보기

👍 잘한 점

  • 수업 시간에 질문 많이 하고 적극적으로 참여했음
  • 미니프로젝트 마무리 잘 했음
  • 다른 조 발표 집중해서 들었음

👎 아쉬웠던 점

  • 발표할 때 말이 너무 빨랐다고 함

🔬 개선점

  • 발표 내용 양 조절을 잘 해서 발표 시간 안에 여유 있게 말할 수 있도록 핵심만 발표하는 능력 익히기
profile
2 B R 0 2 B

0개의 댓글