Spring/spring_old

07./ Spring Web MVC-DB연계-JPA

slow333 2023. 1. 13. 22:59

▶ JDBC(try catch, 중복 slq 등으로 아주 복잡함)

▶ JDBC Template(쿼리 중복제거, 알아서 예외처리...)

▶ JPA(쿼리 최소화, jdbc 포함, 객체로 처리)

 

** 전반적으로 sql을 작성하는데 필요한 PreparedStatement를 통한 입력시 발생하는 변환과정이 없어 애러가 적음

** 몇가지만 외우면 간단한 쿼리문은 처리 가능함

** 복잡한 쿼리는 직접 처리해야함

1. build.gradl에 추가(내부 적으로 jdbc를 갖고 있어 불러올 필요없음)

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'mysql:mysql-connector-java'

   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2. application.properties에 jpa 객체 생성을 위한 정보 설정

# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB Source URL
spring.datasource.url=jdbc:mysql://localhost:3306/memberservice
# DB username
spring.datasource.username=kalpa
# DB password
spring.datasource.password=dongwook0#

### JPA 설정 내용 ######
# true JPA sql을 보여줌
spring.jpa.show-sql=true
# DDL(create, alter, drop) 자동 생성-이미 생성되어 있으니까.
spring.jpa.hibernate.ddl-auto=none
# DB에서 처리되는 SQL을 보여줌
spring.jpa.properties.hibernate.format_sql=true

3. JpaMemberRepository를 생성함

SQL 처리를 대부분 내부에서 해줌

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);
    return member;
  }

  @Override
  public Optional<Member> findById(Long id) {
    Member member = em.find(Member.class, id);
    return Optional.ofNullable(member);
  }

  @Override
  public Optional<Member> findByName(String name) {
    List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
            .setParameter("name", name)
            .getResultList();

    return result.stream().findAny();
  }

  @Override
  public List<Member> findAll() {
    return em.createQuery("select m from Member  m", Member.class)
            .getResultList();
  }
}

4. domain 객체를 수정(Member class)

  *** 생성되는 맴버변수의 이름과 DB의 이름이 다르면 안됨

     해당되는 변수에 => @Column(name="DB column 이름")으로 수정해주어야함(대소문자 구분)

@Entity
public class Member {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name ="name")
  private String name;

  @Column(name = "regdate") //db와 이름이 서로 달라서 맞추어 줘야함(대소문자 구분)
  private Date regDate= new Date(); // 자동으로 새로운 날짜를 생성

  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;  }
  public Date getRegDate() {   return regDate;  }
  public void setRegDate(Date regDate) {  this.regDate = regDate; }

  @Override
  public String toString() {
    return "Member{ id=" + id + ", name=" + name +
            ", regDate=" + regDate +'}';
  }
}

 

'Spring > spring_old' 카테고리의 다른 글

02./ Spring folder 구조  (0) 2023.01.14
07./ Spring Web MVC-DB연계-Spring DATA JPA  (0) 2023.01.14
07./ Spring Web MVC-DB연계-jdbc template  (0) 2023.01.13
07./ Spring Web MVC-DB연계  (0) 2023.01.12
06./ Spring Web MVC  (0) 2023.01.12