JPA란?

현우·2021년 9월 14일
0

Spring 입문편

목록 보기
6/6

자바에서 어떤 방식으로 db와의 연결과 소통을 해서 디비를 사용할까?

JDBC API이다. 하지만 이 방식으로만 코딩하는 것은 굉장히 오래된 방법으로 어렵고 복잡하다. 따라서 MyBatis와 JPA를 사용하는데 전세계적으로 따질때 JPA를 더 많이 사용하는 추세이다.


1. JPA

JPA는 ORM(Object Relational Mapping)으로 SQL문 없이도 객체가 직접 DB와 연동이 되어 객체지향적이다.
JPA를 사용하면 JPA가 알아서 JDBC API를 사용해서 SQL 문 없이 통신한다.

자바 프로그램이 db와의 통신을 번역해주는 미들웨어라 볼 수 있다.

JPA를 사용하는 이유는 다음과 같다.

  • SQL과 데이터 중심적이 아닌 객체 중심적인 개발
  • 높은 생산성, 유지보수의 편리함
  • Object와 RDB간의 불일치를 해결

2. JPA 사용법

1. dependencies에 JPA를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// 이는 JPA뿐만 아니라 JDBC도 포함한다.

2. application.properties에 아래를 추가한다.

/project_name/src/main/resources/templates/application.properties에 아래를 추가한다.

spring.jpa.show-sql=true		// jpa가 변환한 sql문을 확인 가능하게 한다.
spring.jpa.hibernate.ddl-autu=none	// 객체를 보고 자동으로 테이블을 만드는 기능이다.

3. 어노테이션을 추가한다.

@Entity			// JPA가 관리할 entity를 선언해준다.
public class Member{
	
    @ID		primary ket를 mapping 한다.
    @GeneratedValue(strategy = GenerationType.IDENTITY)	// DB가 알아서 생성하게 한다.
    
    private Long id;
    
    @Column(name = "username")	// table 상의 column의 이름과 다른 경우 맵핑한다.
    private String name;
    
    ...
    ...
}

4. JPA 사용법

public class JpaMemberRepository implements MemberRepository {
	
    private final EntityManager em;	// properties와 DB와의 정보들이 연결되어 있는 무언가..?
    
	public JpaMemberRepository(EntityManager em) {
		this.em = em;		// spring boot에서 만들어준 entity manager를 가져온다.
	}
    
	public Member save(Member member) {
		em.persist(member);	// persist 사용시 DB에 member객체를 넣어준다.
        Member = member = em.find(Member.class, id)	// find(type, key값) 사용시 DB에서 검색 및 반환을 한다.
		return Optional.ofNullable(member);
 	}
    
}

key 값을 이용하지 않고 DB에서 검색하기 위해서는 SQL문을 작성을 해줘야 한다.

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();
   }
}


public List<Member> findAll() {	
	return em.createQuery("select m form Member as m", Member.class)
    		.getResultList;
 	} //  객체 자체를 대상으로 

0개의 댓글