Log/TIL

230906

재영(ReO) 2023. 9. 7. 01:40

🍒 오늘 공부한 내용

max-age Public으로 한 이유
CDN에서도 저장하려고 그런거 아닌가요?

HTTP는 Stateless 맞는가?
맞다 -> 쿠키, 세션으로 구별함

### Cookie
쿠키는 사용자를 식별하고 세션을 유지하는 웹 기술
웹 서버는 사용자를 식별하기 위한 유일한 값을 쿠키에 할당한다.
응답 헤더 Set-Cookie에 이름=값; 형태로 반환한다.
클라이언트 측 상태
브라우저는 쿠키 정보를 저장할 책임이 있다.

### Session
세션은 서버에서 값을 저장하고 id를 발급한다.
클라이언트와 서버는 Cookie를 통해 Session Id를 주고 받는다.

session 문제점
-> SCALE OUT 될 때 세션이 존재하지 않는 상황 발생

1. Session clustering
   클러스터 - 여러 개 컴퓨터를 하나로 쓰는 느낌
   replication을 해서 똑같이 사용 <- all-to-all 이라고 함
   Tomcat - Clustering/Session Replication

2. Sticky session
   어느 서버였는지 기억해서 거기에 보내주는 것
   AWS ALB에서 설정 가능
   * ALB : Application LB <- 프로그램으로
   * ELB : Elastic LB <- 물리적으로

3. Shared Session Storage
   JDBC, Redis, MongoDB 등을 활용

다른 해결 방법
JWT

REST 아키텍쳐 스타일

Refresh Token 사용하면 어차피 stateful 하게 됨

MDN 참고

 

 

## Thread

동시성 작업할 때 쓰레드 사용한다

Method Area - static 영역, 필드 및 메서드 데이터(메서드 실행하는 것이 아니라 메서드 자체에 대한 정보) <- 메타 데이터라고 함
메서드 및 생성자 코드

Heap
인스턴스 관리
배열 

쓰레드 안에는 
JVM Stack
PC Register
Native Method Stack
지역 변수들 각 개별 쓰레드에서 관리

프로세스 VS 쓰레드

동시에 여러 작업할 때 쓰레드 사용

Race Condition

하나의 객체 인스턴스를 여러 스레드가 참조할 수 있다
-> 아래 두가지 문제가 생김
스레드 간섭
메모리 일관성 오류
그걸 해결하기 위해 동기화를 사용한다

Thread-safe class
-> Instance에 final 붙이는 이유
상태 변수를 쓰레드 간에 공유하지 않는다.
상태변수를 변경할 수 없도록 만든다.
상태 변수에 접근할 떈 언제나 동기화를 사용한다.
캡슐화나 데이터 은닉은 스레드 안전한 클래스 작성에 도움이 된다

atomic 단점은 없나? - Atomic 클래스들은 특정 연산만 지원하기 때문에 복잡한 연산을 사용하기는 어렵고, 여러 스레드가 동시에 atomic 변수를 업데이트할 때 같이 업데이트를 시도할 때 한 스레드가 성공할 때까지 다른 스레드는 계속 실패하며 반복해야 하기 때문에 성능 저하가 있을 수도 있다고 하네요


🎶 느낀 점 & 배운 점

오늘 계획 한 것 : 
* 강의 [O]
* 프로젝트 회의 (2개) [O]

* 톰캣 컨트리뷰트 PR 리뷰반영[O]

* 알고리즘 스터디 [O]
* 실습 [O]
* 페이지네이션 공부
* 블로그 글 작성
* 이력서 정리
* 깃헙 리드미 정리
* 이분탐색 문제 더 풀기
* 냅색 문제 더 풀기
* 미션 3,4단계

 

오늘 한 것 : 
* 강의 [O]
* 프로젝트 회의 (2개) [O]

* 톰캣 컨트리뷰트 PR 리뷰반영[O]

* 알고리즘 스터디 [O]
* 실습 [O]

공부할 것 :

스프링 부트에서 tomcat 커넥션과 스레드 개수 설정이 둘 다 존재하는 것 같은데, 둘은 어떤 차이가 존재하는지 궁금해요

completable future
Spring Web Flux


자바의 Synchronized -> monitor lock

 

@PostConstruct
@HandlebarsHelper

 

 

cache max-age public 설정 이유

 

WebContentInterceptor

Cache Public, Cache private

 

REST한 요청

 

DNS

 

CORS - Preflight 

 

CDN

 

CAS (Compare and Swap) 알고리즘

 

쿠키 세션

 

Configuration Property Scan

 

static field 언제 올라감?

 

Mozilla

 

ClassLoader가 어떻게 읽음?

spring boot project build package 생기는 이유랑 왜 거기서 클래스패스 찾는지


https://velog.io/@ohzzi/F12%EC%9D%98-%EB%88%88%EB%AC%BC%EB%82%98%EB%8A%94-%EC%BF%BC%EB%A6%AC-%EA%B0%9C%EC%84%A0%EA%B8%B0-%EC%9D%B4%EB%A1%A0%ED%8E%B8오찌 쿼리 개선기

오찌 로깅

 

https://velog.io/@saint6839/Controller%EC%97%90%EC%84%9C-HttpRequest-Body-%EA%B0%92%EC%9D%80-%EC%99%9C-%EB%B9%84%EC%9B%8C%EC%A0%B8-%EC%9E%88%EC%9D%84%EA%B9%8C getBody 왜 비워져있는지

필터 인터셉터 빈등록

StatementInspector


쿼리카운터 -> ThreadLocal

로그인 -> 인터셉터 or 필터

 

Join Column 공부

createdDate CreationTime

entity listener
MappedSuperClass

웹소켓

블루그린, 레드블랙, 롤링
flyway -> 롤백하는 경우 스키마 관리에 문제 생김

 

@Retention -> https://jeong-pro.tistory.com/234


composite 패턴
decorate 패턴

검프 도커 테코톡 실습편

Paging, Pagination

@Valid 에서 잡은 예외 허브가 해 놓은거 이해하기

ssh 설정

propagation, isolation 직접 설정 (https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h) -> 이거 보고 감 잡기
팬텀리드 예시 다시 보기
DB에서 B-Tree 쓰는 이유
복합키
Unique 동시에 걸기
커버링 인덱스
인덱스 스킵 스캔

springfox, springdoc

queryDSL
CQRS

 

LAZY Loading (Transactional 사용하지 않으면 못 쓰는 이유)
Fetch Join

@ContextConfiguration(classes = TestSyncConfig.class)
TransactionTemplate


나아가팀 배포 스크립트문제 -> 쉘 스크립트 프로세스 물고 있는 문제

동욱님 JPA Exists 쿼리 성능 개선 블로그
동욱님 예외레벨 블로그

 

나아가팀 AuthInterceptor에서 터지는 예외가 ControllerAdvice에서 처리도 되고, 콘솔에 에러라고 찍히기도 함 -> 해결못함

 

CD 할 때 도커 허브

queryDSL 동적쿼리

토큰 암호화

self-join

certbot 

jpa bulk insert 할 때 auto increment 이면 안됨

토큰 세션 장단점

syncronized, 비관적 락 장단점

비동기와 트랜잭션

@AttributeOverride

 

레디스
메세지 큐
R-Tree

페이징
커버링인덱스

 

대칭키 암호화 비대칭키 암호화 복호화

모든 엔티티의 변수를 VO로 

 

🌸 감정회고

톰캣 컨트리뷰터가 되었다...! 감격......

ㅋㅋㅋㅋ 정말 별 거 아닌 수정이지만, 오픈소스에 기여하는 것이 처음이라고 적어놔서 그런지 킹갓엠퍼러제너럴사람좋게생긴 Mark가 무려 'A lot easier to follow'라고... 격려도 해줬다.. 하하!
재미를 느끼게 되어서 다행이고, 덕분에 Http11Processor도 열심히 뜯어보고 있다

 

아 개발 재밋다 재밌어서 더 잘 하고 싶다 욕심나네

 

+

주책 다 받아주고 멋지다고 해줘서 고맙습니다!