스프링 트랜잭션 전파스프링 트랜잭션 전파 예제 - 커밋, 롤백@Slf4j@Service@RequiredArgsConstructorpublic class MemberService { private final MemberRepository memberRepository; private final LogRepository logRepository; public void joinV1(String username) { Member member = new Member(username); Log logMessage = new Log(username); log.info("== memberRepository 호출 시작 =="); memberReposito..
스프링 트랜잭션 전파스프링 트랜잭션 - 커밋, 롤백여러 트랜잭션을 각각 따로 사용하는 경우 트랜잭션이 각각 수행되면서 사용되는 커넥션도 각각 다르다.커넥션 풀이 있는 경우 커넥션을 사용하고 반납하다보면 물리적으로는 같은 커넥션을 사용할 수는 있지만 완전히 다른 커넥션으로 취급된다.윗 그림은 커넥션 풀을 사용하지 않는다고 가정했을 때 동작 방식이 경우 트랜잭션을 각자 관리하기 때문에 전체 트랜잭션을 묶을 수 없다.스프링 트랜잭션 - 전파트랜잭션 전파(propagation) : 어떤 트랜잭션이 동작중인 과정에서 다른 트랜잭션을 실행할 경우 어떻게 동작할지 결정하는 것. 트랜잭션 전파의 기본 옵션인 REQUIRED를 기준으로 아래 내용 작성외부 트랜잭션이 수행중일 때 내부 트랜잭션이 추가로 수행되는 경우스프링..
스프링 트랜잭션JDBC로 트랜잭션을 사용하는 것과 JPA로 트랜잭션을 사용하는 코드는 다르기에 기술을 변경하면 코드도 변경해야 한다.이런 문제를 해결하기 위해 스프링에서 PlatformTransactionManager 인터페이스를 통해 트랜잭션 추상화를 제공한다. 스프링은 트랜잭션 추상화 기능뿐만 아니라 트랜잭션 매니저의 구현체도 제공한다.스프링 부트는 사용하는 데이터 접근 기술을 자동으로 인식해서 트랜잭션 매니저를 선택해서 스프링 빈으로 등록해주기에 트랜잭션 매니저를 선택하고 등록하는 과정도 생략할 수 있다. PlatformTransactionManager를 사용하는 방법 2가지선언적 트랜잭션 관리@Transactional 어노테이션 하나만 선언해서 편리하게 트랜잭션을 적용하는 것해당 로직에 트랜잭션을..
스프링 데이터 JPA의 트레이드 오프 스프링 데이터 JPA를 도입한 기존 예제도입 과정 JpaRepository를 구현하는 인터페이스 SpringDataJpaItemRepository를 생성기존에 있던 ItemService는 ItemRepository라는 인터페이스에 의존하고 있기에 서로 맞지 않는다.서로 맞추려면 ItemService의 의존 관계를 추가해야하고 코드에 변경이 생긴다.어댑터 역할을 하도록 JpaItemRepositoryV2를 ItemRepository를 구현하도록 만들고 SpringDataJpaItemRepositor에 의존하도록 만들었다.ItemService는 ItemRepository를 그대로 의존하며 코드를 변경하지 않을 수 있게 됐다.문제점구조를 맞추기위해 어댑터 역할을 하는 ..
Querydsl쿼리의 문제점쿼리는 문자이기에 타입 체크가 불가능하다.실행하기 전까지 작동 여부를 확인할 수 없다.JPQL은 type-safe하다.컴파일 시 에러 체크 가능 JPA에서 QUERY 방법JPQL(HQL) : SQL 쿼리와 비슷해서 익숙하지만 type-safe가 아니며 동적 쿼리 생성이 어렵다.Criteria API : 동적 쿼리 생성이 쉽지만 type-safe가 아니고 너무 복잡하고 알아야할 것이 많다.MetaModel Criteria API(type-safe) : type-safe하지만 너무 복잡하다. QueryDSL : 쿼리를 Java로 type-safe하게 개발할 수 있도록 지원하는 프레임워크쿼리에 특화된 프로그래밍 언어로 다양한 저장소 쿼리 기능을 통합type-safe하고 단순하지만 Q..
스프링 데이터 JPA스프링 데이터 JPA 주요 기능스프링 데이터 JPA : JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리이다.스프링 데이터 JPA가 제공하는 기능 : 공통 인터페이스 기능, 쿼리 메소드 기능을 제공한다.공통 인터페이스 기능 : JpaRepository 인터페이스로 기본적인 CRUD 기능 제공쿼리 메소드 기능 : 인터페이스에 메소드만 적어두면 메소드 이름을 분석해서 쿼리를 자동으로 만들고 실행해준다. public interface ItemRepsitory extends JpaRepository {}공통 인터페이스 기능 JpaRepsoitory 사용법JpaRepository 인터페이스를 상속받는 인터페이스를 선언제네릭 타입에 를 선언JpaRepository를 상속받으면 JpaRe..
JPAJPA (Java Persistence API) : 자바에서 제공하는 표준 ORM 데이터 접근 기술이다.기본적이 SQL을 JPA가 작성하고 처리해준다.ORM (Object Relational Mapping) : 객체 관계 매핑으로 객체는 객체대로 설계하고 관계형 DB는 관계형 DB대로 설계를 해서 ORM이 중간에서 매핑을 해준다.JPA 설정implementation 'org.springframework.boot:spring-boot-starter-data-jpa'JPA 사용을 위해 build.gradle에서 의존 관계 추가 logging.level.org.hibernate.SQL=DEBUGlogging.level.org.hibernate.type.descriptor.sql.BasicBinder=TR..
MyBatisMyBatis 소개MyBatis : JdbcTemplate보다 많은 기능을 제공하는 SQL Mapper이다.SQL을 XML에 편리하게 작성가능동적쿼리를 매우 편리하게 작성 가능MyBatis는 별도의 설정이 약간은 필요하다.ibatis는 MyBatis의 이전 버전이다. update item set item_name=#{itemName}, price=#{price}, quantity=#{quantity} where id = #{id}MyBatis XML로 SQL 작성 예제쿼리가 길어져도 편리하게 작성할 수 있다. select id, item_name, price, quantity from item and item_..
테스트테스트 - 데이터베이스 분리테스트 코드는 src/test/resources/application.properties 파일이 설정에서 우선 순위를 갖는다. @SpringBootTest 사용 시 @SpringBootApplication을 찾아서 설정으로 사용한다. 테스트 시 중요한 것은 다른 환경과 분리해야 한다.가장 간단한 방법은 로컬 DB와 테스트 전용 DB를 별도로 운영하는 것테스트 - 데이터 롤백테스트에서 매우 중요한 원칙테스트는 다른 테스트와 격리해야 한다.테스트는 반복해서 실행할 수 있어야 한다.이때 필요한 것이 트랜잭션이다.테스트 후 트랜잭션을 통해 롤백을 하면 데이터가 저장되지 않으며, 롤백을 하지 못하더라도 트랜잭션이 커밋을 하지 않았기에 데이터가 DB에 반영되지 않는다.트랜잭션을 커밋..
스프링 JdbcTemplateJdbcTemplate 특징장점설정의 편리함 - 스프링 JDBC 사용 시 기본으로 사용되는 라이브러리로 별도의 복잡한 설정이 필요없다.반복 문제 해결 - 템플릿 콜백 패턴을 통해 JDBC의 반복 문제를 해결해주기에SQL 작성, 파라미터 정의, 응답 값 매핑만 하면된다.단점동적 SQL을 해결하기 어렵다. @Slf4jpublic class JdbcTemplateItemRepositoryV1 implements ItemRepository { private final JdbcTemplate template; public JdbcTemplateItemRepositoryV1(DataSource dataSource) { this.template = new JdbcT..