[spring] DB 설정, 동작확인

youuu·2023년 3월 23일
0

SPRING

목록 보기
33/33

설정 파일이 복잡해지면 properties보다 yml(야믈)이 더 좋다.

  • 이전 설정 내용을 제대로 파악하지 않고 사용했는데, 이번에 하나씩 뜯어보았다.

🍋 yml 작성

설명

  • MVCC=TRUE 옵션 : 넣으면 여러개가 한번에 접근할 때 좀 더 빨리 처리된다. (넣는 것 권장)

    • ⭐️⭐️⭐️ -> h2 2.0 부터 MVCC=TRUE를 넣으면 오류난다. 삭제!!
    • 갑자기 오류가 났었다..
  • ddl-auto: create : application 실행 시점에 테이블 생성. (Entity 정보를 보고 지운다음에 다시 생성)

  • debug모드 : hibernate이 생성하는 모든 sql이 다 보인다.

    • org.hibernate.sql: debug

🤔 show_sql / debug 의 차이점 :

show_sqlsystem.out에 출력, debuglogger를 통해 나온다.
따라서, 운영환경에서는 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

1. Member 클래스 생성

  • @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를 이상없이 연결하고 yml 작성 후 test 케이스를 돌렸다.
  • db에 재 접속 하려는데 h2 db localhost에서 연결을 거부했습니다.가 떴다.
  1. db를 uninstall 후 재설치 후 실행
    -> 실패. db 웹까진 뜨는데 연결이 안됐다.
  2. finder로 bin-h2.sh를 누르면 자꾸 종료되었다.
    -> 터미널로 해당위치로 이동 cd Users/ ~~~ls로 파일명 찾아서 누름.
  • 권한주기 : chmod 755 h2.sh
  • 실행 : ./h2.sh
  1. test.mv.db를 찾아서 삭제 한 후 야믈 URL에 jdbc:h2:~/jpashop 부분을 test로 변경 후 실행
    -> 처음에 모르고 jpashop을 넣었을 때 jpashop.mv.db가 생성되었던거같다.
    -> 실패

  2. 해결한 방법⭐️⭐️⭐️

  • test.mv.db를 찾아서 삭제
  • UsersUsers/이름에 빈폴더로 test.mv.db생성.
    • 맥북에서 빈폴더 생성을 몰라서 터미널로 했다.
      만들 위치로 이동 - cat > test.mv.db Users에선 권한때문에 생성이 불가해서 그냥 복붙해서 옮겼다.
    • 둘중 어느 위치였을까.
      인프런 참고 > , 참고 블로그 >

🌟깨달은 점

  • 아마 MVCC 옵션 때문이었던거같다.
  • 우선 자료를 꼼꼼히 보고 수정하자. (강의랑 달라진 내용도 있다.)
  • 맥북은 터미널을 잘 알아야 해결할 수 있다.
  • 새로 실행 후 member 테이블이 생기지 않았다


2. Repository 생성

- MemberRepository

  • Repository 는 Entity 같은 것을 찾아주는 애 (-DAO와 비슷 )
  • @Repository을 쓰면 자동으로 Component 스캔 대상이 되어서 bin에 등록된다.
  • @PersistenceContext이 있으면 EntityManager를 자동으로 주입.
    (EntityManager를 생성하는 코드가 없어도 boot가 다 알아서 해준다.
    gradle에 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);
    }

}

3. Test Code 생성

  • 단축키 : shift + command + T

  • JUnit4로 선택. Test가 생성되었다.


3-2. Test Code 작성

  • @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));
    }
}

🍋 추가설정 _ 쿼리 파라미터 남기기

gradle

  • 쿼리 파라미터 남기기 : org.hibernate.type: trace 를 하면 쿼리에는?표로 나오지만아래처럼 확인할 수 있다.

  • 외부 라이브러리를 사용하기도 한다.
    깃 링크 >

참고: 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다.
하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.

  • 부트 3.0 에선 정상작동 하지 않는다.

쿼리 파라미터 로그 남기기 - 스프링 부트 3.0

p6spy-spring-boot-starter 스프링 부트 3.0에서 사용하려면 추가 설정이 필요하다.

1. org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일 추가

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

2. spy.properties 파일 추가

src/resources/spy.properties
appender=com.p6spy.engine.spy.appender.Slf4JLogger`
이렇게 2개의 파일을 추가하면 정상 동작한다.

profile
공부중인 주니어 개발자

0개의 댓글