개인공부-1

박상훈·2023년 3월 27일
0

개인공부

목록 보기
1/16

개인 공부 일기장 - 1

1. Id(PK)생성 전략

  • 기존에 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할 필요가 없다.

2. 깊이우선 너비 우선탐색

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는 조금더 봐야할듯..!
profile
기록하는 습관

0개의 댓글