- 기존에 DB에 저장될 때 PK로 사용됐던 id값의 생성 전략에 관한 내용으로, 실제 프로젝트 초반에 생성전략에 대한 차이로 id값이 다르게 저장되는 경험을 했었다.
- 일단 생성 전략 중 Sequence와 Identity를 주로 사용했었기에 두가지의 포스팅만!
- IDENTITY : 기본키의 생성을 DB에게 위임한다.
-> JPA영속성 컨텍스트에서 객체를 관리하기 위해서는 PK(id)가 필수적으로 있어야한다.
-> 그러나 Auto_Increment는 애플리케이션에서 그 값이 얼마인지 알지 못하기 때문에 Insert문을 날려야 id 값을 알 수 있다.
-> 원래는 save()메서드로 저장을 할 때 트랜잭션이 끝나는 Commit시점전에 flush()가 이뤄지지만,
해당 경우는 DB에서 id값을 받아와야하니, save()메서드를 호출하는 시점에 insert쿼리가 나간다.
- SEQUENCE : DB의 sequence객체를 이용해 유일한 값을 순서대로 생성한다.
이 전략은 sequence를 사용하는 Oracle, DB2,H2등의 DB에서 사용된다.
-> 만약 Sequence객체를 사용하지 않는 DB를 이용할경우 Sequence를 관리할 객체(테이블)을 생성한다.
(jpa ddl auto 설정이 되어 있어야함)
- IDENTITY와 다른점 :
해당 전략은 단순히 sequence값만 시퀀스 객체에서 조회해보면 되기에 엔티이 테이블에 해당 객체를 바로 insert할 필요가 없다.
DFS - 재귀, stack 자료 구조 활용
BFS - Queue 자료 구조 활용
- DFS - 재귀 기본 코드
public class DFS {
static boolean[] visited = new boolean[9];
static int[][] graph = {{}, {2, 3, 8}, {1, 6, 8}, {1, 5}, {5, 7}, {3, 4, 7}, {2}, {4, 5}, {1, 2}};
static StringBuilder sb = new StringBuilder();
public static void dfs(int x) {
visited[x] = true;
sb.append(x).append(" ");
for (int i = 0; i < graph[x].length; i++) {
if (!visited[graph[x][i]]){
dfs(graph[x][i]);
}
}
}
public static void main(String[] args) {
dfs(1);
System.out.println(sb);
}
}
- 처음 1 부터 탐색 -> 방문 true표시 -> 1과 연결된 2,3,8 방문했는지 안했는지 체크 후 방문안했다면 true변경 후 도출 -> 2와 연결된 1,6,8 방문했는지 안했는지 체크 후 방문 안했다면 true변경 후 도출->이하 반복!
- BFS - 큐 사용
public static void bfs() {
Queue<Integer> queue = new LinkedList<Integer>(); ///큐
queue.offer(start); //시작점도 Queue에 넣어야 함
checked[start] = true; //방문 표시
System.out.print(start + " ");
//Queue가 빌 때까지 반복. 방문 정점은 확인, 출력 후 Queue에 넣어 순서대로 확인
while(!queue.isEmpty()) {
int temp = queue.poll();
for(int j = 1; j <= n; j++) {
if(check[temp][j] == 1 && checked[j] == false) { //이어져있고 방문 안한 곳
queue.offer(j); //큐에 넣고
checked[j] = true; //방문 표시
System.out.print(j + " ");
}
}
}
- 아직 BFS는 조금더 봐야할듯..!