Spring Data JPA 정리 1 _ 기본 및 개념

2022. 3. 10. 12:45·스프링/스프링 JPA 정리 시리즈

JPA란?

  • Jpa는 Java Persistence API 의 약자로 자바 영속성 API를 말한다. JDBC를 이용해서 데이터 베이스를 관리하는 인터페이스이고 이를 구현한 구현체로 대표적인것이 HIbernate이다.
  • 자바 ORM 기술의 표준 API 이다. (Object Relational Mapping)

 

Q. 그렇다면 Spring은 왜 JPA를 만들었을까?

과거에는 SQL 쿼리 중심적인 프로그래밍을 해왔었다. 이러한 방식에는 두가지 문제점이 존재했는데

1. SQL에 의존적인 프로그래밍

2. SQL과 객체사이의 패러다임 불일치

문제가 존재했다. 이를 해결하기 위해 등장했다.

 

예1)

엔티티 객체가 있고 이를 CRUD들을 하는 쿼리들이 여러개 있다고 하자. 이때 객체의 프로퍼티가 추가되거나 삭제되었다고 하면 각 쿼리들을 모두 수정해서 변경된 엔티티에 맞춰줘야 한다.

 

예2)

Meber객체가 있다고 해보자. 이 객체는 이름과 나이만 갖고 있는 객체이다. 이 객체와 테이블은 아래와 같은 구조를 갖게 될 것이다.

(객체)

@Entity
class Member {
	String name;
	String age;
}
---------------
(테이블)

[Member]
- - - - - 
[name]
[age]

이때, Member 테이블에 Team을 추가해달라고 요청이 왔다. 그래서 update Member TeamReqDto를 했다. 하지만 제대로 업데이트가 안됐는데 Member의 Team컬럼에 업데이트를 하지 않았기 때문이다. 또한 Team은 객체이므로 Team의 고유한 이름이나 PK를 넣어주도록 했어야 했다. 따라서 Team 객체에가서 getTeamName() 메소드를 추가해서 Member.setTeam(Team.getTeamName) 방식으로 해줘야 한다.

즉, 객체지향적인 개발이 아니라 테이블을 보며 SQL 관점으로 개발을 하게 된다.

 

예3)

회원이 참여하고있는 팀을 알고 싶을때 코드로 팀을 조회하는 방식과 쿼리로 팀을 조회하는 방식에서 많은 차이점이 존재한다. 이러한 간극을 패러다임, 임피던스 불일치라고 한다.

 

이에 Java Application과 JDBC사이에서 객체를 DB에 매핑시키기 위한 인터페이스가 등장하게 되었다.


Spring Data Jpa 사용해보기

스프링부트 + Gradle + H2를 이용해서 JPA를 사용해보자.

 

yml파일 작성

JPA 설정을 위해 application.yml을 작성해줘야한다.

spring:
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    url: jdbc:h2:tcp://localhost/~/sigma/h2_db	// h2 파일이 존재하는 위치
    driver-class-name: org.h2.Driver			// h2 드라이버 사용
    username: sa	// db user 이름
    password:		// db usr 비번
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    properties.hibernate:
      hbm2ddl.auto: update	// 애플리케이션이 시작할 때 DB를 어떻게 할 것인지 정해준다.
      format_sql: true		// sql 쿼리를 예쁘게 보여준다.
    show-sql: true			// sql 쿼리를 보여준다.
    open-in-view: false		// 트랜잭션이 끝난 객체를 준영속 상태로 만들어준다.

hbm2ddl.auto 에 가능한 방식으로

  • none (암것도 안함)
  • create (기존의 테이블을 전부 drop하고 ddl을 보고 만든다)
  • create-drop (create + 종료될 때 전부 drop한다)
  • update (변경된 부분만 확인해서 생성해준다)
  • validate (제대로 엔티티와 테이블이 매핑이 되는지만 확인해준다)

가 있다.

 

이제 회원 객체를 만들고, 해당 객체의 저장소를 JPA로 만들고 조회까지 해보도록 하겠다.

Mebmer 클래스

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long seq;

    @Column(unique = true, nullable = false)
    private String userId;

    @Column(unique = true, nullable = false)
    private String email;

    @Column(nullable = false)
    private String password;
}

회원 객체를 만들고 엔티티임을 명시해주고, 컬럼, PK, 등을 설정해준다.

 

Member Repository 인터페이스

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {

    Optional<Member> findByEmail(String email);

    Boolean existsByEmail(String email);
}

JpaRepository를 상속받으면 JPA 인터페이스를 사용할 수 있게 된다. 

기본적인 CRUD 메소드가 제공되고 추가적으로 객체의 프로퍼티를 이용해 하도록 메소드의 인터페이스만 작성해주면 된다. 그러면 자동적으로 쿼리가 짜져서 나간다.

 

Meber Repository Test 클래스

@ExtendWith(SpringExtension.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MemberRepositoryTest {

	@Autowired
	private MemberRepository memberRepository;

	private Member member;

	@BeforeEach
	void setUp() {
		// given
		member = Member.builder()
				.seq(1L)
				.email("test@test.com")
				.password("test1234!")
				.userId("testtest")
				.build();
		System.out.println("START-SAVE========================================================================");
		memberRepository.save(member);
		System.out.println("END-SAVE========================================================================");
	}

	@Test
	@DisplayName("회원 이메일 조회")
	void findByEmail() {
		// then
		System.out.println("START-QUERY========================================================================");
		Assertions.assertNotNull(memberRepository.findByEmail(member.getEmail()));
		System.out.println("END-QUERY========================================================================");
	}
}

회원을 저장하고 해당 회원을 이메일로 조회하는 테스트이다.

 

결과

START-QUERY========================================================================
Hibernate: 
    select
        member0_.seq as seq1_7_,
        member0_.activate_yn as activate2_7_,
        member0_.authorize_user_seq as authori10_7_,
        member0_.crdi_yn as crdi_yn3_7_,
        member0_.email as email4_7_,
        member0_.mypage_seq as mypage_11_7_,
        member0_.password as password5_7_,
        member0_.regist_date as regist_d6_7_,
        member0_.signup_type as signup_t7_7_,
        member0_.update_date as update_d8_7_,
        member0_.user_id as user_id9_7_ 
    from
        member member0_ 
    where
        member0_.email=?
END-QUERY========================================================================

정상적으로 수행되는 것을 확인할 수 있다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'스프링 > 스프링 JPA 정리 시리즈' 카테고리의 다른 글

Spring Data JPA 정리 5 _ 페이징 & 정렬  (0) 2022.03.18
Spring Data JPA 정리 4 _ JpaRepository  (0) 2022.03.16
Spring Data JPA 정리 3 _ 연관관계 매핑 (일대일, 다대일, 일대다, 다대다)  (2) 2022.03.14
Spring Data JPA 정리 2 _ 애노테이션  (0) 2022.03.12
'스프링/스프링 JPA 정리 시리즈' 카테고리의 다른 글
  • Spring Data JPA 정리 5 _ 페이징 & 정렬
  • Spring Data JPA 정리 4 _ JpaRepository
  • Spring Data JPA 정리 3 _ 연관관계 매핑 (일대일, 다대일, 일대다, 다대다)
  • Spring Data JPA 정리 2 _ 애노테이션
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    동유럽
    마우스
    mx master s3 for mac
    부다페스트
    키보드 손목 받침대
    류블라냐
    크로아티아
    마우스 패드
    레이저
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
Spring Data JPA 정리 1 _ 기본 및 개념
상단으로

티스토리툴바