drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity, // 자바에선 Long이 여기선 bigint
name varchar(255),
primary key (id)
);
이 친구는 너무 오래된 기술이라 편하게 강의만 듣기
자바는 DB에 접근하려면 JDBC드라이버가 필요하다.
임폴트가 안되면 스프링 안에 좌측에 있는 코끼리 누르기~~
결국 이론적으로 보면 데이타소스에 getConnection()으로 연결 한 다음 쿼리문을 통해 DB 에 저장하는 방식으로 진행한다.
결국, 쿼리문을 알아야함 (SQL문)
사실 이미 다 발전되었기 때문에 이 친구는 공부할 필요성이 적다.
스프링의 장점??
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assert;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.IllegalFormatException;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void 회원가입() {// 테스트는 한글로 적어도 된다.
// given,when,then 문법 (주석)(어떤것이 주어졌는데 (이런데이터를 기반으로 하는구나) = given, 이것을 실행했을때(검증하려는 것) = when, 결과가 이게 나와야해 =then)
Member member = new Member();
member.setName("hello");
// when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void 중복_회원_예외() {
//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));// 뒤에있는 로직을 실행을 할건데, 앞에있는 오류가 터져야한다.
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// try {
// memberService.join(member2);
// fail();
// } catch (IllegalStateException e){
// Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
//then
}
}
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
domain/Member에 멤버 클래스 위에 @Entity
애노테이션 추가
@Id
는 이친구를 pk로 사용하겠다는 애노테이션
@GeneratedValue(strategy = GenerationType.*IDENTITY*)
는 DB가 프라이머리 키를 자동으로 생성해준다 라는 의미. 없으면 생성 x
속성값 찾는 방법
- ex) username이라는 속성을 찾을 때
- @Column(name = “username”)
package hello.hellospring.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Configuration
public class SpringConfig {
private EntityManager em;
public SpringConfig(EntityManager em) {
this.em = em;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new JpaMemberRepository(em);
}
}
public class JpaMemberRepository implements MemberRepository{
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member); // .persist ==> 영구 저장하다.
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id); // id로 멤버객체 찾은 후 반환
return Optional.ofNullable(member);
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member as m where m.name", Member.class)
.setParameter("name",name).getResultList(); // 저 문장을 sql로 바꿔서 실행 - > 이름으로 찾은 리스트
return Optional.empty();
}
@Override
public List<Member> findAll() {
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList(); // 저 문장을 sql로 바꿔서 실행 ->전체 리스트
return result;
}
@Override
public void clearStore() {
}
}
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository);
}
}