공부기록
스프링 공부 1일차 본문
Thymeleaf
마크업을 깨지않는 문법
- 브라우저로 바로 열기가능
스프링이 지원함 (Spring native)
문법이 문서를 많이 봐야됨 ㅜㅜ
템플릿 경로가 설정이 되어있어 해당 경로에 템플릿을 작성하면 알아서 로딩됨
resources/templates/${템플릿 이름}
이 기본값- 이 부분은 설정파일의 설정값을 바꾸면 된다.
spring-boot-devtools를 import하면 템플릿을 수정후 서버만 recompile하면 템플릿 변경사항이 반영됨.
H2 Database
- 개발, 테스트용 DB
- 웹화면을 제공
세팅방법
- h2 database 설치
- 설정을
Generic H2 (Server)
로 설정 jdbc:h2:~/jpashop
으로 접속해서C:/USER/SUA
폴더에jpashop.mv.db
를 생성, 이후에 DB에 URL로 접속이 가능해짐- 이제
jdbc:h2:tcp://localhost/~/jpashop
로 접속이 가능해지면 세팅 완료
JPA와 DB 설정하고 동작확인
application.yml
/resources
아래에 만든다.
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
driver-class-name
을 함으로써 데이터베이스 커넥션과 관련된 데이터베이스 소스 설정이 완료된다.ddl-auto: create
를 함으로써 테이블이 자동으로 생성되는 모드로 설정https://docs.spring.io/spring-boot/docs/2.5.5/reference/htmlsingle/ 에서 설정들에 대한 정보를 볼 수 있다.
logging
의level
의org.hibernate.SQL:debug
로 로그수준을 설정show_sql
은 그냥 콘솔창에 프린트 찍는것이지 로그 찍는게 아니라logging
을 꼭 설정해줘야 로그가 남는다.
테스트 코드를 만드는 부분에서 h2가 버전업 되면서 mvcc옵션을 사용하지 않게 되었다.
Member Entity
- Entity는 JPA에서 데이터베이스 Table을 정의하는 부분이다.
package jpabook.jpashop;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Getter
@Setter
// Entity를 보고 테이블을 생성
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
}
JPA관련 어노테이션은 다
javax.persistence
임에 주의하자.Spring이 이 Entity를 보고 DB에 자동으로
MEMBER
테이블을 만들게 된다.
create table member (
id bigint not null,
username varchar(255),
primary key (id)
)
- SQL로깅 수준을
debug
로 해서 생성되는 과정이 다 출력된다.
Member Repository
- repository는 JPA에서 대응하는 Entity를 위한 쿼리를 생성하는 부분에 해당된다.
package jpabook.jpashop;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class MemberRepository {
// Spring Container가 Annotation을 식별하고 Entity Manager를 주입해준다.
@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);
}
}
@PersistenceContext
를 통해em
에 엔티티 매니저가 주입된다. DI 와 관련된 부분이다.- 메서드에서
ctrl + alt + T
를 하여 테스트 모듈을 만들 수 있다.
Test Code
- TDD를 위해 테스트 모듈을 만들어 테스트를 해볼 수 있다.
- 강의와 다르게 나는 junit5를 사용하였다.
package jpabook.jpashop;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
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.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;
@ExtendWith(SpringExtension.class)
@SpringBootTest
class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
@Transactional
// Transactional 이 Test 에 있으면 해당 트랜잭션을 테스트 이후 rollback 해버린다.
//아래 annotation 으로 rollback 을 안하고 commit 하게 만들 수 있다.
@Rollback(false)
public void testMember() throws Exception{
//given
Member member = new Member();
member.setUsername("memberA");
//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());
//이거 같다고 나온다.
//같은 영속성 context 에서는 두 member 객체는 같다고 나온다.
Assertions.assertThat(findMember).isEqualTo(member);
System.out.println("findMember == member: " + (findMember == member));
}
}
Test
어노테이션으로 테스트임을 명시한다.Transactional
어노테이션으로 DB에 트랜잭션을 날리도록 한다.- JPA에 더 관련된 부분이다. 나중에 따로 포스팅하도록 한다.
given
에 주어진 테스트셋,when
에 테스트 시나리오,then
에 테스트 결과를 명시한다.- 나중에 JUNIT을 사용한 TDD를 더 공부해보자.
- 한 트랜잭션에서는 같은 영속성 context를 유지하기에,
findMember
와member
가 같다고 판단한다.- JPA의 영역인듯 한데, 이 부분도 나중에 JPA를 공부하면서 알아간다.
BUILD
./gradlew clean build
로 .jar 파일을 build한다.java -jar jpashop-0.0.1-SNAPSHOT.jar
로 빌드된 파일이 정상적으로 되는지 실행한다.
'Programming > etc' 카테고리의 다른 글
block vs nonblock, sync vs async (0) | 2021.10.26 |
---|