반응형
스프링 DB
JPA
- JPA 기존의 반복코드는 물론 , 기본적인 SQL도 JPA가 처리를 해줌
- SQL, 데이터 중심 설계에서 객체 중심의 설계로 패러다임 전환 할 수 있음
- JPA는 표준 인터페이스 / 구현체로 hibernate가 있음
- JPA은 ORM(객체랑 관계형 데이터베이스) 기술
설치
gradle 의존성 추가 (~~ data-jpa)
application.properties 에 jpa 설정 추가
spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none
ex>
package com.example.jieundemo.webservice.domain.posts;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.annotation.Id;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "userName",length = 500, nullable = false)
private String name;
public void setId(Long id){
..
}
...
}
DB와 매핑될 자바 클래스를 만든다. 이 자바클래스가 Entity클래스 라고 함
JPA 어노테이션
- @Entity
- 테이블과 링크될 클래스
- _ 으로 이름을 매칭함
- 이제부터 JPA가 관리하는 엔티티
- @Id
- pk필드
- @GeneratedValue
- pk생성 규칙
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- insert할 때 db가 id를 자동 생성해줌 >> identity 하고 한다. 이 전략을 취하겠다.
- @Column
- 테이블 컬럼을 나타내면 굳이 선언하지 않더라고 해당 크래스의 픽드는 모두 컬럼이 된다.
- 기본값이외에 변경필요한 옵션이 있음 사용함
- @Column(name = "userName",length = 500, nullable = false)
- name = 이거 없으면 컬럼명은 그냥 name/ 있으면 컬럼명 userName으로 매핑된다.
package com.example.jieundemo.webservice.domain.posts;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
private final EntityManager em;
...
@Override
public Member save(Member member){
em.persist(member);
return member;
}
@Override
public Optional<Member> findById (Member member){
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
@Override
public Optional<Member> findByName(Member member){
return em.createQuery(qlString: "select m from Member m where m.name = :name", Member.class)
.setParameter(name:"name",name)
.getResultList();
}
@Override
public List<Member> findByAll(Member member){
return em.createQuery(qlString: "select m from Member m", Member.class)
.getResultList();
}
}
EntityManager
이란 ?JAP는 EntityManager로 모두 동작한다. application.properties 에 jpa 설정을 했다면 스프링 부트가 자동으로 세팅을 해줌
위와같이 save 함수를 적으면 JPA가 insert 쿼리를 만들어 넣어준다.
findById 함수는 조회 (pk)
findByAll 은 jpql이라는 객체지향 쿼리를 써야한다.
- 객체 대상으로 쿼리를 날림
- Memeber 라는 Entity를 조회함 , 객체 자체를 쓴다.
주의사항 : 데이터를 저장하고 변경할때는 항상 @ransactional이 있어야한다. (~Service.class 에 넣어준다)
https://jojoldu.tistory.com/251?category=635883 / 김영한의 스프링 (인프런)
반응형
'개발(라이브러리,프레임워크) > Spring boot' 카테고리의 다른 글
로그인 세션관리 구현(Interceptor, jwt 토큰) (1) | 2021.06.28 |
---|---|
vsCode 에서 JUnit Test (0) | 2021.05.26 |
Bean 생성 관리 (0) | 2021.03.29 |
intellij 초기 설정 , vue.js와 연동 (0) | 2021.03.28 |
xss filter & Interceptor (0) | 2020.01.09 |