일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JDBC
- 스프링 핵심 원리
- Spring Boot
- 인프런
- Android
- 백준
- Proxy
- Exception
- QueryDSL
- kotlin
- 자바
- 알고리즘
- springdatajpa
- SpringBoot
- spring
- Thymeleaf
- Servlet
- http
- AOP
- db
- pointcut
- Greedy
- 스프링
- JPQL
- 김영한
- 그리디
- jpa
- transaction
- java
- 스프링 핵심 기능
- Today
- Total
개발자되기 프로젝트
JPA, DB 설정 및 실행하기 본문
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 |