Skip to content

Latest commit

 

History

History
148 lines (115 loc) · 5.71 KB

00-intro.md

File metadata and controls

148 lines (115 loc) · 5.71 KB

Spring Data JPA

이 md는 김영한씨의 실전! 스프링 데이터 JPA 라는 강의를 보고 정리합니다.

이것은 마법같은 기술이다

기존 Spring + JPA 만으로 생산능력이 높아졌지만 이 기술을 사용함으로써 더욱 생산성이 높아진다.

  • 구현체 없이 Repository 만으로 구현이 가능하다.
  • CRUD는 기본적으로 제공된다. → 개발자는 핵심 비즈니스 로직에만 집중하여 개발하자!
  • 선택이 아닌 필수다! 실무에 무조건 적용된다.

하지만

  • JPA를 너무 추상화 해버린다.
  • JPA를 몰라도 사용할 수 있다.
  • 문제는 문제가 생겨 해결할때 JPA의 기본 원리를 모르면 해결할 수가 없다.
  • 결론은 JPA부터 공부하자.

실습환경

Spring initializer를 통해 실습 환경을 생성한다.
실습 환경 공유 ← 링크를 타고들어가면 똑같은 필자와 똑같은 환경제공

Java11

Build Tool

  • Gradle

Dependencies

  • Spring Web
  • Spring Data JPA
  • H2 Database - 2mb의 메모리를 사용하는 가장 좋은 실습용 DB
  • Lombok - Getter, Setter와 같은것을 어노테이션으로 생성을 해주는 의존성

./gradlew dependencies --configuration compileClasspath
프로젝트폴더에서 위와같은 명령어를 사용하면 자신이 사용한 dependencies를 확인할 수 있다.

H2DB 설치 및 실행

  1. 현재 추가된 Dependency 버전에 맞는 H2DB를 설치한다.

    window유저는 window를 사용하면 되고, mac이나 linux환경을 사용하면 All Platform 을 선택해서 다운로드한 후 압축을 풀면된다.

    h2DB의 Dependency는 intellij ultimate 기준 오른쪽에 다음과 같이 확인할 수 있다.

  2. 압축 해제후 /src/bin/ 경로로 이동후 ./h2.sh를 실행한다.
    만약 permission denied로 실행을 못하면 chmod 755 ./h2.sh를 쉘에 입력한다.

  3. 실행후 H2 콘솔에 JDBC URL에 jdbc:h2:~/DBname 과 같이 입력한다.
    이는 DB파일을 생성하기 위해 최초 1번만 실행한다.

    DBname은 자신이 원하는 이름으로 입력해라

  4. 그후 접속은 jdbc:h2:tcp://localhost/~/DBname

application 설정파일

application.properties 파일의 이름을 application.yml 이와같이 변경한다. 그후 다음과 같이 입력한다.

설정파일은 프로젝트 상위 폴더기준 /src/main/resources에 있다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/DBname # 위에서 생성한 접속 URL
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create # 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.
    properties:
      hibernate:
        #show_sql: true
        format_sql: true # 보여주는 쿼리를 예쁘게 포맷팅 해준다.

  logging.level:
    org.hibernate.SQL: debug
    #org.hibernate.type :trace  # 파라미터 바인딩된 부분까지 나온다.

Spring Data JPA사용방법

1. Entity 생성

Member

@Entity @Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;

    public Member(String username){
        this.username = username;
    }
}

2. Repository 생성

MemberRepository

  • Repository는 interface로 JpaRepository<Entity, EntityIdType>를 상속 받는다.
@Repository
public interface MemberRepository extends JpaRepository<Member, Long>

3. Test 코드 작성

  • Intellij에서는 테스트 코드를 작성할때 작성하고싶은 클레스에서 cmd + n 누르면 메뉴가 나타나는데 여기에서 test를 만들수 있다.
  • 이렇게 만든 Test는 /src/test 에 있다.
@SpringBootTest
@Transactional //JPA를 테스트하려면 트렌젝션 내에서 동작해야 된다. //import는 springframework trancational을 선택한다.
class MemberRepositoryTest {

    @Autowired MemberRepository memberRepo;

    @Test
    public void testMember(){
        Member member = new Member("memberA");
        Member savedMember = memberRepo.save(member);

        Member findMember = memberRepo.findById(savedMember.getId()).get();

        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);
    }

}

테스트가 느린이유

기본적으로 Intllij에서는 gradle를 거쳐 Test밑 빌드를 하기 떄문에 속도가 느리다.

다음과 같이 설정한다

  1. Perference에 들어가서 build tool를 검색한다.
  2. 왼쪽 네비게이션 바에서 Build Tool 하위에 Gradle을 선택후
  3. Build and run 에서 Build and run usingRun tests using 를 Intllij IDEA로 선택한다.

쿼리를 더욱 이쁘게 날리자 - 이는 공부용으로 좋다.

dependency를 build.gradledependencies안에 다음과 같이 추가한다.

build.gradle

dependencies {
 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
}