트랜잭션(Transaction)이란? 트랜잭션은 우리 말로 '거래'라는 뜻을 가지고 있다. 이것을 중고거래에 빗대어서 한번 살펴보자. 당근마켓에서 선입금을 아이패드를 사기 사기 위해 선입금을 했다. 받았더니 벽돌이었다. 사기 당했을 때, 입금하기 시점 이전으로 돌릴 수 있는 개념이 바로 트랜잭션이다. 트랜잭션은 트랜잭션 내의 모든 작업들이 성공적으로 끝이나면, 작업의 결과를 묶음으로 적용한다. 반대로 작업들 중 하나라도 오류가 발생하면, 이전에 있는 모든 작업들이 성공적이었다고 하더라도 모두 없던 일처럼 돌린다. 데이터베이스에서는 트랜잭션 개념 단위로 일을 처리하게 되고, 모든 작업이 성공해야 데이터베이스에 작업 결과물이 반영될 수 있다. @Transactional 어노테이션의 기능 tx.begin() ..
0. 설계 주의 사항 단방향 연관관계를 기본으로 설계해라. 필요한 양방향을 추가한다연관관계의 주인은 FK와 가까운 곳으로 설정해라.다대다 연관관계는 일대다 / 다대일로 풀어낸다. Setter는 가급적 제공하지 않는다. 대신, 필요한 별도의 메서드를 제공해서 변경 지점을 확실하게 한다. 객체를 기준으로 설계한다. 맵핑은 연관관계를 기준으로 한다. EnumType은 String으로 설정한다. ORDINAL로 설정 시, 변경 및 확장에 취약하다. 일대일에서 FK는 많이 접근하는 쪽에 둔다. 1. Join Column DB의 테이블과 테이블의 연관 관계를 정해주는 것이다. 즉, 이 테이블(엔티티)의 이 Column을 FK로 사용할껀데, 이 FK는 다른 테이블의 어떤 PK라는 것을 알려주는 것이다. 이걸 하면 D..
Fetch Join이란? 쉽게 말해 한방 쿼리! JPQL에서는 Fetch Join이라는 쿼리 명령어를 지원해준다. Fetch Join은 찾고자 하는 대상과 연관된 엔티티와 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. 기본적으로는 여러 개의 엔티티를 한꺼번에 조회했을 때 발생할 수 있는 N+1 문제를 해결하는데 큰 역할을 한다. FETCH JOIN 쿼리와 실제 SQL 쿼리 비교 String query = "SELECT m FROM MEMBER m JOIN FETCH m.team"; // SELECT m FROM MEMBER m LEFT [INNER/OUTER] JOIN FETCH m.team JPQL의 FETCH JOIN은 위와 같은 형태로 선언한다. 더 자세한 형태는 주석처리 된 부분에 표시되어있다..
영속성 전이, CASCADE 영속성 전이는 연관관계를 맵핑하는 것과 전혀 관련 없음. 엔티티를 영속화 할 때, 관련된 엔티티도 함께 영속화되는 편리함만 제공함. CASCADE 옵션 붙은 쪽이 연관된 다른 엔티티를 관리한다. CASCADE는 영속성이 전이된다는 말이다. 무슨 말이냐면, 특정 엔티티가 다른 엔티티와 관련이 있을 때, 특정 엔티티를 영속화하면 관련된 다른 엔티티도 영속화되는 것을 '영속성 전이'라고 한다. 이것은 연관관계와 즉시 로딩, 지연 로딩과 전혀 관계가 없다. 부모와 자식 클래스가 있다고 가정해보자. 예를 들어 부모 엔티티를 영속화하면, 자식 엔티티도 바로 영속화하고 싶을 때 쓸 수 있다. 또, 자식 엔티티를 영속화할 때 부모 엔티티도 바로 영속화 할 때 사용할 수 있다. 영속성 전이의..
MappedSuperClass → 엔티티가 아니다. MappedSuperClass는 앞선 상속 관계는 약간 다른 개념으로 사용이 된다. 앞선 게시글에서 이야기 했던 슈퍼 타입 - 서브 타입 모델의 관계는 계층 구조를 표현하기 위함이었다면, MappedSuperClass는 공통으로 사용될 변수를 셋팅하는데 '귀차니즘'을 줄이는데 도움을 주는 클래스다. 예를 들어 어플리케이션 전체에서 로그 추적을 위해서 처음 기록된 시간, 마지막으로 수정된 시간들이 각각의 DB Table에 저장된다고 생각해보자. 그렇다면 기본적으로는 각 엔티티마다 그 변수를 가지도록 해주어야 한다. 그런데 이게 테이블이 적을 때는 문제가 없으나 테이블이 많으면 문제가 될 수 있다. 하나하나 손으로 작성을 해줘야하는데 누락되는 경우도 발생할..