오늘 인프런의 재고시스템으로 알아보는 동시성이슈 해결방법이란 강의 중 synchronized를 사용하여 동시성이슈를 해결하는데에서 궁금한 점이 발생했다. 참고로 이 강의에선 springboot, jpa와 함께 mysql을 연결하여 사용한다. // StockService 내 decrease 메서드, 여기서 동시성 이슈 발생 @Transactional public synchronized void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } @Test public void 동..
@Transactional 어노테이션을 붙이면 프록시 패턴을 사용하는 스프링 AOP를 사용하고 DB connection pool에서 connection을 하나 가져오고 setAutoCommit 값을 false로 초기화하고 트랜잭션 종료 시에 다음 2가지로 동작한다. 정상 작동 시 commit(동시에 flush) 에러 발생 시 rollback 트랜잭션이 종료될 때 다시 setAutoCommit 값을 True로 초기화해 준다. 위 DataSourceTransactionManager Class에서 볼 수 있듯이 JDBC커넥션을 DataSource로부터 현재 쓰레드에 바인딩하고, 이는 잠재적으로 DataSource당 하나의 쓰레드를 바인딩한다는 것으로 하나의 트랜잭션은 단일 쓰레드에서 동작한다.
AOP(Aspect Oriented Programming) 관점 지향 프로그래밍이라고 불리며 OOP(Object Oriented Programming)를 보완하는 수단으로 흩어진 관심사(Crosscutting Concerns) 를 각 Aspect를 기준으로 로직을 모듈화하여 핵심 비즈니스 로직에 분리하여 재사용하는 기법. 주요 개념 Aspect: 관심사를 모듈화한 것으로 주로 부가기능을 모듈화함. Target: Aspect를 적용하는 곳(클래스, 메소드 등) Advice: 실질적으로 어떤 일을 해야할 지 에 대한 것으로 실질적인 부가기능을 담은 구현체 JoinPoint: Advice가 적용될 위치, 끼어들 수 있는 지점.(ex 메소드 진입 지점, 생성자 호출 지점, 필드에서 값을 꺼내올 시점 등) Poi..
Hibernate 자바 언어를 위한 ORM 프레임워크로 JPA의 구현체, JPA 인터페이스 구현하며 내부적으로 JDBC API를 사용. JPA(Java Programming Application) 자바 애플리케이션에서 관계형 DB 사용 방식을 정의한 인터페이스. JDBC(Java Database Connectivity) 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API. 데이터베이스에서 데이터를 쿼리하거나 업데이트하는 방법을 제공. Hibernate 장점 생산성 Hibernate는 SQL을 사용하지 않고, 메소드 호출만으로 쿼리를 수행함으로써 SQL 반복 작업을 하지 않아 생산성 향상. 유지보수 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행함으로..
다중성 다대일 (@ManyToOne) 일대다 (@OneToMany) 일대일 (@OneToOne) 다대다 (@ManyToMany) 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 방향 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향(단방향이 2개) 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있고, 둘 중 테이블의 외래키를 관리할 곳을 지정해야함 연관관계의 주인은 외래키를 관리하는 참조 주인의 반대편은 외래키에 영향을 주지 않고, 단순 조회만 가능함(insertable = false, updatable = false) 다대..
JDBC란? JDBC는 Java Database Connectivity의 약자로 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API. Java에서 모든 데이터 접근 기술의 근간으로 즉, 모든 persistence framework에서 내부적으로 JDBC API를 사용한다. 데이터베이스에서 데이터를 쿼리, 업데이트하는 방법을 제공한다. MyBatis란? MyBatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇 가지 고급 매핑을 지원하는 persistence framework. XML(eXtensible Markup Language) 서술자나 Annotation을 사용하여 저장 프로시저나 SQL문으로 객체들을 연결한다. JDBC는 다양한 관계형 데이터베이스를 지원하기 위해 세부적인 작업이 가능..
준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티 Dirty Checking(변경감지) 1. 트랜잭션 커밋 시점에 JPA가 flush() 2. 영속성 컨텍스트 내에 변경된 엔티티가 있는지 확인 3. 변경된 엔티티가 있다면 DB에 update SQL 실행 //Dirty Checking Example @Transactional public void updateMember(Member member){ //파라미터의 member는 준영속 상태의 엔티티 Member findMember = em.find(Member.class, member.getId()); findMember.setName(member.getName()); findMember.setPhoneNum(member.getPhoneNum());..