자바에서는 JDBC API를 통해 데이터베이스 프로그래밍을 한다.
DB와 연결된 커넥션을 미리 만들어서 pool에 저장해 두고 있다가 필요할때 커넥션 풀에서 가져다 쓰고 connection pool에 반환하는 기법
서블릿을 이용하여 자바 클래스를 이용해서 웹 어플리케이션을 개발할 수 있다.
서블릿 클래스를 구현하기 위해 HttpServlet을 상속받아야한다.
MVC패턴
model : 비즈니스 영역의 로직 처리
view : 비즈니스 영역에 대한 화면 담당
controller : 사용자 입력과 처리에 대한 흐름 담당
HTTP요청과 응답을 변경할 수 있는 재사용 가능한 클래스
클라이언트에서 오는 request와 servlet사이에 위치하여 클라이언트 정보를 변경할 수 있다. 또한 response를 결과에 맞게 변경하기도 한다. 여러개의 필터를 적용할 수 도있어 filter chain형식이 되기도 한다.
필터의 사용예시

https://javacan.tistory.com/entry/58
웹 컨테이너는 웹 어플리케이션(컨텍스트)이 시작되거나 종료되는 시점에 특정 클래스의 메서드를 실행할 수 있는 기능 제공
이 기능을 사용하면 웹 어플리케이션을 실행할 때 필요한 초기화 작업이나 웹 어플리케이션이 종료된 후 사용된 자원을 반환하는 작업을 수행할 수 있다.
클래스 생성 시의 실행 블록, static 블록
클래스의 static 블록이 실행되고 있을때는 해당 클래스의 객체는 하나도 존재하지 않기 때문에 static블록에서는 객체 멤버에 접근할 수 없다.
예)Junit의 @BeforeClass
❓클래스들의 정보를 바로 static영역에 로딩하지 않고 해당 클래스가 처음 사용될때 로딩할까?
메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는것이 정석
static 영역에 로딩되면 한번 올라간 프로그램은 GC대상이 되지 않기 때문에 최대한 로딩 시간을 미룬것
클래스 상속을 허락하지 않음
변수 변경 불가능한 상수
메서드 오버 라이딩 금지
네임스페이스를 만드는 역할
interface의 구성요소는 추상메소드, public 정적 상수인데 public, abstract를 붙이지 않아도 컴파일 시 자동으로 붙여준다.
객체변수와 같은 이름의 지역변수가 있는 경우 객체 변수를 사용하려면 this를 붙인다.
super
상속받은 상위 클래스으 인스턴스 지칭
ThreadLocal은 메모리 낭비를 방지하기 위해 static 영역에 저장되어야한다. 만약 static 영역에 저장되지 않는다면 M*N 개수의 ThreadLocal 인스턴스의 메모리 공간이 생기게 된다.
- M
스레드 개수, 스레드마다 stack영역이 생성되어 static으로 선언하지 않으면 thread 마다 ThreadLocal변수가 생성된다.
- N
ThreadLocal을 포함한 클래스의 인스턴스 개수
💡 메모리 누수
자바 어플리케이션에서 사용하지도 않음에도 GC대상이 되지 않아 메모리를 계속 낭비하는것
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');| DATE | DATETIME | TIMESTAMP |
|---|---|---|
| YYYY-MM-DD | YYYY-MM-DD hh:mm:ss | YYYY-MM-DD hh:mm:ss[.fraction] |
| date의 영역만 제공 | date, time 영역 제공 | date, time 영역 제공 |
| 1000-01-01 ~ 9999-12-31 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
| 데이터 저장 시 서버시간을 UTC 시간으로 저장 후, 꺼낼때 timezone시간에 맞춰서 변환한다. |
❓ timestamp는 왜 2038년도까지 밖에 제공하지 않고 datetime은 9999-12-31까지 사용할 수 있나?
2038-01-19 03:14:07 까지만 데이터 처리가 가능하다. 64비트로 다 바꾸면 되지 않을까 생각하지만, 시간을 표현하는 변수의 형식을 그냥 막 바꿔버리면 기존 구현한 레거시 시스템과의 호환성이 문제가 될 수 있다.