면접 시리즈 마지막인것 같다. Web - FrontEnd 위주로, 그리고 Backend도 곁들여서..
<추가 신입 프론트엔드 면접 질문 리스트>
https://velog.io/@honeysuckle/%EC%8B%A0%EC%9E%85-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C
공통점
1) SPA 개념
SPA : 단일 페이지 애플리케이션
데스크탑에 비해 성능이 낮은 모바일에서도 빠른 접근을 위해 SPA방법 등장. 최초 한번 페이지 전체를 로딩한 이후 데이터만 변경하여 사용.
기존의 SSR방법은 요청 시 마다 새로고침이 일어나며 페이지 로딩시 서버로부터 리소스를 받는 방식때문에 문제가 있었고 CSR방식이 생겼다.
-기존방식 : link를 통해 refresh (매 동작마다 페이지 새로고침과 리렌더링)
-SPA : 한 페이지에서 리렌더링 없이 필요한 동작 수행
이런 성능적인 측면으로 User 의 입장에서 native-app을 이용하는 경험을 얻음.(실제로 배포도 가능. ionic, react-native 등)
2) SPA 단점
=> SEO를 최적화 하기 위해 첫 번째 페이지 로딩시 로딩 속도가 빠른 SSR을 사용하고, 이후 페이지에서는 CSR을 활용하는 방식을 많이 사용한다.
NextJS나 Nuxt JS는 SSR이고, Gatsby는 SSG(Static Site Generator)이다.
NextJS에서는 pages 디렉토리 안에 있는 것들이 서버에서 미리 렌더링 된 후 브라우저에 전달된다. 따라서 초기 로딩속도는 늦은편이나 CSR의 단점인 SEO문제를 해결할 수있다. 첫 로딩페이지 이후는 그래도 CSR의 장점을 가져가기 가능. (CSR은 번들링 된 JS가 렌더링을 담당하여 초기에는 빈 HTML만 보내줌, Next는 pre-rendering으로 빌드 타임때 HTML 문서 미리 생성)
SSG는 HTML을 빌드 타임에 각 페이지별로 생성하고 해당 페이지로 요청이 올 경우 이미 생성한 HTML 문서를 반환.
=> 동적인 데이터 교환을 기반 (SSR 추천), 개인 포트폴리오 같은 정적인 데이터 기반(SSG 추천)
0) DNS가 연결해줄 곳을 찾아 서버에서 HTML 파일을 클라이언트로 보낸다.
1) HTML 마크업 처리, DOM Tree 생성 ("What")
2) CSS 마크업 처리, CSSOM Tree 생성 ("HOW")
3) DOM 및 CSSOM 결합 => Render Tree 생성 ("화면에 그려질 것 결정")
4) 렌더링 트리에서 레이아웃 실행 (부모에서 자식 순서로 배치)
5) Paint
[CORS 테크톡을 참고하여 요약했습니다.]
https://www.youtube.com/watch?v=-2TgkKYmJt4
요청을 보내기 위해서는 보내고자 하는 대상과 프로토콜, 포트번호가 같아야 한다.
http://localhost 와 동일한 url
= http://localhost:80
= http://localhost/api/cors
SOP가 필요한 이유
- SOP : 다른 출처의 리소스를 사용하는 것에 제한하는 보안 방식.
- 해커가 만약 다른 Origin으로 접속을 시도하면 SOP에 의해 제한된다.
그렇다면 다른 출처의 리소스가 필요하다면??
=> CORS (Cross-Origin Resource Sharing)
- 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제.
CORS 접근제어 시나리오
1) 프리플라이트 요청 (Preflight Request)
2) 단순 요청 (Simple Request)
Q. 그렇다면 왜 Preflight가 필요한걸까?? Simple이면 편한데??
CORS spec이 생기기 이전에 만들어진 서버들은 브라우저의 SOP Request만 가능하다는 가정하에 만들어 졌는데, cross-site request가 CORS로 인해 가능해졌기 때문에 보안 메커니즘이 따로 없다보니 문제가 생길 수 있어서 이런 서버를 보호하기 위해 preflight request를 포함했다.
=> 즉, Preflight request로 서버가 CORS를 인식하고 핸들할 수 있는지 먼저 확인함으로써 CORS를 인식하지 못하는 서버들을 보호할 수 있게 해준다. (CORS 설정이 없으면 ALLOW-ORIGIN이 없기에 사전에 확인해서 서버를 보호하기 위해)
3) 인증정보 포함 요청 (Credentialed Request)
CORS 해결 방법
1) 프론트 프록시 서버 설정 (개발 환경)
2) 직접 헤더에 설정
3) 스프링 부트 이용
웹 표준에 따라 개발을 하여 서로 다른 OS나 다른 플랫폼에 대응하는 것.
브라우저의 렌더링 엔진이 다른 브라우저에서도 구현되도록.
공통 요소를 사용하여 웹 페이지를 제작 (IE, 크롬, 사파리..)
https://asfirstalways.tistory.com/237
=> Babel + Webpack 사용해서 처리
웹 스토리지는 로컬스토리지와 세션 스토리지가 있다. 둘다 서버에 데이터를 저장하지 않으며 로컬 스토리지는 브라우저에 정보가 계속 남아잇고, 세션은 해당 세션이 끝나면(브라우저가 닫히면) 데이터가 사라진다. 단, HTML5부터 지원한다.
쿠키는 HTTP 요청마다 포함되어 서버에서 정보를 받아오기 때문에 서버에 부담이 간다. 용량도 작고 암호화가 안되서 위험하다.
웹에서 로그인을 하기 위해 토큰을 받아서 API를 호출해야 한다. 하지만 반복되는 작업은 비효율적이기에 쿠키를 서버와 클라이언트에 생성하여 투키만 가지고 서버에 요청할 수 있도록 한다. 단, 저장공간이 작은편.
자동 로그인 -> 로컬스토리지 (계속 저장)
입력 폼 정보 -> 세션스토리지
비로그인 장바구니 -> 세션스토리지
다시 보지 않음 팝업 창 -> 쿠키
CSS class name 규칙
https://devowen.com/272?category=778540
(내용, 그림 참고 링크 [10분 테코톡]: https://www.youtube.com/watch?v=calGCwG_B4Y)
=>서블릿 컨테이너는 서블릿 생명주기를 관리함.
=> 이렇게 많은 처리를 해줘야 하지만, Spring을 사용하면 핸들러 맵핑, 어댑터, 뷰 리솔브는 스프링 컨테이너(스프링 IoC)로부터 주입을 받아서 처리할 수 있고, 개발자는 처리 핸들러에만 집중할 수 있다.
즉, 스프링으로 웹 요청 처리한다는 것은 스프링 MVC에서 제공하는 Dispatcher Servlet과 웹 요청 처리 관련 구현체들을 사용할 수 있고, 스프링 IoC를 사용하여 개발할 수 있다. 최종적으로 개발자가 핸들러에만 집중할 수 있게 도와준다.
https://geminihoroscope.tistory.com/90
https://kim6394.tistory.com/161
https://ktko.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81
https://meetup.toast.com/posts/92
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://kadamon.tistory.com/21
https://syujisu.tistory.com/120
참고 링크
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/FrontEnd