Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

JPA, DB 설정 및 실행하기 본문

인프런/[인프런] Springboot와 JPA활용 1

JPA, DB 설정 및 실행하기

Seung__ 2021. 8. 5. 17:05

1. application.yml, 설정하기


  • datasource 설정
 datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    driver-class-name: org.h2.Driver

 

 --> datasource의 url을 명확하게 h2 콘솔에서 접근하는 url과 동일하게 입력해주자.

 --> url이 달라서 H2와 연결이 되지 않아

ApplicationContext load fail 발생

  • jpa 설정
  jpa:
    hibernate:
      ddl-auto: create
    Properties:
      hibernate:
        show_sql: true
        format_sql: true

- ddl-auto : table 자동 생성 여부
- ddl-auto : create --> 항상 table 생성, 애플리케이션 실행 시 이전 entity 싹~지우고 다시만듦.

 

 

JPA/Hibernate 초기화(ddl-auto, initialization-mode 등)

0. Hibernate JPA의 구현체로 jpa를 한번 감싸서 사용하기 쉽게 해줌 JPA 소개 1. ORM(Object Relational Mapping)  객체와 관계형 Database를 자동으로 mapping시켜주는 것을 말한다.  객체지향 프로그래밍의..

bsh-developer.tistory.com

- show_sql, format_sql : log 찍기, System.out.으로 찍음.
- 운영 환경에서는 logger로 찍어야함.

 

  • logging
logging:
  level:
    org.hibernate.SQL: debug

  - hibernate의 SQL로그를 debug 모드로 사용. 
  - hibernate가 생성하는 SQL이 모두 보임.

  - logger를 통해 찍음.

 

 

2.  실행하기


  • Member class
@Entity
@Getter
@Setter
public class Member {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
    
}
  • MemberRepository
@Repository
public class MemberRepository {

    @PersistenceContext //영속성 컨텍스트를 스프링 부트가 주입!해줌, 생성 필요없어짐 ㄱㅇㄷ
   private EntityManager em;

    public Long save(Member member){
        em.persist(member);
        return member.getId();
    }

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

  - @Repository annotation을 통해 Repository bean으로 등록. springData JPA가 아닌 JPA사용.

 

  • Test(Junit4 사용)
    @SpringBootTest
    @RunWith(SpringRunner.class) //Junit4 , 스프링 관련 test
    public class MemberRepositoryTest {
    
        @Autowired
        MemberRepository memberRepository;
    
        @Test
        @Transactional
        public void testMember() throws Exception{
            //given
            Member member = new Member();
            member.setUsername("userA");
    
            //when
            Long savedId = memberRepository.save(member);
    
            //then
            Member findMember = memberRepository.find(savedId);
            assertThat(findMember.getId()).isEqualTo(member.getId());
            assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        }
    
    }​

- Entity Manager를 통한 data 변경은 항상 Transaction 내에서 이루어저야함.

- Transaction은 이전 글 참고

 

Transaction Manager - 1

 1. Transaction이란? Data Base에서 다루는 개념. DB명령어들의 논리적인 묶음이다. Transaction의 성질 : ACID A : atomatic(원자성), 부분적의 성공을 허용하지 않는다. 중간 단계까지 실행되고 실패하는 일이

bsh-developer.tistory.com

 

JPA

JPA를 사용하면 SQL까지 안적어도 된다! 객체를 JPA에 넣어주면 JPA가 중간에서 DB에 SQL날리고 data가져옴 SQL과 Data중심의 설계에서 객체 중심의 설계로 패터다임 전환 JPA 소개 1. ORM(Object Relational Mapp.

bsh-developer.tistory.com

 

  • Test 결과
    - DB에 MEMBER tale 생성됨.

    insert 
    into
        member
        (username, id) 
    values
        (?, ?)
  • 어 근데 왜 DB에 데이터가 없지?
    - @Transactional은 기본적으로 Test의 경우 DB로 Commit이 되지 않고
    - 반복적인 test를 위해 rollback이 진행된다.
  • @Rollback(value = false)를 추가해주면 해당 테스트는 rallback되지 않는다.
    짜자잔
  • 그리고 추가로 repository에서 id로 entity를 찾았지만 select query가 동작하지 않았다. 왜???
    - DB에서 직접 조회하지 않고 1차 캐시를 통해 조회한 것이다.
    - 따라서 select query가 동작하지 않음.
  • 따라서 같은 영속성 컨텍스트 내에서 id가 같으면 같은 entity로 볼 수 있음.
  • 1차 캐시 내용은 이전 글 참고
 

Entity Cache

https://github.com/bsh6463/BookManager bsh6463/BookManager Contribute to bsh6463/BookManager development by creating an account on GitHub. github.com 1. Entity Manager Entity Manager란?  Entity의..

bsh-developer.tistory.com

 

 

3. 쿼리 파리미터 로그 남기기


  • 로그를 보면 파라미터가 안보이고 ?만 나온다. 이게 뭐냐고~~~

  • logging의 hibernate의 type을 trace로 변경하자.
    logging:
      level:
        org.hibernate.SQL: debug
        org.hibernate.type: trace​
  • 그러면 isnert문에서 바로 보이지는 않지만 아래 로그에서 확인할 수 있다.
insert 
into
  member
    (username, id) 
values
    (?, ?)
2021-08-05 16:55:42.615 TRACE 8692 --- [    Test worker] o.h.type.descriptor.sql.BasicBinder     
: binding parameter [1] as [VARCHAR] - [userA]
2021-08-05 16:55:42.616 TRACE 8692 --- [    Test worker] o.h.type.descriptor.sql.BasicBinder     
: binding parameter [2] as [BIGINT] - [1]
  • 아 그래도 별론데~~~~~~ 외부 라이브러리쓰자 ㅋㅋ
 

GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s

Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-p...

github.com

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'​
  • 그러면 아래와 같이 확인이 가능하다! 
insert into member (username, id) values (?, ?)
insert into member (username, id) values ('userA', 1);
2021-08-05 17:00:17.976  INFO 7472 --- [    Test worker] p6spy

 

세팅 끝!

 

4. GitHub : 210805 project setting


 

GitHub - bsh6463/SpringBootJPA1

Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글

엔티티 클래스 개발  (0) 2021.08.05
도메인 모델 , 테이블 설계  (0) 2021.08.05
도메인 분석 설계  (0) 2021.08.05
H2 Datebase  (0) 2021.08.05
View 환경설정  (0) 2021.08.05
Comments