스프링 부트 JPA 프로젝트 세팅

김강현·2023년 4월 3일
0

SPRING-JPA-실습

목록 보기
1/5
post-thumbnail

프로젝트 생성

스프링 부트 스타터

start.spring.io


(java 버전과, spring boot 버전 맞춰야함. 서칭으로)

  • spring web
  • thymeleaf
  • spring data jpa
  • h2 database
  • lombok

<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: 으로 들어가면 접근 가능!!

(추가 세팅)

  • Settings - Build, Execution, Deployment - Compiler - Annotaion Processors -> Enable Annotaion Processing 체크

lombok을 쓰면 이렇게 바로 가능! (따로 getter, setter 세팅 필요 x)

@Getter @Setter
public class Hello {
    private String data;
}

단축키 꿀팁 : ctrl + alt + v (자동 변수 생성)
new Hello() -> Hello hello = new Hello();

view 템플린 엔진 (thymeleaf)

Thymeleaf.org

  • 기본 html 과 형식이 똑같음
  • spring boot에서 정식으로 상호 지원해주는 툴
  • 실무에서는 사실 잘 안쓰임. (react 나 vue.js 로 따로 만듬)

resourcese 안에 static, templates 폴더 안에 html 파일 생성

  • 정적 파일의 경우 static
  • 동적 파일의 경우 templates 안에.

html 파일 수정해도, 서버 run 중에 바로 적용되지는 않음.
=>

// build.gradle 추가
implementation 'org.springframework.boot:spring-boot-devtools'

이걸 설치하고 난 뒤에, build - recompile 'hello.html'
하면 재로딩 후에 바로 적용됨!!

application.yaml 설정

  • 기존 jpa h2 실습 플젝의 persistence.xml 내용과 매칭되는 파트!
  • application.properties 대신 application.yaml
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 디렉토리에 파일 생성이 된다. 위 어노테이션들 달아주어야함.

  • tdd 단축키 등록해두면 편하다고 하심.

test code 주의 사항

@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); // 영속성 컨텍스트 안에서 같은 식별자는 같은 엔티티로 반환
}
  • 이 코드는 에러가 뜬다 -> Entity Manager 관리하의 함수들은 transaction 이 시작되고 난 뒤에 실행되어야함.

@Transactional 을 넣어주어 Transaction 이라는 것을 명시! Test 끝나고 나면, DB 롤백함.


(그냥 안되던데, run tests using 부분을 Intellij IDEA 로 바꾸면 됨!)

@Rollback(false) 를 해주어, DB 롤백 없게 설정할 수 있음!

server build

  • build 후에 java -jar ~~~ 로 실행해주면!
  • localhost:8080 에 그대로 실행 확인!

쿼리 파라미터 로그 남기기

  • 쿼리 파라미터가 ?, ? 로 남는다.
<application.yaml>
...
logging:
  level:
    org.hibernate.type: trace
  • 외부 라이브러리 쓰기 (spring boot datasource decorator -> P6Spy)
<build.gradle>
...
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
...

실무에서는 성능에 영향을 줄 수도 있으니, 꼭 성능 테스트 진행해볼 것!!

profile
this too shall pass

0개의 댓글