start.spring.io
(java 버전과, spring boot 버전 맞춰야함. 서칭으로)
<build.gradle>
// 이런식으로 미리 세팅을 해줌!
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
main 에서 run 해주면, 서버가 실행되고,
localhost: 으로 들어가면 접근 가능!!
(추가 세팅)
lombok을 쓰면 이렇게 바로 가능! (따로 getter, setter 세팅 필요 x)
@Getter @Setter
public class Hello {
private String data;
}
단축키 꿀팁 : ctrl + alt + v (자동 변수 생성)
new Hello() -> Hello hello = new Hello();
Thymeleaf.org
resourcese 안에 static, templates 폴더 안에 html 파일 생성
- 정적 파일의 경우 static
- 동적 파일의 경우 templates 안에.
html 파일 수정해도, 서버 run 중에 바로 적용되지는 않음.
=>
// build.gradle 추가
implementation 'org.springframework.boot:spring-boot-devtools'
이걸 설치하고 난 뒤에, build - recompile 'hello.html'
하면 재로딩 후에 바로 적용됨!!
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop_230403;MVCC=TRUE # MVCC=TRUE : 권장
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
<Member.java>
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
// 어? 왜 return 을 id 만 하냐. member 를 안하고! -> 가급적 Side Effect 줄이기 위해, 아무것도 넣지 않음.
// 추후에 쓰일 일 있을지도 모르는 id 값만 보통 반환 하심. (김영한 개발자님)
public Long save(Member member){
em.persist(member);
return member.getId();
}
public Member find(Long id){
return em.find(Member.class, id);
}
}
test 생성 -> ctrl + shift + t
@RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest {}
자동으로 test 디렉토리에 파일 생성이 된다. 위 어노테이션들 달아주어야함.
@Test
public void testMember() throws Exception {
// given
Member member = new Member();
member.setUsername("changer");
// when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
// then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member); // 영속성 컨텍스트 안에서 같은 식별자는 같은 엔티티로 반환
}
@Transactional
을 넣어주어 Transaction 이라는 것을 명시! Test 끝나고 나면, DB 롤백함.
(그냥 안되던데, run tests using 부분을 Intellij IDEA 로 바꾸면 됨!)
@Rollback(false)
를 해주어, DB 롤백 없게 설정할 수 있음!
<application.yaml>
...
logging:
level:
org.hibernate.type: trace
<build.gradle>
...
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
...
실무에서는 성능에 영향을 줄 수도 있으니, 꼭 성능 테스트 진행해볼 것!!