📖 ORM

    동시성(Concurrency) 이슈와 JPA Lock 메커니즘의 오해

    최근에 동시성에 관한 이슈를 검색하고 공부했던 것을 글로 간략하게 정리하고자 한다. 동시성 이슈는 개발을 하면서 빈번하게 발생할 이슈는 아니지만 발생 여지가 있다면 개발자로서 알아야 할 내용인 것 같아서 정리해봤다. 일반 변수에 대한 동시성 이슈 일반 변수가 동시성 이슈가 발생하는 경우 일반 변수에 대한 동시성 이슈가 발생한다는 것은 당연히 일반 변수가 공유될 때만 일어난다. 해당 변수가 Static 변수로 설정되어있다라든가 혹은 쓰레드를 이용해 동시 접근을 하는 경우에만 발생한다. public class TestClass { static int = a; //공유 변수 사용 public void test(){ } } 원칙적으로는 위와 같이 변수를 공유하는 경우는 극히 드물고 사용해서도 안 되는 게 원칙이..

    @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의 기본키 데..