dh2 데이터베이스를 이용한다.
h2 다운로드(1.4.200 버전)
https://www.h2database.com/html/download-archive.html
Archive Downloads
www.h2database.com
h2.sh의 권한 바꾸어 실행하기
페이지 로딩시에 잘 안뜨면 ip를 localhost로 바꾸어 실행하기
JDBC URL: jdbc:h2:tcp://localhost/~/Desktop/Develop/Spring/h2/test
(test.mv.db 있는 경로)
- 어차피 안되면 지웠다가 다시 만들어야하니까 기본 경로는 수정X
테이블 만들기
Member 테이블
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
스프링 설정
OCP
개방-폐쇄 원칙(OCP, Open-Closed Principle): 확장에는 열려있고, 수정, 변경에는 닫혀있다.
=> 새로운 것을 보태어 확장은 가능하지만 큰 구조를 수정할 수 없다.(구조에 맞춰 바꿔 끼우기 가능)
스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.
Test
@SpringBootTest: 실제 스프링 컨테이너와 테스트를 함께 실행한다.
=> 좋은 테스트는 컨테이너까지 올리지 않고 단위로 하는 테스트(작게작게 쪼갬)
DB 테스트 시에 @Transactional 어노테이션 이용하기
테스트 시에 db에 데이터를 집어넣고 테스트가 끝나면 트랜잭션을 rollback한다.
=> 테스트 여러번 반복 가능, 테스트 시에만 롤백된다.
package mae.springstart;
import mae.springstart.domain.Member;
import mae.springstart.repository.MemberRepository;
import mae.springstart.service.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired
MemberService memberService;
@Autowired
MemberRepository memberRepository;
@Test
public void 회원가입() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void 중복_회원_예외() throws Exception {
//Given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//When
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));//예외가 발생해야 한다. assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
JDBC Template
실무에서도 사용한다.
순수 jdbc에서 반복되는 코드를 제거해주는 라이브러리이다. 순수 jdbc와 환경설정은 같다.
SQL은 직접 작성해야한다.
DB 연결
resources/application.properties 에 추가하기
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
의존성 추가
Repository
JdbcTemplateMemberRepository.java 파일 만들기
DI : dataSource 주입
stream의 findAny() : 맨 처음 찾은 1개 반환
[JAVA] Stream - findAny()와 findFirst()의 차이점
Stream에서 어떤 조건에 일치하는 요소(element) 1개를 찾을 때, findAny()와 findFirst() API를 사용할 수 있습니다. findAny()는 Stream에서 가장 먼저 탐색되는 요소를 리턴하고, findFirst()는 조건에 일치하는
devjjsjjj.tistory.com
java의 스트림이란: 데이터의 흐름, iterator 직접 사용하는 것이 아닌 내부 반복자를 이용하므로 간결한 코드,
람다식 지원
https://steady-coding.tistory.com/309
Stream이란? - 기본 개념과 특징 (JAVA)
안녕하세요? 코딩중독입니다. 저번 시간에는 주요 함수적 인터페이스를 알아 보았는데, 오늘부터는 람다가 아닌 스트림에 대한 이야기를 하려고 합니다. Stream이란? 스트림의 사전적 의미는 '흐
steady-coding.tistory.com
결과 매핑하는 함수
db를 JdbcTemplate을 이용한 레포지토리로 바꾼다.
db의 ./h2.sh를 켜는 것을 잊지 말자
JPA
반복코드 + 기본적인 sql 쿼리까지 처리해준다.
객체 중심의 설계 가능
개발 생산성을 크게 높일 수 있다.
jpa vs mybatis
django vs spring boot
의존성 추가
jdbc -> data-jpa로 수정(기존 jdbc를 포함하면서 jpa까지 사용 가능)
application.properties
jpa가 생성하는 sql을 보여주고, jpa가 테이블까지 자동으로 만들지 않게(none) 설정
Entity
데이터베이스와 domain의 member를 매핑한다
@Entity 어노테이션과 Entity에 필요한 @Id는 자동으로 jpa가 생성하도록(IDENTITY)한다.
JPA Repository 만들기
Entity Manager를 주입받아야한다. (entity manager가 db연결하고 쿼리 날리고 다 한다.)
굉장히 편하다.
name과 member entity를 찾을때는 jpa sql을 날려야 하지만 그래도 편하다.
jpa를 사용할때는 Service에 @Transactional 어노테이션이 꼭 필요하다.
레포지토리의 메소드는 기본으로 트랜잭션 단위이지만,
롤백은 @Transactional 어노테이션 수행할때만 가능하다.
출처: https://joanne.tistory.com/218
서비스에 @Transactional을 선언한 경우와 선언하지 않은 경우의 JPA save 동작
서비스에 트랜잭션이 달린 경우 // postService.java @Transactional public void save() { repository.save(something); } 2021-08-22 15:54:08.656 DEBUG 9192 --- [ http-nio-8080-exec-1 ] o.s.o.j.JpaTransactionManager : Creating new transaction with n
joanne.tistory.com
레포지토리 바꾸기
DataSource가 아닌 EntityManager를 주입하자.
테스트 (기존 테스트 이용)
Integration Test 시에 정상적으로 sql을 날리는 것을 볼 수 있다.
스프링 데이터 JPA
리포지토리에 구현 클래스 없이 인터페이스만으로 개발 완료 가능
기본 CRUD 기능도 제공한다.
현직에서 많이 쓴다.
jpa를 배우고 나서 데이터 jpa를 알자.
spring data jpa가 자동으로 빈을 만들어준다.
데이터베이스 바꾸기
MemberRepository를 주입한다(이미 빈으로 만들어짐). Service에 사용한다.
흐름
순수 JDBC -> 스프링 통합 테스트 -> 스프링 JdbcTemplate -> JPA -> 스프링 데이터 JPA
'Spring > 스프링 입문' 카테고리의 다른 글
AOP (0) | 2023.01.24 |
---|---|
웹 MVC 개발 (0) | 2023.01.22 |
스프링 빈과 의존관계 (0) | 2023.01.22 |
회원 관리 - 백엔드 개발 (0) | 2023.01.22 |
스프링 웹 개발 기초 (0) | 2023.01.21 |