- Properties
- map과 비슷한 구조.
- 값을 가져오는 함수를 getProperty와 get의 두 가지를 제공한다.
- getProperty는 String을 반환, get은 Object를 반환 - 제네릭이 없었을 때에는 Object를 받아올 수밖에 없었는데 일반적으로 받아서 쓰는 값이 String이었기 때문에 사용자의 형변환을 피하기 위해 getProperty를 따로 제공했음.
- Reader와 InputStream의 차이
- 인코딩 문제의 차이. 인코딩 문제를 해결하기 위해서 Reader, Writer를 만들었다. Reader는 인코딩 정보를 들고있어야 한다.
- JDBC - 각 데이터들에 대한 접근 표준 인터페이스
- java.sql.driver 인터페이스를 com.mysql.jdbc.driver 클래스로 구현, java.sql.connection 인터페이스를 com.mysql.jdbc.connection 클래스로 구현
- driver에서 connection을 얻어오는 부분에 대해서는 abstract factory가 사용됨 - 추상타입으로부터 추상타입을 만든다.
java.sql.Driver driver = new com.mysql.jdbc.Driver();
java.sql.Connection conn = driver.connect("", null); // 구현체 중 com.mysql.jdbc.connection을 반환.
//추상타입 객체인 driver로부터 추상타입 객체인 conn 생성
- abstract factory를 잘 쓰기 위해서는 인터페이스에 api가 잘 설계되어 있어야 한다.
- Statement, ResultSet에 대해서도 마찬가지로 인터페이스를 이용한 abstract factory가 사용됨.
- driver의 설정에서 new com.mysql.jdbc.Driver(); 대신 볼 수 있는 Class.forName("com.mysql.jdbc.Driver"); 이러한 코드는 컴파일 타임 종속성을 런타임 종속성으로 바꾼 것이다.
Driver driver = new com.mysql.jdbc.Driver(); // 처럼 직접 구체클래스로 new를 하는 대신
Class<Driver> clazz = (Class<Driver>) Class.forName("com.mysql.jdbc.Driver");
Driver driver = clazz.newInstance(); // 같은 방법으로 런타임 종속성으로 바꿀 수 있음.
- 예외상황을 런타임으로 밀어낸 것이기 때문에 에러에 대해서는 더 위험해질 수도 있다.
- factory method 패턴 사용 - factory를 숨겨주는 메소드. 뭘 만들지를 인자만 가지고 결정하는 함수. 위에서는 인자로 주는 문자열에 따라("com.mysql.jdbc.Driver") 무엇을 만들어줄지가 결정된다.
- DriverManager 클래스를 사용하면 직접 driver를 가져와서 connection을 얻어오지 않아도 바로 connection을 얻어올 수 있다. 이렇게 추상화를 해준 것이 DataSource 클래스.
- sqlite
- 기존의 dbms와 다르게 dbms가 각 어플리케이션 내부에 들어가서 동작하는 것.
- 분산환경의 경우 os단에서 상호배제를 해주지 못하기 때문에 동시성 제어에 문제가 있을 수 있다. 따라서 분산환경에서의 사용은 좋지 못하다.