전체 글 24

트랜잭션

트랜잭션? 여러 쿼리를 논리적으로 하나의 작업으로 묶어주는 것 계좌 이체를 예로 들어보자, A 계좌에서 B 계좌로 이체를 하려고 할 때 A 계좌에서 만원을 출금하고 B 계좌에 입금하기 전에 에러가 났을 때의 상황을 어떻게 처리할 것인가? 위의 계좌이체 작업은 두 가지 작업으로 이뤄진다. A 계좌에서 만원을 출금하고, DB에 반영 B 계좌에 만원을 입금하고, DB에 반영 위 두 가지 작업이 모두 정상적으로 처리되어야 계좌이체 작업이 완료되었다고 할 수 있다. 다시 말해서 하나의 작업만 완료되고 하나의 작업이 실패하면 계좌 이체 작업에 논리적으로 오류가 있다. 두 작업 모두 성공하거나, 아무일도 일어나지 않아야 한다. (A 계좌에서 만원을 출금한 일도 일어나지 않아야 한다) 이렇게 작업이 모두 성공할 때만 ..

자바 & 스프링 2021.12.20

java - String, StringBuilder, StringBuffer

String, StringBuilder, StringBuffer는 자바에서 문자열을 다루는 대표적인 클래스이다. String Java에서 String 객체를 생성하는 방법은 2가지가 있는데 하나는 "" 큰 따옴표를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다. String은 new를 쓰지 않고 객체를 생성할 수 있는 특이한 클래스이다. 이 두 가지 방법의 객체 할당 방식에는 차이가 있다. String str1 = "abcde"; String str2 = "abcde"; String str3 = new String("abcde"); String str4 = new String("abcde"); System.out.println(str1 == str2); // true System.out.pr..

자바 & 스프링 2021.12.08

JDBC Connection pool은 왜 필요할까?

JDBC란? Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 때 사용하는 API DBMS 종류(MySql, MsSql, Oracle…)에 상관없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리할 수 있다. JDBC 드라이버: 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터 JDBC 실행순서: 1. JDBC 드라이버 로드 2. Connection 객체 생성 3. Statement 객체 생성 4. Query 실행 5. Result 객체로부터 데이터 추출 6. Result 객체 Close 7. Statement 객체 Close 8. Connection 객체 Close 비용 이슈 DB와의 연결은 ..

자바 & 스프링 2021.12.01

java의 싱글톤

소개 싱글톤(singleton) 패턴은 인스턴스를 오직 한개만 제공하는 클래스이다. 시스템 런타임, 환경 세팅에 대한 정보 등, Connection pool 등 인스턴스가 여러개 일 때 문제가 생길 수 있는 경우가 있다. 인스턴스를 오직 한개만 만들어 제공하는 클래스가 필요하다. 구현 방법 1 public class Settings { // 싱글턴은 static instance를 가지고 있다 private static Settings instance; // 외부에서 인스턴스 생성을 못하도록 생성자를 private private Settings() {} // static method로 인스턴스를 가져온다 // 최초에 instance가 null이면 객체를 생성해서 가지고 있는다 public static Se..

자바 & 스프링 2021.12.01

PreparedStatement 쿼리를 사용하는 이유

값 변환을 자동으로 하기 위해 간결한 코드를 위해 Statement Statement 객체는 Connection 클래스의 createStatement() 메소드를 호출함으로써 얻어진다. Statement 객체를 생성하면 Statement 객체의 executeQuery() 메소드를 호출하여 SQL 쿼리를 실행시킬 수 있다. DB가 하나의 statement를 받을 때 DB 엔진은 제일 먼저 문장을 parse 시키고 잘못된 문법을 검사한다. 그 후 DB는 statement를 실행하기 위한 가장 효율적인 방법을 탐색한다. 이때 계산상 아주 큰 비용이 들 수 있다. DB는 어떤 인덱스를 쓸 것인지, 혹은 테이블에 있는 모든 row를 다 읽어야 하는 지를 확인한다. 일단 쿼리 플랜 (query plan)이 이루어지..

자바 & 스프링 2021.11.30

JPA allocationSize default 값이 50인 이유

JPA 기본 키 생성 전략은 4가지이다. IDENTITY: 기본 키 생성을 데이터베이스에 위임한다 (MYSQL) SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다 (ORACLE, H2) - @SequenceGenerator 필요 TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용가능 - @TableGenerator 필요 AUTO: 방언에 따라 자동 지정, 기본값 위의 네 가지 방법 중 SEQUENCE 전략과 TABLE 전략을 사용할 때 Generator 속성에 allocationSize라는 속성이 있다. 이 속성의 default 값은 50이다. allocationSize: 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨, 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 ..

자바 & 스프링 2021.11.30

java - thread 동기화

멀티쓰레드 프로그래밍을 하다보면 스레드를 동기화 해주어야 한다. 쓰레드를 동기화 하는 이유는 여러 개의 쓰레드가 같은 프로세스 내의 자원을 공유하면서 작업하는 경우에 서로의 작업이 다른 작업에 영향을 주기 때문이다. 쓰레드의 동기화를 위해서 임계영역(critical section)과 잠금(lock)을 사용한다. 임계영역을 지정하고, 임계영역이 가지고 있는 lock을 단 하나의 스레드에게 빌려주는 개념이다. lock은 단 하나의 스레드만이 가질 수 있고, 임계영역 내에서 수행할 코드를 수행한 이후에는 lock을 반납하여야한다. 스레드를 동기화하는 방법들 임계영역(critical section): 공유 자원에 대해 단 하나의 스레드만 접근하도록 한다. (하나의 프로세스에 속한 스레드만 가능하다) 뮤텍스(mu..

자바 & 스프링 2021.11.30

java - Stream

자바의 스트림은 뭔가 연속된 정보 를 처리하는 데 사용한다. 가장 기본적인 것은 배열이고, 컬렉션이다. 컬렉션에는 스트림을 사용할 수 있지만, 배열은 사용할 수 없다. Integer[] values = { 1, 3, 5 }; List list = new ArrayList(Arrays.asList(values)); stream을 이용하면 Integer[] values = { 1, 3, 5 }; List list = Arrays.stream(values).collect(Collectors.toList()); 스트림에서 제공하는 연산의 종류 filter(pred): 데이터를 조건으로 거를 때 사용 map(mapper): 데이터를 특정 데이터로 변환 forEach(block): for 루프를 수행하는 것처럼 각..

자바 & 스프링 2021.11.30

Java 8 Lambda — 2

자바의 신 2를 정리했습니다. java.util.functional 패키지 java 8에서 제공하는 주요 Functional 인터페이스는 다음과 같이 있다. Predicate Supplier Consumer Function UnaryOperator BinaryOperator Predicate test()라는 메소드가 있으며, 두 개의 객체를 비교할 때 사용하고 boolean을 리턴한다. 추가로 and(), negate(), or() 이라는 default 메소드가 구현되어 있으며, isEqual() 이라는 static 메소드도 존재한다. Supplier get() 메소드가 있으며, 리턴값은 generic으로 선언된 타입을 리턴한다. 다른 인터페이스들과는 다르게 추가적인 메소드는 선언되어 있지 않다. Con..

자바 & 스프링 2021.11.30

Java 8 Lambda — 1

자바의 신 2를 정리했습니다. 익명 클래스는 가독성도 떨어지고 불편하다. 이러한 단점을 보완하기 위해서 람다 표현식이 만들어졌다. 대신, 이 표현식은 인터페이스에 메소드가 하나인 것들만 적용 가능하다. 그래서 람다 표현식은 익명 클래스로 전환이 가능하며, 익명 클래스는 람다 표현식으로 전환이 가능하다. 자바에서 메소드가 하나인 인터페이스 java.lang.Runnable java.util.Comparator java.io.FileFilter java.util.concurrent.Callable java.security.PrivilegedAction java.nio.file.PathMatcher java.lang.reflect.InvocationHandler interface Calculate { int ..

자바 & 스프링 2021.11.30