관리 메뉴

Mini

JPA 실전편 환경설정 // 문제-해결 중심으로 복습 본문

Java/Spring-app

JPA 실전편 환경설정 // 문제-해결 중심으로 복습

Mini_96 2023. 6. 5. 00:44
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
    }

}