각 문자를 가지고 만들 수 있는 모든 부분집합을 리턴하라.
public ArrayList<String> powerSet(String str) {
ArrayList<String> result = new ArrayList<>();
String deduplication = "";
char[] chars = str.toCharArray();
Arrays.sort(chars);
String str2 = new String(chars); // 문자열 정렬
for (int i = 0; i < str2.length(); i++) { // 중복 제거
if(str2.indexOf(str2.charAt(i)) == i) deduplication += str2.charAt(i);
}
result=pSet(result, deduplication);
result.add("");
Collections.sort(result);
return result;
}
public ArrayList<String> pSet(ArrayList<String> list, String str){
if(str.length()==1) {
list.add(str.charAt(0)+"");
return list;
}
list.addAll(pSet(list, str.substring(1,str.length())));
for(int i=1; i<list.size()/2+1; i++) {
list.set(i, str.charAt(0)+list.get(i));
System.out.println(Arrays.toString(list.toArray()));
}
list.add(str.charAt(0)+"");
return list;
}
모든테스트 통과
트랜잭션(Transaction)
- 전부 성공하든가 전부 실패하든가(All or Nothing)하게 만드는 것
- 여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위를 의미
ACID 원칙
- 원자성(Atomicity)
- 작업을 더이상 쪼갤 수 없음을 의미
- 일관성(Consistency)
- 일관성있게 저장되거나 변경되는 것을 의미
- 격리성(Isolation)
- 여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함을 의미
- 지속성(Durability)
- 트랜잭션이 완료되면 그 결과는 지속되어야 한다는 의미
커밋(commit)
롤백(rollback)
Spring에서 선언형 방식으로 트랜잭션을 적용하는 2가지 방법
@Transactional
애너테이션을 클래스 레벨에 추가하면 기본적으로 해당 클래스에서 이용하는 모든 메서드에 트랜잭션이 적용된다.
또한 RuntimeException
이 발생하면 rollback도 해준다.
but Exception, SQLException, DataFormatException 같은 체크 예외(checked exeption)는 @Transactional
애너테이션만 추가해서는 rollback이 되지 않는다.
@Transactional(rollbackFor = {SQLException.class, DataFormatException.class})
위와 같이 해당 체크 예외를 직접 지정해주거나 언체크 예외(unchecked exception)로 감싸서 rollback이 동작하도록 할 수 있다.
@Transactional(readOnly = true)
- 말 그대로 읽기전용으로 만들어 commit 절차를 진행하기는 하지만 JPA 내부적으로 영속성 컨텍스트를 flush하지 않도록 하는 방법
- 읽기용으로만 쓰도록 성능 최적화 하는 용도로 사용
(불필요한 동작 안하게 만들어 줌)
플러시(flush)란?
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미
클래스 레벨에만 @Transactional
이 적용된 경우
@Transactional
애너테이션이 메서드에 일괄 적용클래스 레벨과 메서드 레벨에 함께 적용된 경우
즉, 메서드마다 @Transactional(특성)
특성(Attribute)을 다르게 할 수 있는 것이다.
트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식을 의미
트랜잭션 전파는 propagation 애트리뷰트를 통해서 설정할 수 있다.
Propagation.REQUIRED
Propagation.REQUIRES_NEW
Propagation.MANDATORY
Propagation.NOT_SUPPORTED
Propagation.NEVER
@Transactional
애너테이션의 isolation
애트리뷰트
=> 독립적으로 실행되어야 하는 격리성을 조정할 수 있는 옵션
Isolation.DEFAULT
Isolation.READ_UNCOMMITTED
Isolation.READ_COMMITTED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
트랜잭션의 격리 레벨은 일반적으로 데이터베이스나 데이터소스에 설정된 격리 레벨을 따르는 것을 권장한다.
proxy
InvocationHandler