-
23강. JPA스프링 프레임워크-입문 2021. 5. 6. 15:51
Jdbc Templatae를 사용하면 어느정도 코드의 반복정인 양을 줄일 수 있습니다. 하지만 우리가 줄이지 못한 것이 하나 있습니다. 바로 개발자가 SQL 구문을 직접 작성을 해야한다는 점입니다. JPA를 사용하면 SQL 쿼리를 자동으로 처리를 해줍니다. 즉 개발 생산성을 크게 올릴 수 있습니다.
JPA를 사용하면 단순히 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있습니다.
JPA와 MyBatis를 비교한 것입니다. 글로벌적으로는 JPA가 압도적으로 높습니다. MyBatis의 비중은 중국과 한국이 맡은 파트입니다.
Spring과 JPA는 각각 엄청난 깊이가 있는 학문입니다. 배우는 시간이 오래걸리는 것은 당연한 것입니다.
JPA를 사용하기 위해서 의존성을 추가해주겠습니다.
기존의 Jdbc 의존성을 삭제하고 data-jpa를 추가하겠습니다.
그 후 JPA와 관련된 설정들을 application.properties에 추가해주도록 하겠습니다.
spring.jpa.show-sql=true
-> JPA가 날리는 SQL구문을 LOG로 확인하겠다는 구문입니다.
spring.jpa.hibernate.ddl=auto=none
jpa를 사용하면 회원 객체를 보고 테이블을 만듭니다. 하지만 우리는 사용하지 않겠습니다.
External Library에서 JPA가 잘 들어갔는지 체크해보겠습니다.
JPA와 hibernate가 다운로드 된 것을 확인할 수 있습니다.
JPA라는 것은 간단히 말하면 인터페이스입니다. 구현 기술들은 여러 것들이 있고 JPA 인터페이스의 Hibernate가 사용하는 것입니다.
JPA는 객체랑 ORM이라는 기술입니다. (Object Relational Mapping) 어떻게 매핑을 하는지 이제 알아보도록 하겠습니다.
Member 클래스로에서 JPA가 알아볼 수 있게 @Entitiy 어노테이션을 줍니다. 그러면 에러가 발생할 것인데
아래의 코드를 추가합니다. 기준이 되는 것에 @Id 어노테이션을 명명하고 @GeneratedValue(strategy =GenerationType.IDENTITY)를 명시합니다. IDENTITY 전략이란 DB에게 id 순번을 맡기는 것을 말합니다. (우리가 임의로 만드는 것이 아니라 DB가 자동으로 만들어 주는 것)
만약 자바의 필드와 DB의 컬럼명과 다르다면 아래와 같은 방식으로 지정을 해줄 수 있습니다.
이렇게 명시를 해주면 매핑이 가능합니다. 하지만 우리는 DB와 이름이 같기 때문에 삭제하도록 하겠습니다.
JPA는 @Entity어노테이션이 명시된 클래스를 가지고 SELECT, INSERT, UPDATE, CREATE 등을 수행할 수 있습니다.
JpaMemberRepository 클래스를 생성합니다. 구후 MemberRepository를 받아 구현하도록 하겠습니다.
JPA는 EntityManager로 모두 동작합니다.
우리가 아까 추가한 data-jpa를 라이브러리로 추가하면 스프링 부트가 자동으로 EntityManger를 생성을 해줍니다.
즉 JPA를 사용하려면 EntityManger를 주입 받아야 합니다.
그 후 Injection을 위해 생성자를 생성합니다.
* 전에 말했듯이 생성자가 하나일 경우 @Autowired를 생략해도 주입이 됩니다.
member를 저장하도록 합니다. 이런 구문을 작성을 하면 Insert 구문을 알아서 작성하고 Id까지 자동으로 setId 처리를 해줍니다.
em.find()를 사용하면 SELECT문이 나가는 것입니다.
Optional로 반환을 할 것이기에 return문을 수정해줍니다.(값이 없을 수도 있기 때문에)
findAll()과 findByName() 구문 같은 경우는 특정한 JPQL과 같은 객체지향 쿼리 언어를 사용홰야합니다.
위의 코드를 좀 설명을 하자면 "SELECT m FROM member m" 이구문이 JPQL이라는 객체지향 쿼리 언어입니다. 보통 테이블 대상으로 쿼리를 날리는데 이것은 객체(Entity)를 대상으로 쿼리를 날립니다. 그 후 SQL로 번역이 됩니다.
기존의 SQL과는 구문이 좀 다른 점이 보이는데요 SELECT * FROM member AS m 이런식으로 작성이 됬을 것인데 JSQL은 그렇지 않습니다. SELECT의 대상이 m이라는 것이 들어간 것이죠 즉 m Member 객체 자체를 조회하겠다는 것입니다.
fidAll()과 거의 비슷합니다. Member.class에서 JSQL쿼리문을 조회하고 그 결과 값을 받아 하나만을 리턴해야하기에 스트림을 한 후에 반환합니다.
PK 기반이 아닌 것들은 JSQL을 작성해야합니다. JPA 기술을 Spring에서 감싸서 보내는데 Spring Data JPA 기술입니다.
JPA를 사용할 때 주의점이 하나있는데 바로 @Transational이 있어야 한다는 것입니다. 우리는 MemberService에 붙여주도록 하겠습니다.
구동하기전 Spring Config를 수정해주도록 합니다.
연결이 완료되었으니 통합 테스트를 실행해보겠습니다.
정상적으로 실행이 되는 것을 확인할 수 있습니다.
또한 SQL 구문이 들어간 것을 LOG로 확인해볼 수 있습니다.
@Transational이 되어 있어 롤백이 되지만 확실하게 DB에 올라가는 지를 체크해보기 위해 @Commit 어노테이션을 명시하겠습니다.
@Commit 어노테이션을 사용하면 확정적으로 DB에 올라가는 것을 확인할 수 있습니다.
DB에 확인해보니 값이 정상적으로 올라간 것을 확인할 수 있습니다.
값이 중복되어 그 전의 값과 혼동이 온 것일 수도 있으니 값에 변경을 주겠습니다.
정상적으로 들어간 것을 확인할 수 있습니다.
JPA는 크고 작은 회사들도 많이 사용됩니다.
JPA는 Spring만큼 공부할 것이 많기 때문에 실무에서 사용하려면 공부를 해야합니다.
'스프링 프레임워크-입문' 카테고리의 다른 글
22강. 스프링 Jdbc Template (0) 2021.05.06 21강. 스프링 통합 테스트 (0) 2021.05.06 20강. 순수 JDBC (0) 2021.05.06 19강. H2 데이터베이스 설치 (0) 2021.05.05 18강. 회원 웹 기능 - 조회 (0) 2021.05.05