package jpabook.jpashop;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello") //hello라는 url이오면, 호출해라
public String hello(Model model)
{
//hello.html안의 -- data에 hello!!로 렌더링해라.
model.addAttribute("data","hello!!");
return "hello"; //resources\templates\'hello'.html로 매핑
}
}
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;
}
@Entity @Id @GeneratedValue가 뭔지 공부해야함.
package jpabook.jpashop;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em;
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
}
@Repository, @PersistentContext 의 효과가 먼가?
*yml
※ 주의 : 들여쓰기에 매우 민감함. 칸 정확히맞춰야 동작함.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop; #MVCC=TRUE #MVCC사용하면 오류남.
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
#문제 : test log에서 변수가(?, ?) 이렇게보임
#해결1 : trace // (?, ?) 밑에 파라미터 설명해줌
org.hibernate.type: trace #로그찍기
#문제2 : ? 를 없애고싶음
#해결 : 외부라이브러리 P6Spy
#build.gradle에 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' 추가.
*Test
package jpabook.jpashop;
import org.assertj.core.api.Assertions;
import org.junit.Assert;
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 javax.transaction.Transactional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class) //jnunit에게 Spring관련테스트임을 알려줌
@SpringBootTest
public class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
/*
문제 : EntityManager를 통한 data변경은 트랜잭션안에서 이뤄져야함
해결 : @Transactional
*/
@Transactional
/*
문제 : Test끝나면 data 롤백됨 => db에서 확인이안됨
해결 : Rollback(false)
*/
@Rollback(false)
public void testMember() throws Exception{
//given
Member member=new Member();
member.setUsername("MemberA");
//when
Long savedID = memberRepository.save(member);//좌측에 변수자동넣기 C Alt V
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);
//JPA 영속성 동일성 보장
//같은 트랜잭션안에서 저장,조회 => 영속성 컨텍스트가 같음 => id가같으면 같은 Entity로 인식
//=> 기존관리하던거 return
}
}
'Java > Spring-app' 카테고리의 다른 글
회원 기능 테스트 (0) | 2023.06.07 |
---|---|
회원 서비스 개발 //의존관계주입, @Transactional(readOnly) (1) | 2023.06.06 |
회원 리포지토리 개발 (0) | 2023.06.06 |
엔티티 설계시 주의점 // Setter제거 (0) | 2023.06.06 |
엔티티 클래스 개발1 // JPA 어노테이션 (1) | 2023.06.06 |