반응형

1. JSP 라이프사이클이란?

JSP 라이프사이클은 JSP 페이지가 요청을 처리하기 위해 거치는 일련의 단계를 의미합니다. JSP 페이지는 서블릿으로 변환되고, 컴파일되고, 요청을 처리한 후, 소멸되는 과정을 거칩니다. 즉, 라이프사이클은 JSP의 생성으로 시작하여 JSP의 해체로 끝납니다.

 

1. JSP 페이지 번역 (Translation) 
   └── example.jsp -> example_jsp.java
-- JSP 컨테이너는 JSP 파일을 서블릿 자바 파일로 변환합니다.

2. JSP 페이지 컴파일 (Compilation)
   └── example_jsp.java -> example_jsp.class
-- 서블릿 자바 파일을 컴파일하여 자바 바이트코드로 변환합니다.

3. 클래스 로딩 (Class Loading)
   └── example_jsp.class 로드
-- 컴파일된 클래스 파일을 JVM으로 로드합니다.  

4. 인스턴스화 (Instantiation)
   └── new example_jsp()
-- 서블릿 클래스의 객체를 생성합니다.

5. 초기화 (Initialization)
   └── example_jsp._jspInit()
-- 서블릿 객체의 초기화 작업을 수행합니다.

6. 요청 처리 (Request Processing)
   └── example_jsp._jspService(request, response) 
-- 라이언트의 요청을 처리하고 응답을 생성합니다.

7. 소멸 (Destroy)
   └── example_jsp._jspDestroy()
-- 서블릿 객체가 소멸될 때 자원을 해제합니다.

 

WAS (웹 애플리케이션 서버)
│
├── 웹 컨테이너 (Web Container)
│   │
│   ├── 서블릿 컨테이너 (Servlet Container)
│   │   ├── 서블릿 클래스 로딩
│   │   ├── 서블릿 인스턴스 생성
│   │   ├── 서블릿 초기화 (init)
│   │   ├── 요청 처리 (service, doGet, doPost)
│   │   └── 서블릿 소멸 (destroy)
│   │
│   └── JSP 컨테이너 (JSP Container)
│       ├── JSP 페이지 번역 (Translation)
│       ├── JSP 페이지 컴파일 (Compilation)
│       ├── 클래스 로딩 (Class Loading)
│       ├── 인스턴스화 (Instantiation)
│       ├── 초기화 (jspInit)
│       ├── 요청 처리 (jspService)
│       └── 소멸 (jspDestroy)
│
│
└── ...

 

샘플 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>    
<%
	// http://localhost:8080/jsp/example.jsp
	// 초기화 단계(jspInit 역할)
	if(application.getAttribute("initialized") == null) {
		application.setAttribute("initialized", true);
		application.setAttribute("initializedTime", new Date());
		out.println("JSP가 초기화 되었습니다. <br>");
	}
	
	out.println("요청이 완료 되었습니다. <br>");
	out.println("현재 시간 : " + new Date() + " <br>");
	
	// 세션이라는 전역 메모리지에 데이터를 저장하고 확인해 보자. 
	String message = (String)session.getAttribute("message");
	if(message != null) {
		out.println("세션 메시지 : " + message);
	} else {
		out.println("저장된 세션 메시지가 없습니다.");
	}
	
	// 세션이라는 메모리에 key, value 를 할당하자. 
	session.setAttribute("message", "안녕~ 세션에 저장한 메세지야");
	
%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h1>JSP 라이프 사이클 확인</h1>
	<p>이 페이지에 학습 목적은 JSP 동작 방식에 대한 이해와 라이프 사이클 입니다.</p>

</body>
</html>

<%
	// 소멸 단계 확인 (jspDestroy)
	if(application.getAttribute("initialized") != null) {
		application.removeAttribute("initialized");
		application.removeAttribute("initializedTime");
		out.println("JSP 객체가(서블릿) 소멸 되었습니다. <br>");
	}
%>

반응형

'Java > Java 이론' 카테고리의 다른 글

[JSP] 주석과 지시자  (0) 2024.07.03
[JSP] JSP 기초 문법  (0) 2024.07.03
[JSP] Java Server Pages 란?  (0) 2024.07.03
스레드(Thread)  (0) 2023.10.04
중첩 클래스  (0) 2023.10.02
반응형
1. JSP의 정의와 역할을 이해한다.
2. JSP의 장점과 특징을 파악한다.
3. JSP와 관련된 기본 용어를 익힌다.

 

1. JSP란 뭘까?

Java Server Pages (JSP)는 동적인 웹 콘텐츠를 생성하기 위한 서버 측 기술이다. JSP는 HTML 페이지 내에 Java 코드를 포함시켜 웹 서버에서 실행된 후, 클라이언트에 HTML을 전송하는 방식으로 동작한다. 좀 더 자세히 말하자면 JSP(Java Server Pages)는 자바 서버 페이지의 약자로, 웹 애플리케이션 개발을 위한 서버 사이드 기술(Server-Side Rendering)입니다. JSP는 HTML, CSS, JavaScript 등의 클라이언트 사이드 언어와 함께 사용되어 동적인 웹 페이지를 생성하는 데 사용됩니다. 자바 코드를 HTML 코드에 삽입하여 웹 서버에서 실행할 수 있게 해주며, 그 결과는 클라이언트의 웹 브라우저로 전송됩니다.

 

SSR은 Server-Side Rendering(서버 측 렌더링)의 약어입니다. SSR은 클라이언트에게 웹 페이지를 제공하기 전에 서버에서 웹 페이지를 렌더링하여 HTML을 생성하는 웹 개발 방법론입니다. 이 방법론은 클라이언트에게 정적인 HTML을 먼저 제공하고, 클라이언트 측에서 JavaScript를 사용하여 동적인 콘텐츠를 추가하는 방식인 Client-Side Rendering(CSR)대비됩니다.

 

 

2. Servlet vs JSP

JSP 역할

웹 애플리케이션에서 사용자 요청을 처리하고, 동적으로 생성된 HTML을 클라이언트에게 반환한다. 프론트엔드와 백엔드의 중간 역할을 하며, HTML과 같은 프론트엔드 코드와 Java와 같은 백엔드 코드를 혼합하여 사용할 수 있다.

 

JSP의 기본 동작 원리

클라이언트 요청: 클라이언트(웹 브라우저)가 JSP 페이지에 접근한다.

서버 처리: 웹 서버(아파치 톰캣)가 JSP 페이지를 찾아 Java 서블릿으로 변환한 후 컴파일하여 실행한다.

응답 생성: JSP 페이지가 실행되어 동적인 HTML을 생성하고, 이를 클라이언트에게 전송한다.

 

샘플 코드 확인 1
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
    <title>My First JSP Page</title>
</head>
<body>
    <h1>Hello, JSP!</h1>
    <%
        String message = "Welcome to Java Server Pages!";
        out.println("<p>" + message + "</p>");
    %>
</body>
</html>

 

샘플 코드 확인 2
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSP Example</title>
</head>
<body>
    <h1>JSP Example</h1>
    
    <hr>
    
    <%-- JSP 디렉티브 : 페이지 속성 설정 --%>
    <%@ page import="java.util.Date" %>
    <%@ page import="java.text.SimpleDateFormat" %>
    
    <%-- JSP 스크립트릿 : Java 코드 영역 --%>
    <%
        // 현재 날짜와 시간을 가져오기
        Date now = new Date();
        
        // 날짜 포맷 지정
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = sdf.format(now);
    %>
    
    <%-- HTML과 함께 JSP 표현식 사용하여 날짜 출력 --%>
    <p>현재 시간: <%= formattedDate %></p>
    
    <%-- JSP 선언문 : 변수 선언 --%>
    <%!
        int number = 10;
        String message = "Hello, JSP!";
    %>
    
    <%-- HTML과 함께 JSP 표현식 사용하여 변수 출력 --%>
    <p>숫자: <%= number %></p>
    <p>메시지: <%= message %></p>
    
    <%-- JSP 주석 : HTML 주석 --%>
    <!-- 이 부분은 HTML 주석입니다. JSP에서는 이렇게 사용할 수 있습니다. -->
    
    <%-- JSP 액션 태그 : Java 코드 실행 및 제어 --%>
    <%-- if-else 구문 --%>
    <% if (number > 5) { %>
        <p>숫자가 5보다 큽니다.</p>
    <% } else { %>
        <p>숫자가 5보다 작거나 같습니다.</p>
    <% } %>
    
     <%-- JSP 액션 태그 : include 지시자를 사용한 다른 JSP 파일 포함 --%>
    <%-- <%@ include file="included.jsp" %> -->
    
    
    <%-- JSP 표현언어(EL) : 변수 값 출력 --%>
    <p>EL 표현식을 사용한 숫자: ${10}</p>
    <p>EL 표현식을 사용한 메시지: ${"Hello, JSP!"}</p>
</body>
</html>

 

JSP 처리 과정

웹 브라우저에 JSP 페이지에 해당하는 URL을 입력하면, 톰캣 서버는 다음과 같은 과정을 거쳐 JSP 페이지를 실행한다.

 

JSP를 실행한다는 말은 곧 JSP 페이지를 컴파일한 결과인 서블릿 클래스를 실행한다는 의미가 된다.
반응형

'Java > Java 이론' 카테고리의 다른 글

[JSP] JSP 기초 문법  (0) 2024.07.03
[JSP] JSP 라이프사이클  (0) 2024.07.03
스레드(Thread)  (0) 2023.10.04
중첩 클래스  (0) 2023.10.02
람다 함수  (0) 2023.10.02
반응형

1과목 - 데이터 모델링의 이해

데이터 모델링이란?

현실 세계를 단순화하여 표현하는 기법

 

데이터 모델링 특징 및 목적

특징

  • 추상화 : 현실세계, 개념을 일정한 형식으로 '간략하게' 표현
  • 단순화 : 현실세계를 '정해진 표기법'으로 단순하고 쉽게 표현, 핵심에 집중하고, 불필요한 것은 제거
  • 명확화 : 불문명(애매모호한 것)을 제거하고, '정확하게' 현살을 기술

목적

  • 단순히 데이터베이스, 시스템 만을 구축하기 위한 것이 아닌 업무설명, 분석, 형상화 목적도 있음
  • 분석된 모델로 실제 데이터베이스를 생성하며 개발 및 데이터 관리에도 사용함

 

데이터 모델링 유의점 및 3가지 관점 그리고 중요 3요소

유의점

  • 중복(Duplication) : 같은 데이터가 엔터티에 중복 저장되면 안된다.
  • 비유연성(Inflexibility) : 애플리케이션의 '사소한 변경'에도 데이터 모델이 수시로 변경하면 안된다.
    • -> 데이터 모델과 프로세스 분리해서 유연성을 높여야 한다
  • 비일관성(Incosistency) : 중복이 없는 경우에도 비일관성 발생 가능성 있음
    • -> 데이터 간의 연관 관계에 대해 명확하게 정의

관점

  • 데이터 관점(What, Data) : 어떤 데이터들이 업무와 얽혀있는지
  • 프로세스 관점(How, Process) : 업무가 실제로 처리하고 있는 일이 무엇인지
  • 데이터와 프로세스의 상관 관점(Data vs Process, Intercation) : 프로세스 흐름에 따라 데이터가 어떤 영향을 받는지

중요요소

  • Things : 대상(Entity)
  • Attribute : 속성
  • Relationships : 관계

 

모델링의 3가지 단계

  1. 개념적 모델링 : '전사적'으로 수행, 업무 중심적이고 포괄적인 수준의 모델링(추상화 레벨 가장 높음)
  2. 논리적 모델링 : Key, 속성, 관계들을 표현하는 단계 -> 정규화 활동이 이루어지는 단계 : 논리 데이터모델을 대상으로 정규화하는 것
  3. 물리적 데이터 모델링 : 실제 DB를 구현할 수 있도록 성능, 가용성등 물리적 요소 고려하는 단계

 

데이터 스키마 단계에 따른 독립성

스키마란?

테이블이 어떠한 구성으로 되어있는지, 어떤 정보를 가지고 있는지에 대한 기본적인 테이블의 구조를 정의한 것

 

데이터 스키마의 구조

출처 : DBGUIDE.NET

사용자

  • 외부 스키마 : 각(여러) 사용자가 보는 스키마 정의 및 표현
  • 개념 스키마 : 모든(여러X) 사용자가 보는 데이터 정의 및 표현 & 관계를 정의하는 단계
  • 내부 스키마 : 물리적인 저장 구조를 나타내는 단계 -> 저장 구조, 칼럼, 인덱스 정의

 

데이터 베이스

  • 논리적 독립성 : 개념스키마가 변경 되어도 외부 스키마는 영향 X [외부] - [개념]
  • 물리적 독립성 : 내부스키마가 변경 되어도 개념/외부 스키마는 영향 X [외부, 개념] - [내부]

 

ERD 작성 순서

  1. 엔터티 도출
  2. 엔터티 배치
  3. 엔터티 관계 설정
  4. 관계명 기입
  5. 관계 참여도 기입
  6. 관계 필수/선택 여부 기입
  • Entity는 네 부분의 모서리가 둥근 형채인 Soft-box로 표현함
  • Entity 이름은 Box 내부 상단에 표시
  • Attribute 중 필수로 값을 입력하며 식별자인 속성은 #(Mandatory)를 표시
  • Attribute 중 필수로 값을 입력하여야 하는 속성은 *(Mandatory)를 표시
  • Attribute 중 선택적인 입력을 입력하여야 하는 속성은 º(Optional)를 표시

엔터티란? 엔터티의 특징

업무에 쓰이는 데이터들을 용도별로 분류한 데이터의 그룹 = 엔터티

 

엔터티의 특징

  • 업무에서 쓰이는 정보여야 함
  • 식별자가 있어야 함
  • 2개 이상의 인스턴스를 가져야 함
  • 반드시 속성을 가져야 함 -> 이 때 하나의 인스턴스는 2개 이상의 속성을 가짐 -> 즉 하나의 엔터티는 2개 이상의 속성을 가짐
  • 다른 엔터티와 1개 이상의 관계

 

엔터티 분류 방법과 그에 따른 종류

유형, 무형에 따른 분류

  • 유형 엔터티 : 모델링 대상이 물리적인 형태가 존재 (ex) 상품, 회원
  • 개념 엔터티 : 모델링 대상이 형태 없음 (ex) 부서, 학과
  • 사건 엔터티 : 모델링 대상이 행위로 인해 발생하는 것 (ex) 주문, 이벤트 응모

발생 시점에 따른 분류

  • 기본 엔터티 : 모델링 대상이 업무에 대해 원래 존재하는 요소 -> 독립적, 자식 엔터티 가질 수 있음 (ex) 상품, 회원, 부서
  • 중심 엔터티 : 모델링 대상의 업무 과정 중 하나, 기본 엔터티로부터 파생, 행위 엔터티 생성 (ex) 주문, 매출, 계약
  • 행위 엔터티 : 2개 이상의 엔터티로부터 파생 (ex) 주문 내역, 이벤트 응모 이력 등

 

엔터티 명명 주의점

  • 업무에서 실제 쓰이는 용어 사용
  • 한글 약어 사용 X, 영문 대문자로 표시
  • 단수 명사로 표현, 띄어쓰기 X
  • 의미상 중복 X (주문, 결제 엔터티는 중복 가능)
  • 명확하게 표현할 것

 

속성? 속성의 특징

엔터티의 특징을 나타내는 최소의 데이터 단위

 

속성의 특징

  • 더 이상 쪼개지지 않는 레벨
  • 업무에서 필요로 하는 항목
  • 엔터티를 설명, 인스턴스를 설명
  • 하나의 속성은 하나의 속성값만 가짐 -> 여러 개 가지면 1차 정규화
  • 일반 속성은 정해진 주식별자에 함수적 종속성 가져야한다.
    -> 완전 함수적 종속이 아닌 부분 종속이면 2차 정규화 해준다.
    ex) PK가 2개의 속성으로 이루어져있는데 {속성1, 속성2} 에서 속성 2에만 종속성 가지면 2차 정규화로
    엔터티 추가 생성해서 각 엔터티마다 완전 함수적 종속 충족시켜줌

 

속성의 특성에 따른 분류

일반적인 특성에 따른 분류

  • 기본 속성
    : 업무 프로세스(기본 틀) 분석했더니 바로 정의 가능한 속성
  • 설계 속성 - 인스턴스에 유니크함을 부여하는 속성(PK의 토대)
    : 업무엔 없으나, 모델링 하다보니 고유함 보전하기 위해 필요해져서 만들어짐
    ex) 학번, 사번 등등
  • 파생 속성 -> 성능, 편의 위해 새로 만든 엔터티의 속성
    : 데이터를 조회할 때 빠른 성능 낼 수 있도록 원래 속성값을 계산하여 저장할 수 있도록 하는 속성
    ex) 평균, 재고 등

 

구성 방식(각 속성 및 엔터티와의 관계)에 따른 분류

  • PK 속성
    : 인스턴스의 유니크함을 부여하는 속성, 일반 속성들의 종속성을 가진 키
    (기본키, 주식별자 키) #으로 표현 (ex) 학번, 사번
  • FK 속성
    : 다른 엔터티에서 가져온 속성(외래키), 다른 엔터티와의 관계를 맺게 해줌
    -> 주식별자에 있는 속성이 FK가 될 수 있음 (ex) #사원번호(FK)
  • 일반 속성 : PK, FK를 제외한 나머지 속성

 

속성의 분해 가능 여부에 따른 분류

  • 단일 속성 : 속성이 하나의 의미로 구성
  • 복합 속성 : 여러개의 의미로 구성(주소 = 시 + 구 + 동)
  • 다중 값 속성 : 속성이 여러 개 값 가짐 -> 1차 정규화 or 별도 엔터티 생성

 

속성이 만들어 낸 데이터 모델의 개념

  • 도메인
    : 속성이 가질 수 있는 속성 값의 범위
  • 용어 사전
    : 속성의 이름을 정확, 직관적으로 부여하기 위한 용어사전
  • 시스템 카탈로그
    : 시스템 자체에 관련있는 데이터를 가진 DB
    : 시스템 테이블로 구성 & SQL로 조회 가능
    : 여기에 저장된 데이터 = 메타 데이터, SELECT만 가능 INSERT, UPDATE 등등 불가능

 

관계란? 관계의 종류

엔터티와 엔터티 사이에 속성끼리의 연결에 의해 만들어지는 상관 관계

 

종류

  • 존재 관계 : 모델링 된 엔터티들이 존재로서 관계를 가짐
  • 행위 관계 : 모델링 된 엔터티들이 행위에 의해 관계를 가짐

UML의 클래스 다이어그램에 의해 나뉘는 종류

  • 연관 관계
    : 필수적 관계(존재적 관계, 식별자 관계) - 항상 서로 이용(실선)
    : 멤버 변수로 선언
  • 의존 관계
    : 선택적 관계(비식별자 관계) - 상대 클래스 행위에 따라 이용(점선)
    : 행위 코드 오퍼레이션에서 파라미터로 사용

관계 표기 방법(ERD)에 따른 특성 분류

  • 관계명
    : 관계 이름은 시작 엔터티 - 능동적 / 끝 엔터티 - 수동적 '동사' 사용
  • 관계 차수
    : 각 엔터티 끼리의 관계에 참여하는 '속성의 수', 1:1, 1:M, M:N 형식으로 구분
  • 관계 선택 사양
    : 필수적 관계(엔터티끼리 항상 관계), 선택적 관계(행위에 의해 관계 여부가 성립)
    ex) 한 수업 엔터티에 참여 엔터티, 과제 엔터티가 있으면
           참여는 수업이 있을 때 마다 항상 관계가 성립되어서 조회가 되지만,
           과제는 과제가 있는 날에만 관계를 맺고 조회가 되기 때문에 이러한 것을 구분함

 

관계 체크 사항(두 엔터티 사이 관계 정의 시 유의할 사항)

  • 두 엔터티 사이 관심있는 연관 규칙이 존재하는가?
  • 두 엔터티 사이 정보의 조합이 발생하는가?
  • 업무 기술 시, 장표의 관계 연결을 가능하게 하는 동사가 있는가?
  • 업무 기술 시, 장표의 관계 연결을 가능하게 하는 규칙이 서술되어 있는가?

식별자란? 주 식별자의 특성

각각의 인스턴스를 구분 가능하게 만들어주는 대표 속성을 뜻한다.

 

주 식별자란? 주 식별자의 특성 # 으로 표현

주 식별자는 PK(Primary Key)에 해당하는 속성 - PK는 여러개 존재할 수 있음

  • 유일성 : 해당 속성이 인스턴스를 유일하게 식별할 수 있는 성질을 가졌는지
  • 최소성 : 최소한의 속성들로만 유일성을 보장하게 하는지
  • 불변성 : 속성값이 변하지 않아야함
  • 존재성 : 속성값은 NULL이 될 수 없음
    -> ex) 유일성과 최소성을 만족하는 속성은 보조키로서 존재할 수 있다.
    -> 즉 특정 특성을 만족함에 따라 속성은 특정 키로서 존재가능

 

식별자의 특성과 특정 여부에 따른 분류

 

대표성 여부

  • 주 식별자(PK) - # 으로 표현 : 유일성, 최소성, 불변성, 존재성을 모두 만족하는 식별자
    -> PK는여러 속성이 존재할 수 있으나, 여러속성이 존재 할 경우 나머지 일반 속성들이 해당 PK들 속성들에 대해 함수적 종속성을 띄어야 함 -> 그렇지 않으면 2차 정규화하여 부분 종속에 해당하는 속성들만 따로 추가 엔터티를 생성한다.
    • 주 식별자 도출 기준
      • 해당 업무에서 자주 이용되는 속성
      • 명칭, 내역 등의 이름은 피함
      • 속성 수를 최대한 적게 구성
      • 자주 변하지 않는 값
  • 보조 식별자
    : 인스턴스 식별은 가능하다 엔터티를 대표하는 식별자는 아님
    -> 즉 다른 엔터티와의 참조 관계로 연결되지 않는다.
    ex) 회원 엔터티에서
    # 회원번호
    * 회원명
    * 아이디
    에서 아이디는 다른 인스턴스랑 중복 될 수 없기 때문에 해당 엔터티에서 인스턴스를 구분짓게 할 수 있는 식별자이나 이것이 엔터티를 대표하지는 못함

 

스스로 생성되었는가에 대한 여부

  • 내부 식별자
    : 다른 엔터티 참조 없이 해당 엔터티 내부에서 스스로 생성된 식별자
  • 외부 식별자
    : 다른 엔터티에서 온 식별자 - 다른 엔터티와 연결고리 역할
    -> 만약 부모 엔터티의 FK를 받아서 이를 주식별자로 사용하면
    -> 해당 자식 엔터티의 PK는 SQL 조인에서 반드시 사용되고 WHERE 절에서 사용 가능성이 높음

 

단일 속성인지에 대한 여부(주식별자 구성이 여러 속성인가)

  • 단일 식별자 : 주 식별자가 1개의 속성으로 구성
  • 복합 식별자 : 주 식별자가 2개 이상의 속성으로 구성
    : 주 식별자가 2개 이상이면 해당 속성들의 우선순위를 잘 매겨서 잘 복합시킨 후 일반 속성들에게 종속시켜야 주 식별자로서 기능을 다하게 된다.

대체되었는지 기존에 있는지에 대한 분류

  • 원조(본질) 식별자 : 업무에 의해 만들어지는 식별자, 가공되지 않은 원래 식별자
  • 인조(대리) 식별자 : 인위적으로 만들어지는 식별자, 주 식별자가 복잡할 때 이를 통합
    ex) 주문 번호 - 대표적 인조, 대리 식별자
          기존 : 사번 + 주문일자 + 순번을 주 식별자로 두고 주문을 처리하다가
          이를 '주문번호' 라는 단일 속성의 주 식별자로 만들면 이게 인조, 대리 식별자가 됨

 

식별자관계와 비식별자 관계

 

식별자 관계

트랜잭션에 의한 관계 - 동시에 커밋, 롤백 - 하나의 커밋 단위로 엔터티들이 묶임

: 부모 엔터티의 식별자 속성이 자식 엔터티의 주 식별자가 되는 관계

  • 강한 연결 관계
  • 실선(항시 연결)
  • 부모 - 자식 관계가 항시 유지
  • SQL문의 조인을 최소화 해줌

 

비식별자 관계

: 부모 엔터티의 식별자 속성이 자식 엔터티의 일반 속성이 되는 관계

  • 약한 연결관계
  • 점선(선택적 연결)
  • 부모 - 자식 관계가 유지 안 될 수있음
    -> 일반 속성 값은 Null이 들어갈 수 있기 때문에 부모 엔터티의 식별자 속성에 값이 없을 때 자식 엔터티의 속성 값(인스턴스)이 생성 가능하다.

 

데이터 모델과 SQL

성능 데이터 모델링 개요

1. 성능 데이터 모델링의 정의

  • 성능 저하의 원인 중 하나는 데이터 모델링의 근본적인 디자인이 잘못되어 있는 경우도 많다.
  • 따라서 성능 데이터 모델링을 통해 성능향상을 도모해야한다.
  • 성능 데이터 모델링이란?
    • 데이터베이스 성능향상을 목적으로 설계단계의 데이터모델링 때부터 성능과 관련된 사항이 모델링에 반영될 수 있도록 하는 것

 

2. 성능 데이터 모델링 수행시점

  • 사전에 성능 모델링을 할 수록 성능 향상을 위한 비용은 적게 든다.
  • 분석/설계 단계에서 성능을 고려해 데이터 모델링을 수행할 경우 재업무 비용을 최소화할 수 있다.
  • 따라서 분석/설계 단계에서 처리성능을 향상시킬 방법을 고려해야한다.

 

3. 성능 데이터 모델링 고려사항

  • 성능 데이터 모델링 프로세스
    • 정규화
    • DB 용량 산정
    • 트랜잭션의 유형 파악 -> 테이블 수직 분할 할 때(반정규화)
    • 용량과 트랜잭션의 유형에 따라 반정규화
    • 이력모델 조정, PK/FK 조정, 슈퍼타입/서브타입 조정
    • 성능관점에서 데이터 모델을 검증

 

정규화

정규화란?

엔터티를 작은 단위로 분리하는 과정

-> 큰 엔터티를 작은 엔터티들로 분리하고 관계 맺음

: 논리 데이터 모델에서 행하는 과정이다. (개념 모델링 X, 물리 모델링 X)

 

정규화의 특징 및 하는 이유와 개념

  • 데이터의 무결성을 위해 수행
  • 최소한의 데이터만을 하나의 엔터티에 넣는 과정, 데이터 분해 과정
  • 데이터 일관성 확보
  • 데이터 독립성 확보 - > 데이터 중복 제거
  • 데이터 유연성 확보 -> 필요 데이터들의 분할로 인해 유연하게 접근 가능
  • 입력, 수정, 삭제 성능은 일반적으로 향상 -> 조회 성능이 저하 될 수 있음

 

정규화의 단점

  • 엔터티 갯수 증가 - 이로 인한 관계가 증가함
  • 데이터 조회 시 여러번의 조인이 요구됨
  • 조회 성능의 저하
    • 식별자, 비식별자와 헷갈리지 말 것 -> 식별자 = join 최소화

 

정규화의 종류

각 정규화를 통해 이루어지는 행위가 있는데 이 행위를 만족하는 엔터티 구조는

제 1 정규형 릴레이션, 제 2 정규형 릴레이션, 제 3 정규형 릴레이션 이라고 칭한다.

 

제 1 정규화

테이블 칼럼들이 원자성(특성의 중복을 방지) 갖게 하기 위해 엔터티 분해

-> 하나의 인스턴스가 비슷한 속성을 여러개 가지지 않게 하기 위해 분리하는 것

 

제 2 정규화

'부분 종속'이 아닌 '완전 종속'을 가져야 한다.

이 때 만약 '부분 종속'을 가지는 일반 속성이 있다면 해당 속성과 해당 속성의 결정자인 부분 종속을 이루고 있는 주 식별자의 속성을 따로 떼어내 추가적인 엔터티를 만들어 제 2정규형을 만족하는 릴레이션을 구축하는 것

또는 주 식별자의 속성이 아닌 일반 속성 끼리 종속 관계를 맺어도 이에 대해 해당 일반 속성이 새로운 엔터티에서 제 2 정규성을 만족하도록 엔터티를 추가적으로 만들어준다.

 

제 3 정규화

정규화된 엔터티의 일반 속성들은 주 식별자에만 함수적 종속을 가져야한다.

그런데 만약 주 식별자의 속성들끼리 종속 관계를 가지고 그 이후에 또 일반 속성에 대해 결정자가 되던지 일반 속성끼리 종속성을 가지는데 이 때의 결정자가 주 식별자 속성에 종속되어 있는 등

A -> B, B -> C와 같은 '이행적 종속'을 이루는 TABLE(엔터티)일 때 이러한 '이행적 종속'을 깨도록 추가적인 엔터티를 만들고 관계를 형성해주는 것이 제 3 정규화이다.

 

BCNF 정규화

모든 결정자가 후보키가 되도록 테이블을 분해하는 것

-> 후보키 : 식별자의 '유일성', '최소성'을 만족하는 속성 집합(or 단일 속성)

 

제 4 정규화

여러 컬럼이 하나의 칼럼 종속시킬 때 분해해서 '다중값 종속성' 제거

 

제 5 정규화

조인에 의해 새로운 종속성이 발생 이를 막기 위해 엔터티 재 분해

 

반 정규화

반정규화란? 특징과 하는 이유?

정규화된 데이터 모델(엔터티, 속성, 관계)에 대해 '성능 향상', '개발, 운영의 단순화'를 위해 데이터를 중복, 통합, 분리하는 기법

정규화 시 엔터티 갯수 증가, 관계 증가 -> 여러 조인을 요구

이러한 경우 디스크 I/O 양이 많아져 성능이 저하되거나 경로가 멀어서 '조인'으로 인한 성능 저하가 예상

비 정규화 = 정규화를 하지 않음

반 정규화 = 위 내용을 하는 것

 

반 정규화의 특징

  • 조회(SELECT) 속도 향상
  • 데이터 모델의 유연성은 저하
    -> 입력/수정/삭제 성능 저하

반정규화 하는 경우

  • 정규화를 통해 엔터티, 관계 수가 많아져서 조회 시 '조인'으로 인한 성능 저하가 예상될 때
  • 컬럼을 계산하고, 읽을 때 FK라서 여러 조인을 또 불러와서 성능이 저하 될 때
    -> 즉 조인으로 인한  I/O 양이 너무 많아져서 처리 성능이 저하 될 때
    -> 중복성을 증가시켜 조회 성능을 향상시킨다.

반정규화 안하면 발생하는 문제

  • 성능 저하된 DB 생성
  • 구축, 시험 단계에서 수정에 따른 노력 비용 발생

 

테이블을 가지고 반정규화 방법(병합, 분할, 추가)

테이블 병합

  • 1:1 관계 테이블 병합
  • 1:M 관계 테이블 병합
  • 슈퍼 서브 타입 테이블 병합
    -> 공통 속성과 개별 속성을 별도로 관리하는 설계 타입

 

테이블 분할

  • 테이블 수직 분할(속성 분할)
    : 트랜잭션 처리 유형 파악이 필요 -> 반정규화에서 테이블 수직 분할 할 때 필요
    -> 테이블 속성 개수 많을 때, 조회 성능 향상을 위해
    -> 자주 쓰이는 속성을 수직 분할 -> 이후 1:1 관계를 이루게 된다.
  • 테이블 수평 분할(인스턴스 분할, 파티셔닝)
    : 물리적으로 데이터 분리

 

테이블 추가

  • 중복 테이블 추가 : 동일한 테이블 구조 중복, 원격 조인 제거
  • 통계 테이블 추가 : SUM, AVG등 전용 테이블 추가
  • 이력 테이블 추가 : 마스터 테이블의 레코드를 긁어서 테이블 추가 생성
  • 부분 테이블 추가 : 이용 빈도 높은 컬럼을 복사하여 별도 테이블 생성, 물리적 디스크 I/O 줄이기 위해

컬럼을 통해 반정규화 하는 방법

  • 중복 컬럼 추가 -> 중복 추가는 다 JOIN 감소 시키기 위해(중복 테이블 추가)
    : 조인 감소를 위해 중복 칼럼 추가
    ex) 최근 상품 가격
  • 파생 컬럼 추가 -> 파생 속성이 이것을 뜻함 -> 부하 줄이기
    : 미리 값을 계싼하여 컬럼에 보관
  • 이력 테이블 컬럼 추가
    : 대량의 이력 데이터를 처리할 때 기능성 컬럼(최근값 여부, 시작&종료일 등)을 추가
  • PK에 의한 컬럼 추가
    : 여러 컬럼으로 이루어진 PK를 가진 테이블을 조인할 경우 단순성을 위해서 인공키를 PK로 지정하고 활용
  • 응용 시스템 오작동을 위한 이전 데이터 보관 컬럼 추가
    : 이전 데이터를 임시적으로 중복하여 보관

 

관계를 통해 반정규화 하는 방법

중복 관계 추가 방법

  • 여러 경로를 거쳐 조인 할 수 있지만, 성능 저하를 예방하기 위해 추가적인 관계를 맺음
    -> 중복 관계 추가는 데이터 무결성을 깨뜨릴 위험성이 없음
    -> 이에 무결성을 지키면서 처리 성능을 향상 시킬 수 있음

 

관계와 조인

관계란?

부모 엔터티의 식별자를 자식에 상속하고, 상속된 속성을 매핑키(조인키)로 활용

 

관계의 분류

  • 존재 관계
  • 행위 관계

조인이란?

데이터 중복을 피하기 위해 테이블은 정규화에 의해 분리

-> 이렇게 분리된 테이블을 동시에 출력하거나 관계가 있는 테이블 참조 위해서는 테이블 연결

-> 이 때 이러한 연결 과정을 조인이라 칭한다.

 

 

계층형 데이터 모델

하나의 엔터티 내에서 인스턴스 끼리 계층 구조를 가지는 경우

-> 계층 구조를 갖는 인스턴스끼리 연결하는 조인을 셀프조인이라 한다.

(같은 테이블 내에서 여러 번 조인 되는 것)

 

상호배타적 관계

하나의 부모가 2개의 자식 엔터티를 가질 때 행위 조건에 따라 두 자식 중 하나의 자식만 관계를 가질 수 있는 것을 상호배타적 관계라 칭한다.

 

트랜잭션이란?

트랜잭션의 특징

  • 하나의 연속적인 업무 단위를 뜻함
  • 트랜잭션에 묶인 엔터티들은 '필수적 관계'를 가짐
  • 하나의 트랜잭션에 속한 동작들은 모두 성공하거나, 모두 취소(UNDO)되어야 한다.
    -> 트랜잭션의 '원자성'
  • 서로 독립적으로 업무가 발생하면 안됨, 순차적으로 함께
  • 부분 커밋 불가, 동시 커밋 & 롤백

 

본질 식별자와 인조 식별자

원조(본질) 식별자

: 업무에 의해 만들어지는 식별자(꼭 필요한 식별자)

 

인조(대리) 식별자

: 원조 식별자가 PK 2개 이상인 복합 식별자 일 때

속성들을 하나의 속성으로 묶어서 사용하면 이것이 인조 식별자

: 꼭 필요하진 않지만 편의성을 위해 인위적으로 만들어지는 것

 

인조 식별자의 단점

  • 중복 데이터 발생 가능성 -> 데이터 품질 저하
  • 불필요한 인덱스 생성 -> 저장 공간 낭비 및 DML 성능 저하
  • 개발 편의성이 줄어들 수 있음
반응형
반응형

(1) 변환 함수

1. 명시적 형변환과 암시적 형변환

-- 데이터베이스에서 데이터 유형에 대한 형변환을 할 수 있는 방법은 두 가지가 있다.
-- 명시적 형변환 : 변환 함수를 사용하여 데이터 유형을 명시적으로 나타냄
-- 암시적 형변환 : 데이터베이스가 내부적으로 알아서 데이터 유형을 변환함
-- 예를 들어 조건절에서 VARCHAR 유형의 BIRTHDAY 컬럼을 숫자와 비교할 경우
-- 데이터베이스는 오류를 뱉지 않고 내부적으로 BIRRTHDAY 컬럼을 NUMBER형으로 변환하게 된다.



2. 명시적 형변환에 쓰이는 함수

-- SQL SERVER의 경우 CONVERT나 CAST 함수를 사용할 수 있다.


ㄱ. TO_NUMBER(문자열)

-- 문자열을 숫자형으로 변환해주는 함수

 

SELECT TO_NUMBER('1234') FROM DUAL;
SELECT TO_NUMBER('ABC') FROM DUAL; -- 오류발생



ㄴ. TO_CHAR(수 OR 날짜, [포맷]) *[]은 옵션

-- 수나 날짜형의 데이터를 포맷 형식의 문자형으로 변환해주는 함수

 

SELECT TO_CHAR(1234) FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD HH24MISS') FROM DUAL;



ㄷ. TO_DATE(문자열, 포맷)

-- 포맷 형식의 문자형의 데이터를 날짜형으로 변환해주는 함수이다.

 

SELECT TO_DATE('20240628', 'YYYYMMDD') FROM DUAL;



(2) NULL 관련 함수


1. NVL(인수1, 인수2)

-- 인수1의 값이 NULL일 경우 인수2를 반환하고 NULL이 아닐 경우 인수1을 반환해주는 함수
-- SQL SERVER의 경우 ISNULL(인수1, 인수2)

 

SELECT * FROM TB_SAMPLE7;

SELECT MEMBER_NO
       ,NVL(REVIEW_SCORE, 0) AS REVIEW_SCORE
FROM TB_SAMPLE7;

 

 


2. NULLIF(인수1, 인수2)

-- 인수1과 인수2가 같으면 NULL을 반환하고 같지 않으면 인수1을 반환해주는 함수
-- REVIEW_SCORE(컬럼) 데이터가 0일 경우 NULL을 반환하고, 0이 아닐경우 REVIEW_SCORE 값을 반환

 

SELECT * FROM TB_SAMPLE7;

SELECT MEMBER_NO
      ,NULLIF(REVIEW_SCORE, 0) AS REVIEW_SCORE
      ,REVIEW
FROM TB_SAMPLE7
WHERE PRODUCT_ID = '100001';

 


3. COALESCE(인수1, 인수2, 인수3 ...)

-- NULL이 아닌 최초의 인수를 반환해주는 함수이다.

 

SELECT * FROM TB_SAMPLE8;
SELECT NAME
       ,COALESCE(PHONE, EMAIL, FAX) AS CONTACT
FROM TB_SAMPLE8;

 

 


4. NVL2(인수1, 인수2, 인수3)

-- 인수1이 NULL이 아닌 경우 인수2를 반환하고 NULL인 경우 인수3을 반환하는 함수

 

SELECT * FROM TB_SAMPLE7;
SELECT MEMBER_NO
      ,NVL2(REVIEW, '리뷰있음', '리뷰없음') AS REVIEW_CHECK
FROM TB_SAMPLE7;



(3) CASE

 

-- CASE는 함수와 성격이 같기는 하지만 표현 방식이 함수라기보다는 구문에 가깝다.
-- 문장으로는 '~이면 ~이고, ~이면 ~이다' 식으로 표현되는 구문
-- 필요에 따라 각 CASE를 여러 개로 늘릴 수도 있다.
-- 같은 기능을 하는 함수로는 ORACLE의 DECODE함수가 있다.
-- 다음 구문은 모든 같은 결과값을 반환한다. *[]은 옵션

 

SELECT * FROM TB_SAMPLE9;

 

-- 아래 SQL 코드는 모두 같은 결과를 나타냅니다.

SELECT SUBWAY_LINE,
        CASE WHEN SUBWAY_LINE = 1 THEN 'BLUE'
             WHEN SUBWAY_LINE = 2 THEN 'GREEN'
             WHEN SUBWAY_LINE = 3 THEN 'ORANGE'
             ELSE 'GRAY'
        END AS LINE_COLOR
FROM TB_SAMPLE9;

SELECT SUBWAY_LINE,
        CASE SUBWAY_LINE
            WHEN 1 THEN 'BLUE'
            WHEN 2 THEN 'GREEN'
            WHEN 3 THEN 'ORANGE'
            ELSE 'GRAY'
        END AS LINE_COLOR
FROM TB_SAMPLE9;

SELECT SUBWAY_LINE,
        DECODE(SUBWAY_LINE, 1, 'BLUE', 2, 'GREEN', 3, 'ORANGE', 'GRAY') AS LINE_COLOR
FROM TB_SAMPLE9;

-- TIP) CASE 문에서 ELSE 뒤의 값이 DEFAULT 값이 되고 별도의 ELSE가 없을 경우 NULL이 DEFAULT가 된다.

 

연습문제) 다음 SQL의 결과는?

 

SELECT 
    CASE WHEN COL1 = 'C' THEN SUBSTR(COL2, 2, 1)
         WHEN COL1 = '가' THEN 'C'
         WHEN COL1 = '1' THEN '10'
         ELSE 'B'
    END AS RESULT
FROM TB_SAMPLE10;

반응형
반응형

(1) 문자함수



1. CHR(ASCII 코드)

ASCII 코드를 인수로 입력했을 때 매핑되는 문자가 무엇인지를 알려주는 함수
SQL SERVER 인경우 CHAR(ASCII 코드)
SELECT CHR(65) FROM DUAL;



2. LOWER(문자열)

문자열을 소문자로 변환해주는 함수이다.
SELECT LOWER('JENNIE') FROM DUAL;



3. UPPER(문자열)

문자열을 대문자로 변환해주는 함수이다.
SELECT UPPER('jennie') FROM DUAL;



4. LTRIM(문자열, [특정문자]) *[]은 옵션임

특정문자를 따로 명시하지 않으면 문자열의 왼쪽 공백을 제거
명시해주었을 경우 문자열을 왼쪽부터 한 글자씩 특정문자와 비교하여 특정 문자에 포함되어 있으면 제거,
포함되지 않았으면 멈춘다.
SQL SERVER의 경우 공백 제거만 가능하다.
SELECT LTRIM('      JENNIE') FROM DUAL;
SELECT LTRIM('블랙핑크', '블랙') FROM DUAL;



5. RTRIM(문자열, [특정문자]) *[]은 옵션

특정문자를 바로 명시해주지 않으면 문자열의 오른쪽 공백을 제거
명시해주었을 경우 문자열을 오른쪽부터 한 글자씩 특정문자와 비교하여 특정 문자에 포함되어 있으면 제거하고
포함되지 않으면 멈춘다.
SQL SERVER의 경우 공백 제거만 가능하다.

 

SELECT RTRIM('JENNIE      ') FROM DUAL;
SELECT RTRIM('블랙핑크', '핑크') FROM DUAL;


6. TRIM([위치] [특정문자] [FROM] 문자열) *[]은 옵션

-- 옵션이 하나도 없을 경우 문자열의 왼쪽과 오른쪽 공백을 제거하고
-- 그렇지 않을 경우 문자열을 위치(LEANDING OR TRAILING OR BOTH)로 지정된 곳 부터
-- 한 글자씩 특정문자와 비교하여 같으면 제거, 같지않으면 멈춘다.
-- LTRIM, RTRIM과는 달리 특정 문자는 한 글자만 지정할 수 있다.
-- SQL SERVER의 경우 공백 제거만 가능하다.

 

SELECT TRIM('     JENNIE       ') FROM DUAL;
SELECT TRIM(LEADING '블' FROM '블랙핑크') FROM DUAL;
SELECT TRIM(TRAILING '크' FROM '블랙핑크') FROM DUAL;



7. SUBSTR(문자열, 시작점[길이]) *[]은 옵션

-- 문자열의 원하는 부분만 잘라서 반환해주는 함수
-- 길이를 명시하지 않았을 경우 문자열의 시작점부터 문자열의 끝까지 반환된다.
-- SQL SERVER의 경우 SUBSTRING(문자열)

 

SELECT SUBSTR('블랙핑크제니', 3, 2) FROM DUAL;
SELECT SUBSTR('블랙핑크제니', 3, 4) FROM DUAL;



8. LENGTH(문자열)

-- 문자열의 길이를 반환해주는 함수
-- SQL SERVER의 겨웅 LEN(문자열)

 

SELECT LENGTH('JENNIE') FROM DUAL;
SELECT LENGTH('블랙핑크') FROM DUAL;



9. REPLACE(문자열, 변경 전 문자열, [변경 후 문자열]) *[]은 옵션

-- 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿔주는 함수이다.
-- 변경 후 문자열을 명시해주지 않으면 문자열에서 변경 전 문자열을 제거한다.

 

SELECT REPLACE('블랙핑크제니', '제니', '지수') FROM DUAL;
SELECT REPLACE('블랙핑크제니', '블랙') FROM DUAL;


10. LPAD(문자열, 길이, 문자)

-- 문자열이 설정한 길이가 될 때까지 왼쪽을 특정 문자로 채우는 함수

 

SELECT LPAD('JENNE', 10, 'V') FROM DUAL;

(2) 숫자함수


1. ABS(수)

-- 수의 절댓값을 반환해주는 함수
SELECT ABS(-1) FROM DUAL;
SELECT ABS(2) FROM DUAL;



2. SIGN(수)

-- 수의 부호를 반환해주는 함수이다.
-- 양수이면 1, 음수이면 -1, 0이면 0을 반환

 

SELECT SIGN(-7) FROM DUAL;
SELECT SIGN(7) FROM DUAL;
SELECT SIGN(0) FROM DUAL;



3. ROUND(수, [자릿수]) *[]은 옵션

-- 수를 지정된 소수점 자릿수까지 반올림하여 반환해주는 함수이다.
-- 자릿수를 명시하지 않았을 경우 기본값은 0
-- 반올림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환한다.

 

SELECT ROUND(163.76, 1) FROM DUAL;
SELECT ROUND(163.76, -2) FROM DUAL;



4. TRUNC(수, [자릿수]) *[] 은 옵션

-- 수를 지정된 소수점 자릿수까지 버림하여 반환해주는 함수
-- 자릿수를 명시하지 않았을 겨웅 기본값은 0이며 버림된 정수로 반환
-- 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환

 

SELECT TRUNC(54.29, 1) FROM DUAL;
SELECT TRUNC(54.29, -1) FROM DUAL;



5. CEIL(수)

-- 소수점 이하의 수를 올림한 정수를 반환해주는 함수
-- SQL SERVER의 경우 CEILING(문자열)

 

SELECT CEIL(72.86) FROM DUAL;
SELECT CEIL(-33.4) FROM DUAL;



6. FLOOR(수)

-- 소수점 이하의 수를 버림한 정수를 반환해주는 함수

 

SELECT FLOOR(22.3) FROM DUAL;
SELECT FLOOR(-22.3) FROM DUAL;


7. MOD(수1, 수2)

-- 수1을 수2로 나눈 나머지를 반환하는 함수
-- 단 수2가 0일 때는 수1을 반환함

 

SELECT MOD(15, 7) FROM DUAL;
SELECT MOD(15, -4) FROM DUAL;

(3) 날짜함수


1. SYSDATE

-- 현재의 연, 월, 일, 시, 분, 초를 반환해주는 함수
--(nls_date_format에 따라서 sysdate의 출력양식은 달라질 수 있음)
-- SQL SERVER의 경우 GETDATE()

 

SELECT SYSDATE FROM DUAL;



2. EXTRACT(특정 단위 FROM 날짜 데이터)

-- 날짜 데이터에서 특정 단위(YEAR, MONTH, DAT, HOUR, MINUTE, SECOND)
-- 만을 출력해서 반환해주는 함수
-- SQL SERVER의 경우 DATEPART(특정단위, 날짜 데이터)

 

SELECT EXTRACT(YEAR FROM SYSDATE) AS YEAR,
       EXTRACT(MONTH FROM SYSDATE) AS MONTH,
       EXTRACT(DAY FROM SYSDATE) AS DAY
FROM DUAL;



3. ADD_MONTHS(날짜 데이터, 특정 개월 수)

-- 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환해주는 함수
-- 날짜의 이전 달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면
-- 해당월의 마지막 일자가 반환된다.
-- SQL SERVER 의 경우 DATEADD(MONTH, 특정 개월 수, 날짜 데이터)

 

SELECT ADD_MONTHS(TO_DATE('2024-06-28', 'YYYY-MM-DD'), -1) AS PREV_MONTH
       ,ADD_MONTHS(TO_DATE('2024-06-28', 'YYYY-MM=DD'), 1) AS NEXT_MONTH
FROM DUAL;




반응형

'자격증 > SQLD' 카테고리의 다른 글

📘 SQLD 자격증 준비 — SQL 함수 완전 정복!  (0) 2025.05.06
SQLD 요약정리 (1)  (1) 2024.07.03
[SQL] 변환함수, NULL 관련함수, CASE  (0) 2024.06.28
데이터 모델과 SQL  (0) 2023.10.24
Part 1) 데이터 모델링의 이해  (1) 2023.10.23
반응형

인접 관계 선택자


종류 사용법 설명
부모 요소 선택자 $("요소 선택").parent() 선택한 부모 요소를 선택합니다.
상위 요소 선택자 $("요소 선택").parents() 선택한 요소의 상위 요소를 모두 선택합니다.
가장 가까운 상위 요소 선택자 $("요소 선택").closest("div") 선택한 요소의 상위 요소 중 가장 가까운 <div>만 선택합니다.
하위 요소 선택자 $("요소 선택 하위 요소") 선택한 요소에 지정한 하위 요소를 선택합니다.
자식 요소 선택자 $("요소 선택>자식 요소") 선택한 요소를 기준으로 자식 관계에 지정한 요소만 선택니다.
자식 요소들 선택자 $("요소 선택").children() 선택한 요소의 모든 자식 요소를 선택합니다.
형(이전) 요소 선택자 $("요소 선택").prev() 선택한 요소의 바로 이전 요소를 선택합니다.
형(이전) 요소들 선택자 $("요소 선택").prevAll() 선택한 요소의 이전 요소 모두를 선택합니다.
지정 형(이전) 요소들 선택자 $("요소 선택").prevUntil("요소명") 선택한 요소부터 지정한 요소의 이전 요소까지 모두 선택합니다.
동생(다음) 요소 선택자 $("요소 선택").next()
$("요소 선택 + 다음요소")
선택한 요소의 다음 요소를 선택합니다.
동생(다음) 요소들 선택자 $("요소 선택").nextAll() 선택한 요소의 다음 요소를 모두 선택합니다.
지정 동생(다음) 요소들 선택자 $("요소 선택").nextUntil("h2") 선택한 요소부터 지정한 요소의 다음 요소까지 모두 선택합니다.
전체 형제 요소 선택자 $(".box_1").siblings() class 값이 box_1인 요소의 형제 요소 전체를 선택합니다.

 

1) 부모 요소 선택자

선택한 부모 요소를 선택합니다,

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>인접 관계 선택자</h1>
    <ul id="wrap">
        <li>리스트1
            <!-- 자식 목록 -->
            <ul>
                <li id="list_1">리스트1-1</li>
                <li>리스트1-2</li>
            </ul>
        </li>
        <li>리스트2</li>
        <li>리스트3</li>
    </ul>
     <!-- jquery cdn -->
     <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
     <script>
        $(function(){
            // 코딩 : #list_1에서 부모 태그 선택하기
            // 사용법 : $("CSS선택자").parent().함수()
            $("#list_1").parent()
                        .css("border", "2px dashed #f00");
        });
     </script>
</body>
</html>

 

결과

 

2) 자식 요소 선택자

선택한 요소의 모든 자식 요소를 선택합니다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="wrap">
        <h1>인접 관계 선택자</h1>
        <p>내용 1</p>
        <section>
            <h1>하위 요소 선택자</h1>
            <p>내용2</p>
        </section>
    </div>

     <!-- jquery cdn -->
     <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
     <script>
        // #wrap > section 아래 자식 태그를 선택해서
        // background-color : yellow
        // border : 2px solid #f00 으로 수정하기

        $(function(){
            $('#wrap > section').children()
            .css('background-color', 'yellow')
            .css('border', '2px solid #f00');
        });
     </script>
</body>
</html>

 

결과

 

3) 형(이전) 요소 선택자 와 동생(다음) 요소들 선택자

- 선택한 요소의 바로 이전 요소를 선택합니다.( $("요소 선택").prev())

- 선택한 요소의 다음 요소를 선택합니다. ( $("요소 선택").next() / $("요소 선택 + 다음요소"))

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <h1>인접 관계 선택자</h1>
        <p>내용1</p>
        <p class="txt">내용2</p>
        <p>내용3</p>
        <p>내용4</p>
      </div>
  
      <!-- jquery cdn -->
      <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
      <script>
        $(function(){
            // .txt 선택태그 앞/뒤에 태그 선택하기
            // 사용법 : $('css 선택자').prev().함수() => 앞의 태그 선택
            $('.txt').prev().css('background-color', '#0ff');

            // 뒤의 태그 선택하기
            // 사용법 : $('css 선택자').next().함수() => 뒤의 태그 선택
            $('.txt').next().css('border', '2px dashed #f00');
        });
      </script>
</body>
</html>

 

결과

 

 

4) 형(이전) 요소들 선택자와 동생(다음) 요소들 선택자

- 선택한 요소의 이전 요소 모두를 선택합니다.

- 선택한 요소의 다음 요소를 모두 선택합니다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="wrap">
        <h1>인접 관계 선택자</h1>
        <p>내용1</p>
        <p class="txt">내용2</p>
        <p>내용3</p>
        <p>내용4</p>
      </div>
  
      <!-- jquery cdn -->
      <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
      <script>
        // 앞/뒤 모든 태그 선택하기

        // 앞의 모든 태그 선택
        // $('css 선택자').prevAll().함수();
        $('.txt')
        .prevAll()
        .css('background-color', '#0ff')
        .css('border', '2px dashed #f00');

        // 뒤의 모든 태그 선택
        // $('css 선택자').nextAll().함수();
        $('.txt')
        .nextAll()
        .css('background-color', '#f00')
        .css('border', '2px dashed #f00');

      </script>
</body>
</html>

 

결과

 

5) 전체 형제 요소 선택자

- 요소의 형제 요소 전체를 선택합니다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="wrap">
      <h1>인접 관계 선택자</h1>
      <p>내용1</p>
      <p class="txt">내용2</p>
      <p>내용3</p>
      <p>내용4</p>
    </div>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
    <script>
        $(function(){
            // 코딩
            // 예제 : .txt의 형제 태그 선택해서 디자인 적용
            // $("CSS선택자").siblings().함수();
            $(".txt").siblings()
            .css("background-color", "#0ff")
            .css("border", "2px dashed #f00");
        });
    </script>
  </body>
</html>

 

결과

 

7) 지정 형(이전) 요소들 선택자와 지정 동생(다음) 요소들 선택자

- 선택한 요소부터 지정한 요소의 이전 요소까지 모두 선택합니다.

- 선택한 요소부터 지정한 요소의 다음 요소까지 모두 선택합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="wrap">
        <h1 class="title">인접 관계 선택자</h1>
        <p>내용1</p>
        <p>내용2</p>
        <p class="txt3">내용3</p>
        <p>내용4</p>
        <p>내용5</p>
        <p class="txt6">내용6</p>
      </div>
  
      <!-- jquery cdn -->
      <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
      <script>
        // 선택태그(.txt) 부터 대상태그(.title) 앞까지만 선택하기 (앞)
        // 사용법 $('기준선택자').prevUntil('대상선택자').함수()
        $(function(){
            $('.txt3')
            .prevUntil('.title')
            .css('background-color', '#0ff')
            .css('border', '2px dashed #f00');
        });

        // 선택태그(.txt3)부터 대상태그(.txt6)사이 선택하기 (뒤)
        // 사용법 $('기준선택자').prevUntil('대상선택자').함수()
        $(function(){
            $('.txt3')
            .nextUntil('.txt6')
            .css('background-color', '#0ff')
            .css('border', '2px dashed #f00');
        });
      </script>
</body>
</html>

 

결과

 

8) 상위 요소 선택자

- 선택한 요소의 상위 요소를 모두 선택합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1 class="title">선택자</h1>
    <section>
      <div>
        <p class="txt1">내용</p>
      </div>
    </section>

    <section>
      <div>
        <p class="txt2">내용</p>
      </div>
    </section>

     <!-- jquery cdn -->
     <script src="http://code.jquery.com/jquery-3.1.0.js"></script>

     <script>
        // .txt1 선택태그 위의 부모 모두 선택하기
        // 사용법 : $('css선택자').parents().함수();
        $('.txt1').parents()
        .css('border', '2px dashed #f00');
     </script>
</body>
</html>

 

결과

 

 

9) 가장 가까운 상위 요소 선택자

- 선택한 요소의 상위 요소 중 가장 가까운 태그만 선택합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1 class="title">선택자</h1>
    <div>
        <div>
            <p class="txt1">내용</p>
        </div>
    </div>

     <!-- jquery cdn -->
     <script src="http://code.jquery.com/jquery-3.1.0.js"></script>

     <script>
        // 선택태그에서 부모태그들 중 가장 가까이 있는 태그 선택
        // 사용법 : $('css선택자').closest('부모태그').함수();

        $('.txt1').closest('div')
        .css('border', '2px dashed #f00');
     </script>
</body>
</html>

 

결과

 

반응형

'JavaScript > jQuery' 카테고리의 다른 글

[jQuery] 직접선택자(2)  (0) 2024.06.26
[jQuery] jQuery 기본과 직접선택자  (0) 2024.06.26
반응형
  • h1 요소와 ID가 tit3인 h3 요소의 스타일을 변경하여, 배경색을 하늘색으로, 테두리를 빨간색 점선으로 적용하기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>제이쿼리</h1>
    <h2>선택자</h2>
    <h3 id="tit3">직접선택자</h3>
    <h3>인접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>

    <script>
        $(function(){
            // 예제 : 2개를 선택해서 디자인 적용하기
            // $('선택자, 선택자2').함수();
            $('h1, #tit3')
            .css('background-color', '#0ff')
            .css('border', '2px dashed #f00');
        });
    </script>
</body>
</html>

 

결과

 

💡 일치선택자

 

h1에 tit 부분에 배경색과 border 지정하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1 class="tit">제이쿼리</h1>
    <h1>선택자</h1>
    <h3 class="tit">직접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
    <script>
        // 일치 선택자
        $(function(){
            $('h1.tit')
            .css('background-color', '#0ff')
            .css('border', '2px dashed #f00');
        });
    </script>
</body>
</html>

 

결과

💡 연습문제

#wrap 밑에 h1 태그만 선택해서 디자인 적용    background-color yellow    border 2px dashed #f00

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
      <!-- 연습문제 : #wrap 밑에 h1 태그만 선택해서 디자인 적용
    background-color yellow
    border 2px dashed #f00
    -->
    <div id="wrap">
        <h1>인접한 관계 선택자</h1>
        <p>내용</p>
        <section>
            <h1>하위 요소 선택자</h1>
            <p>내용2</p>
        </section>
    </div>
      <!-- jquery cdn -->
      <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
      <script>
        $('#wrap > h1')
        .css('background-color', 'yellow')
        .css('border', '2px dashed #f00');
      </script>

</body>
</html>

 

결과

 

 

반응형

'JavaScript > jQuery' 카테고리의 다른 글

[jQuery] 인접 관계 선택자  (0) 2024.06.26
[jQuery] jQuery 기본과 직접선택자  (0) 2024.06.26
반응형

들어가기 전에


💡 라이브러리?

 

자주 사용되는 함수들의 모임(묶음)을 말합니다.

 

💡 jquery를 사용하게 된 배경
  • 웹 브라우저(익스플로러, 크롬, 사파리 등…) 간의 js 문법이 잘 동작하지 않았음
    • 크로스 브라우저 문제 ⇒ jquery가 등장
  • 바닐라 js 보다 코딩이 짧고 사용이 쉬운 것이 장점
  • 단점으로는 용량이 크고, 성능이 떨어짐
💡 jquery?

 

함수를 이용해서 DOM을 조작하는 것임

 

jQuery 기본문법

$(function() {jquery 실행문});
  • HTML 위쪽에 넣어도 실행되게 만드는 구문 ⇒ HTML 태그 보다 뒤 늦게 실행을 시켜주는 구문
// 사용법

$(function(){
	$('#title').css('color', 'skyblue');
});

 

전체 선택자


‘*’ 키워드를 사용하며, 전체 태그를 선택함

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>제이쿼리</h1>
    <h2>선택자</h2>
    <h3>직접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
    <script>
        $(function(){
            // * : 전체선택자
            // 전체 태그를 선택해서 외곽선을 1px solid blue 해라.
            // jquery : $("*").css("속성", "값");   // 디자인 조작
            $("*").css("border", "1px solid blue");
        })
    </script>
</body>
</html>

 

결과

css 선택자


1. 직접선택자

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>제이쿼리</h1>
    <h2 id="tit">선택자</h2>
    <h3>직접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>

    <script>
        $(function(){
            // jquery 작성
            // 예제 : 배경색: #ff0, border : 2px solid black
            // TODO : 메소드(함수) 체이닝
            // 사용법 : $("CSS선택자").함수().함수() ...
            $("#tit").css("background-color", "#ff0")
                    .css("border", "2px solid black");
        })
    </script>
</body>
</html>

 

결과

[연습문제]

id = tit 선택해서 / background-color : #ff0 / border : 2px dashed black 설정하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 연습문제 1) id = tit 선택해서 -->
    <!-- background-color : #ff0 -->
    <!-- border : 2px dashed black -->
    <h1>제이쿼리</h1>
    <h2 id="tit">선택자</h2>
    <h3>직접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
    <script>
        $(function(){
            $("#tit").css("background-color", "#ff0")
                    .css("border", "2px dashed black");
        })
    </script>
</body>
</html>

 

결과

 

[연습문제 2]

h2 태그를 선택해서 디자인 적용하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 연습문제 h2 태그를 선택해서 디자인 적용 -->
    <!-- background-color : skyblue -->
    <!-- border : 2px dashed black -->
    <h1>제이쿼리</h1>
    <h2>선택자</h2>
    <h3>직접선택자</h3>

    <!-- jquery cdn -->
    <script src="http://code.jquery.com/jquery-3.1.0.js"></script>
    <script>
        $(function(){
            $("h2")
            .css("background-color", "skyblue")
            .css("border","2px dashed black");
        })
    </script>
</body>
</html>

 

결과

반응형

'JavaScript > jQuery' 카테고리의 다른 글

[jQuery] 인접 관계 선택자  (0) 2024.06.26
[jQuery] 직접선택자(2)  (0) 2024.06.26
반응형

SELECT

저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어

SELECT 컬럼1, 컬럼2, ... FROM 테이블명 WHERE 컬럼1 = '아무개';

컬럼을 따로 명시하지 않고 *(asterisk)를 쓰면 전체 컬럼이 조회되며 조회되는 컬럼의 순서는 테이블의 컬럼 순서와 동일, 별도의 WHERE 절이 없으면 테이블의 전체 Row가 조회됨!

SELECT * FROM 테이블;
  • 테이블이나 컬럼명에 별도의 별칭(Alias)를 붙여줄 수 있음
  • 여러개의 테이블을 조인하거나 서브쿼리가 있을 때 컬럼명 앞에 테이블명을 같이 명시해야 하는 경우

예제

다음 중 문법 에러가 발생하는 SQL은 어느 것일까?

1. select d.dept_no from departments d;
2. select departments.dept_no from departments t where dept_no = 'd009';
3. select departments.dept_no from departments where dept_no = 'd009';
4. select dept_no from departments t where t.dept_no = 'd009';

정답 ) 2

풀이) 테이블 명에 Alias를 설정했을 경우 컬럼명에 테이블 명 대신 Alias를 이용해야 한다.

select t.dept_no from departments t where dept_no = 'd009';

산술연산자

  • 수학에서 사용하는 사칙연산의 기능을 가진 연산자
  • NUMBER DATE 유형의 데이터와 같이 사용할 수 있다.
  • ( ) : 괄호로 우선순위를 조정할 수 있음
    • : 곱하기
    • / : 나누기
    • : 더하기
    • : 빼기
select 10+5, 10-5, 10*5, 10/5 from dual;
select * from sample;
select col1 + col2 AS A,
	     col1 - col2 AS B,
       col1 * col2 AS C,
       col1 / col2 AS D
from sample;
select col1+col2*col1 AS R1,
       (col1+col2)*col1 AS R2
from sample;

예제

다음 SQL의 결과는 무엇인가?

select col1 + col2 AS RESULT from sample2;

[SAMPLE2 테이블]

정답)

해설) 다른 컬럼끼리 연산(가로연산)에서 NULL이 포함되어 있으면 결과값은 Null이 된다.

 

합성 연산자

  • 문자와 문자를 연결할 때 사용하는 연산자
-- Oracle
SELECT 'S'||'Q'||'L'||'개'||'발'||'자' AS SQLD FROM DUAL;
-- MySQL
SELECT CONCAT('S', 'Q', 'L', '개', '발', '자') AS SQLD FROM DUAL;
select * from sample3;
-- Oracle
select col1 || ' ' || 'SQLD' || ' ' || col2 AS RESULT from sample3;

-- MySQL
select concat(col1, ' ', 'SQLD', ' ', col2) AS RESULT from sample3;

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

SQL의 종류  (1) 2024.09.19
관계형 데이터베이스와 테이블  (0) 2024.09.19
WHERE 절  (0) 2024.06.25
프로시저  (0) 2023.09.15
VIEW  (0) 2023.09.15
반응형

INSERT를 제외한 DML문을 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문

SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명 WHERE 조건절;
SELECT * FROM employees
WHERE gender = 'M';
UPDATE 테이블명 SET 컬럼명 = 새로운데이터 WHERE 조건절;

DELETE FROM 테이블명 WHERE 조건절;

(1) 비교 연산자

연산자의미예시

= 같음 WHERE COL = 10
< 작음 WHERE COL < 10
< = 작거나 같음 WHERE COL < = 10
> WHERE COL > 10
> = 크거나 같음 WHERE COL > = 10

다음 쿼리는 first_name이 Georgi인 행을 조회한다.

SELECT first_name, last_name, gender FROM employees
WHERE first_name = 'Georgi';

다음 쿼리는 salary가 60000보다 작은 행을 조회한다.

select emp_no, salary from salaries
where salary < 60000;

다음 쿼리는 first_name과 Georgi의 데이터 타입이 맞지 않아 에러가 발생한다.

SELECT first_name, last_name, gender FROM employees
WHERE first_name = Georgi;
💡 first_name과 같은 문자형 컬럼을 비교 조건으로 사용하려면 우측 상수값을 반드시 인용부호로 감싸주어야 한다.

 

(2) 부정 비교 연산자

연산자의미예시

! = 같지 않음 where col ! = 10
^= 같지 않음 where col ^= 10
<> 같지 않음 where col <> 10
not 컬럼명 = 같지 않음 where not col = 10
not 컬럼명 > 크지 않음 where not col > 10

다음 쿼리는 first_name 이 Georgi 가 아닌 행을 조회한다.

SELECT first_name, last_name, gender FROM employees
WHERE first_name <> 'Georgi';
💡 논리 연산자는 SQL에 명시된 순서와는 관계없이 () → NOT → AND → OR 순으로 처리된다.

 

💡 조건식에서 컬럼명은 일반적으로 좌측에 위치하지만 우측에 위치해도 정상 작동한다.

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

관계형 데이터베이스와 테이블  (0) 2024.09.19
SELECT 문  (0) 2024.06.25
프로시저  (0) 2023.09.15
VIEW  (0) 2023.09.15
SYSTEM_ROLE  (0) 2023.09.14
반응형

개발자로 직종을 변경하고 친구들에게 개발자에게 필요한 자격증에 대해 얘기하다가 정보처리기사 자격증을 알게 되었다.

그래서 회사를 퇴사하자마자 바로 2023년 3회차 시험에 필기시험을 접수하고 본격적인 준비를 시작했다.

 

정보처리기사 필기 합격기준

 
총 5과목으로 구성되어 있으며 한 과목당 40점은 넘어야 하고, 평균 60점 이상이여야 합격할 수 있다.
 
코로나가 끝난 후 개발자로의 취업은 많이 어려워졌다는 것을 많이 들었다.
 
그래서 비전공자인 나는 이 정보처리기사 자격증이 꼭 필요했다.
 
그래서 6월에 회사를 퇴사하자마자 필기 준비를 시작했다.
 

정보처리기사 필기 공부법

 
정보처리기사 필기는 CBT 형식으로 치뤄지고, 시험장에서 PC로 시험을 치고 합/불합격을 바로 확인할 수 있다.
 
짧은 시간 내에 합격하기 위해 나는 기출문제 사이트인 CBT 사이트를 이용해
 
매일 4~5시간동안 필기 기출을 반복적으로 공부하였다.
 
https://www.comcbt.com/

 

최강 자격증 기출문제 전자문제집 CBT

전자문제집, CBT, 컴씨비티, 씨비티, 기사, 산업기사, 기능사, 컴활, 컴퓨터활용능력, 1급, 2급, 워드, 정보처리, 전기, 소방, 기계, 사무자동화, 정보기기, 제과, 제빵, 한국사, 공무원, 수능, 필기,

www.comcbt.com

 
여기 사이트에서 기출문제를 반복한 결과 1트만에 합격!
 
필기 합격 후 실기가 남아있어 실기를 바로 준비하였다.
 
하지만....
 
 

정보처리기사 실기 합격기준 

 
정보처리기사는 필답형으로 진행되며 20문제가 출제된다고 한다.
 
프로그래밍 문제와 단답형과 계산형 문제가 나오는데 기준은 아래와 같다.
 
실기 : 100점을 만점으로 하여 60점 이상.
 
이 23년 3회 실기시험을 신청했는데 이 때 학원 교육을 듣고 프로젝트를 진행하면서 실기 시험 할 시간이 많이 없었다.
 
그래도 응시료가 아까워 실기는 어떻게 나오는지 맛보러 가보자는 마음으로 실기 시험을 응시했는데 그 결과..
 

불합격 컷

 
그래도 실기가 어떻게 나오는지 경험해봤다는 생각으로 다음 회차에는 꼭 합격하겠다는 생각으로 24년 1회차 실기 시험을 위해 실기 공부를 2배 이상 공부했다.
 

정보처리기사 실기 공부법

 
정보처리기사 실기는 필기와는 다르게 기출문제만 봐서는 합격하기 힘든 시험이다.
 
그래서 나는 실기 이론과 기출+예상문제가 있는 수제비 정보처리기사 실기 책을 구입했다.
 
그리고 학원 친구들과 매주 스터디도 하면서 자격증 취득을 위해 열심히 공부를 했다.
 

 
비전공자를 위한 최고의 수험서라고 책에 적혀있는데 비전공자가 이해하기에 쉽기도 했고, 수제비 카페가 있어 스터디도 할 수 있고 유튜브도 있어 많은 정보를 얻을 수 있었다.
 
그리고 프로그래밍 문제는 흥달쌤 유튜브를 많이 참고했다. 특히나 C언어 부분이 비전공자인 나는 많이 어려웠는데 유튜브를 보면서 많은 도움이 되었다.
https://www.youtube.com/@HeungSsaem

 

흥달쌤

흥달쌤과 함께하는 IT 채널입니다. 정보처리기사 자격증 관련된 강의 및 실무 노하우, 프로그래밍 언어(JAVA, C언어, Python) 특강 등이 진행됩니다. 앞으로 진행 예정인 동영상은 IT 관련된 이야기

www.youtube.com

 
특히 실기 시험 전 날 라이브 강의도 해주셨는데 유튜브로 라이브 강의도 보면서 시험에 잘나올법한 내용들을 한번도 복습했던게 컸었다.
 
 

대망의 실기 시험날

 
정보처리기사 실기는 부산 동의대학교에서 시험을 쳤다.
 
시험 난이도는 작년 3회차 시험 보다 난이도가 쉬웠다고 생각했다. 내가 예상한 문제도 나온거 같았고, 프로그래밍 언어 문제도 무난하게 나온것으로 기억한다.
 
실기 시험을 치고 개발자로 취업하기 위해 회사 면접도 보면서 서울에 있는 개발 회사에 취업하고 몇일 뒤 실기 결과가 나왔다!
 

실기 시험은 2트만에 성공!

 
뭔가 실기시험 끝나고 합격할거 같다는 느낌반 몇 점차이로 떨어질거 같다는 생각 반으로 반신반의했는데 운이 좋게도 합격을 했다. 실기시험은 약간의 문제 운도 있는거 같다.
 

개발자의 첫 자격증

 
드디어 나도 정처기를 손에 넣었다. 이제 리눅스 마스터랑 SQLD 자격증도 도전 할 예정이다.

반응형

'자격증 > 정보처리기사' 카테고리의 다른 글

SW 구축 _ 프로젝트 계획 및 분석  (0) 2023.09.19
SW 구축 _ 소프트웨어 공학  (0) 2023.09.19
반응형

자바스크립트를 사용하여 프로그래밍을 할 때는
데이터를 변수와 상수라는 박스를 만들어 그 안에 넣어서 사용합니다.
이때, 변하지 않는 값이라면 변수를, 고정된 값이라면 상수를 사용합니다.

 

변수와 상수?

 

어떤 의미를 가진 하나의 데이터가 여러 곳에서 사용될 때 변수나 상수를 사용하면 코드 작성이 간편해집니다.

이때 값을 저장하고 변경할 수 있는 것을 변수, 똑같이 값을 저장하지만 변하지 않는 고정값을 담는 것을 상수라고 합니다.

 

다음은 변수와 상수를 선언한 코드입니다. 해석을 해보자면 switchOn 이라는 박스에 true 라는 값이, PI(원주율)이라는 박스에 3.1415926535라는 값이 들어있다는 뜻입니다. 여기서 switchOn은 let을 사용한 변수, PI는 const를 사용한 상수라고 부릅니다.

이처럼 변수와 상수는 이름을 통해 어떤 데이터에 의미를 부여하는 역할도 할 수 있습니다.

let switchOn = true;
const PI = 3.1415926535

 

변수를 사용하면 수정 내용을 코드 전체에 동일하게 적용해야 할 때 변수만 바꿔 주면 되어 무척 편리합니다.

switchOn 의 true를 false로 바꾸면 switchOn을 사용한 코드에 들어가는 모든 값이 바뀌게 됩니다. 반면 고정된 값을 여러 곳에서 사용할 때는 상수를 사용합니다.

 

 

변수를 사용할 때 var를 사용하지 않나요?

ES6 이전에는 자바스크립트에서 변수를 선언할 때 var라는 명령어를 사용하였습니다. 자바스크립트 초창기에는 이것이 굉장히 불안정해 오류의 원인으로 작용했습니다. 하지만 오늘날 ES6 버전 이후부터는 let과 const가 var를 대체합니다.

*
var x = 1;
var y = 2;

console.log(x, y);

* 이렇게 코드를 작성하면 같은 이름의 변수를 두 번 선언할 수 있는 등 코드를 불안정하게 하는 원인이 됩니다.

 

간단히 말해서 let은 변수를 만드는 키워드, const는 상수를 만드는 키워드라 생각하시면 됩니다.

키워드 의미 특징
let 변수를 선언 넣은 데이터를 변경할 수 있음
const 상수를 선언 넣은 데이터를 변경할 수 없음

 

let

 

아래의 코드는 a라는 박스에 1이라는 데이터를 담는다는 뜻입니다. 프로그래밍에서 등호(=)는 단순히 같다는 뜻이 아니라 왼쪽에 오른쪽의 값을 넣는다고 이해해야 합니다. 따라서 콘솔로 a를 출력하면 let 변수 선언을 통해 담긴 1이라는 결과가 나옵니다.

 

 

b라는 박스를 하나더 만들어서 b에 a값을 넣어보겠습니다.

a, b 박스의 값이 각각 1로 출력되었습니다.

오른쪽에 있는 a라는 박스의 값을 왼쪽의 b 박스에 넣어줬다고 생각하시면 됩니다.

 

 

이번에는 let을 붙이지 않고 a 박스에 2를 넣어보겠습니다. 왜냐하면 a라는 박스가 이미 만들어져있기 때문입니다. 그러면 a 박스에 원래 들어가 있던 값이 2로 변경되었기 때문에 출력결과도 2로 나오는 것을 볼 수 있습니다.

 

 

이번에는 a에는 "주녘의 IT기술 블로그" 라는 문자열을 b에는 true라는 불리언(참/거짓) 값을 넣어보겠습니다. 출력 결과를 보면 a, b에 들어있는 값이 성공적으로 바뀐 것을 확인할 수 있습니다. let을 붙이지 않았기 때문에 새로운 박스를 만드는 것이 아니라 박스안에 있는 값만 바뀌었습니다.

 

 

const

 

상수는 const라는 키워드를 사용하여 다음과 같이 선언합니다. A라는 박스에 상수 1을 넣고 출력하면 1이라는 결과가 나옵니다.

* 상수는 일반적으로 프로그래밍에서는 대문자로 이름을 짓습니다.

 

여기에 다른 값을 넣으려고 하면 오류가 발생해 코드가 실행되지 않습니다. 따라서 어떤 데이터가 절대 바뀌면 안되는 값을 가져야 한다면 const 키워드를 이용해 상수를 선언하면 됩니다.

식별자 명명 규칙
  • 영문, 한글 및 유니코드(대부분의 문자 표현) 글자, 숫자 사용 가능
  • 특수문자는 & 또는 _ 사용가능
  • 숫자로 시작할 수 없음
  • 공백(스페이스) 사용 불가
  • 예약어 사용불가
반응형

'JavaScript > JS 이론' 카테고리의 다른 글

템플릿 문자열  (0) 2023.08.31
[JS] 기본이론  (0) 2023.08.23
[JS] 문서 객체 모델 (DOM)  (0) 2023.08.22
[JavaScript] 자바스크립트의 기본 입출력방식  (0) 2023.08.16

+ Recent posts