2021-12-02(목) 4주차 4일 + 휴강

Jeongyun Heo·2021년 12월 2일
0

@RequestMapping("/lang/literal/exam5") 이 주소와
@GetMapping("/test1") 이 주소가 합쳐져서
메소드를 가리키는 경로가 된다.
메소드를 찾아가는 경로

경로는 마음대로 정할 수 있다.

@RequestMapping("/lang/literal/exam5")

바로 예제를 찾을 수 있으니까 경로 이름을 저렇게 줬을 뿐
경로가 마치 패키지 이름과 같이 연결될 거라고 생각하면 안 됨
다만 예제를 찾기 쉽게 하려고 저렇게 해놨을 뿐

문자와 문자를 합쳐서 하나의 문자열을 만들어서 리턴함
리턴된 문자열은 이 요청을 한 웹 브라우저에게 보내진다
요청을 한 브라우저가 서버로부터 받는다
이 문자에 대해서 유니코드를 알고 있다면 \u0041 이렇게 적어도 된다.
\u0041 ← 이 번호에 해당하는 문자

내부적으로 저장할 때는 2진수 형태로 저장하지만
표현할 때는 10진수로 표현함
16진수가 10진수로 바뀌어서
웹 브라우저 쪽으로 리턴
0x41
65 라는 정수값을 0x41라고 표기했을 뿐이고 8진수로 표기할 수도 있고 2진수로도 표현할 수도 있고 내 마음
그러나 중요한 건 합쳐질 때는 정수값을 10진수로 만들어서 문자열과 결합이 된다
합쳐질 때는 어차피 10진수 형태로 문자열로 만들어져서 하나의 문자열이 만들어짐
10진수 형태로 만들어지고 나서 문자열과 합쳐진다
문자열을 웹 브라우저로 보낸다
웹 브라우저는 서버로부터 받은 걸 출력한다

숫자에 해당하는 문자를 출력하고 싶은데..
이 숫자가 0x41 이라는 이 번호가 부여된 문자가 출력되기를 원한다
문자를 가리키는 번호
(char) 0x41
UTF-16 번호를 적은 거니까 괜히 10진수로 바꿔가지고 문자열이랑 결합하지 말고 65가 가리키는 문자를 여기에 붙여. 앞에 char를 표시해줘야 됨. 단수 정수값이 아니라 문자(character)를 가리키는 번호임을 알 수 있는 거. 문자를 가리키는 정수라고 알려주는 거. 얘는 일반 정수가 아니라 문자를 가리키는 정수다. 데이터의 유형·종류에 대해서 컴파일러에게 툭 던져주는 거.

(char) 0x41
뒤에 놓인 값의 유형이 문자에 지정된 번호(UTF-16)를 의미한다고 컴파일러에게 툭 던지는 정보

투수가 받는 거 catch
투수가 던지는 거 cast
cast 던지다
Type casting (형 변환)
우리나라 말로는 타입을 던진다고 안 하고 현재 데이터의 유령을 변환한다고 해서 형 변환이라고 한다.
형 변환이라는 말은 오해의 소지가 있음
정수가 다른 걸로 바뀐다고 오해함
그게 아니라
타입을 던지는 거

(char) 0x41
문자를 가리키는 번호
문자에 지정된 번호
라는 의미를 갖게 된다.

그냥 0x41이라고 하면 정수지만 (char) 0x41 얘는 문자를 가리키는 번호야 라고 정보를 주면 이 자리에 숫자가 놓이는 게 아니라 문자가 놓여서 앞에 있는 문자열과 여기에 놓인 문자가 합쳐져서 하나의 문자열이 만들어진다.

문자든 부동소수점이든 내부적으로 저장되는 건 2진수
일반적으로 숫자를 사용하면 정수가 되는 거고
앞에 type casting 하면 (char) 0x41 아 얘는 문자를 가리키는 번호구나

인코딩과 디코딩

4 = 0000 0100
-4 = 1111 1100

2의 보수 규칙에 따라 2진수화

어떤 규칙에 따라서 어떤 형태로 바꾸는 걸 인코딩이라고 한다.

인코딩(encoding) : 규칙에 따라 데이터를 변환하는 거

디코딩(decoding) : 원래대로 하는 거

'가' → UTF-16 규칙에 따라서 인코딩 → 1010 1100 0000 0000 →
→ UTF-8 규칙에 따라서 인코딩 → 11101010 1011000000 10000000

반대로 다시
UTF-8을 UTF-16으로 원래대로 하는 거 = 디코딩
원래 형식으로 바꾸는 거
디코딩한다고 얘기한다.

영상 데이터
하나의 점 → 1 pixel
한 개의 점은 빨간색, 초록색, 파란색 3가지 값이 합쳐져서 천연색을 구성
1 pixel을 값으로 표현할 때는 RGB로 표현
빨간 색상을 표현할 때는 100레벨이 아니라 256레벨로 표현
8 bit, 8 bit, 8 bit ⟹ 3 byte
8 bit 3개를 합쳐서 3 byte로 한 점의 색상을 표현
HD : 1920 x 1080 = 2,073,600 pixel
한 점당 색상을 3 byte로 표현하
2,073,600 pixel × 3 byte = 6,220,800 (약 6 MB)
1600만 색깔
한 개의 점의 색을 표현하는 데 3 byte 가 필요
약 6 MB
1 KB = 1024 byte
1 MB = 1024 KB

동영상은?
화면이 초당 몇 개?
보통 영화관은 초당 24개의 화면으로 구성됨
화면 하나에 약 6 MB x 24개 = 144 MB
영화관에서 1초 영상을 출력하는 데 144 MB 필요
이 영상이 1분 영상이 되려면 144MB x 60초 = 8640 (약 8.5 GB 필요)
영화가 보통 80분
약 8.5 GB x 80분 = 680 GB
많아봐야 8 GB, 보통은 4 GB던데..?
680 GB 변환을 해야됨
영상이 바뀌지 않는 부분
1초 동안 바뀌지 않는 부분
10초 동안 바뀌지 않는 부분은 그대로 두고 바뀌는 부분만 따로 저장
같은 색깔의 점은 압축을 한다
변환 (같은 화면 처리 + 압축 + ...)
영상을 처리
같은 영상
2 GB ~ 8 GB로 만들어짐
이때도 이렇게 변환하는 걸 인코딩 한다고 함
MPEG / H.264 / VP9 ← 변환 방식(알고리즘)

VP9 → 무료
MPEG, H.264 → 유료

앱 하나 팔릴 때마다 돈 내야 됨

웹 브라우저에서는 mp3 플레이 되던데?
운영체제 만든 회사에서 그 회사에 돈 내는 거

이런 알고리즘에 따라서 변환해주는 소프트웨어
반대로 인코딩 된 동영상 데이터를 플레이하려면 다시 원래 데이터로
동영상 데이터를 플레이 하려면 다시 원래 데이터로
압축된 걸 압축을 풀어야 됨
영상을 플레이하려면 초당 24개의 화면(프레임)을 만들어서 돌려야 됨
그럼 압축을 풀고 초당 24개의 화면으로 만들어서 화면에 플레이하는 거
원상태로 데이터로 바꿔야 됨. 그걸 디코딩이라고 함.
원래 영상 데이터로 만들어서 원래 영상 데이터를 플레이어가 실행하는 거.
인코딩, 디코딩을 사람이 하는 게 아니라 소프트웨어가 하는 거.
인코딩, 디코딩을 해주는 이런 소프트웨어
MPEG으로 압축했으면 MPEG으로 풀어야 되고
zip으로 압축했으면 zip으로 풀어야 되고
압축한 걸 푼다
변환한 방식에 따라서 디코딩 해야 될 거 아니야
이런 소프트웨어를 codec(코덱)이라고 부른다.

코덱(codec)은 어떠한 데이터 스트림이나 신호에 대해, 인코딩이나 디코딩, 혹은 둘 다를 할 수 있는 하드웨어나 소프트웨어를 일컫는다.

어떤 사람이 H.264로 압축을 하고 변환을 했다. (인코딩을 했다.)
다시 그걸 원래 영상으로 뽑아내려면 H.264의 알고리즘에 따라서 거꾸로 복원
H.264 알고리즘에 따라서 거꾸로 (디코딩)
컴퓨터에 H.264에 대해서 디코딩 하는 소프트웨어가 설치되어 있으면 그걸 원래 데이터로 디코딩해서 플레이할 것이고 설치가 안 돼 있으면 디코딩이 불가능하니까 동영상 플레이가 안 된다.
원래 데이터로 디코딩해서 플레이
설치가 안 되어 있으면 디코딩이 안 되니까 동영상을 못 봄
동영상을 실행하려고 하면
이 영상을 플레이할 수 있는 코덱이 설치 되지 않았습니다. 코덱을 먼저 설치해주세요.
저 방식에 따라서 인코딩 된 걸 디코딩 할 수 있는 소프트웨어, 도우미 프로그램을 설치하라는 거

사진과 해상도, 모니터

모니터 : 1920 x 1080 = 2,073,600 (약 200만개의 픽셀)
핸드폰 : 800만 화소(pixel)
800만 pixel × 3 byte = 2400만 byte
약 2,400만 byte = 약 24 MB
한 사진당 24 MB가 되는거
10개만 찍어도 240MB
100개 찍으면 2.4GB
핸드폰 용량이 금방 찰 거임
사진을 찍을 때 그냥 찍지 않고
800만 화소라면 한 화소(픽셀) 당
한 픽셀당 3 byte가 필요한데 24MB는 너무 큼
그래서 보통 압축을 함

압축
• JPEG (손실 압축) 원래의 색깔이 약간 손실. 같은 값이면 더 많이 압축할 수 있음.
인간이 구분할 만큼 그렇게 차이가 나는 색이 아니면
두 개의 점을 퉁쳐서 같은 색깔로 만들어버림
그럼 원래의 색깔이 약간 손실됨
그래서 손실 압축
같은 값이면 더 많이 압축할 수 있음

• GIF (비손실 압축)

• PNG (비손실 압축)

비압축 (압축 X)
• BITMAP
• RAW 데이터

디지털 카메라는 설정하는 거 있음
압축 안 할 거라고 하면 메모리 금방 찰 거임
대부분의 압축으로 설정되어 있고 손실 압축으로 설정되어 있음
원본 이미지가 살짝
근데 왜 손실 압축이 기본인가요? 모니터 때문임
모니터는 어차피 200만개 점밖에 출력 못 함
카메라로 800만 화소로 찍은 걸 어차피 200만개의 점에 구겨 넣어야 됨
800만 화소 중에서 600만개의 점을 퉁쳐서 날려서 합쳐버리고
어차피 출력할 때 점들이 날아감
그까짓 색깔 좀 같이 퉁쳐가지고 유사한 색깔을 하나의 색깔로 손실 압축 한다고 하더라도 화면 출력에는 영향을 끼치지 않는다.
나는 비압축 할거야! 손실 압축 안돼!!
그 사진 가지고 뭐할건디.. 큰 종이로 프린트해서 볼 거야?
저희 집 모니터가 8K 모니터입니다.

7680 x 4320 = 33,177,600 화소

4K
8K

800만 화소 카메라로 사진을 찍었다
모니터가 최소 4K가 돼야지 그 사진을 점 한 개도 빠뜨지 않고 온전히 출력할 수 있음
상식적으로 페이스북이나 인스타그램에 사진을 올리는데
사진을 800만 화소로 찍었으면
집에 있는 모니터가 4K라고 하더라도 웹 브라우저를 띄우고 웹 브라우저 안에 작은 크기로 사진을 띄울 거임
그럼 어차피 이 영역은 사이즈가 200만 화소 밖에 안 될 거
그러니까 모니터로 사진을 보는 사람들은 800만 화소를 어차피
어차피 원본 이미지 그대로 출력 안 함
집에 있는 모니터가 최소 4K 있어야 되고
디지털 카메라가 2000만 화소면 집에 8K 모니터 있어야 됨
손떨림 보정, 색감, 빛이 들어왔을 때 빛을 인코딩하는데 빨간색을 더 강하게 인코딩 하느냐 파란색을 더 강화시켜서 인코딩하느냐 여기에 집중해야 됨

특정 포맷으로 압축하는 것도 인코딩이라고 한다.

데이터A를 변환을 해서 특정한 형식의 데이터B 형태로 만드는 것을 인코딩이라고 한다.
데이터B를 원래 데이터A로 복원하는 걸 디코딩이라고 한다.

그게 어떤 형식이든, 압축이든 영상 포맷이든 이미지 포맷이든 UTF-8이든 UTF-16이든 그런 것들은 다 A라는 형태에서 B라는 형태로 규칙에 따라서 변환하는 걸 인코딩이라고 하고 다시 원래 데이터로 바꾸는 걸 디코딩이라고 한다.

변환 (인코딩)
복원 (디코딩)

보통 키보드로 문자를 직접 입력할 수 없을 때 유니코드를 사용한다.

  @GetMapping("/test5")
  public String test5() {
    return "문자5: " + '\u4eba' + '\u00a9' + '\u03c0' + '\u03a3';  // 키보드에서 입력 불가능한 특수 문자를 입력할 때 주로 유니코드를 사용한다.
  }

문자코드와 ''

'가' = '\uac00' = (char) 0xac00

  @GetMapping("/test1")
  public String test1() {
    return "012ABC가각간똘똠똡똥";
  }

페이지 소스 보기
서버에서 보내준 소스 그대로 보여줘
test2

Exam0700

브라우저가 \r 처리를 안 하고 있음

이클립스랑 브라우저에서 확인 불가능
콘솔창에서의 의미
그 다음줄 맨 앞에 가서 출력
커서를 맨 처음으로 가서
다음 라인에서 출력해라
Carrage return이 의미가 없는 거

\t : 공백 두 칸

제어 문자

"012\nabc"
Line Feed를 의미하는 명령 = 제어 문자
제어 문자 → 일반 문자가 아니다 (escape character)

"012\"a\"bc"

일반적으로 출력하는 문자가 아니라 제어 문자

스프링부트에 값을 보내는 방법

Query String = qs

?를 기준으로
? 전 : 요청 URL
? 후 : Query String (서버에 뭔가를 질의하는, 문의하는 문자열)

줄여서 qs 라고 함

쿼리 스트링을 메소드에서 받으려면?

String test1(String name, String tel, String gender) {...}

String ← 변수에 저장할 데이터 타입(유형)
name ← 변수명
변수 : 값을 담는 메모리

쿼리 스트링의 parameter name과 메소드의 변수명은 같아야 한다.
파라미터명과 변수명이 일치해야 한다.

변수 선언 순서는 상관없다!

com.eomcs.study.lang.variable.Exam1.java - java-lang-boot/src/main/java

@RestController("lang.variable.exam1") // 클래스 이름이 같은 경우 충돌 방지
// 변수 : 값을 저장하는 메모리를 준비시키는 명령어
package com.eomcs.study.lang.variable;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController("lang.variable.exam1") // 클래스 이름이 같은 경우 충돌 방지
@RequestMapping("/lang/variable/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1(String name, String tel, String gender) {
    return "클라이언트에서 받은 값 = " + name + "," + tel + "," + gender;
  }

}

null 현재 값이 안 넘어왔다는 거

http://localhost:8080/lang/variable/exam1/test1
애초에 값을 안 보냄

쿼리 스트링으로 전달한 값은 메모리에 저장된다.
저 메모리를 '변수'라고 한다.

변수 수라고 하니까 뭔가 수같아 숫자
하지만 아님
변수는 값을 담는 "메모리"

http://localhost:8080/lang/variable/exam1/test1?tel=010-0000-0000&gender=woman&name=홍길동

서버에 값을 전달

서버에 전달할 때 parameter name, parameter value
parameter name=parameter value
파라미터 명=파라미터 값
& : 파라미터 구분자
? 앞까지는 요청 URL이라고 부르고

파라미터 name이 일치하지 않은 경우는 옵션을 붙여야 됨

boot-project

0개의 댓글