설정 파일이 복잡해지면
properties
보다yml
(야믈)이 더 좋다.
- 이전 설정 내용을 제대로 파악하지 않고 사용했는데, 이번에 하나씩 뜯어보았다.
MVCC=TRUE
옵션 : 넣으면 여러개가 한번에 접근할 때 좀 더 빨리 처리된다. (넣는 것 권장)
MVCC=TRUE
를 넣으면 오류난다. 삭제!!ddl-auto: create
: application 실행 시점에 테이블 생성. (Entity 정보를 보고 지운다음에 다시 생성)
debug
모드 : hibernate이 생성하는 모든 sql이 다 보인다.
org.hibernate.sql: debug
show_sql
은 system.out
에 출력, debug
는 logger
를 통해 나온다.
따라서, 운영환경에서는 show_sql: true
을 사용하면 안된다. (-> 로거 사용)
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
@GeneratedValue
자동 생성하는 것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;
}
h2 db localhost에서 연결을 거부했습니다.
가 떴다.cd Users/ ~~~
후 ls
로 파일명 찾아서 누름. chmod 755 h2.sh
./h2.sh
test.mv.db
를 찾아서 삭제 한 후 야믈 URL에 jdbc:h2:~/jpashop
부분을 test
로 변경 후 실행
-> 처음에 모르고 jpashop
을 넣었을 때 jpashop.mv.db
가 생성되었던거같다.
-> 실패
해결한 방법⭐️⭐️⭐️
test.mv.db
를 찾아서 삭제Users
나 Users/이름
에 빈폴더로 test.mv.db
생성.🌟깨달은 점
MVCC
옵션 때문이었던거같다.Repository
는 Entity 같은 것을 찾아주는 애 (-DAO와 비슷 )@Repository
을 쓰면 자동으로 Component 스캔 대상이 되어서 bin에 등록된다.@PersistenceContext
이 있으면 EntityManager
를 자동으로 주입.EntityManager
를 생성하는 코드가 없어도 boot가 다 알아서 해준다.starter-data-jpa
를 넣어줬기 때문에 yml을 읽어서 알아서 생성해준다.)package jpabook.jpashop;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
// 저장하는 코드
// 왜 Member 가 아닌 Id를 리턴하지 ?
//command 와 쿼리를 분리하란 원칙에 의해서. 커맨드성일때 리턴값을 거의 안만듬. 그러나 ID가 있으면 다음에 조회할 수 있기때문에.
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
단축키 : shift + command + T
JUnit4
로 선택. Test가 생성되었다.
@RunWith(SpringRunner.class)
: 나 스프링과 관련된걸 테스트 할꺼야~
@SpringBootTest
어노테이션을 붙어준다
검증시 Assertions
를 사용 (.assertJ 선택)
@Transactional
이 test에 있으면 테스트 케이스가 끝난 후 rollback 해버린다
이때 결과를 보고 싶으면 @Rollback(value = false)
를 추가.
영속성 컨텍스트에서 식별자가 같으면 같은 entity로 인식한다.
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 org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional
@Rollback(value = false)
public void testMember() throws Exception {
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(saveId);
//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));
}
}
쿼리 파라미터 남기기 : org.hibernate.type: trace
를 하면 쿼리에는?
표로 나오지만아래처럼 확인할 수 있다.
외부 라이브러리를 사용하기도 한다.
깃 링크 >
참고: 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다.
하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
p6spy-spring-boot-starter
스프링 부트 3.0에서 사용하려면 추가 설정이 필요하다.
src/resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.github.gavlyukovskiy.boot.jdbc.decorator.DataSourceDecoratorAutoConfigurati on
폴더명: src/resources/META-INF/spring
파일명:org.springframework.boot.autoconfigure.AutoConfiguration.imports
src/resources/spy.properties
에
appender=com.p6spy.engine.spy.appender.Slf4JLogger`
이렇게 2개의 파일을 추가하면 정상 동작한다.