전체 글
-
트랜잭션(Transaction)BackEnd/Spring DB 2023. 1. 27. 07:00
트랜잭션 ACID 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 실패해야 한다. 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation level)을 선택할 수 있다. 지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 트랜잭션 격리 수준(Isolation level) READ UNCOMMITED(커밋되지 않은 읽기) READ COMMITTED(커밋된 읽기) REPEATABLE READ(반복..
-
커넥션 풀(Connection Pool) & 데이터 소스(DataSource)BackEnd/Spring DB 2023. 1. 26. 05:00
데이터베이스 커넥션 획득 과정 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. Connection Pool 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 소모되는 일입니다. 이런 문제를 해결하기 위해 커넥션 풀(커넥션을 관리하는 풀)을 사용합니다. ..
-
JDBCBackEnd/Spring DB 2023. 1. 25. 22:00
Overview 해당 카테고리에 있는 내용은 인프런-스프링 DB 1편, 스프링 DB 2편 강의를 듣고 정리한 글입니다. JDBC 등장 이유 클라이언트는 애플리케이션 서버를 통해 데이터베이스에 접근하며, 커넥션을 연결하고 SQL을 전달하여 결과를 응답받습니다. 문제는 MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, Oracle Database 등 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 결과를 응답 받는 방법이 모두 다르다는 점입니다. 데이터베이스 변경 시 개발자는 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 그리고 결과를 응답 받는 방법을 새로 학습해야 하며, 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 ..
-
Item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라Book/Effective Java 3E 2022. 12. 29. 21:00
모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공합니다. 다음 코드는 합주단의 종류를 연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 열거 타입입니다. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } 동작은 하지만 유지보수하기가 끔찍한 코드입니다. 상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없습니다. ..
-
Item 34. int 상수 대신 열거 타입을 사용하라Book/Effective Java 3E 2022. 12. 28. 23:20
열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입입니다. 사계절, 태양계의 행성, 카드게임의 카드 종류 등이 좋은 예입니다. 자바에서 열거 타입을 지원하기 전에는 다음 코드처럼 정수 열거 패턴을 사용했습니다. // 코드 34-1 정수 열거 패턴 - 상당히 취약하다! public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; 정수 열거 패턴(int enum pattern) 기법은 타입 안전을 보장할 방법이 없으며 표현력도 좋지 않습니다. 또한 상수의 값이 바뀌면 클라이언트도 반드시 다시 컴파일해야 합니..
-
Item 33. 타입 안전 이종 컨테이너를 고려하라Book/Effective Java 3E 2022. 12. 23. 21:00
Set에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map에는 키와 값의 타입을 뜻하는 2개만 필요합니다. 데이터베이스의 경우에는 행(row)에 해당하는 임의 개수의 열(column)이 필요합니다. 이런 경우, 키를 매개변수화한 다음 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하면 됩니다. 이러한 설계 방식을 타입 안전 이종 컨테이너 패턴(type safe heterogeneous container pattern)이라 합니다. 다음은 간단한 예로 타입별로 즐겨 찾는 인스턴스를 저장하고 검색할 수 있는 Favorites 클래스입니다. 각 타입의 Class 객체를 매개변수화한 키 역할로 사용합니다. package effectivejava.chapter5.item33; im..
-
Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라Book/Effective Java 3E 2022. 12. 20. 06:00
가변인수(varargs)는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 구현 방식에 허점이 있습니다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼습니다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생합니다. 다음 메서드에서는 형변환하는 곳이 보이지 않는데도 인수를 건네 호출하면 ClassCastException이 발생합니다. 컴파일러가 생성한 (보이지 않는) 형변환이 숨어 있기 때문입니다. 이처럼 타입 안전성이 깨지니 제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않습니다. package ..
-
Item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라Book/Effective Java 3E 2022. 11. 19. 10:15
Item 29의 Stack 클래스에 일련의 원소를 스택에 넣는 pushAll 메서드와 짝을 이루는 popAll 메서드를 추가해야 한다고 해봅시다. package effectivejava.chapter5.item31; import java.util.*; // 와일드카드 타입을 이용해 대량 작업을 수행하는 메서드를 포함한 제네릭 스택 public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; // 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안..