패스트캠퍼스 백엔드 부트캠프 3기

[패스트캠퍼스 백엔드 부트캠프 3기] 9주차

다름임 2025. 2. 14. 10:03

Web(웹) 
1. URL 직접 입력 
2. 링크 클릭 
* 링크  : 프로그램과 URL 연결
* 웹은 인스턴스 메서드를 사용하는데, 인스턴스메서드는 객체생성 후 호출할 수 있다. 하지만 WAS가 미리 객체를 생성해주기 때문에, 호출만 하면 된다. 
cf. static메서드는 객체생성 없이 바로 호출 가능하다. 
* Servlet이란?
java에서 나온 멀티쓰레드 웹 개발 방식 - 요청마다 프로세스 생성하는 단일 쓰레드가 불편해서 
Servlet이 JSP로 발전하고, 이후 Spring으로 발전했다. 
- 객체를 미리 생성해야 한다. 이와 관련된 디자인 패턴으로는 
1. Singleton : 하나 만들어놓고 여럿이 쓴다. 
--> class Singleton { 
         static Singleton s = new Singleton();   //객체 미리 생성
    }
2. FlyWeight : 객체 여러개 ( 배열, Map)
3. Prototype - clone()

* servlet 코드에 작성해야 할 것 
1. 프로그램 등록 --> 애너테이션 붙이기 
2. URL과 프로그램을 연결하기 
3. 입력, 처리, 출력 과정

* URL
웹에서는 URL의  ‘?’ 뒤쪽에 값을 준다. 
year = 2021&month=10&year=2022
name  value   name value...

1. Map 형태 (key, value) 
String String[ ] (배열이므로 key가 겹쳐도 됨) 
year         
month

2. 하나일때 : String year = request.getParameter(”year”);
  여러개일때 : String[] yearArr = request.getParameterValues(”year”);
3. 문자열 형태이다. 


*Tomcat
- WAS(Web Application Server)- dynamic(동적)인 웹을 만들기 위한 웹 컨테이너, 서블릿 컨테이너
 - 웹서버에서 정적으로 처리해야할 데이터를 제외한 JSP, ASP, PHP 등은 웹 컨테이너(톰캣)에게 전달한다.- 동적인 데이터 처리가 가능하고, DB연결, 데이터 조작, 다른 응용프로그램과 상호 작용이 가능하다.
- 톰캣은8080포트로 처리한다. 

* System.out은 콘솔에서 출력하는 것인데
브라우저에서 출력하는 방법은 1. main등 메서드의 매개변수에 response 추가 
2. printwriter 출력스트림 사용 

* Framework : 개발방법 정형화 
* Spring Framework : 웹 개발 방법 정형화 

* Web의 구성 
1. HTML (resource /  file)
2. HTTP 
HTML --> Transfer --> HTTP
HTML  ---보여줌---> Browser
- Resource(file) 
1. 정적 리소스  : text
2. 동적 리소스 : video, audio, app(프로그램) 
목적  : 동적 리소스 프로그램 만들기 (app) 

* Protocol(프로토콜) 
정의 : 서로간의 통신을 위한 약속, 규칙  / 주고받을 데이터에 대한 형식 정의 
ex. 편지에 보내는 사람, 받는사람, 주소 작성 양식 규정-- 프로토콜

* HTTP : HTML 주고받는 프로토콜
(HyperText Transfer Protocol) 
HyperText : 링크 있는 텍스트 = HTML 문서 
* HTML 
1. 단순, 읽기 쉬움 -- 텍스트 기반의 프로토콜
2. 상태유지 x (stateless)  - 클라이언트 정보 저장



* Web Server :  정적 Resource서비스 제공
* Web App Server(WAS) : 정적 + 동적(프로그램) Resource 서비스 제공

*정적  --> 상수 
*동적  --> 변수 
스트리밍 서버 : 동영상, 방송 ==> 동적리소스 

프로그램을 톰캣 서버에 등록하고 연결하면 사용가능해진다 
*URL의 종류 
1. 정적 리소스 : ?a=b&c=d
2. 동적 리소스 : /index.html


 *****HTML******
텍스트  + 태그(어떠한 동작을 하도록 함) --> HTML
*<Head> : 정보 
<Body> : 내용

*browser는 html을 트리로 만들고 해석해서 보여준다. 
                                         -----> 객체 (부모) 

                                            -----> 객체(자손)


* <p> Hello <p> : 하나의 객체 ==> 객체끼리 연결해서 트리로 만든다 
<p> : 클래스이름 , 생성자 호출

<meta         charset           =          “utf-8”>
클래스           iv                            값
--> meta 타입 객체 생성        

 “utf - 8”

meta
                          charset


 “안녕”

<h1> 안녕 <h1> -->h1객체 생성     h1
                                                             



클라이언트와 서버의 구분 “ 요청하는지 제공하는지 “
클라이언트 : 서비스를 요청하는 App
서버 : 서비스를 제공하는 App
서버의 종류 : 어떤 서비스를 제공하는지 ?
*서버의 포트 : IP주소만으로는 1대의 PC에 있는 여러개의 서버중 어떤 서버인지 구분 불가 --> 포트로 구분 --> 어떤 서버에 대한 요청인지 
ip주소가 대표번호이고, 포트가 내선번호라고 이해하면 쉽다. 
포트와 서버의 연결(Binding) : 한 포트에 한 서버만
서버가 포트를 기다림 : Listening
웹서버의 기본 포트는 80이며, 생략가능하다. 그리고 포트 0~1023번은 이미 예약되어있으므로 사용불가 

웹 애플리케이션 서버(WAS): 웹 애플리케이션(프로그램)을 처리하는 서버 
=> 서버에 프로그램을 설치해 놓고, 클라이언트가 이 프로그램을 사용할 수 있게 해준다. 그러면 클라이언트는 결과만 받으면 된다. 
프로그램을 클라이언트에 설치한다면 업데이트하기가 매우 까다롭다. 그래서 서버에 프로그램을 깔아 원격으로 프로그램을 호출한다. 


http://www.fastcampus.kr/event/list 
host이름 : http://www.fastcampus.kr
contect이름 : event
servlet이름 : list
* 톰캣 서버 안에는 서비스가 있는데, 이 서비스를 처리하는 엔진이 있다. 엔진은 호스트를 여러개 가질 수 있으며, 한 호스트에는 여러개의 context가 있다. (context = 하나의 WebApp : sts프로젝트의 한 프로젝트) 한 Context안에는 여러개의 Servlet(~=Controller . 작은 서버 프로그램) 이 있다. 
클라이언트에서 특정 포트번호를 통해 (8080) 톰캣에 요청하면, 미리 만들어 놓은 쓰레드 풀에서 한가한 쓰레드가 요청을 처리한다. 클라이언트의 Protocol(ex. HTTP 1.1) 에 따라 Connector가 달라지며, Connector가 일치하는 URL 에 해당하는 호스트에서 해당 요청을 처리할 수 있는 Servlet에게 작업을 요청한다. 

*HTTP 응답 메시지의 Format(형식)
상태라인(Status Line) + 헤더(n줄) + 빈줄 한칸(헤더와 바디 구분) + 바디(실제 응답내용)  
*HTTP 상태코드 
상태 라인 : HTTP/1.1 200 OK  200 --> 상태 코드 
2xx : Success (성공) 
3xx : Redirect (다른 URL 요청) 
4xx : Client Error (클라이언트가 요청을 잘못함 ex.404 not found) 
5xx: Server Error (ex. 예외처리 구문 없음) 
 
*HTTP 요청메시지 
1. GET : 서버에서 리소스 가져오기 (READ) --> Body 없음, 데이터는 요청라인(상태라인)에 같이 보냄
2. POST : 서버에 전송할 데이터를 Body에 가지고있음 (WRITE) 
ex) 회원가입, 로그인, 파일첨부 

*HTTP + TLS(암호화) = https :// --> post요청이 보안이 유리한 이유

*Base64인코딩(바이너리파일-> 텍스트파일)의 장점 : 이미지를 html이 불러온 것이 아니라, html안에 이미지를 인코딩해서 아예 넣어버림. 그러면 파일 링크가 깨질 가능성이 없음

OOP 5대 설계원칙 - SOLID
1. S -> SRP : 단일책임의 원칙 (책임 ==관심사) --> 하나의 메서드는 하나의 책임 
관심사 : 해야 할 작업 
만약 하나의 메서드가 3개의 관심사를 가지고 있다면, SRP에 위반되므로 분리 

* 분리
1. 관심사 분리
2. 변하는것과 자주변하지 않는것 분리 -- “출력(view)” 분리
3. 공통(중복) 코드 분리 --”입력” 분리
--> 분리를 해서 관심사가 하나씩 사라진다(없앤다)
3개의 관심사 분리의 순서 : 관심사 분리 --> 공통코드 분리--> 변하는것과 변하지않는것 분리
MVC패턴 -- 처리와 출력의 분리 때문에 두 코드를 연결할 중간객체인 Model이 필요
-->처리 (Controller)와 출력 (View)사이에 Model객체 만들기

MVC패턴
1. 요청이 오면 DispatcherServlet이 
   1) 입력과 변환을 처리하고 2) 모델객체(결과 저장소)를 생성한다.
2.이 모델 객체를 Controller에 전달
1) Controller가 처리하고 2) 작업결과를 Key,Value형태로 모델 객체에 담아 저장하고(객 체는 돌려줄 필요가 없음) , 
3. 결과를 보여줄 View의 이름을 DispatcherServlet에 반환한다. 
4. 이 모델을 DispatcherServlet이 View에 전달 , view에 모델 값이 채워진다.
5. View가 이 값을 바탕으로 클라이언트에게 응답한다. 
출력을 분리했을때 장점 : 클라이언트가 요청한 상황에 따라 여러가지 View를 보여주기 좋다


* 컨테이너 : 객체를 담는곳 , Map로 관리한다 ==> FlyWeight패턴
Spring /Web의 디자인패턴
0. FactoryMethod : 생성자 대신 사용
1. Singleton: 객체 1개 재사용 
2. FlyWeight: 객체 n개 재사용(배열 / Map)
3. Prototype : clone() -- 미리 만든 객체 복제 

* Servlet 은 HTML을 Java형식으로, Jsp는 Java코드를 HTML형식으로 
함수형은 불변이므로 iv사용가능하지만 
Servlet은 iv사용 거의 x, 대신 lv 사용 
iv 사용 안하는 이유 : FlyWeight패턴 이므로 여럿이서 객체재사용 

* 페이지 이동 
1. URL 직접입력 
2. <a>
3. <form> 
4. Redirect :요청2번, 응답2번 (수동1번, 자동1번) 
5. Forward :요청 1번 응답 1번

DB모델링이란 ? DB모델을 만드는것 
모델이란 ? 실제를 본뜬것 (실제는 HW 실제를 본뜬것은 SW)  = 실제를보고, 가상을 만드는것 
DB란? 데이터를 어떤 구조로 저장할지 
RDB란 ? 관계 + 그룹 n개 
모델링은 실제 업무를 관찰하고 분석하여 설계로 표현하는 것이다. (표현 : 어떤 구조로 저장할지 결정 ) 
전부 2차원 테이블이며, 테이블간의 관계를 표현한다. 

*DB모델링의 핵심 
1. iv 나열(속성) 
2. 그룹화 
3. 관계 
* DB모델링의 단계
1. 개념모델링  (관찰, 분석)
2. 논리모델링  (설계)
3. 물리모델링  (구현)

* for instance = for example
instance 는 example이다. 인스턴스는 객체인데 , 객체는 클래스의 example이기 때문(본뜬것) 
* 설계가 중요한 이유 : 설계가 없으면 추상화가 안된다. (변경에 불리) 
* 프로젝트할때, 화면을 보고 어떤데이터를 어떻게 보여줘야 할까 생각하는것이 모델링의 시작이다.

* 관계
1. 관계수 : 1 : 1, 1 : n, m : n
2. 선택성 : 필수(NOT NULL) or 선택(NULL)
3.식별자(PK) 상속 : PK 이면서 FK 

정규화 : 테이블쪼개기 -> 무조건 관계생김 --JOIN
역정규화 : 너무 쪼개서 성능저하--> 다시 붙이기 

도메인
테이블의 속성: 학년 :값 1~4  --도메인-->  int 1~4

Computed Column에는 ALIAS를 붙이는 것이 좋다. (저장속성 x) -- as 생략가능, print되는 이름만 바꿈 , 두 단어 이상 - “”사용 
select name,salary as 연봉1, salary*18 "연봉 2" from s_emp;



* 컬럼의 합성 == 문자열 결합, 하나의 칼럼
select name||'이'||title "name + 이 + title" from s_emp; 
== 제목은 “name + 이 + title” , 내용은 name+이+title인 결과 얻기 

* distinct : 중복 행 제거 , order by : 정렬 (asc / desc)

select (print문) 칼럼명 from 테이블명 -- for문
where - if문
검색 순서 : from-where - select - orderby 

연산자 
1. 논리연산자 
2. 논리비교연산자 : - , != , <> , ^=
3. SQL비교연산자 : NOT BETWEEN ~AND~
NOT IN , NOT LIKE, IS NOT NULL, IS NULL, IN, LIKE,BETWEEN AND

자동형변환 (비추) 
직접형변환

문자열 비교 : %(0~n개), -(1개)
연산자 우선순위 : 모든 비교연산자(논리비교, sql비교) -> AND->OR
* 만약에 OR, AND 섞여있을때 --> 괄호 치기

* SQL함수
1. 단일행 함수 
1) 문자형 함수 : 
UPPER(대문자로), LOWER(소문자로), INITCAP(첫글자만대문자로), CONCAT(문자열붙이기), SUBSTR(문자 자르기), LENGTH(문자열길이), LPAD(왼쪽공백채우기), RPAD(오른쪽공백채우기), LTRIM(왼쪽부터지우기), RTRIM(오른쪽부터지우기), TRANSLATE(문자대체), REPLACE(문자전환)
2) 숫자형 함수 : 
ROUND(반올림), TRUNC(끊기), MOD(나머지연산), POWER(거듭제곱),S QRT(제곱근), SIGN(양수,음수,0구별), CHR(ASCII값문자)
3) 날짜형 함수 :
SYSDATE(현재시스템의 날짜와시간), LAST_DAY(지정날짜의해당월의 마지막날),MONTHS_BETWEEN(두날짜사이 개월수),ADD_MONTHS(지정날짜+몇개월),ROUND(반올림),TRUNC(버림) 
1/22 -> 버림 : 1/1, 반올림 : 2/1 
4) 변환형 함수 : TO_CHAR(숫자나 날짜를 문자열로), TO_NUMBER(문자를 숫자로), TO_DATE(문자를 날짜로) 
5) 함수 겹쳐서 사용하기 
-- 함수3(함수2(함수1(컬럼값,형식1),형식2),형식3)
2. 그룹 함수 : 함수명(A)
COUNT(A의 행 개수), AVG(평균), SUM(합계), MIN(최소값), MAX(최대값), STDDEV(표준 편차), VARIANCE(분산)
*COUNT(*)를 제외한 모든 그룹함수는 NULL 고려X

*논리 : 타입 명시 x --> 의논해야 하므로, 물리 : 타입명시 O

** 데이터 모델링 절차 

엑셀 =--> 그룹핑 후 테스트 데이터를 넣으면 빠진부분이나 중복된 부분 볼수 있다. 
iv 생각나는대로 작성, ---> 그 후 고르기 
핵심엔티티 정하기 : 문장 --> 주어, 목적어, 동사 추출 . iv 타입 정하기 
고객(엔티티)의 정의: 타겟이 누구인가..
속성 정의 :ex) 자산의 정의 --> 어디까지 자산이라고 볼것인가?

*개념모델링 : 추상클래스 --구현--> 논리모델링 : 구체 클래스 

*핵심 엔티티 : 3,4번을 먼저하기
1. 유형(코드 테이블)  및 분류(대분류, 소분류, 중분류) 
2. 업무규칙 및 지식(정보) 
3. 업무 주체 및 대상(Who, What)
4. 장소 (Where)

* 속성(논리모델링)을 저장해야 컬럼(물리모델링)이 된다. 
cf. 파생속성은 저장되지 않으므로 컬럼이 될 수 없다. 

*행위엔티티 : 상세 / 상태 / 이력 
이력관리 
1. 전체속성
2. 부분속성
3. 점 이력 : 어떤 시점
4. 성분 이력: 기간 (from~to)
5.현재 포함(예전이력 +현재 or 예전이력만)
<HTML> 
요소의 중첩 --> ‘부자관계’
<head>     ---> 부모
<body>   --->자식
</body>
</head>
* 요소(Element) : 영역을 가진 객체 
element를 tree로 만들고, tree를 그릴때 영역을 잡는다. 이것은 화면을 구성하는 것이다. (Layout)
영역 ==> 좌표(그릴 위치 지정), 높이, 넓이, 간격 등을 가진다. 
1. Layout 잡기 
2. Print (그리기)

속성의 종류
<img src = “html.jpg”> 에서
1. Field : 값 자체 (”html.jpg”)
2. Attribute : src = “html.jpg” , iv이며, (이름,값) 쌍으로 이루어졌다. 
           실행시 객체 생성
3. property : Attribute가 실행되어 만들어진 img객체의 속성 ‘src’ 

글로벌 Attribute : 상속으로 모든 요소가 공통 사용( 자바의 Object같은 ) 
Meta data(데이터에 대한 데이터) : 문서에 대한 정보 
(cf. DB의 Metadata : Dictionary)

* HTML ==> Tag (내용) + CSS(디자인) + JS(프로그래밍) 으로 이루어짐


*태그 
<p> : 문단 전환(paragraph) 
<br> : 줄바꿈
공백 : &nbsp
<a> -> 링크 (Hypertext)  : 페이지간 연결, 이동, 데이터 전달 역할 ==> 웹 프로그래밍의 핵심

* URL 전달방법 세가지 
1. URL 직접 입력 
ex ) ?year=2024&month=10&day=2
2. <a> 태그 
ex) <a href = “URL”> 링크 </a> 의 URL에 1번 내용 작성
만약 year=2024를 수정하려면 HTML문서를 직접 수정해야 한다. 
쉽게 하는 방법 
3. <form> 태그  : 화면에 사용자가 직접 입력하도록
year [  2025  ]
month [  1  ]


* CSS(Cascading Style Sheet) 
Cascading : 위에서 아래로 규칙이 상속되어 적용된다 (폭포수) 
* CSS의 속성은 Property , HTML의 속성은 Attribute라고 한다.