📖 ORM

    @Transactional 사용 시 자기 호출(Self-Invocation) 이슈 - 실습으로 배우는 JPA 3편

    코드는 깃헙에 있습니다. 자기 호출 이슈는 보통 개발자가 @Transactional의 기능을 조작하려고 할 때 발생하는 이슈입니다. 그럼 우선 자기 호출이란 뭔지 알아봐야겠지요. 자기 호출이란? @Transactional은 스프링 AOP를 기반으로 만들어진 어노테이션 입니다. AOP는 다이나믹 프록시 혹은 CGLib(Spring Boot와 JPA Hibernate는 Default가 CGLib)으로 생성된 프록시 객체를 사용하는 기술입니다. 왜 프록시 객체를 사용할까요? @Transactional이 붙으면 트랜잭션을 시작하고 마지막에 롤백 혹은 커밋에 대한 명령어로 메소드를 감싸기 위해 프록시 객체를 만들어서 메소드를 새롭게 만든다라고 보면 됩니다. public Proxy { public void exte..

    findAll()에 관한 N+1 테스트 - 실습으로 배우는 JPA 2편

    JPA에 익숙해지기 위해 N+1을 발생시키고 그 과정에서 영속성 컨텍스트와 @Transactional 동작 방식을 이해하는 글 입니다. EAGER는 보통 실무에서 쓰이지는 않지만 JPA 이해 과정에서 사용한 점 양해 부탁드립니다. 실습 예제는 여기에 있습니다. 서론 '학교'와 '학생'은 1:N의 관계에 있습니다. 그러므로 '학교'는 기본키, '학생'은 외래키로 활용되며 아래와 같이 Entity를 만들 수 있습니다. @Before로 데이터 세팅 @Before public void setup() { List schools = new ArrayList(); for(int i=1; i a.getSchool().getName()) .collect(Collectors.toList()); } @Test @Displa..

    @OnDelete와 CascadeType.ALL, orphanRemoval 속성

    사용법 CascadeType.ALL는 아래와 같이 쓴다. @OneToMany(cascade = CascadeType.ALL) private List members = new ArrayList(); @OnDelete는 아래와 같이 쓴다. @OneToMany @OnDelete(action = OnDeleteAction.CASCADE) private List members = new ArrayList(); 참조무결성과 Cascade create table Member ( foreign key (member_id) references Team (id) ); 참조 무결성에 대한 개념을 복습하자면 Team과 Member 연관관계에 있고 Team의 기본키와 member_id 외래키를 설정할 경우 Team의 기본키 데..

    @ManyToOne과 @OneToMany로 배우는 JPA 기초 사용법 - 실습으로 배우는 JPA 1편

    @ManyToOne과 @OneToMany를 실습해보면서 발생할 수 있는 에러들을 대처해보는 예제입니다. 본 글은 JPA에 익숙하지 않은 분들을 위한 포스팅입니다. 실습 예제는 여기에 있습니다. 서론 '학교'와 '학생'은 1:N의 관계에 있습니다. 그러므로 '학교'는 기본키, '학생'은 외래키로 활용되며 아래와 같이 Entity를 만들 수 있습니다. School Entity @Entity @Getter @Setter @NoArgsConstructor @ToString public class School { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy..