- 사용자와의 인터랙션을 통해 동적으로 계속해서 변화하는 데이터 - 상태들은 일관적이어야한다. - 서로 다른 여러개의 컴포넌트들이 어떤 동일한 상태를 다루면, 그 데이터의 정확성을 보장하기 위해 데이터의 변경을 제한해 데이터의 상태를 항상 같게 유지해야한다
상태관리는 왜 필요한가?
- 서로 다른 두 컴포넌트에 같은 데이터가 필요하다고 할 때, 각 컴포넌트가 부모자식 관계로 되어있지 않은 이상, 각 컴포넌트 간의 직접적인 데이터 전달은 어렵다.
- 데이터를 부모 컴포넌트로 보내고, 다시 그 상데이터 필요한 컴포넌트로 전달해야한다. 하지만 이렇게 Prop Drilling이 많아지면 이 prop이 어디에서 왔는지 확인하기 정말 어려워진다. - 이때 사용하는 상태관리 툴이 Context API, Redux, React Query, MobX
React 에서 "상태"
- React에서 "상태"는 컴포넌트의 데이터를 나타내는 것을 의미한다.
- 컴포넌트의 상태는 해당 컴포넌트가 렌더링되는 동안 변할 수 있는 값입니다. 상태는 컴포넌트 내부에서 관리되며, 컴포넌트를 업데이트하거나 다시 렌더링할 때 사용됩니다.
이 예시에서 count는 컴포넌트의 상태를 나타내며, 버튼을 클릭할 때마다 상태가 업데이트되고, 해당 변경 사항이 UI에 반영됩니다. 상태는 컴포넌트 내에서 필요한 데이터를 저장하고 관리하는 데 사용되며, 필요에 따라 컴포넌트의 다른 부분에서 상태를 사용할 수 있습니다.
HTML 다운로드: 웹 브라우저는 서버에 웹 페이지를 요청하고, 서버는 해당 페이지의 HTML 파일을 응답으로 전송합니다.
HTML 파싱: 웹 브라우저는 수신한 HTML 문서를 파싱하여 문서 객체 모델(Document Object Model, DOM)을 생성합니다. DOM은 HTML 문서의 구조와 요소들을 표현하는 트리 형태의 데이터 구조입니다.
CSS 다운로드: 웹 페이지에 포함된 CSS 스타일 시트 파일들을 서버로부터 다운로드합니다.
CSS 파싱: 다운로드한 CSS 파일들을 파싱하여 스타일 규칙들을 해석하고, 각 요소에 적용될 스타일 정보를 계산합니다.
렌더 트리 구성: DOM 트리와 CSS 스타일 정보를 결합하여 렌더 트리(Render Tree)를 생성합니다. 렌더 트리는 화면에 실제로 표시될 요소들을 포함한 구조입니다.
레이아웃: 렌더 트리의 각 요소들에 대해 위치와 크기를 계산하여 페이지의 레이아웃을 설정합니다. 이 단계에서 요소의 박스 모델과 배치 정보가 결정됩니다.
페인팅: 레이아웃 단계에서 계산된 정보를 바탕으로 실제로 화면에 픽셀을 그리는 작업을 수행합니다. 이 단계에서 각 요소의 색상, 텍스트, 배경 등이 실제 화면에 표시됩니다.
페이지 로드 완료: 위 단계들이 완료되면 웹 페이지의 로딩이 완료되고, 사용자는 렌더링된 페이지를 볼 수 있게 됩니다.
일반적인 브라우저의 동작 방식을 설명한 것이며, 실제 브라우저마다 세부적인 동작이 조금씩 다를 수 있습니다.
DOM (Document Object Model) 이란
- 웹 페이지의 구조와 콘텐츠를 나타내는 표준화된 인터페이스
- HTML, XHTML, XML 등의 문서를 계층적인 트리 구조로 표현합니다.
- 모든 요소, 속성, 텍스트를 객체로 만들어 이 객체들을 부자 관계에 따라 트리 구조로 구성한 것
- DOM은 웹 브라우저가 HTML 문서를 이해하고 조작할 수 있도록 제공되는 프로그래밍 인터페이스이다. 이를 통해 JavaScript와 같은 스크립트 언어를 사용하여 웹 페이지의 요소에 동적으로 접근하고 수정할 수 있다.
- DOM 트리는 HTML 문서의 요소(Element), 속성(Attribute), 텍스트 등을 노드(Node)라는 객체로 표현합니다. 각 노드는 트리 구조에서 부모-자식 관계를 가지며, 서로 연결되어 문서의 구조를 형성합니다.
- DOM은 웹 페이지의 구조에 접근하고 수정하는 다양한 메서드와 속성을 제공합니다. 예를 들어, 특정 요소를 선택하거나 생성, 삭제, 수정할 수 있으며, 요소의 스타일, 내용, 속성 등을 변경할 수 있습니다.
- 또한, DOM은 이벤트 처리와 상호작용에도 사용됩니다. 사용자의 동작(클릭, 마우스 오버 등)을 감지하고, 이벤트 핸들러를 등록하여 특정 동작에 대한 응답을 구현할 수 있습니다.
- DOM은 크로스 플랫폼 및 플랫폼 독립적이며, 웹 브라우저를 비롯한 다양한 환경에서 사용될 수 있습니다.
웹을 동적으로 제어 = DOM 을 제어
- 웹을 개발한다는 것은 정적인 HTML만을 작성하는 게 아니라, Javascript를 통해 동적으로 동작할 수 있는 웹을 개발하는 것
그럼 DOM을 동적으로 제어(조작)해야 하는데, 이를 Javascript가 해 줄수 있도록 DOM API 라는 것이 기본적으로 제공된다.
DOM API
- DOM 을 조작하기 위한 프로그래밍 인터페이스
- DOM API는 웹 브라우저에서 JavaScript와 같은 스크립트 언어를 사용하여 웹 페이지의 요소에 접근하고 조작하는 메서드와 속성의 집합
- DOM API를 사용하면 웹 페이지의 요소에 동적으로 접근하고 수정 가능하다
- 일반적으로 DOM API는 다음과 같은 기능을 제공합니다:
요소 선택: 특정 요소를 선택하기 위해 ID, 클래스, 태그 이름 등을 사용하여 요소를 찾을 수 있습니다. getElementById, getElementsByClassName, getElementsByTagName, querySelector, querySelectorAll 등의 메서드를 사용합니다.
속성 및 내용 조작: 선택한 요소의 속성 값을 읽거나 변경할 수 있습니다. 예를 들어, getAttribute, setAttribute, innerHTML, textContent 등의 메서드를 사용하여 요소의 속성 값을 가져오거나 설정할 수 있습니다.
요소 생성 및 추가: 새로운 요소를 동적으로 생성하고, DOM에 추가할 수 있습니다. createElement, appendChild, insertBefore 등의 메서드를 사용하여 요소를 생성하고 다른 요소에 추가합니다.
이벤트 처리: 사용자의 동작(클릭, 마우스 오버 등)을 감지하고, 이벤트 핸들러를 등록하여 특정 동작에 대한 응답을 구현할 수 있습니다. addEventListener를 사용하여 이벤트 핸들러를 등록하고, 이벤트가 발생했을 때 실행될 코드를 작성합니다.
스타일 조작: 선택한 요소의 스타일을 동적으로 변경할 수 있습니다. style 속성을 사용하여 요소의 스타일을 설정하거나 변경할 수 있습니다.
이외에도 DOM API는 DOM 트리의 탐색, 노드의 추가 및 삭제, 이동, 애니메이션 등 다양한 기능을 제공합니다. DOM API는 웹 개발에서 가장 일반적으로 사용되며, 웹 페이지의 동적인 특성을 구현하는 데 중요한 역할을 합니다.
DOM API 를 통해서 DOM을 조작한다는 건, 일반적으로 다음과 같은 동작을 의미합니다.
DOM API
1. DOM에 요소를 추가한다. 2. DOM의 요소를 수정한다. 3. DOM의 요소를 삭제한다.
Virtual DOM
- DOM 을 직접 조작하는 건 안정성이 떨어지고, DOM API 가 low-level 이기 때문에 이걸로 DOM 을 조작시 코드의 복잡도가 높아진다. ( = 앱의 규모가 커질수록 복잡도가 높아짐) - Virtual DOM의 조작은 React와 같은 라이브러리가 비교적 쉽게 해준다.
- 그리고 Virtual DOM이 실제 Real DOM을 직접 조작한다. 그 조작하는 과정(Diffing 알고리즘)은 React가 알아서 해주게 됩니다.
React
- 사용자 인터페이스(UI)를 구축하기 위한 JavaScript 라이브러리입니다.
- Facebook에서 개발되었으며, 웹 애플리케이션의 UI를 구성하는데 중점을 둔다.
React 특징
1. React는 컴포넌트 기반 아키텍처를 사용하여 UI를 작은 독립적인 조각으로 분할합니다. 각 컴포넌트는 자체 상태(state)와 속성(props)을 가지며, 이를 조합하여 전체 애플리케이션을 구축합니다. 컴포넌트는 재사용 가능하고 모듈화된 방식으로 작성할 수 있어 개발 생산성과 유지 보수를 향상시킵니다.
2. Virtual DOM(가상 DOM)을 사용하여 성능을 최적화합니다. 변경된 부분만 실제 DOM에 적용하여 업데이트하므로 효율적인 렌더링을 가능하게 합니다. 이를 통해 복잡한 UI를 효과적으로 처리하고 사용자에게 빠른 반응성을 제공할 수 있습니다.
3. React는 단방향 데이터 흐름을 따르는 개념인 "상태 관리"를 강조합니다. 일반적으로 Redux, MobX와 같은 상태 관리 라이브러리와 함께 사용되며, 상태를 중앙 집중식으로 관리하여 애플리케이션의 복잡성을 줄이고 데이터의 일관성을 유지합니다.
4. 웹 애플리케이션 개발뿐만 아니라, React Native를 통해 모바일 애플리케이션 개발에도 사용됩니다. React Native는 React를 기반으로 하여 네이티브 앱을 개발할 수 있는 크로스 플랫폼 프레임워크입니다.
5. React는 커뮤니티와 생태계가 활발하며, 다양한 도구와 라이브러리가 제공되어 개발자들이 효율적으로 작업할 수 있도록 지원합니다.
React에서 리렌더링이 일어나는 경우 1. Props가 변경되었을 때 2. State가 변경되었을 때 3. forceUpdate() 를 실행하였을 때. 4. 부모 컴포넌트가 렌더링되었을 때
React는 상태나 속성 값이 변하게 되면 리렌더링 이라는 과정을 통해서 바뀐 상태나 속성 값으로 화면을 그린다.
Virtual DOM 을 사용해서 React는 값이 변할 때 화면의 깜빡임 없이 빠른 속도로 값을 변경 시킬 수 있다.
만약 상태나 속성값이 변경된 경우, 변경된 값으로 React는 가상의 돔을 그리게 됩니다.
그린Virtual DOM과Real DOM을 비교하여 변경된 사항만 반영하여 해당 내용을 실제 돔에서 수정한 이후 새로운 화면을 렌더링 변경사항을 감지하고Virtual DOM을 새로 그린 다음Real DOM과 비교하여 바뀐 내용만 반영해서 새로 화면에 렌더링
ChatGPT 모델을 사용하는 파이썬 프로그램을 작성합니다. 예를 들어, 다음과 같이 ChatGPT 모델을 사용하여 문장 생성을 수행하는 간단한 예제 코드를 작성할 수 있습니다.
import openai
import os
# OpenAI API key 설정
openai.api_key = os.environ["OPENAI_API_KEY"]
# 문장 생성 함수
def generate_text(prompt):
# 문장 생성 요청
response = openai.Completion.create(
engine="davinci",
prompt=prompt,
max_tokens=60,
n=1,
stop=None,
temperature=0.5,
)
# 생성된 문장 반환
return response.choices[0].text.strip()
# 문장 생성 예제
generated_text = generate_text("Hello, how are you?")
print(generated_text)
위 코드에서 OPENAI_API_KEY는 API key를 환경변수로 설정한 경우에 사용하는 코드입니다. API key를 직접 입력하는 경우에는 다음과 같이 코드를 작성합니다.
openai.api_key = "YOUR_API_KEY"
4. Colab에서 실행
작성한 파이썬 프로그램을 Colab에서 실행하여 결과를 확인할 수 있습니다. Colab에서는 다음과 같이 코드를 작성하고 실행할 수 있습니다.
[문항4] 다음과 같은 문자열에서 휴대폰 번호 마지막 뒷자리 숫자 4개를 ####로 바꾸는 프로그램을 정규표현식을 사용하여 작성하시오. (20점)
s = """ park 010-9999-9988 kim 010-9909-7789 lee 010-8789-7768 ""“
답안:
import re
s = """
park 010-9999-9988
kim 010-9909-7789
lee 010-8789-7768
"""
pat = re.compile("(\d{3}[-]\d{4})[-]\d{4}")
result = pat.sub("\g<1>-####", s)
print(result)
[문항5] 웹 크롤링을 통해 html 파일안의 모든 div태그의 class가 'abc'인 요소를 가져오는 코드를 작성하시오. (10점)
답안: 자신의 클래스 내 접근 가능, <br>같은 패키지 내 접근 가능, <br>하위 클래스에서 접근 가능,<br>다른 패키지에서는 접근 불가능
[문항2] 1~10의 수 중 짝수와 홀수의 합을 구해 출력하는 코드를 작성하시오. [15점]
답안:
package p2022_11_29;
public class test1 {
public static void main(String[] args) {
int even = 0; //짝수 합계 저장을 위한 변수 선언
int odd = 0; //홀수 합계 저장을 위한 변수 선언
for(int i=1; i<=10; i++) {
if(i%2 == 0) { //짝수 여부 확인
even = even+i; //기존에 저장된 even값과 i값을 더해서 다시 even 변수에 대입
}
else { //홀수 여부 확인
odd = odd+i;
}
}
System.out.println("짝수 합계 : "+even);
System.out.println("홀수 합계 : "+odd);
}
}
[문항3] ② 자리에서 ‘철수’ 가 출력되도록, ① 자리에서 부모 생성자로 ‘철수’를 보내는 코드를 작성하시오. [10점]
답안: super("철수")
[문항4] 스레드를 구현하기 위해 ①자리에 들어갈 적당한 코드는? [10점]
답안: Runnable
[문항5] 오늘 날짜와 현재 시간을 알아오기 위한 코드를 작성하시오. [10점]
답안:
package p2022_11_29;
import java.util.Date;
public class test1 {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
}
}
[문항6] ①, ② 자리에 들어갈 코드를 작성하시오. [20점]
답안: 1) boolean<br>2) boolean
[문항7] Movie 클래스 객체를 요소로 갖는 ArrayList 객체를 생성하시오. [10점]
답안: List<Movie> list = new ArrayList<Movie>();
[문항8] JDBC를 이용하여 콘솔창으로 부서번호,부서명, 위치를 입력받아 Dept Table에 입력하는 프로그램을 작성 하시오(Oracle) [10점]
[문항1] . “( ) 컴퓨팅이란 인터넷이라는 통신 서비스를 활용한 컴퓨팅 서비스 종류의 하나로 개인용 컴퓨터가 아닌 인터넷을 통해 연결된 원격 컴퓨터를 활용하는 기술을 말한다.”에서 괄호안에 적한한 단어를 기술하세요. [10점]
답안: 클라우드 컴퓨팅
[문항2] AWS 컴퓨팅 서비스로서 인스턴스(가상 머신)을 제공하는 웹 서비스는 무엇인가?[10점]
답안: EC2
[문항3] AWS 스토리지 서비스로서 데이터 보관 이외에도 정적 웹 사이트 호스팅 및 다양한 형태의 서비스로 활용 가능한 만능 스토리지 서비스를 무엇이라고 하는가?[10점]
답안: S3
[문항4] AWS 데이터베이스 서비스로 RDBMS 서비스를 사용자가 직접 관리하지 않고 아마존에서 제공하는 서비스를 이용하여 데이터베이스를 이용할 수 있도록 해주는 서비스를 무엇이라고 하는가?[10점]
답안: RDS
[문항5] 클라우드 서비스의 종류에는 IaaS(Infrastructure as a Service), PaaS(Platform as a Service), SaaS(Software as a Service)와 같이 크게 3가지로 나눌 수 있다. 아마존 AWS는 3가지 클라우드 유형중 어떤 유행의 서비스인지 기술하시오.[10점]
답안: IaaS
[문항6] ssh 방식으로 인스턴스 연결시 사용하는 포트는 무엇인가?[10점]
답안: 22번 포트
[문항7] 다음중 클라우드 서비스의 예가 아닌 것은?[10점]
1) Amazon Web Service(AWS) 2) Google Compute Engine(GCE) 3) Microsoft Azure 4) IBM Watson
답안: 4) IBM Watson
[문항8] 다음중 가상화 시스템이 아닌 것은?[10점]
1) VMware 2) Virtual Box 3) git 4) docker
답안: 3) git
[문항9] 대표적인 Linux 종류에 대하여 3가지 이상 기술 하시오.[10점]
답안: 우분투<br>센트OS<br>레드햇
[문항10] Ubuntu 시스템에서 사용하는 editor 종류에 대하여 3가지 이상 기술 하시오.[10점]
[문항2] 다음은 무엇에 대한 설명인가?[10점] 작은 소프트웨어 단위(컴포넌트 또는 모듈)를 테스트하는 것으로서, 일반적으로 개발자 자신에 의해 행해진다. 과거에는 시간 부족을 이유로 생략되었으나 최근에는 개발 도구의 발전으로 개발 과정 중에 자동으로 진행된다.
1) 단위 테스트 2) 통합 테스트 3) 시스템 테스트 4) 인수 테스트
1) 단위 테스트
[문항3] 다음 중 테스트 도구의 장점이 아닌 것은 무엇인가?[10점]
1) 테스트 데이터의 재입력과 재구성 같은 반복 작업의 자동화를 통하여 테스트 인력과 시간을 최소화한다. 2) 비공개 상용 소프트웨어의 경우 고가이며, 인력과 교육에 대한 유지관리 비용이 높다. 3) 향상된 요구사항 정의, 성능 및 스트레스 테스트, 품질 측정을 최적화한다. 4) 빌드확인, 회귀, 다중 플랫폼 호환성, 소프트웨어 구성, 기본 테스트 등의 향상된 테스트 품질을 보장한다.
2) 비공개 상용 소프트웨어의 경우 고가이며, 인력과 교육에 대한 유지관리 비용이 높다.
[문항4] 다음 내용은 소프트웨어 테스트 기법 중 어떤 기법에 해당하는 내용인가?[10점] 시스템 테스트 업무 진행 전체를 총괄할 수 있도록 절차 및 각 프로세스별 세부 업무를 알아야 하고 결과에 대한 분석 및 해결 방안을 제시할 수 있어야 한다.
1) 단위 테스트 기법 2) 통합 테스트 기법 3) 시스템 테스트 기법 4) 인수 테스트 기법
3) 시스템 테스트 기법
[문항5] 개별업무보다는 프로젝트 전체의 업무 흐름에 대하여 계획을 수립하고 제대로 수행되는 점검하는 테스트를 선택하시오.[10점]
1) 단위테스트 2) 통합테스트 3) 시스템테스트 4) 인수테스트
2) 통합테스트
[문항6] 전원차단 등 시스템에 생긴 문제에 대하여 제대로 복구 되는지 확인하는 테스트를 선택하시오.[10점]