[F-lab 모각코 챌린지 46일차]TIL

JeongheeKim·2023년 7월 16일

TIL

목록 보기
46/66

학습계획


  • 커넥션 풀, 서블릿, 필터
  • ThreadLocal은 왜 private static final로 선언할까?
  • mysql의 date, timestamp, datetime차이

Today I Learned


자바에서는 JDBC API를 통해 데이터베이스 프로그래밍을 한다.

커넥션 풀

DB와 연결된 커넥션을 미리 만들어서 pool에 저장해 두고 있다가 필요할때 커넥션 풀에서 가져다 쓰고 connection pool에 반환하는 기법

  • pool에 커넥션이 미리 생성되어 있기 때문에 커넥션 생성시 드는 연결 시간을 줄일 수 있다.
  • 커넥션을 계속 재사용하기 때문에 생성되는 커넥션 수가 일정하게 유지된다.

서블릿

서블릿을 이용하여 자바 클래스를 이용해서 웹 어플리케이션을 개발할 수 있다.

서블릿 클래스를 구현하기 위해 HttpServlet을 상속받아야한다.

MVC패턴

model : 비즈니스 영역의 로직 처리

view : 비즈니스 영역에 대한 화면 담당

controller : 사용자 입력과 처리에 대한 흐름 담당

필터

HTTP요청과 응답을 변경할 수 있는 재사용 가능한 클래스

클라이언트에서 오는 request와 servlet사이에 위치하여 클라이언트 정보를 변경할 수 있다. 또한 response를 결과에 맞게 변경하기도 한다. 여러개의 필터를 적용할 수 도있어 filter chain형식이 되기도 한다.

필터의 사용예시

  • 사용자 인증
  • 캐싱필터
  • 자원 접근에 대한 로깅
  • 응답 데이터 변환(응답 헤더 변환, 데이터 암호화등)
  • 공통기능 실행

https://javacan.tistory.com/entry/58

ServletContextListener

웹 컨테이너는 웹 어플리케이션(컨텍스트)이 시작되거나 종료되는 시점에 특정 클래스의 메서드를 실행할 수 있는 기능 제공

이 기능을 사용하면 웹 어플리케이션을 실행할 때 필요한 초기화 작업이나 웹 어플리케이션이 종료된 후 사용된 자원을 반환하는 작업을 수행할 수 있다.


클래스 생성 시의 실행 블록, static 블록

클래스의 static 블록이 실행되고 있을때는 해당 클래스의 객체는 하나도 존재하지 않기 때문에 static블록에서는 객체 멤버에 접근할 수 없다.

예)Junit의 @BeforeClass

❓클래스들의 정보를 바로 static영역에 로딩하지 않고 해당 클래스가 처음 사용될때 로딩할까?

메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는것이 정석

static 영역에 로딩되면 한번 올라간 프로그램은 GC대상이 되지 않기 때문에 최대한 로딩 시간을 미룬것

  • final 키워드

클래스 상속을 허락하지 않음

변수 변경 불가능한 상수

메서드 오버 라이딩 금지

  • package키워드

네임스페이스를 만드는 역할

  • interface

interface의 구성요소는 추상메소드, public 정적 상수인데 public, abstract를 붙이지 않아도 컴파일 시 자동으로 붙여준다.

  • this

객체변수와 같은 이름의 지역변수가 있는 경우 객체 변수를 사용하려면 this를 붙인다.

super

상속받은 상위 클래스으 인스턴스 지칭


❓ThreadLocal은 왜 private static final로 선언할까?

ThreadLocal은 메모리 낭비를 방지하기 위해 static 영역에 저장되어야한다. 만약 static 영역에 저장되지 않는다면 M*N 개수의 ThreadLocal 인스턴스의 메모리 공간이 생기게 된다.

- M
    
    스레드 개수, 스레드마다 stack영역이 생성되어 static으로 선언하지 않으면 thread 마다 ThreadLocal변수가 생성된다.
    
- N
    
    ThreadLocal을 포함한 클래스의 인스턴스 개수
    

💡 메모리 누수
자바 어플리케이션에서 사용하지도 않음에도 GC대상이 되지 않아 메모리를 계속 낭비하는것

  • mysql 8.0.19버전 이후 부터 DATETIME, DATETIME 에 timezone 설정 가능
    INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'),
        ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
DATEDATETIMETIMESTAMP
YYYY-MM-DDYYYY-MM-DD hh:mm:ssYYYY-MM-DD hh:mm:ss[.fraction]
date의 영역만 제공date, time 영역 제공date, time 영역 제공
1000-01-01 ~ 9999-12-311000-01-01 00:00:00 ~ 9999-12-31 23:59:591970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
데이터 저장 시 서버시간을 UTC 시간으로 저장 후, 꺼낼때 timezone시간에 맞춰서 변환한다.

❓ timestamp는 왜 2038년도까지 밖에 제공하지 않고 datetime은 9999-12-31까지 사용할 수 있나?

  • year 2038 problem 모든 컴퓨터에서는 시간 측정을 위해 UNIX time 체계를 사용한다. UNIX time 체계는 32비트 Integer 단위의 변수를 사용하고 초당 1씩 증가하도록 데이터를 처리한다. Integer의 최대범위를 넘어가면 더이상 증가할 수 없어 컴퓨터에서는 오버플로우가 발생했다고 판단하여 변수를 초기화 한다. 이러한 이유로 32비트 UNIX time 체계에서는 2038-01-19 03:14:07 까지만 데이터 처리가 가능하다. 64비트로 다 바꾸면 되지 않을까 생각하지만, 시간을 표현하는 변수의 형식을 그냥 막 바꿔버리면 기존 구현한 레거시 시스템과의 호환성이 문제가 될 수 있다.

0개의 댓글