전체 글 682

[JPA] 영속성 컨텍스트의 이점 ( + DirtyChecking )

[JPA] JPA 동작원리 ( 영속성 컨텍스트 ) [JPA] 패러다임의 불일치 어플리케이션 개발은 주로 객체지향언어로 이루어진다. 객체지향언어는 현실의 많은 문제를 코드로 구현하지만 문제가 있다. 데이터는 주로 관계형DB에 저장되는데 관 lordofkangs.tistory.com 영속성 컨텍스트의 동작원리를 간단히 설명하면, 엔티티(member)는 영속화(persist)되어 1차 캐시에 저장된다. 그리고 쓰기지연SQL저장소에는 INSERT문이 생성되어 1차캐시에 등록된 데이터를 DB 테이블에 추가할 준비를 한다. 그리고 flush 명령이 내려오면 쓰기지연SQL저장소에 저장된 쿼리들이 실행되면서 1차캐시와 DB가 동기화된다. 마무리로 커밋(commit)까지 완료되면 완전히 1차캐시 내용이 DB에 반영된다...

Dev/JPA 2023.05.25

[JPA] 엔티티(Entity)가 기본생성자를 가져야 하는 이유 ( Reflection )

조회시 사용되는 엔티티(Entity)는 기본생성자를 가지고 있어야 한다. @Entity @Data public class Member { @Id public String name; public int age; public Member() {} //반드시 필요! public Member(String name, int age) { this.name = name; this.age = age; } } 이유가 무엇일까? ◎ Reflection EntityManger가 조회(find)를 요청하면 1차캐시에 원하는 엔티티가 없는 경우 DB에 SELECT문을 실행하여 조회한다. 그리고 결과를 1차캐시에 저장하고 엔티티 객체를 생성하여 반환(return)한다. 즉, 프로그램 실행 중에 동적으로 엔티티 객체를 생성해야 한..

Dev/JPA 2023.05.25

[CodingTest] 팀 결성 ( Graph 알고리즘 )

◎ 문제 학교에서 학생들에게 0번부터 N번까지의 번호를 부여했다. 처음에는 모든 학생이 서로 다른 팀으로 구분되어, 총 N + 1 개의 팀이 존재한다. 이때 선생님은 '팀 합치기'연산과 '같은 팀 여부 확인'연산을 사용할 수 있다. '팀 합치기' 연산은 두 팀을 합치는 연산이다. '같은 팀 여부 확인' 연산은 특정한 두 학생이 같은 팀에 속하는지를 확인하는 연산이다. 선생님이 M개의 연산을 수행할 수 있을 때, '같은 팀 여부 확인'연산에 대한 연산 결과를 출력하는 프로그램을 작성하시오. 첫째 줄에 N, M이 주어진다. M은 입력으로 주어지는 연산의 개수이다. (1

문제풀이 2023.05.25

[Algorithm] 위상정렬 (Topology Sort)이란?

위상정렬은 방향그래프를 한 정렬이다. 위 그래프는 작업 간 의존관계를 표현한다. 작업C는 작업B와 작업E가 완료되어야 처리가 가능하다. 그래프는 의존관계는 표현하지만 어떤 작업부터 처리해야 하는지 알려주지는 않는다. 위상정렬(Topology Sort) ◎ 알고리즘 위상 정렬의 조건은 하나이다. ☑︎ 전처리 작업이 완료된 순서대로 작업이 진행되어야 한다. 이를 어떻게 구현할까? 방향그래프는 방향을 가진 간선을 가지고 있다. 노드로 들어오는 간선의 개수를 진입차수라고 한다. 작업C는 진입차수가 2이다. 간선① : 작업B ➠ 작업C 간선② : 작업E ➠ 작업C 작업B가 완료되면 작업B는 간선①을 제거한다. 작업E가 완료되면 작업E는 간선②를 제거한다. 작업C는 진입차수가 0이된다. 그럼 큐에 들어가서 선입선출..

[JPA] 트랜잭션(Transaction) 이해하기(2) - JPA

DB의 데이터변경은 '트랜잭션(Transaction)' 단위로 이루어진다. 트랜잭션이란? DB 데이터 변경은 단 하나의 쿼리만으로 이루어지지 않는다. 입금을 생각해보자. A가 B에게 5만원을 입금하면 두 가지 쿼리가 실행되어야 한다. 1) A계좌에 5만원 출금 2) B계좌에 5만원 입금 1) 과 2)는 독립되어 있지 않다. 1)이 성공해도 2)가 실패하면 1)은 원복되어야 한다. 그러므로 여러 처리를 하나의 단위로 묶는 논리적 단위가 필요한데, 이가 바로 '트랜잭션'이다. [JPA] 트랜잭션(Transaction) 이해하기(1) - JDBC DB의 데이터변경은 '트랜잭션(Transaction)' 단위로 이루어진다. 트랜잭션이 필요한 이유가 무엇일까? DB 데이터 변경은 단 하나의 쿼리만으로 이루어지지 않..

Dev/JPA 2023.05.24

[JPA] 트랜잭션(Transaction) 이해하기(1) - JDBC

DB의 데이터변경은 '트랜잭션(Transaction)' 단위로 이루어진다. 트랜잭션이란? DB 데이터 변경은 단 하나의 쿼리만으로 이루어지지 않는다. 입금을 생각해보자. A가 B에게 5만원을 입금하면 두 가지 쿼리가 실행되어야 한다. 1) A계좌에 5만원 출금 2) B계좌에 5만원 입금 1) 과 2)는 독립되어 있지 않다. 1)이 성공해도 2)가 실패하면 1)은 원복되어야 한다. 그러므로 여러 처리를 하나의 단위로 묶는 논리적 단위가 필요한데, 이가 바로 '트랜잭션'이다. DB에서 트랜잭션 구현하기 H2 DB에서 트랜잭션을 이해해보자. 계좌 테이블(Account)은 계좌정보가 들어있다. 사쿠라는 20000원 김채원은 30000이 계좌에 들어있다. 그럼 사쿠라가 김채원에게 5000원을 송금하는 과정을 구현..

Dev/JPA 2023.05.24

[Algorithm] 크루스칼 알고리즘(Kruskal Algorithm)이란?

현실은 복잡하다. 수많은 싸이클이 존재하고 비효율이고 무질서하다. 그러므로 우리는 싸이클을 제거하고 효율높은 질서를 찾아야 한다. 그래프는 여러 개의 신장트리(Spanning Tree)를 갖는다. 신장트리(Spanning Tree)란? 모든 노드가 연결되면서 사이클이 존재하지 않는 그래프를 의미한다. 여러 신장 트리 중 가장 비용이 적은 신장트리를 최소신장트리라고 부르는데, 최소신장트리를 구하는 대표적인 알고리즘이 크루스칼 알고리즘(Kruskal Algorithm)이다. 크루스칼 알고리즘(Kruskal Algorithm) 크루스칼 알고리즘은 두 가지 조건이 충족되어야 한다. 1) 최소비용이어야 한다. ( 정렬을 활용한 그리디 알고리즘 ) 2) 싸이클이 존재하면 안 된다. ( Union-Find 알고리즘으..

[Algorithm] 무방향그래프에서 싸이클 찾기

싸이클(Cylce)은 '순환'을 의미한다. 일반적으로 싸이클은 좋지 못한 현상이다. 자칫 무한 루프에 빠질 수 있고 순환을 이루는 개체간의 종속성이 올라간다. 간선을 의존관계라고 생각해보자. A는 C에 의존하고 C는 B에 의존하고 B는 A에 의존한다. 종속성이 커질수록 결합도가 올라가 유지보수가 어려워진다. 그러므로 그래프가 싸이클이 있는지 여부를 판단하는 알고리즘이 필요하다. 1) 무방향그래프에서 사이클 찾기 ( Union-Find 알고리즘 ) 2) 방향그래프에서 사이클 찾기 ( DFS 탐색 알고리즘 ) 간선에 방향이 없으면 무방향그래프, 있으면 방향그래프이다. 이번 포스팅에서는 무방향그래프에서 싸이클을 찾아보겠다. Union-Find 알고리즘 사용하기 [Algorithm] Union-Find 알고리즘..

[JPA] JPA 프로젝트 만들기 ( with Maven )

JPA는 SQL 중심 프로그래밍을 자동화하여 개발자가 쿼리를 짜는 노고를 줄이는 ORM 기술이다. JPA를 구현하는 대표 구현체는 Hibernate이다. JPA 구현은 대부분 Hibernate로 구현된다. DB는 H2 DB를 사용할 예정이다. [ DB ] H2 DB를 사용하는 이유 H2 데이터베이스는 간단한 프로젝트나 테스트용으로 적합한 데이터베이스이다. H2의 장점은 Embeded모드를 지원하기 때문이다. Application과 DB의 통신 Oracle , MySQL, MariaDB의 작동원리는 위 그림과 같 lordofkangs.tistory.com ( H2 사용은 위 포스팀 참고 ) 그럼 JPA 프로젝트를 만들어보자. 1. pom.xml 설정하기 JPA 예제를 위한 라이브러리를 디펜던시로 추가해보자..

Dev/JPA 2023.05.22

[JPA] JPA 동작원리 ( 영속성 컨텍스트 )

[JPA] 패러다임의 불일치 어플리케이션 개발은 주로 객체지향언어로 이루어진다. 객체지향언어는 현실의 많은 문제를 코드로 구현하지만 문제가 있다. 데이터는 주로 관계형DB에 저장되는데 관계형DB와 어플리케이션은 lordofkangs.tistory.com JPA는 객체지향 프로그래밍과 SQL 중심 프로그래밍 사이의 '패러다임 불일치' 문제를 해결하기 위해 등장했다. 이전에는 개발자가 SQL문을 직접 작성하여 테이블에 레코드를 추가해야 했다. JPA가 등장한 이후, 개발자는 JPA가 관리하는 인스턴스(엔티티)를 생성, 수정, 삭제만 하면 된다. ( 객체지향 관점 유지 가능 ) 그러면 JPA가 자동으로 SQL문을 생성한다. JPA는 DB 테이블의 레코드를 엔티티 인스턴스와 동기화하여 관리한다. 1차 캐시 영역..

Dev/JPA 2023.05.22