Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Spring/JPA활용 SpringBoot 기본

JPA와 DB 설정, 동작 확인

2021. 8. 9. 15:25

JPA와 DB 설정, 동작 확인 

 

H2 DB 설치 및 JPA DB 환경설정

 

(1) H2 설치 및 설정 
-> http://h2database.com/html/main.html 에서 설치
-> 설치후 h2콘솔에서 JDBC URL에서 
    -> Generic H2 (Embedded)로 설정한 이름을 붙여 실행
   ex) jdbc:h2:~/jpashop
    -> Generic H2 (Server)로 설정하고 나온대로 실행
   ex) jdbc:h2:tcp://localhost/~/jpashop

(2) JPA와 DB 환경설정

application.yml 만들기
yml은 YAML ain't Markup Language의 약자라고 하는데,  최근 스프링이나 쿠버 네티스의 '설정파일' 저장양식으로 많이 쓰인다고한다.

resources의 경로에 application.yml 파일을 만든다.

코드

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
#         show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

 

원래 JPA 시간에 배웠던 Persistence의 역할을 대체한다고 생각하면 된다. 
첨부해서 이번에 만들 application.yml과 비교해서 보면 좋을듯 하다.

Persistence

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpql"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

 


엔티티 생성 및 동작 확인


Member 엔티티 생성

 

코드

package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;
}



MemberRepository  생성

 

코드

package jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class MemberRepository {

    @PersistenceContext
    private EntityManager em;

    public Long save(Member member){
        em.persist(member);
        return member.getId(); // Id정도를 리턴하면 조회하기도 확인하기도 편함
    }

    public Member find(Long id){
        return em.find(Member.class , id);
    }

}

 

  • @Repository
    일종의 Component로, DB 연동과 관련있는 컴포넌트 어노테이션이다.
    DB와 연결되어 있고 컨테이너의 스캔 대상이 되고, 엔티티를 저장, 조회, 수정 등의 기능을 한다.
    (DAO class에 주로 붙여지는 어노테이션 인것 같다)
  • @PersistenceContext
    스프링부트를 쓰기 때문에 스프링 컨테이너 위에서 모든것을 처리해야 하는데, 이 어노테이션이 있으면 스프링 부트가 EntityManager를 알아서 삽입해준다. 

    비교 (SpringBoot를 사용하지 않고 Persistence, EntityManagerFactory, EntityManager, EntityTransaction 호출)
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
            EntityManager em = emf.createEntityManager();
            EntityTransaction tx = em.getTransaction();
            tx.begin();​
      
  • save, find 메소드는 JPA에서 배웠던 persist, find 함수를 사용해서 만들었음. save 이후 Id 리턴하는 디테일 확인


Test 파일 만들고 실행하기(MemberRepositoryTest)


=> 단축키 !! 기억 !! MemberRepository에서 커서가 있는 상태에서
Ctrl + Shift + t 를 누르면 자동으로 src.test.java.jpabook.jpashop 경로에 MemberRepositoryTest 파일을 생성해 줄 수 있도록 도와준다.

코드

package jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;

import javax.transaction.Transactional;


@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(false)
    public void testMember() throws Exception {
        // given
        Member member = new Member();
        member.setUsername("memberA");

        // when
        Long saveId = memberRepository.save(member);
        Member findMember = memberRepository.find(member.getId());

        // then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member);
        System.out.println("findMember == member: " + (findMember == member));
    }
}

 

  • @RunWith(SpringRunner.class)
    JUnit 프레임워크의 테스트 실행을 위해 사용되는 애노테이션이다. JUnit5에서는 필요 없다고 한다.
    이렇게 JUnit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면 JUnit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들과 관리하는 작업을 진행해준다. 고 한다. -from 토비의 스프링 3.1

  • @SpringBootTest
    스프링 부트에서 제공하는 통합테스트 어노테이션이다. 다른 기능 검증을 위한 단위 테스트 어노테이션 (@WebMvcTest, @DataJpaTest, @JsonTest 등)들 을 모두 종합한, 실제 운영 환경에서처럼 테스트가 가능하게 한다.

  • @Transactional
    DB 변화가 존재하고 알려주고 트렌젝션을 알아서 관리해준다.

  • @Autowired
    MemberRepository가 의존 자동 주입되도록 @Autowired 어노테이션을 붙여준다.
  • @Test
    Test 관련 어노테이션

  • @Rollback(false)
    Test파일은 원래 Create되었다가 실행이 끝나면 다 Rollback시켜서 DB상에서 데이터를 확인 할 수 없는데,
    사용자가 확인 할 수 있도록 @Rollback(false) 도 붙여준다.

  • testMember() 메소드 설명
    값을 넣고 조회하는 것은 MemberRepository를 이용해서 한다.
    Assertions.assertThat( ) 을 이용해서 값을 비교하는 검사를 진행할 수 있다.

    속성값으로 조회해도 되지만, 엔티티 (Member)단위로 조회해도 검사가 된다. 현재는 영속성 컨텍스트에 있는 member를 그대로 비교하기 때문에 equal은 모두 true이다.   

 


커스텀 단축키 만들기

 

위의 test() 메소드를 단축키로 생성할 수 있다면 더 빨리 테스트가 진행 될 수 있다.  

test()를 예시로 intelliJ에서 커스텀 단축키 만드는 법을 알아보자.

 

1. settings -> LiveTemplates 간다.
2. + 버튼을 누른다.
3. 먼저 TemplateGroup으로 custom을 만들어주자.
4. 다시 +버튼을 눌러서 Live Template을 만들어주자.
5. Template test:에 코드를 입력한다. 그리고 abbreviation에 단축키로 할 단축키 명을 지정한다.
6. 등록언어도 지정해주고(java), Use static import if possible도 체크해주자

커스텀 단축키 생성하는 모습

 

사용모습

 


로그 추가하기


1.
application.yml에서 

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

처럼   org.hibernate.type: trace를 추가한다.

binding parmeter에 대한 정보등을 보여줌


2. 
1번이 부족하다면 외부 라이브러리를 쓸 수도 있다.

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

에서 P6Spy 라이브러리를 가져와서 사용하자.

build.gradle에서  implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1' 을 의존설정해주자.

 

 

 

프로잭트 첨부

SpringBoot-Basic-main.zip
0.06MB



이 게시물은 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 수강하고 정리한 내용임을 밝힙니다.

출처: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 본

www.inflearn.com

 

    'Spring/JPA활용 SpringBoot 기본' 카테고리의 다른 글
    • 상품 도메인 개발, @Transactional에 대한 궁금증 해소
    • 회원 도메인 개발(레포지터리, 서비스, 테스트) && 의존주입 생략 과정, JUnit5를 이용한 테스트, 내부 DB로 전환
    • 도메인 분석 설계 (JPA를 활용해서 엔티티 클래스 개발)
    • 프로젝트 환경 설정
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바