스프링 DB 접근 기술
- 스프링 DB 접근 기술 사용 시대별 흐름
- Jdbc -> Spring JdbcTemplate -> JPA -> 스프링 데이터 JPA
- Jdbc : 자바에서 DB에 접속할 수 있도록 하는 자바 API
- Spring Jdbc Template : 자바에서 제공하는 애플리케이션에서 DB로 SQL을 편리하게 보낼 수 있는 기술
- JPA : SQL을 개발자가 직접 작성하지 않아도 쿼리를 자동으로 만들어주며 객체를 DB에 쿼리 없이 저장하고 관리할 수 있는 기술이다.
- 스프링 데이터 JPA : JPA를 편리하게 사용할 수 있도록 한 번 감싼 기술
- 프로젝트 최상위 디렉토리에서 패키지 sql에 ddl.sql 파일을 만들어서 sql 쿼리도 관리하는 것이 좋다.
- 만들어두면 Git을 통해서 함께 관리할 수 있어서 좋다.
Jdbc
- Jdbc 기술은 오래된 기술로 거의 사용하지 않기에 가볍게만 알아두고 필요할 때 찾아 쓰기....
- Jdbc 코드 흐름
- 생성자를 통해 DataSource를 스프링으로부터 주입받는다.
- dataSource를 통해 Connection을 가져온다.
- 스프링 프레임워크를 사용할 때는 Connection을 DataSourceUtils를 통해 가져오고 반환해야 한다.
데이터베이스 트랜잭션이 발생하면 동일한 커넥션으로 유지시켜주는 역할이다. - Connection에 만들어놓은 sql을 넣는다.
- sql 쿼리문에 값을 넣는다.
- executeUpdate()로 DB에 실제 쿼리를 보낸다.
- 사용한 자원 (Connection, ResultSet ...) 들을 반환한다.
- 생성자를 통해 DataSource를 스프링으로부터 주입받는다.
- 스프링 빈을 등록시 직접 등록하는 방식을 사용하면 얻는 장점
- 만약 Repository 인터페이스의 구현체가 변하는 경우 -> 다른 코드들은 수정할 필요 없이 @Configuration 클래스에서 Repository의 DI를 주입하는 @Bean 을 찾아서 그 부분만 수정해주면 된다.
- 당연히 Service에서는 구현체에 의존하면 안되고 Repository 인터페이스에 의존하도록 코드가 작성되어 있어야한다.
- 이렇게 작성한 코드는 OCP 원칙 (개방 - 폐쇄 원칙)에 적합한 코드가 된다.
- 만약 Repository 인터페이스의 구현체가 변하는 경우 -> 다른 코드들은 수정할 필요 없이 @Configuration 클래스에서 Repository의 DI를 주입하는 @Bean 을 찾아서 그 부분만 수정해주면 된다.
테스트 (DB 활용)
- 테스트 코드 작성 시 @SpringBootTest, @Transactional 어노테이션을 테스트 클래스에 선언해줘야 한다.
- @Transactional : 테스트 시작 전 트랜잭션을 시작하고 테스트 완료 후에 DB에 반영되지 않도록 항상 롤백하는 어노테이션이다.
- @Transactional 어노테이션을 사용함으로 테스트 간 서로 영향을 받지 않고 독립적으로 수행될 수 있도록 보장해주는 역할
- @Commit 어노테이션으로 트랜잭션을 커밋할 수 있다.
- @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행하게 해주는 어노테이션이다.
- 실제 스프링을 실행해서 테스트를 수행한다.
- 테스트 코드 작성 시에는 굳이 생성자 DI를 사용하지 않고 필드 DI와 같은 편한 방식을 사용해도 무관하다.
- 주로 테스트 용 DB를 따로 사용한다.
- 단위 테스트 : 스프링을 실행하지 않고, 스프링 컨테이너 없이 테스트하는 방식이다.
- 스프링을 실행하지 않고, 컨테이너 없이 테스트하기에 통합 테스트보다 더 빠르게 할 수 있다.
- 순수한 단위 테스트의 방식이 더 좋은 테스트일 확률이 높다.
- 통합 테스트보다 단위 테스트를 잘 만들어서 하는 것이 더 좋다.
- 통합 테스트 : 스프링을 실행하고 DB를 연동해서 테스트하는 방식이다.
스프링 JdbcTemplate
- Jdbc Template은 실무에서 종종 사용하지만 필요할 때 찾아서 사용하자...
- 스프링 JdbcTemplate의 특징
- 순수 Jdbc와 동일한 환경설정으로 구성한다.
- Jdbc API에서의 반복 코드를 대부분 제거해준다.
- SQL은 직접 작성해야 한다.
- Template Method Pattern과 Callback을 사용한다.
Template Method Pattern : 디자인 패턴 중 하나로 여러 클래스에서 공통으로 사용하는 메소드를 템플릿화하여 상위 클래스에 정의하고 하위 클래스마다 세부 동작 사항을 다르게 구현하는 패턴이다.
콜백 (Callback) : 피호출자가 호출자를 다시 호출하는 것으로 비동기적 처리를 하기 위한 디자인 패턴 중 하나다.
- Jdbc Template 사용 시
- 생성자를 통해 DataSource를 스프링으로부터 주입받고 JdbcTemplate 객체를 생성할 때 인자로 넣어준다.
- DB insert 쿼리는 메소드를 통해 만들 수 있다.
- DB 조회 쿼리는 sql을 작성하고 결과를 RowMapper로 매핑해줘야 한다.
- 생성자를 통해 DataSource를 스프링으로부터 주입받고 JdbcTemplate 객체를 생성할 때 인자로 넣어준다.
JPA
- JPA 장점
- 기존 반복 코드를 제거하고 기본적인 SQL도 만들어서 실행해준다.
- SQL과 데이터 중심 설계 -> 객체 중심 설계
- 개발 생산성 향상
- JPA 설정 (application.properties)
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
- show - sql => true로 설정 시 JPA에서 실행하는 SQL을 볼 수 있다.
- ddl - auto => JPA에서 객체를 보고 테이블을 생성하도록 할 수 있는 옵션
- JPA - 인터페이스, 구현체 - 하이버네이트, ....등이 있다.
- JPA는 ORM 기술을 사용한다.
- ORM(Object Relational Mapping) : 객체와 관계형 DB를 매핑한다.
- IDENTITY : DB에 값을 넣으면 ID를 자동으로 생성해주는 방식을 의미한다.
- JPA 사용 방법
- 도메인 클래스에 @Entity로 선언함으로 JPA와 매핑해준다.
- PK(Primary Key)를 설정하기 위해서 @Id로 해당 PK 변수에 선언해준다.
- 주로 ID 변수를 PK로 사용한다.
- IDENTITY 방식을 사용하려면 @GeneratedValue (stragtegy = GenerationType.IDENTITY)를 선언해준다.
- 객체의 변수명과 DB 컬럼명이 서로 다른 경우 매핑 시키기 위해서
이름이 서로 다른 경우 변수에 @Column(name = "DB컬럼명")으로 명시함으로 매핑해준다. - Repository에서 EntityManager 객체를 사용하기 위해서 주입받는다.
- JPA는 모든 것이 EntityManager를 통해서 동작한다.
- JPA 라이브러리를 추가하면 Spring Boot에서 EntityManager를 자동으로 만들어주고 만들어진 EM을 사용할 때 주입받아서 사용하면 된다.
- EntityManager 클래스의 메소드
- persist() : 영속하다, 영구 저장하다의 의미로 저장하는 용도로 사용된다.
- find() : PK로 검색하는 용도로 사용된다.
- JPQL : JPA에서 제공하는 SQL을 추상화한 객체 지향 쿼리 언어이다.
- SQL은 테이블 대상으로 쿼리를 날리지만 JPQL은 객체를 대상으로 쿼리를 날린다.
- PK가 아닌 변수로 검색 시 JPQL(객체 지향 쿼리)을 사용해야 한다.
- JPA 사용 시 트랜잭션이 항상 있어야하므로 서비스단에 @Transactional을 선언해줘야한다.
스프링 데이터 JPA
- 스프링 데이터 JPA 장점
- 레포지토리에 구현 클래스 없이 인터페이스만으로 개발할 수 있다.
- 기본 CRUD 기능을 제공한다.
- 기본 CRUD를 별도로 생성하지 않아도 된다.
- 인터페이스에 메소드를 선언할 때 메소드명, 반환타입, 매개변수등을 조합해서 JPQL을 작성해준다.
- 페이지 기능 자동 제공
- 관계형 DB 사용 시 필수일 정도로 편리하고 좋다.
- 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이기에 JPA 기본기를 먼저 쌓아놓고 사용해야 한다.
- 스프링 데이터 JPA가 JPA 기술을 가져다 쓰는 것이기 때문에 JPA가 기반이다.
- 스프링 데이터 JPA 사용 방법
- 레포지토리를 인터페이스로 생성한다.
- JpaRepository를 상속받고 있으면 자동으로 구현체를 만들어서 스프링 빈으로 등록해준다.
- JpaRepository를 상속받고 있으면 자동으로 구현체를 만들어서 스프링 빈으로 등록해준다.
- JpaRepository를 상속받는다. (추가적으로 기본 인터페이스가 있다면 그것도 상속받는다.)
- JpaRepository에 들어갈 제네릭타입으로 도메인 객체와 PK 타입을 적는다.
ex) JpaRepository<Member, Long>
- JpaRepository에 들어갈 제네릭타입으로 도메인 객체와 PK 타입을 적는다.
- 레포지토리를 인터페이스로 생성한다.
- 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용한다.
- 쿼리를 자바 코드로 안전하게 작성할 수 있다.
- 동적 쿼리를 편리하게 작성할 수 있다.
출처: [인프런 김영한 스프링 입문]
[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확
www.inflearn.com
'Spring > [인프런 김영한 스프링 입문]' 카테고리의 다른 글
[인프런 김영한 스프링 입문] AOP (2) | 2024.08.11 |
---|---|
[인프런 김영한 스프링 입문] 회원 관리 예제 - 웹 MVC 개발 (1) | 2024.08.09 |
[인프런 김영한 스프링 입문] 스프링 빈과 의존관계 (0) | 2024.08.09 |
[인프런 김영한 스프링 입문] 회원 관리 예제 - 백엔드 개발 (0) | 2024.08.09 |
[인프런 김영한 스프링 입문] 스프링 웹 개발 기초 (0) | 2024.08.08 |