Spring
[JPA] 객체와 테이블 매핑
[JPA] 객체와 테이블 매핑
2022.12.22JPA가 영속성 컨텍스트 개념을 사용해 동작하는건 알겠는데, 자바 객체와 데이터베이스 테이블은 어떻게 매핑되는걸까? JPA에서 가장 중요한 부분은 자바 객체인 엔티티와 데이터베이스의 테이블을 정확하게 매핑하는 작업이다. JPA에서는 @Entity 애너테이션을 사용해서 엔티티를 관리한다. @Entity 애너테이션이 붙은 클래스는 데이터베이스 테이블과 매핑될 수 있다. 예전에는 xml 등 설정 파일을 사용해 매핑 정보를 작성했는데, 애너테이션을 사용하는 편이 좀 더 쉽고 직관적이다. @Entity 애너테이션의 속성으로 name을 지정해 JPA에서 사용할 엔티티 이름을 지정할 수 있고, @Table 애너테이션의 속성으로 name을 지정해 매핑할 테이블 이름을 지정할 수 있다. 엔티티 클래스는 public 또는..
[JPA] 영속성 컨텍스트
[JPA] 영속성 컨텍스트
2022.12.21자바 객체와 관계형 데이터베이스를 어떻게 매핑해서 사용해야 할까? 실제로 JPA는 내부적으로 어떻게 동작하는걸까? JPA의 작동 원리를 제대로 이해하기 위해서는 영속성 컨텍스트에 대해 이해해야 한다. 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 환경으로, 눈에 보이지 않는 논리적인 개념이다. EntityManager를 생성하면 이에 대응하는 PersistenceContext 가 생성된다. 엔티티를 처음 만들면 엔티티는 비영속 상태이다. persist 메서드를 사용하면 엔티티가 영속 상태가 되어 영속성 컨텍스트에 관리된다. 즉, em.persist() 메서드는 단순히 데이터베이스에 값을 저장하는게 아니고, 엔티티를 영속화함을 의미한다. 그런데 왜 이런 매커니즘을 도입했을까? 객체와 데이터베이스 사이에 영..
[JPA] 도입
[JPA] 도입
2022.12.21Java Persistence API의 약자로 자바 진영의 ORM 기술 표준을 의미한다. JPA는 인터페이스이고, 인터페이스를 구현한 여러 구현체가 있는데 그 중 하이버네이트를 가장 많이 사용한다. 객체는 객체대로, 데이터베이스는 데이터베이스대로 설계하고 ORM 프레임워크가 객체와 데이터베이스간 차이를 해결해 데이터베이스를 자바 객체를 다루는 것 처럼 사용할 수 있도록 한다. 아예 밑바닥부터 구현되는건 아니고, JDBC API도 적절하게 사용한다. Persistence 클래스는 yml, xml 등 설정 정보를 읽고 EntityManagerFactory 클래스를 만든다. 그리고 필요할 때 마다 EntityManager를 만들어서 사용하는 방식으로 동작한다. EntityManager는 JPA에서 애플리케이션..
[Spring Database] 트랜잭션 전파
[Spring Database] 트랜잭션 전파
2022.09.16하나의 메서드 안에서 트랜잭션이 둘 이상 사용되거나, 트랜잭션 내부에서 또 트랜잭션을 거는 경우는 어떻게 처리될까? 하나하나 살펴보자. @Test void double_commit() { log.info("트랜잭션1 시작"); TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션1 커밋"); txManager.commit(tx1); log.info("트랜잭션2 시작"); TransactionStatus tx2 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션2 커밋"); txManager.co..
[Spring Database] 트랜잭션
[Spring Database] 트랜잭션
2022.09.13데이터 접근 기술들은 트랜잭션을 처리하는 방법이 조금씩 다르다. 따라서 데이터 접근 기술을 바꾸게 되면 트랜잭션을 처리하는 코드들도 모두 바꿔야 한다. 스프링은 PlatformTransactionManager 인터페이스를 통해 트랜잭션 추상화를 제공한다. 인터페이스를 통해 트랜잭션을 사용하면 데이터 접근 기술이 달라져도 동일한 방법으로 트랜잭션을 사용할 수 있다. 많이 사용되는 데이터 접근 기술에 대한 구현체도 함께 제공하고, 사용하는 기술을 인식해 구현체를 스프링 빈으로 등록해준다. 스프링에서는 더 구체적이고 자세한 요소가 더 높은 우선순위를 가진다. 트랜잭션에서도 마찬가지인데, 메서드와 클래스에 @Transactional 애너테이션을 붙일 수 있으면 메서드가 더 높은 우선순위를 가진다. @Spring..
[Spring Database] QueryDSL
[Spring Database] QueryDSL
2022.09.11QueryDSL (Query Domain Specific Language) 특정 도메인에 초점을 맞춘 프로그래밍 언어이다. 쿼리에 특화된 프로그래밍 언어이고, JPA / MongoDB / SQL 같은 데이터베이스 관련 기술들을 사용할 때 쿼리를 type-safe하게 개발 할 수 있게 지원하는 프레임워크이다. Entity 혹은 데이터베이스의 테이블의 정보를 바탕으로 QueryDSL Annotation Processing Tool 를 사용해 쿼리 전용 멤버 객체인 Q(Entity이름).java 를 만든다. (생성된 객체를 바탕으로 쿼리를 자바 코드로 작성한다) 즉, Q().java 파일을 사용해 자바 코드를 작성하고, 작성된 자바 코드는 JQPL로 변환되고 JQPL은 SQL로 변환돼서 실행된다. @Repos..
[Spring Database] Spring Data JPA
[Spring Database] Spring Data JPA
2022.09.11스프링 데이터 JPA 기술의 가장 대표적인 기능은 두 가지이다. 1. 공통 인터페이스 2. 쿼리 메서드 JpaRepository 인터페이스는 기본적인 CRUD 및 공통화가 가능한 기능들을 모두 제공한다. JpaRepository 인터페이스를 사용할 리포지토리에서 상속받고(extends), 제네릭에 관리할 를 입력해주면 스프링 데이터 JPA 기술 내부에서 프록시 기술을 통해 구현 클래스가 생성된다. 만들어진 구현 클래스의 인스턴스는 스프링 빈으로 등록되고, 개발자는 구현 클래스를 신경쓰지 않고 JpaRepository 인터페이스가 제공하는 기술을 사용할 수 있다. 인터페이스에 메서드만 적어두면 스프링 데이터 JPA 기술이 메서드 이름을 분석해 쿼리를 자동으로 만들고 실행해준다. JPA만 사용했을 경우 복잡..
[Spring Database] JPA 적용
[Spring Database] JPA 적용
2022.09.10JPA의 핵심은 객체와 관계형 데이터베이스간의 매핑이다. 애너테이션 기반으로 객체와 데이터베이스를 매핑해보자. @Data @Entity @Table(name = "item") 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; public Item() { } public Item(String itemName, Integer price, Integer quantity) { this.itemN..
[Spring Database] JPA
[Spring Database] JPA
2022.09.09JPA를 사용하기에 앞서 JPA가 도입된 배경에 대해 살펴보자. 애플리케이션을 개발할 때는 Java와 같이 객체지향언어를 사용한다. 또, 데이터베이스는 Oracle / MySQL 과 같은 관계형 데이터베이스를 사용한다. 즉 애플리케이션은 객체로 관리하고, 데이터는 관계형 데이터베이스에 저장한다. 그런데, 데이터베이스는 SQL만 받아들이고 실행할 수 있는데.. 여기서 문제가 발생한다. SQL 반환값을 자바 객체로 변환해야 하고.무엇을 개발하든 SQL에 의존 할 수 밖에 없다. 객체에 멤버 변수가 추가된다면? SQL도 추가된 변수에 따라 모두 수정 해 줘야 한다. 또, 객체지향과 관계형 데이터베이스의 패러다임이 다르다는 문제가 있다. 객체에는 상속이라는 개념이 있어 설계할 때 유용하게 사용할 수 있지만, 테..
[Spring Database] MyBatis
[Spring Database] MyBatis
2022.09.09MyBatis는 JdbcTemplate가 제공하는 대부분의 기능을 제공한다. SQL을 XML을 통해 관리하고, 동적 쿼리 문제를 쉽게 해결할 수 있다는 장점이 있다. 프로젝트에서 동적 쿼리와 복잡한 쿼리가 많이 사용된다면 MyBatis를 사용하는 편이 합리적이고, 단순한 쿼리가 대부분이면 JdbcTemplate을 사용하는 것도 괜찮다. #MyBatis mybatis.type-aliases-package=hello.itemservice.domain mybatis.configuration.map-underscore-to-camel-case=true logging.level.hello.itemservice.repository.mybatis=trace application.properties에 MyBatis 관..
[Spring Database] 데이터베이스 테스트
[Spring Database] 데이터베이스 테스트
2022.09.07데이터베이스를 연동한 상태에서 잘 동작하는지 확인하기 위해 테스트 코드를 작성 해 보자. 우선 test 디렉토리의 application.properties 파일에도 데이터베이스 관련 정보를 넣어 줘야 한다. spring.profiles.active=test spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.username=sa logging.level.org.springframework.jdbc=debug @SpringBootTest 애너테이션은 @SpringBootApplication 애너테이션을 찾아서 설정으로 사용한다. 테스트 시 로컬에서 사용하는 데이터베이스가 로컬에서 사용하는 데이터베이스가 겹치면서 테스트에서 문제가 발..
[Spring Database] JdbcTemplate
[Spring Database] JdbcTemplate
2022.09.06SQL을 자바 문자열로 직접 사용할 때 JdbcTemplate을 사용하면 편하다. JdbcTemplate은 spring-jdbc 라이브러리에 기본적으로 포함돼있어 별도의 설정 없이 바로 사용할 수 있고, 템플릿 콜백 패턴을 사용해 JDBC를 직접 사용할 때 발생하는 여러 가지 귀찮은 작업을 대신 처리해준다. (커넥션 획득, 스프링 예외 변환기 실행 등..) /** * jdbc template 구현 */ @Slf4j public class JdbcTemplateItemRepositoryV1 implements ItemRepository { private final JdbcTemplate template; public JdbcTemplateItemRepositoryV1(DataSource dataSource..