-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (6) 스프링 DB 접근 기술Back-End/Spring 2022. 8. 21. 23:27
📚 H2 데이터베이스 설치
1) https://www.h2database.com/html/download-archive.html
1.4.200 버전 설치
2) h2\bin 디렉토리에서 h2.bat 실행
h2\bin> h2.bat
만약, 접속이 안될 경우 주소창의 IP 주소를 localhost로 바꾸어주면 된다.
3) 연결 클릭
4) 새 cmd 창을 열어 dir
test.mv.db 가 생성되어있는 것을 확인
5) 소켓을 통해 접근할 수 있도록 url 변경
jdbc:h2:tcp://localhost/~/test
🔸 TABLE 생성
CREATE TABLE member ( id BIGINT GENERATED BY DEFAULT AS IDENTITY, name VARCHAR(255), PRIMARY KEY (id) );
MEMBER table이 생성된 것을 확인
GENERATED BY DEFAULT AS IDENTITY
id BIGINT GENERATED BY DEFAULT AS IDENTITY : id 값이 들어오지 않으면 DB가 자동으로 Default 값을 채워넣어줌
🔸 TABLE 조회
SELECT * FROM MEMBER;
🔸 TABLE에 데이터 넣기
INSERT INTO MEMBER(name) VALUES('spring');
📚 순수 Jdbc
build.gradle의 dependencies에 추가
spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa
🔸 Jdbc
자바 프로그램과 DB를 연결할 때 필요한 driver
🔸 repository에서 DB로 메모리를 변경하는 방법
1) MemberRepository interface를 구현한 JdbcMemberRepository class 생성
public class JdbcMemberRepository implements MemberRepository
2) configuration만 수정하면 된다!
spring에서 제공하는 DataSource를 생성하여 memberRepository에 DI해준다.
private DataSource dataSource; @Autowired public SpringConfig(DataSource dataSource) { this.dataSource = dataSource; }
@Bean public MemberRepository memberRepository() { // return new MemoryMemberRepository(); return new JdbcMemberRepository(dataSource); }
실행 결과 : DB에 잘 연결된다.
🔸 Spring (객체 기반)
- 개방-폐쇄 원칙확장에는 열려있고, 수정과 변경에는 닫혀있다.
- spring의 DI를 상요하면 기존 코드의 수정 없이 설정만으로 interface 구현 클래스를 변경할 수 있다.
📚 스프링 통합 테스트
스프링과 연결된 DB까지 통합된 테스트 진행
@SpringBootTest
: 스프링 컨테이너와 테스트를 함께 실행
@Transactional
: 테스트 케이스에서 사용하면 test를 시작하기 전에 transaction을 시작하고, test가 완료되면 rollback
▶ test 후에 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지않고 반복 가능
📚 스프링 JdbcTemplate
Jdbc 코드를 축약하여 간단하게 사용할 수 있도록 해주는 template
@Override public Optional<Member> findById(Long id) { List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper()); return result.stream().findAny(); }
📚 JPA (Java Persistence API)
- JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
- JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
- JPA를 사용하면 개발 생산성을 크게 높일 수 있다.
🔸 ORM (Object Relational Database Mapping)
JPA는 ORM이다!
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것
🔸 JPA 라이브러리 추가
◾ build.gradle
dependencies
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
◾ application.properties
spring.jpa.show-sql=true // sql을 볼 수 있음 spring.jpa.hibernate.ddl-auto=none // 테이블을 자동으로 생성
- 예제에서는 미리 만들어져있는 테이블을 사용할 것이므로 ddl-auto는 none으로 설정
◾ hibernate
JPA(표준)는 interface로 제공되기 때문에 이를 구현하는 hibernate(기업) library 필요
🔸 persistence 관련 annotation
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // system이 회원을 구분하기 위해 부여하는 식별자 id private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
@Entity
: JPA가 관리하는 Entity
@Id
: 해당 property가 PRIMARY KEY임을 나타냄
@GeneratedValue
: PRIMARY KEY의 값을 DB가 자동으로 생성해주는 경우 명시
- strategy : persistence provider가 Entity의 primary key를 생성할 때 사용할 생성 전략
- generator : @SequenceGenerator나 @TableGenerator annotation에서 명시된 primary key 생성자를 재사용할 때 사용됨
👀 DB의 column 명과 property 명이 다를 경우
@Column annotation을 사용하여 매핑해준다.
@Column(name = "username") private String name;
🔸 EntityManager
- JPA library가 DB connection 정보, data source, sql 설정 등을 조합하여 EM(EntityManager를 알아서 만들어준다.
- JPA를 사용하려면 EM을 DI받아 사용해야 한다.
em.find()
: primary key로 데이터를 조회하는 경우 사용
em.find(조회할 데이터 타입, key);
em.createQuery()
: primary key가 아닌 property로 데이터를 조회하는 경우 사용
em.createQuery(qlString, 조회 데이터 타입) .getResultList(); // 조회된 데이터 목록을 얻어옴
🔸 Transaction
데이터를 저장하거나 변경할 때에는 꼭 @Transaction을 사용해야 한다.
📚 스프링 데이터 JPA
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { @Override Optional<Member> findByName(String name); }
JpaRepository interface를 상속한 SpringDataJpaMemberRepository interface를 발견하면 SpringDataJpa가 구현체로 만들어 스프링 빈에 등록
🔸 Spring Data JPA
◾ JpaRepository interface
- find, save, delete, get 등의 대략적인 메서드 정의
- PagingAndSortingRepository interface 상속
- 🌟 Spring Data JPA가 이 interface를 상속하는 interface의 구현체를 자동으로 생성해준다.
🔸 Spring Data
◾ Repository interface
◾ CrudRepository interface
- save, find, exists, count, delete 등의 메서드 정의
- Repository interface 상속
◾ PagingAndSortingRepository interface
- findAll 메서드 정의
- CrudRepository interface 상속
🔸 SpringDataJpaRepository 정의 방법
만약, 내가 정의한 property로 데이터를 조회하는 메서드를 정의하고 싶은 경우
@Override Optional<Member> findByName(String name);
@Override Optional<Member> findByNameAndId(Spring name, long id);
JPQL : select m from Member m where m.name=?
🔸 스프링 데이터 JPA 제공 기능
- 인터페이스를 통한 기본적인 CRUD
- findByName(), findByEmail()처럼 메서드 이름 만으로 조회 기능 제공
- 페이징 기능 자동 제공
'Back-End > Spring' 카테고리의 다른 글
스프링 핵심 원리 - 기본편 (1) 객체 지향 설계 스프링 (0) 2022.08.21 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (7) AOP (0) 2022.08.21 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (5) 회원 관리 예제 - 웹 MVC 개발 (0) 2022.08.14 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (4) 스프링 빈과 의존관계 (0) 2022.08.14 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (3) 회원 관리 예제 - 백엔드 개발 (0) 2022.08.14