JPA는 기존 반복코드도 줄여주고, 기본적인 sql문도 jpa가 직접 만들어서 실행해준다.
JPA사용시 sql과 데이터중심 설계에서 객체 중심의 설계로 패러다임 전환할 수 있다.
JPA사용시 개발 생산성을 크게 높일 수 있다.
JPA -> 자바진형의 표준인터페이스 구현해서 씀.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
build.gradle에 라이브러리 추가.(기본적으로 jdbc도 포함)
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
properties에서 설정 추가
1. jpa가 날리는 sql을 볼 수있음.
2. 객체를 보고 테이블도 만듦. but table 은 생성해놨기 때문에 끄고 시작.
JPA
객체 + ORM 기술 (Object relational mapping) 매핑-> 어노테이션으로.
@Entity // JPA 가 관리하는 Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 자동으로 생성해주는 것을 identity 전략이라고함.
private Long id;//System에 저장하는 ID
@Column(name = "username") //DB에 username에 매핑
private String name;
}
@Entity -> JPA가 관리하는 Entity
@GeneratedValue(strategy = GenerationType.IDENTITY) -> DB가 자동으로 값생성해주는거 설정
@Column(name = "username") -> member의 name이 DB의 속성 username과 mapping됨.
username이라는 칼럼 설정을 안해서(member에 오류가 뜸 -> user로 변경해서 해결)
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);//(조회할 타입,식별자 Pk값);
return Optional.ofNullable(member);
}
@Override//PK기반 이아닌것은 jpql문법으로 작성해줘야함.
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//PK기반 이아닌것은 jpql문법으로 작성해줘야함.
public List<Member> findAll() {
List<Member> result = em.createQuery("select m from Member m", Member.class)// 테이블 대상으로 X 객체 대상으로, select또한 객체를 리턴
.getResultList();
return result;
}
}
JPA 주의 사항
@서비스 계층에 Transactional 이 있어야함. (데이터를 저장하거나 변경할때)
@Transactional
public class MemberService {
서비스 클래스 앞에도 Transactional을 붙어 commit, rollback 가능하게 함.
@Configuration
public class SpringConfig {
private DataSource dataSource;// 스프링이 데이터베이스와 연결할수있는 dataSource를 만들어줌.(Jdbc계열)
private EntityManager em;
public SpringConfig(DataSource dataSource, EntityManager em) {
this.dataSource = dataSource;
this.em = em;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new JpaMemberRepository(em);
}
}
@Congfiguration 설정
1. Entity 매니저 주입
2. datasource도 잘 선언해줄것
평.
코드가 줄어든건 알겠는데 따로 깊이 공부를 해야할듯함..
스프링 데이터 JPA
- 인터페이스만으로 개발 완료 가능.
- CRUD기능도 제공해줌.
- 메서드 이름많으로 조회 기능 제공
-페이징 기능 제공
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>,MemberRepository {//인터페이스가 인터페이스를 받을땐 extends
//jpaRepository를 상속 받고있는 인터페이스가 있으면 스프링데이터JPA가 구현체를 자동으로 만들고 스프링빈에 등록해줌.
@Override
Optional<Member> findByName(String name);
}
스프링데이터 JpaMemberRepository
스프링데이터JPA가 JpaRepository를 상속받는 인터페이스를 보고 스프링빈을 자동으로 만들어서 올림..
최대한 일반화를 시켰지만 각각의 비즈니스로직이 다르기 때문에 모든것을 제공 X ex) findbyName,findByEmail
JPQL select m from Member m where m.name = ?
- > FindBy00 인터페이스 이름만으로 해결가능
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) { //스프링이 구현체 집어넣어줌.
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository);
}
스프링 configuration

JpaRepository 내부를 들여다보면 save, findbyID, 기본적인 CRUD가 제공되어있음
실무에서는 기본적으로 JPA와 스프링 데이터 JPA를 기본으로 사용. 복잡한 동적 쿼리는 Querydsl 이라는 라이브러리를 사용. or JdbsTemplate 을 사용하면 됨.
'Spring > 스프링입문' 카테고리의 다른 글
[스프링입문] 섹션7. AOP (0) | 2023.01.17 |
---|---|
[스프링입문] 섹션6-1. 스프링 DB 접근 기술 - Jdbc, JdbcTemplate (0) | 2023.01.17 |
[스프링입문] 섹션5. 회원관리 예제 - 웹MVC개발 (0) | 2023.01.17 |
[스프링입문] 섹션4. 스프링 빈과 의존관계 (2) | 2023.01.16 |
[스프링입문] 섹션3.회원 관리 예제 - 웹MVC개발 (0) | 2023.01.16 |
JPA는 기존 반복코드도 줄여주고, 기본적인 sql문도 jpa가 직접 만들어서 실행해준다.
JPA사용시 sql과 데이터중심 설계에서 객체 중심의 설계로 패러다임 전환할 수 있다.
JPA사용시 개발 생산성을 크게 높일 수 있다.
JPA -> 자바진형의 표준인터페이스 구현해서 씀.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
build.gradle에 라이브러리 추가.(기본적으로 jdbc도 포함)
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
properties에서 설정 추가
1. jpa가 날리는 sql을 볼 수있음.
2. 객체를 보고 테이블도 만듦. but table 은 생성해놨기 때문에 끄고 시작.
JPA
객체 + ORM 기술 (Object relational mapping) 매핑-> 어노테이션으로.
@Entity // JPA 가 관리하는 Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 자동으로 생성해주는 것을 identity 전략이라고함.
private Long id;//System에 저장하는 ID
@Column(name = "username") //DB에 username에 매핑
private String name;
}
@Entity -> JPA가 관리하는 Entity
@GeneratedValue(strategy = GenerationType.IDENTITY) -> DB가 자동으로 값생성해주는거 설정
@Column(name = "username") -> member의 name이 DB의 속성 username과 mapping됨.
username이라는 칼럼 설정을 안해서(member에 오류가 뜸 -> user로 변경해서 해결)
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);//(조회할 타입,식별자 Pk값);
return Optional.ofNullable(member);
}
@Override//PK기반 이아닌것은 jpql문법으로 작성해줘야함.
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//PK기반 이아닌것은 jpql문법으로 작성해줘야함.
public List<Member> findAll() {
List<Member> result = em.createQuery("select m from Member m", Member.class)// 테이블 대상으로 X 객체 대상으로, select또한 객체를 리턴
.getResultList();
return result;
}
}
JPA 주의 사항
@서비스 계층에 Transactional 이 있어야함. (데이터를 저장하거나 변경할때)
@Transactional
public class MemberService {
서비스 클래스 앞에도 Transactional을 붙어 commit, rollback 가능하게 함.
@Configuration
public class SpringConfig {
private DataSource dataSource;// 스프링이 데이터베이스와 연결할수있는 dataSource를 만들어줌.(Jdbc계열)
private EntityManager em;
public SpringConfig(DataSource dataSource, EntityManager em) {
this.dataSource = dataSource;
this.em = em;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new JpaMemberRepository(em);
}
}
@Congfiguration 설정
1. Entity 매니저 주입
2. datasource도 잘 선언해줄것
평.
코드가 줄어든건 알겠는데 따로 깊이 공부를 해야할듯함..
스프링 데이터 JPA
- 인터페이스만으로 개발 완료 가능.
- CRUD기능도 제공해줌.
- 메서드 이름많으로 조회 기능 제공
-페이징 기능 제공
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>,MemberRepository {//인터페이스가 인터페이스를 받을땐 extends
//jpaRepository를 상속 받고있는 인터페이스가 있으면 스프링데이터JPA가 구현체를 자동으로 만들고 스프링빈에 등록해줌.
@Override
Optional<Member> findByName(String name);
}
스프링데이터 JpaMemberRepository
스프링데이터JPA가 JpaRepository를 상속받는 인터페이스를 보고 스프링빈을 자동으로 만들어서 올림..
최대한 일반화를 시켰지만 각각의 비즈니스로직이 다르기 때문에 모든것을 제공 X ex) findbyName,findByEmail
JPQL select m from Member m where m.name = ?
- > FindBy00 인터페이스 이름만으로 해결가능
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) { //스프링이 구현체 집어넣어줌.
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository);
}
스프링 configuration

JpaRepository 내부를 들여다보면 save, findbyID, 기본적인 CRUD가 제공되어있음
실무에서는 기본적으로 JPA와 스프링 데이터 JPA를 기본으로 사용. 복잡한 동적 쿼리는 Querydsl 이라는 라이브러리를 사용. or JdbsTemplate 을 사용하면 됨.
'Spring > 스프링입문' 카테고리의 다른 글
[스프링입문] 섹션7. AOP (0) | 2023.01.17 |
---|---|
[스프링입문] 섹션6-1. 스프링 DB 접근 기술 - Jdbc, JdbcTemplate (0) | 2023.01.17 |
[스프링입문] 섹션5. 회원관리 예제 - 웹MVC개발 (0) | 2023.01.17 |
[스프링입문] 섹션4. 스프링 빈과 의존관계 (2) | 2023.01.16 |
[스프링입문] 섹션3.회원 관리 예제 - 웹MVC개발 (0) | 2023.01.16 |