오늘 할 일

- 스프링 강의 보기 : 컴포넌트 스캔 부분

- 점심 만들어진 화면 분석하기

- 툰게더 목적 , 방향성, 해보고 싶은 것 생각해보기

 

스프링 강의 기록

컴포넌트 스캔과 의존관계 자동 주입 시작하기

@Component , @Autowired 이제야 알겠네...

빈으로 등록         의존관계 주입

 

토이 프로젝트 - 점심

x

 

회  고

- 스프링 강의 보기 : 컴포넌트 스캔 부분(1강 들음)

- 점심 만들어진 화면 분석하기(x)

- 툰게더 목적 , 방향성, 해보고 싶은 것 생각해보기(완료)

 

 

 

내 일  할  일

- 스프링 강의 보기 : 컴포넌트 스캔 부분

 

 

 

반응형

250121 : HTTP 

http --- 쿠키까지
쿠키 왜 이름이 쿠키냐
세션쿠키 , 영속 쿠키
쿠키랑 세션 
언제 나왔나 없었으면?

ResponseEntity ,@ResponseStatus
-- 안전하게 하는법 왜 문제였지?
toEntity 
JPA 정적 팩토리 메소드
public interface KeywordRepository extends JpaRepository<KeywordRepository,Long> {
Optional - orElseGet

 

250122 : 스프링 핵심원리 - 기본편

빈은뭐지..? @bean이게 빈인가? 컨테이너에서 빈이란건 뭐지? 
스프링 컨테이너는 왜? 객체를 관리할까?
스프링은 왜 만들어졌을까?
스레드 동시성

반응형

 

오 늘  할 

- 스프링 강의 보기 : 싱글톤 컨테이너

- 점심 화면 만들기 

- 더 알아보기쓰기

 

스프링 강의 기록

--

순수 di 컨테이너에서 객체가 계속 생성되고 삭제되고 -> 하나를 공유하는건 어떨가?

근데 이게 하나를 100이 나눠쓴다고?

--

싱글톤 패턴

스프링은 객체를 다 싱글톤으로 해줌 

공유하는게 좋은가? 공유하면 그 다음까지 기다려야하는데 그게 객체를 생성하는 것 보다 빠르나?

기다리는건 아니고 그냥 같이 쓰는건가? -> 바보 ㅋ 공유라는건 걍 같이 쓰는거 ㅋ 기다리는거 없음 그래서 무상태로 

만들어야함 

 

싱글톤 문제

- 유연성이 떨어지는 구만.. 수많은 단점들..

--

스프링 싱글톤 컨테이너 

--

싱글톤 방식의 주의점(제일 궁금했음)

** 무상태여야함 / 읽기만 가능해야함 .. 등등

--

@Configuration 과 싱글톤

자바 소스에서 new ~ 생성되어야 하는데

??? 

--

@Configuration 바이트 코드 조작의 마법

 

@Configuration

스프링이

@CGLIB 내가 만든 객체가 아닌 그 임의의 다른 클래스가 싱글톤이 되도록 보장해준다.

 

@Configuration 을 안쓰면? 싱글톤이 보장 되지않네? 레알 자바코드 new로 함

@Bean 만써도 빈으로 등록되긴하지만 메서드를 직접 호출할 떄 싱글톤을 보장하지않음

빈은뭐지..? @bean 이게 빈인가? 컨테이너에서 빈이란건 뭐지? 

앞에 안들으니깐 모르겠구만 ㅋ

 

 

토이 프로젝트 - 점심

오늘 스프링 강의듣고 오후 업무 하고 시간이 적어서 지피티에 요청해서 복붙만함 dart 언어는 초면이라 잘 모르겠는데내일 한번 천천히 뜯어 봐야겠다. 

 

회  고

- 스프링 강의 보기 : 싱글톤 컨테이너 (완료)

- 점심 화면 만들기 (완료)

- 더 알아보기쓰기 (완료)

 

스프링 강의 듣는데 원래는 학자형 타입이라 처음부터 순서대로 듣는데 야생권법으로 중간에 스프링 부분 부터 들었다.

그랬더니 모르는 것 투성이지만 킵고잉했다 ㅋ 진짜 궁금한거는 검색 살짝 해보고 어차피 다시 볼꺼니깐 더 알아보기에 따로 써놨다! 강의 완강하고 하나씩 보고 전체적으로 한번 봐야겠다.

 

오늘은 토이 프로젝트는 별로 못하고 복붙만 해놨다. 내일은 강의 듣기 전에 소스 한번 보면서 분석해봐야겠다.

 

내일 툰게더 시작 모임 있는데 그 전에 프로젝트의 목적과 해보고싶은 것들과 방향성에 대해서 좀 생각해봐야겠다.

 

굿굿 ㅋ 오늘이 삼일째 TIL 작심삼일인데 삼일 썼다 ㅋ 뿌듯~~~~~ 

 

 

 

내 일  할  일

- 스프링 강의 보기 : 컴포넌트 스캔 부분

- 점심 만들어진 화면 분석하기

- 툰게더 목적 , 방향성, 해보고 싶은 것 생각해보기

 

 

 

반응형

오 늘  할  일

- HTTP 강의 완강
- 지피티로 플러터 앞단 만들기

 

HTTP 강의 기록

HTTP 캐시
캐시 적용
캐시가 만료 됐는데
서버- 클라이언트의 데이터가 같다면
서버- 클라이언트의 데이터가 다르다면
** 그떄 필요한게 검증헤더
안바뀐걸 어케 알아?

1)
Last-Modified(최종수정일)검증헤더 - if-modified-since 조건부요청
304 Not Modified + 헤더 메타 정보만
http body가 없음 - 그래서 용량이 줄어들음
캐시로 리다이렉션해라

  • 날짜 기반의 로직 사용

2)
ETag(Entity tag)
캐시용 데이터 임의의 버전 태그

  • 캐시 제어 로직을 서버에서 완전히 관리

캐시
cache-control
no-cache :

프록시 캐시 서버
public 캐시

캐시 무효화
Cache-Control:no-cache,no-store,must-revalidate
pragma:no-cache
no-cache vs must-revalidate

  • no-cache 원서버 접근 불가면 에러 or 200 ok
  • must.. 원서버 접근 불가면 무조건 504

 

토이 프로젝트 - 점심

오늘 플러터 셋팅하고 폴더 구조 어떻게 하는지 봄

 

회  고

- HTTP 강의 완강 (완료)
- 지피티로 플러터 앞단 만들기(ing)

 

와 처음으로.. 강의 완강 해본 듯 ..? 강의 마지막에 다음에 어떻게 해야하는지 로드맵 보여주시는데 스프링 입문 강의 -> jpa 실무 루트로 가라고 하셔서 내일부터는 스프링 기본 강의 입문편 들어 볼까 생각중입니다.

http 캐시 부분 배웠는데 가끔 개발자도구에서  request 봤을때 cache-control:no-cache 종종 보고 오 노캐시군 이렇게 넘어갔는데 오늘 보니깐 전혀 다른얘기라,, 앗차차 했다.

 

오늘 플러터로 앞단 만드려고 했는데 환경셋팅하고 폴더구조 어떻게 하는지 보다가 끝남 ㅋ 그리고 좀 에바인게 플러터 크로스 플랫폼이라고 해서 선택했는데.. 알고보니.. 아이폰 앱 빌드 할 때는 무조건 맥에서 해야하는...지.. 오늘 알았습니다 ㅋ 일단 고 하고 후에 알아봐야겠다...

 

내일은 진짜 앞단 지피티하고 같이 만들어야겠다.

 

원래 벨로그에서 썼는데.. 가독성이 너무 떨어져서 다시

티스토리로 돌아 왔습니다.

 

내 일  할  일

- 스프링 강의 보기

- 점심 화면 만들기 

 

 

 

반응형

오늘 할일

  • HTTP 헤더 부분 공부
  • 점심 등록 기능

배운 것

1) HTTP 헤더 공부

표현

콘텐츠 협상

  • 클라이언트가 선호하는 표현 요청
    -> Accept: 클라이언트가 선호하는 미디어 타입 전달
           우선 순위가 있어서 서버가 확인하고 우선순위에 맞춰서 전달
  • 요청에서만 사용
    협상과 우선순위1
  • 0~1 클수록 높은 우선순위(생략하면 1)
  • accept-language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
    협상과 우선순위2
  • 구체적인 것을 우선한다.
  • 구체적인 것을 기준으로 미디어 타입을 맞춘다.<- 뭔 얘기인지는 잘 모르겠음

전송 방식

  • 단순전송
  • 압축전송
  • 분할전송
    : transfer-Encoding: chunked
    5
    hello
    5
    hello
    0 < - 끝난다는 표시
    \r\n <
    ** content-length는 보내면 안됨
  • 범위전송

일반 정보

  • from 유저 에이전트의 이메일 정보
  • Referer: 이전 사이트 주소 (유입 경로 분석 가능)
    referer:https://www.google.com/
  • user-agent: 유저 에이전트 애플리케이션 정보
            특정 브라우저 장애 파악
            유입 통계
  • server : origin 서버 정보

특별한 정보
-host(필수):
-Location : 페이지 리다이렉션
-Allow: 허용 가능한 HTTP 메서드

  • Retry-after : 유저 에이전트가 다음 요청을 하기까지 기다려야하는 시간<- 하지만 어렵죠?

인증

  • Authorization: 클라이언트 인증정보를 서버에 전달
  • WWW-..

쿠키

  • set-Cookie :서버에서 클라이언트로 쿠키전달(응답)
  • Cookie : 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달
  • 모든 요청에 쿠키 정보를 자동 포함

쿠키 미사용

  • http 무상태 프로토콜임

  • http 무상태에 대안 - 모든 요청에 사용자 정보를 포함(보안, 개발 문제)

  • 쿠키 정보를 모두 포함하면 또 보안 문제겠죠?

  • 사용처
    1) 사용자 로그인 세션관리
    2) 광고정보 트래킹

  • 쿠키 정보는 항상 서버에 전소됨
    1) 네트워크 트래픽 추가 유발
    2)

    세션 쿠키 영속 쿠키

    쿠키 - 도메인 / 경로

    • 경로를 포함한
      보안
      Secure , HttpOnly, SameSite

더 알아보고 싶은 것

http --- 쿠키까지
쿠키 왜 이름이 쿠키냐
세션쿠키 , 영속 쿠키
쿠키랑 세션
언제 나왔나 없었으면?

2) 토이프로젝트 점심기능

  • 점심 등록 기능 구현함

    더 알아보고 싶은 것

    ResponseEntity ,@ResponseStatus
    • 안전하게 하는법 왜 문제였지?
      toEntity
      JPA 정적 팩토리 메소드
      public interface KeywordRepository extends JpaRepository<KeywordRepository,Long> {
      Optional - orElseGet

내일 할일

  • HTTP 강의 완강
  • 지피티로 플러터 앞단 만들기
반응형

자료구조 란?

배열과 같이 여러 데이터(자료)를 구조화해서 다루는 것을 자료 구조라 한다.

리스트 자료구조 란?

순서가 있고, 중복을 허용하는 자료 구조를 리스트(List)라 한다.

 

ArrayList

출처 : medium

동적배열을 사용하여 데이터를 저장하는 리스트 형태의 자료구조

 

내부구조 : ArrayList는 내부적으로 배열을 사용해서 데이터를 저장한다. 초기 크기를 설정할수 있지만 데이터가 추가되면 크키가 자동으로 증가된다.

 

특징

https://poiemaweb.com/js-array-is-not-arrray

 - 인덱스를 통한 접근 속도 : 내부적으로 배열으로 되어 있기 때문에 인덱스를 통해 데이터를 접근하기 때문에 굉장히 빠르다.O(1)

- 삽입/삭제 속도 : 배열의 특정 위치에 삽입하거나 삭제하려면 해당 위치 요소를 다 이동해야 하므로 성능이 떨어진다. O(n)

- 메모리 사용효율 : 배열은 메모리가 할당될때 연속적으로 할당되므로 LinkedList보다 메모리 사용이 효율적이다.

 

LinkedList

노드를 사용해서 데이터를 저장하는 리스트 자료구조

 

public class Node {

  Object item;
  Node next;

  public Node(Object item){
    this.item = item;
  }
}

public class MyLinkedListV3<E> {

  private Node<E> first;
  private int size = 0;

...
}

내부구조 : LinkedList 는 내부적으로 노드들로 이어져 있다. 노드는 데이터와 다음, 이전 노드를 가리키는 참조로 되어 있다.

 

특징

 - 삽입/삭제 속도 : 리스트의 처음이나 중간에 데이터를 삽입하거나 삭제하는 경우, 노드의 이전 이후 참조만 변경하면 되므로 빠르다 O(1)

- 인덱스를 통한 접근 속도 : 인덱스를 통해 접근하려면 첫 노드부터 순차적으로 탐색 해야하므로 속도가 느리다. O(n)

- 메모리 사용 효율 : 각 노드가 데이터와 두개의 참조(다음,이전)을 가지고 있기 때문에, ArrayList 보다 메모리를 더 많이 사용한다.

 

 

ArrayList vs LinkedList 성능 비교

package collection.list;

public class MyListPerformanceTest {

  public static void main(String[] args) {
    int size = 50_000;
    System.out.println("== MyArrayList 추가 ==");	// 크기만큼 데이터 추가
    addFirst(new MyArrayList<>(),size);
    addMid(new MyArrayList<>(),size);
    MyArrayList<Integer> arrayList = new MyArrayList<>();
    addLast(arrayList,size); 

    System.out.println("== MyLinkedList 추가 ==");
    addFirst(new MyLinkedList<>(),size);
    addMid(new MyLinkedList<>(),size);
    MyLinkedList<Integer> linkedList = new MyLinkedList<>();
    addLast(linkedList,size);

    int loop = 10000;
    System.out.println("==MyArrayList 조회=="); // 루프만큼 인덱스로 조회
    getIndex(arrayList, loop, 0);
    getIndex(arrayList, loop, size / 2);
    getIndex(arrayList, loop, size - 1);
    System.out.println("==MyLinkedList 조회==");
    getIndex(linkedList, loop, 0);
    getIndex(linkedList, loop, size / 2);
    getIndex(linkedList, loop, size - 1);
    System.out.println("==MyArrayList 검색==");
    search(arrayList, loop, 0);
    search(arrayList, loop, size / 2);
    search(arrayList, loop, size - 1);
    System.out.println("==MyLinkedList 검색==");
    search(linkedList, loop, 0);
    search(linkedList, loop, size / 2);
    search(linkedList, loop, size - 1);
  }

  private static void addFirst(MyList<Integer> list, int size){
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < size; i++) {
      list.add(0,i);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("앞에 추가 - 크기: " + size + ", 계산 시간: " + (endTime - startTime) + "ms");
  }
  
  private static void addMid(MyList<Integer>list, int size){
    long startTime = System.currentTimeMillis();
    for (int i = 0; i <size ; i++) {
      list.add(i/2,i);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("평균 추가 - 크기: " + size + ", 계산 시간: " + (endTime - startTime) + "ms");
  }

  private static void addLast(MyList<Integer>list, int size){
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < size ; i++) {
      list.add(i);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("뒤에 추가 - 크기: " + size + ", 계산 시간: " + (endTime - startTime) + "ms");
  }

  private static void getIndex(MyList<Integer> list, int loop, int index){
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
      list.get(index);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("index: " + index + ", 반복: " + loop + ", 계산 시간: " + (endTime - startTime) + "ms");
  }

  private static void search(MyList<Integer> list, int loop ,int findValue){
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
      list.indexOf(findValue);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("findValue: " + findValue + ", 반복: " + loop + ", 계산 시간: " + (endTime - startTime) + "ms");
  }
}

 

== MyArrayList 추가 ==
앞에 추가 - 크기: 50000, 계산 시간: 2051ms
평균 추가 - 크기: 50000, 계산 시간: 1018ms
뒤에 추가 - 크기: 50000, 계산 시간: 3ms
== MyLinkedList 추가 ==
앞에 추가 - 크기: 50000, 계산 시간: 4ms
평균 추가 - 크기: 50000, 계산 시간: 1316ms
뒤에 추가 - 크기: 50000, 계산 시간: 1626ms
==MyArrayList 조회==
index: 0, 반복: 10000, 계산 시간: 0ms
index: 25000, 반복: 10000, 계산 시간: 1ms
index: 49999, 반복: 10000, 계산 시간: 0ms
==MyLinkedList 조회==
index: 0, 반복: 10000, 계산 시간: 0ms
index: 25000, 반복: 10000, 계산 시간: 313ms
index: 49999, 반복: 10000, 계산 시간: 624ms
==MyArrayList 검색==
findValue: 0, 반복: 10000, 계산 시간: 1ms
findValue: 25000, 반복: 10000, 계산 시간: 123ms
findValue: 49999, 반복: 10000, 계산 시간: 231ms
==MyLinkedList 검색==
findValue: 0, 반복: 10000, 계산 시간: 1ms
findValue: 25000, 반복: 10000, 계산 시간: 447ms
findValue: 49999, 반복: 10000, 계산 시간: 904ms

 

위에서 구현한 배열리스트와 연결리스트 성능

기능 배열 리스트  연결 리스트
앞에 데이터 추가(삭제) O(n) - 2051ms (크기만큼 뒤로 밈) O(1) - 4ms (first정보가 있음)
평균 데이터 추가(삭제) O(n) - 1018ms (인덱스로 한번에 찾지만 데이터를 뒤로 밈) O(n) - 1316ms(루프만큼 돌아서 인덱스를 찾음)
뒤에 데이터 추가(삭제) O(1) - 3ms (인덱스로 한번에 찾고 뒤로 밀 데이터 없음) O(n) - 1626ms (루프만큼 돌아서 인덱스를 찾음)
인덱스 조회 O(1) - 1ms (내부가 배열로 되어 있음 한버넹 찾음) O(n) - (평균) 313ms
검색 O(n) - (평균) 123ms O(n) - (평균) 447ms

 

자바에서 제공하는 배열리스트와 연결리스트 성능 비교

(※자바에서 제공하는 연결리스트는 이중연결리스트이다.)

(왼) 자바 제공 (오) 구현한 연결리스트

 

기능 배열 리스트  연결 리스트
앞에 데이터 추가(삭제) O(n) - 106ms O(1) - 2ms
평균 데이터 추가(삭제) O(n) - 49ms O(n) - 1116ms
뒤에 데이터 추가(삭제) O(1) - 1ms O(n) - 2ms
인덱스 조회 O(1) - 1ms O(n) - (평균) 312ms
검색 O(n) - (평균) 104ms O(n) - (평균) 427ms

 

실제 성능

- 이론적으로 LinkedList의 중간 삽입 연산은 ArrayList보다 빠를 수 있다.(왜냐면 순차로 찾아서 중간에 싸악 삽입 또는 삭제해주면 되니깐 ArraylList는 뒤로 데이터를 다 밀어줘야해서 더 늦다.) 그러나 실제적 접근 속도, 메모리 할당 및 해체 비용, cpu  캐시 활용도 등 다양한 요소에 의해 영향 받는다.

 

추가로 'ArrayList' 는 데이터를 한 칸씩 직접 이동하지 않고, 대신에 메모리 고속 복사(자바에서 System.arrayCopy)를 사용한다.


'ArrayList' 는 요소들이 메모리 상에서 연속적으로 위치하여 CPU 캐시 효율이 좋고, 메모리 접근 속도가 빠르다.


반면, 'LinkedList' 는 각 요소가 별도의 객체로 존재하고 다음 요소의 참조를 저장하기 때문에 CPU 캐시 효율
이 떨어지고, 메모리 접근 속도가 상대적으로 느려질 수 있다

 

정리하면 이론적으로 'LinkedList' 가 중간 삽입에 있어 더 효율적일 수 있지만, 현대 컴퓨터 시스템의 메모리 접근 패
턴, CPU 캐시 최적화, 메모리 고속 복사 등을 고려할 때 'ArrayList'가 실제 사용 환경에서 더 나은 성능을 보여주는
경우가 많다.

 

배열 리스트 vs 연결 리스트

대부분의 경우 배열 리스트가 성능상 유리하다. 이런 이유로 실무에서는 주로 배열 리스트를 기본으로 사용한다.
만약 데이터를 앞쪽에서 자주 추가하거나 삭제할 일이 있다면 연결 리스트를 고려하자.

 

참고

김영한의 실전자바 - 중급2편

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-2/dashboard

 

김영한의 실전 자바 - 중급 2편 강의 | 김영한 - 인프런

김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전

www.inflearn.com

 

반응형

+ Recent posts