-
Notifications
You must be signed in to change notification settings - Fork 0
[Week2 bjh3311]
TCP(Transmission Control Protocol) 의 특징
- 연결 기반이므로 데이터를 전송하는 동안 수신자와 발신자 사이에 연결을 설정하고 이를 유지한다
- 데이터가 완전히 온전하게 도착하도록 보장합니다
HTTP 메소드
- PUT요청 : 갱신(덮어씌우기)
- PATCH : 리소스 부분 분경 (PUT은 전체 변경이지만, PATCH는 일부만 변경)
HTTP 기본은 무상태이다 무상태로 구현하는 경우 단점을 보완하기 위해 WebSocket이라는 기술이 등장해 상태(Stateful)도 지원 가능함. 세션을 관리하는 방식은 쿠키라는 헤더에 저장해서 관리한다.
HTTP 쿠키??
- 쿠키는 주로 세션 관리( 서버에서 관리하는 로그인 등의 정보를 의미한다. ), 개인 설정유지, 사용자 트래킹( 사용자의 행동을 기록하고 분석하는 것 ) 용도로 사용된다
- 쿠키는 서버가 웹 브라우저에 전송하는 작은 데이터 조각이다.
- 클라이언트가 서버로 요청을 보냈을 때 서버는 요청에 대한 응답과 함께 Set-Cookie 헤더에 쿠키를 담아 보낼 수 있다
세션을 관리하는이유?? 상태를 관리해야 하기 때문이다. 왜냐? HTTP는 Stateless 하기 때문이다.
Status Code를 사용해야 하는 이유!!
- 클라이언트와의 명확한 커뮤니케이션
- HTTP 표준 준수
- 디버깅과 문제 해결
- SEO(검색 엔진 최적화)
- 사용자 경험 개선:
특히 4번 부분은 직접 실험해본 결과.... 잘못된 url 요청에 404 Not Found가 아닌 200 OK 날려봤는데 크롬에서 잘못된 url도 정상으로 판단해서 자동완성을 시켜준다.
직접 HTTP Status Code를 여러 경우의 수로 넣으면서 어떻게 다르게 작동하는지 확인 할 수 있었다.
아직 BufferedReader가 어떻게 작동하는지 완벽하게 이해하지 못 해서, 서버가 무한대기하는 현상을 해결하는데 꽤 오래걸렸다.
Content-Length 헤더를 사용하는 방식은 HTTP 요청 본문의 길이를 결정하는 표준적인 방법입니다.
InputStream 이란 ? 가장 기본적인 입력 스트림으로 바이트 단위의 데이터를 보내며, InputStream의 입력 메서드인 read()는 1byte 단위로 읽어드린다. 때문에 2byte 이상의 문자는 1byte만 읽어드리고 나머지는 스트림에 잔존하게 된다
BufferedReader InputStream에서 InputStreamReader로 확장하여, char type을 처리할 수 있도록 확장되었지만 문자열을 사용할 순 없다 그래서 Buffer(버퍼)를 통해 입력받은 문자를 쌓아둔 뒤 한 번에 문자열처럼 보내버리는 BufferdReader가 필요하다
스트림이란? 파일을 읽거나 쓸 때, 데이터가 전송되는 통로!! BuffferedReader는 보조 스트림이다!!
기초부터 차근차근 java의 개념이 잡혀가는 느낌이다.
다른 분들과 비교했을 때 내 코드는 너무 스파게티 코드이다. 리팩토링이 많이 많이 필요하다
JVM의 구성에 대해서 조금 더 자세하게 알게 되었다
클래스 로더는 런타임에 클래스 파일의 바이트 코드를 읽어 JVM의 Runtime Data 영역에 할당한다. 클래스 로더는 계층 구조로 되어 있어, 부모 클래스 로더부터 순차적으로 로딩을 시도한다.
JVM을 이루는 구성 요소 중 하나는 Runtime Data Area이다. JVM은 가상 머신이기 때문에 별도의 메모리 구조를 가지게 된다. 힙과 메서드 영역의 경우 모든 스레드가 공유하며, 스레드마다 PC 레지스터, 스택영역이 별도로 생성된다.
Heap은 클래스의 인스턴스와 배열과 같은 참조형(new) 데이터 객체들의 실제 값이 저장되며, Garbage Collection이라는 동적 메모리 관리 시스템에 의해서 관리된다.
Method 영역에는 클래스 메타데이터, 클래스에서 사용하는 상수, 메서드 정보, static 필드와 같은 데이터들이 저장된다. JVM 종료시까지 메모리에서 해제되지 않기 때문에 메모리 상에 존재한다.
PC 레지스터는 실제 CPU의 그것과 동일하게 JVM이 실행중인 명령어의 주소를 저장한다.
Stack은 메서드 호출과 반환에 따라 생성, 삭제되며 지역변수, 매개변수, 함수의 실행 결과를 저장한다.
자바 Reflection의 존재와 개념에 대해 알게 되었다.
Thread Local이란? ThreadLocal이란 Java에서 지원하는 Thread safe한 기술로 멀티 스레드 환경에서 각각의 스레드에게 별도의 저장공간을 할당하여 별도의 상태를 갖을 수 있게끔 도와준다.
HashMap을 사용할 때 멀티스레드 환경에서 Thread-safe한 Concurrent HashMap의 존재와 개념, 사용법에 대해서 배웠다.
HTTP 쿠키(HTTP Cookies)란?
서버에서 유저의 브라우저에 저장하는 작은 데이터 조각입니다. 쿠키는 주로 세션 관리(로그인상태, 장바구니), 사용자 개인화(테마,환경 설정), 트래킹(분석,광고)등에 사용됩니다.
Set-Cookie는 HTTP 응답 헤더 중 하나로, 쿠키를 서버에서 클라이언트(브라우저)로 전송하는 데 사용됩니다. 이 헤더가 포함된 응답을 받으면, 브라우저는 이를 해석하고 해당 쿠키를 저장합니다.
서버에서 Set-Cookie 헤더를 받게 되면 브라우저는 다음과 같이 동작합니다.
브라우저는 Set-Cookie 헤더에 지정된 쿠키와 해당 설정을 저장합니다. 만약 같은 이름의 쿠키가 이미 존재하면, 그 쿠키는 새 값과 설정으로 덮어씌워집니다.
Set-Cookie의 속성 중 Path=
- 브라우저가 쿠키 헤더를 전송하기 위해 요청된 URL에 존재해야 하는 경로를 나타냅니다.
- 슬래시(/) 문자는 디렉토리 구분 기호로 해석되며 하위 디렉토리도 일치합니다. 예를 들어 Path=/docs,
- 의 경우 요청 경로 /docs, /docs/, /docs/Web/, /docs/Web/HTTP가 모두 일치합니다.
- 요청 경로 /, /docsets, /fr/docs는 일치하지 않습니다.
HttpOnly
- JavaScript가 Document.cookie 등을 통해 쿠키에 액세스하는 것을 금지합니다. 즉, 서버와 클라이언트 사이의 HTTP(S) 요청에서만 사용될 수 있습니다
- 주로 XSS(Cross-Site Scripting) 공격을 방지하는 데 사용됩니다. XSS 공격자는 브라우저에서 실행되는 악성 스크립트를 통해 쿠키에 접근하려고 시도할 수 있는데, HttpOnly 플래그는 이를 방지합니다.
JVM에 대해 좀 더 자세하게 알게 되었다.
아직 너무 겉 핥기 식으로 알고 있는 것 같다.
리팩터링과 클린 코드의 차이점에 대해 알게 되었다.
클린코드는 코드 이해도와 가독성을 높이는 것을 목표로, 코드 설계시 작성 하게 된다.
리팩토링은 클린코드를 포함하여 전체 코드 완성 후 수정 등 추가 작업시 진행되며 유지보수를 위한 코드 개선이 특징이다. 리팩토링의 주 목적은 가독성을 높이고, 코드 중복을 줄이며, 예외 처리를 명확하게 하는 것입니다.
또한 구글 JAVA Style Guide의 존재를 알게 되었다.
if-else문을 쓸 때 다른 분들은 나랑 스타일이 달라서 어떤게 맞는지 고민을 해보았다.
코드에 대한 규칙과 스타일에 대해 알게 되었다.
여태까지 막 짜던 습관이 남아있어서 얼른 고치도록 해야겠다.
JAVA 람다식에 대해 알게 되었다. if문을 switch로 쓰는게 더 가독성이 좋은 것 같다.
커밋은 이슈 단위로 해라!!! EX) 커밋 51개 ,file change 19
컨벤션을 좀 지켜라!! 안쓸거면 logger도 만들지 마라!! 자주 쓰이는 상수는 상수 전용 클래스로 추출 좀 해라!!
String a = "abc" , a = new String("abc") 이 두 개는 메모리에서 생성 방식이 다르다
String a = "abc" 은 String constant pool이라는 영역에 생성된다.
a = new String("abc") 는 Heap 메모리에 영역에 생긴다.
- String str1 = new String("Hello");
- String str2 = "Hello";
- String str3 = "Hello";
Dispatcher servlet 이란 무엇인가?