본문 바로가기
Log/TIL

230902

by 재영(ReO) 2023. 9. 3.

🍒 오늘 공부한 내용

  • 자바는 스트림으로부터 I/O를 사용한다. -> 다른 언어는?

    입출력은 시스템간 데이터 이동에 사용됨

    * InputStream은 데이터를 읽고, OutputStream은 데이터를 쓴다.
    * FilterStream은 InputStream이나 OutputStream에 연결될 수 있다.
    * FilterStream은 읽거나 쓰는 데이터를 수정할 때 사용한다. (e.g. 암호화, 압축, 포맷 변환)

    * Stream은 데이터를 바이트로 읽고 쓴다.
    * 바이트가 아닌 텍스트(문자)를 읽고 쓰려면 Reader와 Writer 클래스를 연결한다.
    * Reader, Writer는 다양한 문자 인코딩(e.g. UTF-8)을 처리할 수 있다.

    ### OutputStream

    * OutputStream은 다른 매체에 바이트로 데이터를 쓸 때 사용한다.
    * OutputStream의 서브 클래스(subclass)는 특정 매체에 데이터를 쓰기 위해 write(int b) 메서드를 사용한다.
    * 예를 들어, FilterOutputStream은 파일로 데이터를 쓸 때,
    * 또는 DataOutputStream은 자바의 primitive type data를 다른 매체로 데이터를 쓸 때 사용한다.

    * write 메서드는 데이터를 바이트로 출력하기 때문에 비효율적이다.
    * <code>write(byte[] data)</code>와 <code>write(byte b[], int off, int len)</code> 메서드는
    * 1바이트 이상을 한 번에 전송 할 수 있어 훨씬 효율적이다.
    * write 메서드는 데이터를 바이트로 출력하기 때문에 비효율적이다.
    * <code>write(byte[] data)</code>와 <code>write(byte b[], int off, int len)</code> 메서드는
    * 1바이트 이상을 한 번에 전송 할 수 있어 훨씬 효율적이다.

    * 효율적인 전송을 위해 스트림에서 버퍼링을 사용 할 수 있다.
    * BufferedOutputStream 필터를 연결하면 버퍼링이 가능하다.

    * 버퍼링을 사용하면 OutputStream을 사용할 때 flush를 사용하자.
    * flush() 메서드는 버퍼가 아직 가득 차지 않은 상황에서 강제로 버퍼의 내용을 전송한다.
    * Stream은 동기(synchronous)로 동작하기 때문에 버퍼가 찰 때까지 기다리면
    * 데드락(deadlock) 상태가 되기 때문에 flush로 해제해야 한다.

    BufferedOutputStream과 ByteArraryOutputStream 과는 뭐가 다를까? 
    바이트어레이 -> 버퍼링 안하므로 오버해드 없음
    그럼 언제 얘네 다르게 쓸까?

    요약하면, ByteArrayOutputStream는 메모리 내 데이터 작업에 유용하며, BufferedOutputStream는 파일 또는 네트워크와 같은 외부 출력 대상에 데이터를 쓸 때 유용합니다.


    Try-with-resources -> JAVA 7 부터 try-with-resources로 stream등을 close() 하지 않아도 알아서 auto close를 지원하므로 편리해짐


    ### InputStream
    * read() 메서드는 매체로부터 단일 바이트를 읽는데, 0부터 255 사이의 값을 int 타입으로 반환한다.
    * int 값을 byte 타입으로 변환하면 -128부터 127 사이의 값으로 변환된다.
    * 그리고 Stream 끝에 도달하면 -1을 반환한다.

    ### FilterStream
    * BufferedInputStream은 데이터 처리 속도를 높이기 위해 데이터를 버퍼에 저장한다.
    * InputStream 객체를 생성하고 필터 생성자에 전달하면 필터에 연결된다.
    * 버퍼 크기를 지정하지 않으면 버퍼의 기본 사이즈는 얼마일까?

    * 자바의 기본 문자열은 UTF-16 유니코드 인코딩을 사용한다.
    * 문자열이 아닌 바이트 단위로 처리하려니 불편하다.
    * 그리고 바이트를 문자(char)로 처리하려면 인코딩을 신경 써야 한다.
    * reader, writer를 사용하면 입출력 스트림을 바이트가 아닌 문자 단위로 데이터를 처리하게 된다.
    * 그리고 InputStreamReader를 사용하면 지정된 인코딩에 따라 유니코드 문자로 변환할 수 있다

    * InputStreamReader를 사용해서 바이트를 문자(char)로 읽어온다.
    * 읽어온 문자(char)를 문자열(String)로 처리하자.
    * 필터인 BufferedReader를 사용하면 readLine 메서드를 사용해서 문자열(String)을 한 줄 씩 읽어올 수 있다.


    * File 객체를 생성하려면 파일의 경로를 알아야 한다.
    * 자바 애플리케이션은 resource 디렉터리에 HTML, CSS 같은 정적 파일을 저장한다.
    * resource 디렉터리의 경로는 어떻게 알아낼 수 있을까?

    ClassLoader classLoader = getClass().getClassLoader();
    URL resource = classLoader.getResource(fileName);



    Accept: text/css,*/*;q=0.1

    주어진 HTTP 요청 헤더 "Accept"는 클라이언트가 서버로부터 응답으로 받고자 하는 미디어 유형을 지정하는 데 사용됩니다. 이 헤더는 웹 브라우저나 클라이언트가 웹 서버에게 "어떤 종류의 컨텐츠를 지원하거나 선호하는지"를 알려줍니다.

    "Accept" 헤더의 값은 일반적으로 다음과 같은 형식을 가집니다:

    ```
    Accept: media_type[, media_type]
    ```

    여기서 "media_type"은 클라이언트가 원하는 미디어 유형입니다. 주어진 "Accept" 헤더의 값인 "text/css,*/*;q=0.1"를 해석하면 다음과 같습니다:

    - "text/css": 클라이언트는 "text/css" 미디어 타입의 컨텐츠를 지원합니다.
    - "*/*;q=0.1": 클라이언트는 모든 미디어 타입을 지원하며, "q" 매개변수를 사용하여 "quality factor" 또는 "우선순위"를 설정합니다. "q=0.1"은 이 클라이언트가 "*/*" (모든 미디어 타입)을 지원하지만 이를 최소한으로 선호한다는 것을 의미합니다. "q" 매개변수는 0에서 1 사이의 값으로 설정되며, 높은 값일수록 선호도가 높음을 나타냅니다.

    결과적으로 이 "Accept" 헤더는 클라이언트가 "text/css" 미디어 타입을 약간 선호하지만 다른 미디어 타입도 일부 지원할 수 있다는 것을 나타냅니다. 서버는 이 정보를 활용하여 클라이언트에게 가장 적합한 컨텐츠를 제공할 수 있습니다.


    index.html 페이지만 접근했는데 CSS 같은 정적 파일들은 어떻게 호출된걸까?


    웹 페이지가 로드될 때 CSS, JavaScript 및 이미지와 같은 정적 파일은 해당 웹 페이지에 필요한 리소스로서 자동으로 브라우저에 의해 요청됩니다. 이것은 웹 페이지의 구조 및 콘텐츠를 렌더링하기 위해 필요한 외부 리소스를 가져오기 위한 표준 동작입니다. 웹 페이지는 HTML 파일에서 이러한 리소스에 대한 링크 또는 스크립트를 포함하고 있기 때문에 브라우저가 이러한 리소스를 다운로드합니다.

    HTML 파일 내에서 이러한 리소스를 호출하는 주요 방법은 다음과 같습니다:

    1. **Link 요소**: CSS 파일을 로드할 때 주로 사용됩니다. 다음과 같이 HTML `<head>` 섹션에 추가됩니다:

       ```html
       <link rel="stylesheet" type="text/css" href="styles.css">
       ```

    2. **Script 요소**: JavaScript 파일을 로드할 때 사용됩니다. 다음과 같이 HTML 파일 내에 스크립트로 추가됩니다:

       ```html
       <script src="script.js"></script>
       ```

    3. **Image 태그**: 이미지 파일을 로드할 때 사용됩니다. 다음과 같이 HTML 파일 내에서 이미지를 표시하는 데 사용됩니다:

       ```html
       <img src="image.jpg" alt="Description">
       ```

    4. **Favicon**: 웹 페이지의 아이콘으로 사용되는 favicon 파일은 다음과 같이 HTML `<head>` 섹션에 추가됩니다:

       ```html
       <link rel="icon" href="favicon.ico" type="image/x-icon">
       ```

    따라서 웹 페이지의 HTML 파일을 요청하면, 브라우저는 HTML 파일 내에서 정적 리소스를 찾아서 이러한 리소스에 대한 추가 요청을 생성하고 이 리소스를 다운로드합니다. 이렇게 웹 페이지의 구성에 따라 필요한 모든 리소스를 로드하게 됩니다.

    개발자 도구의 네트워크 패널을 사용하면 이러한 네트워크 요청과 응답을 모니터링하고 분석할 수 있으며, 웹 페이지의 로드 시간을 개선하고 리소스 로딩에 대한 성능 최적화를 수행하는 데 도움이 됩니다.



🎶 느낀 점 & 배운 점

오늘 계획 한 것 : 톰캣 구현 미션

오늘 한 것 : 톰캣 구현 미션

공부할 것 :

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로 

 

🌸 감정회고

미션 재밌다

다만 프로젝트 때 열심히 클래스 분리하고 의존성 관리하고 해서 객체 지향에 어느정도 익숙해졌다고 생각했는데

미션 진행하는 꼴 보니까 진짜 ㅋㅋㅋ 단 한개도 클래스 분리 안하고 메서드 하나가 엄청 비대해진다
자만하지말고 계속 노력해야겠다
그리고 이때쯤에 객사오나 오브젝트 같은 거 읽으면 더욱 효과가 좋다고 했었던 것이 기억나서

다시 읽어봐야겠다

'Log > TIL' 카테고리의 다른 글

230904  (0) 2023.09.05
230903  (0) 2023.09.05
230901  (1) 2023.09.02
230831  (0) 2023.09.01
230830  (0) 2023.08.31