2021-03-08-TIL

프로그래밍 언어의 정의?

알고리즘 문제를 풀 수 있으면 프로그래밍 언어이다.

튜링 완전(turing completeness)이란 어떤 프로그래밍 언어추상 기계튜링 기계와 동일한 계산 능력을 가진다는 의미이다. 이것은 튜링 기계로 풀 수 있는 문제, 즉 계산적인 문제를 그 프로그래밍 언어나 추상 기계로 풀 수 있다는 의미이다.

HTML은 언어인가?

HTTP

DNS의 원리

다단계 구조라서 하위 DNS 서버에서 모르면 상위 계층을 불러온다. 말단직원에게 무엇을 물어봐서 모르면, "김과장 오라 그래!" 이런 것 처럼.

codesquar.kr 주소에 해당하는 IP(1.1.1.1)가 없어진다면

ip를 새로만든다. 그리고 도메인네임을 연결한다. 하지만 서버에 캐시가 남아있어서 안된다. 예를 들어 48시간 캐싱시간을 설정했다면 변경 불가능.

방법은 임시로 도메인네임을 새로 파고 krong.kr로 접속하면 5.5.5.5로 변경 후, 접속하라고 공지한다. 하지만 CORS문제가 또 발생한다. 코드상에서 도메인 네임을 하드코딩 해 놓았다면 모두 바꾸어야한다. 애초에 환경변수로 관리해야함…

/etc/hotst에 쓰면 생기는 문제

DNS 스푸핑을 당할 수 있다.

네트워크 계층구조

인캡슐레이션과 디캡슐레이션을 통해서 각각의 계층은 다른 계층의 내용을 알 필요가 없다. 각 계층에 해당하는 부분만 보내고 작성하면 된다. 독립성이 보장된다.

HTTP는 상태가 없다. stateless 그냥 Request/Response를 개별적으로 보낸다.

TCP/IP 위로는 신뢰성이 있는 통신이다. 따라서 HTTP는 성능이 상대적으로 떨어진다. 3way hand shaking 비용이 커서 시간이 걸리기 때문. 그냥 가방에 넣고 보내면 되는데, 택배로 포장하고 보내는 과정을 거쳐서 시간이 걸리는 것과 같다.

HTTP Request

리퀘스트 헤더는 Key-Value 구조이다.

HTTP Response

헤더에 contents-length가 있는데 이게 없으면 어디까지 읽을지 알 수 없다. 이를 기준으로 다 읽으면 연결을 끊는다.

Telnet으로 보내보기

GET /docs/index.html HTTP/1.1
Host: www.nowhere123.com

엔터 두번 치면 문자열을 전송한 것 만으로도 응답이 온다.

Postman으로 보내기

Add Request한 다음에 Request에 x-www-form-urlencoded를 선택한 다음, Key Value를 작성하고 실행 -> 405에러가 나면 POST에 해당하는 PostMapping을 추가해주고 실행

포워드 리다이렉트

리다이렉트는 저쪽으로 GET요청을 하는것이다.

return "/hello" 는 이 요청에서 /hello라는 템플릿을 보여주는거고

return "redirect:/hello" 는 브라우저가 새로 GET요청을 하는 것이다.

POST는 새로운 리소스를 만들어달라는 의미가 담겨있다. 따라서 GetMapping말고는 보통 redirect하는것이 보통이다.

DeleteMapping에서도 템플릿 반환하는 방식은 위험하다. redirect하는 것이 맞다. 뒤로가기나 새로고침이 정상적으로 동작하도록 설계해야한다!!

logging.level.root=DEBUG
logging.level.com.codesquad.qna.web=DEBUG

인텔리제이에서 test/http에 작성해서 테스트해도 된다. Postman보다도 간단한 방법

HTTP method

이전에는 GET POST만 사용하곤 했지만, 요즘에는 REST로 url을 설계하기 위해서 다른 메소드도 사용한다.

f(x) = f(f(x)) POST로 5번 요청하면 5개 계정을 생성하라는 의미가 된다.

405

POST로 보냈는데 서블릿컨테이너가 PutMapping을 찾아버린다던지,

POST가 들어왔는데 마치 PUT이나 DELETE인 것처럼 속여준다. 하지만 이게 잘못되면 405가 날라간다.

서블릿필터와 인터셉터가 이러한 요청을 처리해준다. (AOP)

spring.mvc.hiddenmethod.filter.enabled=true POST지만 hidden속성으로 PUT이나 DELETE가 있으면 그 메소드로 처리해주어라는 설정 -> form으로 POST나 DELETE도 보낼 수 있도록 해줌, 실제로는 POST로 보내지만 서버에서는 DELETE, PUT 요청으로 착각하고 처리해준다. 중간에 POST를 DELETE나 PUT으로 필터해준다.

삭제 요청을 했는데도 안되면, @DeleteMapping("/users/{id}") 로 해도 @PostMapping("/users/{id}") 가 있으면 이게 먼저 실행되므로 DELETE요청이 씹힌다.

클라이언트는 서버가 바꾸라는데로 바꿀 수 밖에 없다. 거부할 수 있는 수단이 없다.

500 대 에러

백엔드 개발자의 문제

TODO: MVC, JSP