트랜잭션 - 비즈니스로직에서 쪼개질 수 없는 하나의 단위작업 - 한 번에 이루어지는 작업의 단위 - 알아두면 좋은 ACID 원칙 원자성(Atomicity) 하나의 트랜잭션은 모두 하나의 단위로 처리해야 한다. A와 B 작업이 하나의 트랜잭션으로 묶여있는 경우 A는 성공, B는 실패할 경우 해당 작업단위는 실패로 끝나야한다. 즉, A,B 모두 rollback 되어야 한다는 원칙 일관성(Consistency) 트랜잭션이 성공했다면 데이터베이스의 모든 데이터는 일관성을 유지해야한다. 격리성(Isolation) 트랜잭션으로 처리되는 중간에 외부에서의 간섭은 없어야한다. 영속성(Durability) 트랜잭션이 성공적으로 처리되면, 그 결과는 영속적으로 보관되어야 한다. 실습했던 내용 - pom.xml 에 라이브러..
블로킹 방식의 작업완료 통보 - submit() 메소드 이용. 매개값으로 받은 작업객체(Runnable, Callable)를 스레드풀에 저장하고 즉시 Future객체를 반환. - Future 객체는 작업결과가 아니라 작업이 완료되기까지 기다렸다가(지연되었다가 == 블로킹되다) 최종결과를 얻었을 때 사용된다. - 따라서 Future 객체를 지연객체라고도 부른다. - Future 객체의 get() 메소드는 작업이 완료될때까지 블로킹되었다가 처리결과를 리턴한다. - get()메소드의 리턴타입은 submit() 메소드의 두번째 인자의 타입과 같다. 리턴값이 없는 작업 완료 통보 - Runnable 객체로 생성. - 작업처리가 정상적으로 완료되면 Future 객체의 get() 메소드는 null을 반환. - 작업도..
스레드풀 - 병렬작업 처리가 많아지면 스레드 개수 증가 -> 스레드 생성 및 스케쥴링을 CPU가 바빠져서 메모리 많이 사용 - 결국 성능저하. - 갑작스런 병렬 작업처리가 많아질 때 스레드풀을 이용. - 스레드를 제한된 개수만큼 정해놓고 작업큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아서 처리. - 스레드풀 생성/사용을 위해 Executors 클래스와 ExecutorService 인터페이스를 제공. - Executors의 다양한 정적메소드로 ExecutorService의 구현객체를 만들 수 있는데 이것이 바로 스레드풀. 스레드풀 생성 Executors 클래스 - newCachedThreadPool() - newFixedThreadPool() ExecutorService executorServi..
Thread Group - 관련된 스레드를 묶어서 관리할 목적으로 사용. - JVM이 실행될때 - system 스레드 그룹을 만듬 - JVM 운영에 필요한 스레드들을 생성 - system 스레드 그룹에 포함시킴 스레드 그룹 이름 얻기 ThreadGroup group = Thread.currentThread().getThreadGroup(); String groupName = group.getName(); 스레드 그룹 예제 public static void main(String[] args) { ThreadGroup group = Thread.currentThread().getThreadGroup(); //System.out.println(group.getName()); AutoSaveThread auto..
우리는 흔히 insert 작업을 할때 (Oracle 기준입니다.) insert into tbl_board(bno, title, content, writer) values(seq_board.nextval, #{title},#{content},#{writer}) 위와 같이 insert를 할 것이다. bno 컬럼은 sequence 객체의 값이 들어가는 자리로 VO가 있다면 vo에 저장되어 넘어가지 않고 sequence 객체의 nextval 함수를 통해서 실행될 것이다. 그런데 만약, 자동으로 추가된 PK 값을 확인해야 하는 상황이 온다면 어떻게 할까요? - sequence 객체의 currentval 함수를 이용하면 앞으로 들어갈 PK 를 확인할 수 있는데. 임의의 갯수 임의의 번째 실행이라면? 제약사항이 있다..
템플릿 메소드 패턴 - 알고리즘 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하는 패턴 - 구현하려는 기능이 일정한 프로세스가 존재한다. - 구현하려는 기능이 사용하는 알고리즘이 추후 변경가능성이 있다. 템플릿 메소드 패턴을 위한 단계 1. 구현하려는 기능의 필요한 여러가지 단계를 확인. 2. 각각의 단계를 메소드로 분리 선언 3. 수행할 템플릿 메소드를 생성. 4. 하위 클래스에서 구현. 예제로 확인 추상 클래스 선언! public abstract class AbstGameConnectHelper { //외부에 노출되면 안됨. //보안과정 protected abstract String doSecurity(String string); //인증과정 protected a..
Adapter 패턴 - 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. - 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 예제 public class Math { //두배 public static double twoTime(double num) {return num*2;} //절반 public static double half(double num) {return num/2;} //강화된 알고리즘으로 빠른 두배 계산. public static Double doubled(Double d) {return d*2;} } - 다음과 같이 이미 구현된 기능이 존재할 때, Math 클래스에 정의된 알고리즘을 이용하여 float 타..
스레드 상태제어 - 실행중인 스레드의 상태를 변경하는 것. - 메소드로 주로 제어 - interrupt(), sleep(), join(), wait(), yield() notify(), notifyAll() 등의 메소드가 존재. - 이중 notify(), notifyAll(), wait() 메소드는 Object 클래스의 메소드이고 나머지는 Thread 클래스의 메소드. 일정시간동안 일시정지 : sleep() - 실행중인 스레드를 일시정지. - 매개값으로 밀리초를 넣어주면 해당 시간동안 sleep() 메소드를 만나는 스레드는 일시정지함. - 일시정지 상태에서 interrupt() 메소드를 호출할 경우 InterruptedException이 발생됨. try{ Thread.sleep(1000); //1초간 일..