공부기록

스프링 공부 1일차 본문

Programming/etc

스프링 공부 1일차

코타쿠 2021. 9. 29. 21:51

Thymeleaf

  • 마크업을 깨지않는 문법

    • 브라우저로 바로 열기가능
  • 스프링이 지원함 (Spring native)

  • 문법이 문서를 많이 봐야됨 ㅜㅜ

  • 템플릿 경로가 설정이 되어있어 해당 경로에 템플릿을 작성하면 알아서 로딩됨

    • resources/templates/${템플릿 이름}이 기본값
    • 이 부분은 설정파일의 설정값을 바꾸면 된다.
  • spring-boot-devtools를 import하면 템플릿을 수정후 서버만 recompile하면 템플릿 변경사항이 반영됨.

H2 Database

  • 개발, 테스트용 DB
  • 웹화면을 제공

세팅방법

  1. h2 database 설치
  2. 설정을 Generic H2 (Server)로 설정
  3. jdbc:h2:~/jpashop 으로 접속해서 C:/USER/SUA 폴더에 jpashop.mv.db를 생성, 이후에 DB에 URL로 접속이 가능해짐
  4. 이제 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/ 에서 설정들에 대한 정보를 볼 수 있다.

  • logginglevelorg.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를 유지하기에, findMembermember가 같다고 판단한다.
    • 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