H2 데이터베이스 설치
sql문
generated by default as identity
null 값이 들어오면 자동으로 id 세팅해줌

팁:sql ddl을 sql 파일을 만들어 관리한다.
순수 JDBC
자바가 DB랑 붙으려면 JDBC가 꼭 있어야한다
이번 강의에서는 과거에 사용하던 방식으로 구현을 했다.
JdbcMemberRepository
public class JdbcMemberRepository implements MemberRepository {
private final DataSource dataSource;
public JdbcMemberRepository(DataSource dataSource) {
this.dataSource = dataSource;
}
스프링부트가 데이터소스(접속정보)를 만들고 데이터소스를 주입받는다.
진짜 데이터베이스랑 연결된 정보를 얻을 수 있다.
이번 강의에서 제일 중요한 점은 JdbcMemberRepository 코드가 아니다.
SpringConfig 가 핵심이었다.
SpringConfig
@Configuration
public class SpringConfig {
//JdbcMemberRepository는 dataSource가 필요하다 이건 스프링이 제공해준다
//스프링부트가 프로퍼티즈 보고 자체적으로 dataSource 만들고 DI 해준다.
private final DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean //스프링빈 등록할거야
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
//return new MemoryMemberRepository(); //인터페이스는 new 안됨
return new JdbcMemberRepository(dataSource);
}
}
강의 초반에 비지니스 요구사항에서 DB가 정해지지 않아서 인터페이스와 구현체를 만들고 나중에 다른 리포지토리로 바꾸려고 계획을 했었다. 이를 가능하게 만드는 것이 스프링의 장점이다.
JdbcMemberRepository 와 SpringConfig 파일을 제외하고 어떤 코드도 손대지 않았다. 이 두 파일만 손대니 구현체를 바꿔끼울 수 있었다.


가장 중요한 개방 폐쇄 원칙(OCP) (확장에는 열려있고 수정, 변경에는 닫혀있다)를 지킬 수 있다.
스프링의 DI를 사용하면 기존 코드를 전혀 손대지 않고 설정만으로 구현클래스를 변경할 수 있다.
스프링 통합 테스트
@SpringBootTest
class MemberServiceIntegrationTest {
//스프링한테 멤버서비스, 멤버리포지토리 내놔 해야됨
//어떻게? DI 하기 근데 테스트는 끝단에 있는거라 편한 방법 사용함 @Autowired 사용
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository; //구현체는 SpringConfig에서 올라올거임
@Test
void 회원가입() { //테스트는 한글로 해도 상관무
//given
Member member = new Member();
member.setName("spring1");
//when
Long saveId = memberService.join(member);
//then
Member findMember=memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository; //구현체는 SpringConfig에서 올라올거임
스프링한테 멤버서비스, 멤버리포지토리 내놔 해야됨
어떻게? DI 하기 근데 테스트는 끝단에 있는거라 편한 방법 사용함 @Autowired 사용
구현체는 SpringConfig에서 올라오니까 인터페이스를 연결
이 상태로 테스트를 하면 에러가 난다. DB에 앞서 했던 데이터들이 저장되어있기 때문에 이미 존재하는 회원이라는 에러가 뜬다.
이미 존재하는 회원이라는 에러->db 삭제
실제로는 운영 db를 지우는게 아니라 테스트 디비 or 로컬 pc 디비를 돌려서 확인함
다시 실행하면 테스트는 통과되지만 다시 또 하면 에러가 난다. DB에 저장되어있기 때문
테스트는 여러번 계속 반복할 수 있어야한다! => @Transactional 사용
해결방법
DB는 트랜잭션이라는 개념이 있다. 커밋을 해야 DB에 반영이 된다. 커밋 하기 전까지는 반영이 안된다.
테스트 끝난 후에 롤백하면 DB 데이터가 다 날라간다 그래서 롤백해주는 어노테이션을 달면 해결이 된다.
@Transactional 을 달면 트랜잭션 후에 DB 쿼리를 다 하고 테스트 끝나면 롤백을 해준다. 그러면 DB 데이터가 반영이 안된다. 이 기능은 테스트에서만 적용됨
순수한 자바로만 하는 테스트:단위테스트
스프링컨테이너+DB까지 불러서 하는 테스트 :통합테스트
단위테스트가 훨씬 좋은 테스트다 계속 연습하는 게 중요
스프링 JdbcTemplate
람다식 변경 단축키 알트+엔터
마지막으로 실행했던 걸 다시 실행 단축키: 컨트롤+R
JdbcTemplate는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야한다.
JdbcMemberRepository의 코드와 JdbcTemplate를 활용해 만든 JdbcTemplateMemberRepository 파일을 비교해보면 JdbcTemplateMemberRepository 가 코드 단축이 엄청 됐다는 것을 알 수 있다.
이번 강의에서는 JdbcTemplate를 활용해서 코드 단축을 하고 SpringConfig에 구현체를JdbcTemplateMemberRepository 로 바꾸는 실습을 했다.
JPA
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
DB 쿼리에 insert into values~ 할때 name을 넣지, id는 넣지 않는다. id를 넣지 않아도 DB에서 자동으로 생성 해주는데 이러한 것을 IDENTITY 전략이라고 한다
spring.jpa.show-sql=true //Jpa가 날리는 sql을 볼 수 있다
spring.jpa.hibernate.ddl-auto=none //jpa가 객체를 보고 테이블을 만들어줌 근데 우린 이미 만들었으니까 끔
@Override
public List<Member> findAll() {
List<Member> result = em.createQuery("select m from Member m", Member.class)
.getResultList();
return result;
}
result 로 받고 result를 return 함 똑같으면 인라인 해주면 좋다
단축키:컨트롤+알트+N
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
select m from Member m 이 JPQL 쿼리문이다. 객체를 대상으로 쿼리를 날리는 것이다.
select m 객체 자체를 select 한게 포인트
PK 기반이 아닌 것들은 JPQL을 써야한다
JPA를 쓰려면 항상 트랜잭션이 있어야한다
JPA는 트랜잭션 안에서 다 실행되어야 한다
스프링 데이터 JPA
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
스프링데이터 JPA가 JpaRepository가 있으면 구현체를 자동으로 만들고 등록해준다. 그걸 그대로 가져다쓴다
스프링 데이터 JPA 제공 기능
1.인터페이스를 통한 기본적인 CRUD
2.findByName(), findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
3. 페이징 기능 자동 제공
'Springboot' 카테고리의 다른 글
| 스프링 핵심 원리-기본편 섹션 1. 객체 지향 설계와 스프링 정리 (0) | 2024.03.15 |
|---|---|
| 김영한 스프링 입문 섹션 7. AOP 정리 (0) | 2024.03.10 |
| 김영한 스프링 입문 섹션 5.회원 관리 예제-웹 MVC 개발 정리 (0) | 2024.03.08 |
| 김영한 스프링 입문 섹션 4.컴포넌트 스캔과 자동 의존관계 설정 정리 (1) | 2024.03.08 |
| 김영한 스프링 입문 섹션 3. 회원 관리 예제 실습 정리 (0) | 2024.03.07 |