▶ 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 |