Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Thymeleaf
- springdatajpa
- 스프링 핵심 원리
- Proxy
- db
- pointcut
- jpa
- java
- spring
- 자바
- 인프런
- 그리디
- AOP
- SpringBoot
- transaction
- http
- 스프링
- QueryDSL
- JPQL
- 김영한
- kotlin
- 알고리즘
- Exception
- Spring Boot
- Servlet
- Android
- Greedy
- 스프링 핵심 기능
- JDBC
- 백준
Archives
- 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 싹~지우고 다시만듦.
- 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은 이전 글 참고
- 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차 캐시 내용은 이전 글 참고
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]
- 아 그래도 별론데~~~~~~ 외부 라이브러리쓰자 ㅋㅋ
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
'인프런 > [인프런] 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