트랜잭션 적용 위치
2022. 8. 23. 01:07
데이터 접근 기술/스프링 트랜잭션
이번시간에는 코드를 통해 @Transactional 의 적용 위치에 따른 우선순위를 확인해보자. 인터페이스와 해당 인터페이스를 구현한 클래스에 애노테이션을 붙일 수 있다면 더 구체적인 클래스가 더 높은 우선순위를 가진다. TxLevelTest package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.co..
트랜잭션 적용 확인
2022. 8. 22. 21:52
데이터 접근 기술/스프링 트랜잭션
트랜잭션 적용 확인 @Transactional 을 통해 선언적 트랜잭션 방식을 사용하면 단순히 애노테이션 하나로 트랜잭션을 적용할 수 있다. 그런데 이 기능은 트랜잭션 관련 코드가 눈에 보이지 않고, AOP를 기반으로 동작하기 때문에, 실제 트랜잭션이 적용되고 있는지 아닌지를 확인하기가 어렵다. 스프링 트랜잭션이 실제 적용되고 있는지 확인하는 방법을 알아보자. TxApplyBasicTest package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.aop.support...
다양한 데이터 접근 기술 조합
2022. 8. 22. 13:07
데이터 접근 기술
어떤 데이터 접근 기술을 선택하는 것이 좋을까? 이 부분은 하나의 정답이 있다기 보다는, 비즈니스 상황과, 현재 프로젝트 구성원의 역량에 따라서 결정하는 것이 맞다 생각한다. JdbcTemplate 이나 MyBatis 같은 기술들은 SQL을 직접 작성해야 하는 단점은 있지만 기술이 단순하기 때문에 SQL에 익숙한 개발자라면 금방 적응할 수 있다. JPA, 스프링 데이터 JPA, Querydsl 같은 기술들은 개발 생산성을 혁신할 수 있지만, 학습 곡선이 높기 때문에, 이런 부분을 감안해야 한다. 그리고 매우 복잡한 통계 쿼리를 주로 작성하는 경우에는 잘 맞지 않는다. 개인적으로 추천하는 방향은 JPA, 스프링 데이터 JPA, Querydsl을 기본으로 사용하고, 만약 복잡한 쿼리를 써야 하는데, 해결이 ..
실용적인 구조
2022. 8. 22. 12:50
데이터 접근 기술
이번에는 스프링 데이터 JPA의 기능은 최대한 살리면서, Querydsl도 편리하게 사용할 수 있는 구조를 만들어보겠다. 복잡한 쿼리 분리 ● ItemRepositoryV2 는 스프링 데이터 JPA의 기능을 제공하는 리포지토리이다. ● ItemQueryRepositoryV2 는 Querydsl을 사용해서 복잡한 쿼리 기능을 제공하는 리포지토리이다. 이렇게 둘을 분리하면 기본 CRUD와 단순 조회는 스프링 데이터 JPA가 담당하고, 복잡한 조회 쿼리는 Querydsl이 담당하게 된다. 물론 ItemService 는 기존 ItemRepository 를 사용할 수 없기 때문에 코드를 변경해야 한다 ItemRepositoryV2 package hello.itemservice.repository.v2; impor..
스프링 데이터 JPA 예제와 트레이드 오프
2022. 8. 22. 11:54
데이터 접근 기술
클래스 의존 관계 런타임 객체 의존 관계 ● 중간에서 JpaItemRepositoryV2 가 어댑터 역할을 해준 덕분에 MemberService 가 사용하는 MemberRepository 인터페이스를 그대로 유지할 수 있고 클라이언트인 MemberService 의 코드를 변경하지 않아도 되는 장점이 있다. 고민 ● 구조를 맞추기 위해서, 중간에 어댑터가 들어가면서 전체 구조가 너무 복잡해지고 사용하는 클래스도많아지는 단점이 생겼다. ● 실제 이 코드를 구현해야하는 개발자 입장에서 보면 중간에 어댑터도 만들고, 실제 코드까지 만들어야 하는 불편함이 생긴다. ● 유지보수 관점에서 ItemService 를 변경하지 않고, ItemRepository 의 구현체를 변경할 수 있는 장점이 있다. 그러니까 DI, O..
Querydsl 적용
2022. 8. 22. 03:00
데이터 접근 기술/Querydsl
JpaItemRepositoryV3 package hello.itemservice.repository.jpa; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import hello.itemservice.domain.Item; import hello.itemservice.domain.QItem; import hello.itemservice.repository.ItemRepository; import hello.itemservice..
Querydsl 설정
2022. 8. 21. 20:31
데이터 접근 기술/Querydsl
build.gradle plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' ext["hibernate.version"] = "5.6.5.Final" configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.spri..
스프링 데이터 JPA 적용2
2022. 8. 21. 04:05
데이터 접근 기술/Spring Data JPA
JpaItemRepositoryV2 package hello.itemservice.repository.jpa; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUpdateDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Tran..
스프링 데이터 JPA 적용1
2022. 8. 20. 20:47
데이터 접근 기술/Spring Data JPA
설정 스프링 데이터 JPA는 spring-boot-starter-data-jpa 라이브러리를 넣어주면 된다. build.gradle 추가 //JPA, 스프링 데이터 JPA 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 그런데 이미 앞에서 JPA를 설정하면서 spring-boot-starter-data-jpa 라이브러리를 넣어주었다. 여기에는 JPA , 하이버네이트, 스프링 데이터 JPA( spring-data-jpa ), 그리고 스프링 JDBC 관련 기능도 모두 포함되어 있다. 따라서 스프링 데이터 JPA가 이미 추가되어있으므로 별도의 라이브러리 설정은 하지 않아도 된다. 스프링 데이터 JPA 적용 SpringDataJ..
스프링 데이터 JPA 주요 기능
2022. 8. 20. 14:51
데이터 접근 기술/Spring Data JPA
스프링 데이터 JPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리이다. 수많은 편리한 기능을 제공하지만 가장 대표적인 기능은 다음과 같다. ● 공통 인터페이스 기능 ● 쿼리 메서드 기능 공통 인터페이스 기능 ● JpaRepository 인터페이스를 통해서 기본적인 CRUD 기능 제공환다. ● 공통화 가능한 기능이 거의 모두 포함되어 있다. ● CrudRepository 에서 fineOne() findById() 로 변경되었다. JpaRepository 사용법 public interface ItemRepository extends JpaRepository { } ● JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 를 주면 된다. ● 그러면 JpaRepository ..
JPA 적용3 - 예외 변환
2022. 8. 19. 00:58
데이터 접근 기술/JPA
JPA의 경우 예외가 발생하면 JPA 예외가 발생하게 된다. @Repository @Transactional public class JpaItemRepositoryV1 implements ItemRepository { private final EntityManager em; @Override public Item save(Item item) { em.persist(item); return item; } } ● EntityManager 는 순수한 JPA 기술이고, 스프링과는 관계가 없다. 따라서 엔티티 매니저는 예외가 발생하면 JPA 관련 예외를 발생시킨다. ● JPA는 PersistenceException 과 그 하위 예외를 발생시킨다. ● 추가로 JPA는 IllegalStateException , Il..
JPA 적용2 - 리포지토리 분석
2022. 8. 18. 22:53
데이터 접근 기술/JPA
JpaItemRepositoryV1 코드를 분석해보자. save() - 저장 public Item save(Item item) { em.persist(item); return item; } ● em.persist(item) : JPA에서 객체를 테이블에 저장할 때는 엔티티 매니저가 제공하는 persist() 메서드를 사용하면 된다. JPA가 만들어서 실행한 SQL insert into item (id, item_name, price, quantity) values (null, ?, ?, ?) 또는 insert into item (id, item_name, price, quantity) values (default, ?, ?, ?) 또는 insert into item (item_name, price, qu..
JPA 적용1 - 개발
2022. 8. 18. 15:19
데이터 접근 기술/JPA
JPA에서 가장 중요한 부분은 객체와 테이블을 매핑하는 것이다. JPA가 제공하는 애노테이션을 사용해서 Item 객체와 테이블을 매핑해보자 Item - ORM 매핑 package hello.itemservice.domain; import lombok.Data; import javax.persistence.*; @Data @Entity public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "item_name", length = 10) private String itemName; private Integer price; private Integer quantity; pu..
JPA 설정
2022. 8. 18. 14:24
데이터 접근 기술/JPA
spring-boot-starter-data-jpa 라이브러리를 사용하면 JPA와 스프링 데이터 JPA를 스프링 부트와 통합하고, 설정도 아주 간단히 할 수 있다. spring-boot-starter-data-jpa 라이브러리를 사용해서 간단히 설정하는 방법을 알아보자. build.gradle 에 다음 의존 관계를 추가한다. //JPA, 스프링 데이터 JPA 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' build.gradle 에 다음 의존 관계를 제거한다. //JdbcTemplate 추가 //implementation 'org.springframework.boot:spring-boot-starter-jdbc' spri..
MyBatis 기능 정리2 - 기타 기능
2022. 8. 17. 03:14
데이터 접근 기술/MyBatis
애노테이션으로 SQL 작성 다음과 같이 XML 대신에 애노테이션에 SQL을 작성할 수 있다. @Select("select id, item_name, price, quantity from item where id=#{id}") Optional findById(Long id); ● @Insert , @Update , @Delete , @Select 기능이 제공된다. ● 이 경우 XML에는 ~ 는 제거해야 한다. ● 동적 SQL이 해결되지 않으므로 간단한 경우에만 사용한다. 애노테이션으로 SQL 작성에 대한 더 자세한 내용은 다음을 참고하자. https://mybatis.org/mybatis-3/ko/java-api.html 문자열 대체(String Substitution) #{} 문법은 ?를 넣고 파라미터를..
MyBatis 기능 정리1 - 동적 쿼리
2022. 8. 16. 22:12
데이터 접근 기술/MyBatis
MyBatis에서 자주 사용하는 주요 기능을 공식 메뉴얼이 제공하는 예제를 통해 간단히 정리해보자. ● MyBatis 공식 메뉴얼: https://mybatis.org/mybatis-3/ko/index.html ● MyBatis 스프링 공식 메뉴얼: https://mybatis.org/spring/ko/index.html 동적 SQL 마이바티스가 제공하는 최고의 기능이자 마이바티스를 사용하는 이유는 바로 동적 SQL 기능 때문이다. 동적 쿼리를 위해 제공되는 기능은 다음과 같다. ● if ● choose (when, otherwise) ● trim (where, set) ● foreach 공식 메뉴얼에서 제공하는 예제를 통해 동적 SQL을 알아보자 if SELECT * FROM BLOG WHERE sta..
MyBatis 적용3 - 분석
2022. 8. 16. 21:53
데이터 접근 기술/MyBatis
생각해보면 지금까지 진행한 내용중에 약간 이상한 부분이 있다. ItemMapper 매퍼 인터페이스의 구현체가 없는데 어떻게 동작한 것일까? ItemMapper 인터페이스 package hello.itemservice.repository.mybatis; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUpdateDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; impo..
MyBatis 적용2 - 설정과 실행
2022. 8. 16. 21:03
데이터 접근 기술/MyBatis
MyBatisItemRepository package hello.itemservice.repository.mybatis; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUpdateDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional..
MyBatis 적용1 - 기본
2022. 8. 16. 17:19
데이터 접근 기술/MyBatis
이제부터 본격적으로 MyBatis를 사용해서 데이터베이스에 데이터를 저장해보자. XML에 작성한다는 점을 제외하고는 JDBC 반복을 줄여준다는 점에서 기존 JdbcTemplate과 거의 유사하다. ItemMapper package hello.itemservice.repository.mybatis; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUpdateDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; i..
MyBatis 설정
2022. 8. 16. 14:35
데이터 접근 기술/MyBatis
mybatis-spring-boot-starter 라이브러리를 사용하면 MyBatis를 스프링과 통합하고, 설정도 아주 간단히 할 수 있다. mybatis-spring-boot-starter 라이브러리를 사용해서 간단히 설정하는 방법을 알아보자. build.gradle 에 다음 의존 관계를 추가한다. //MyBatis 추가 implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' ● 참고로 뒤에 버전 정보가 붙는 이유는 스프링 부트가 버전을 관리해주는 공식 라이브러리가 아니기 때문이다. 스프링 부트가 버전을 관리해주는 경우 버전 정보를 붙이지 않아도 최적의 버전을 자동으로 찾아준다. 다음과 같은 라이브러리가 추가된다. ● myb..