이 md는 김영한씨의 실전! 스프링 데이터 JPA 라는 강의를 보고 정리합니다.
기존 Spring + JPA 만으로 생산능력이 높아졌지만 이 기술을 사용함으로써 더욱 생산성이 높아진다.
- 구현체 없이 Repository 만으로 구현이 가능하다.
- CRUD는 기본적으로 제공된다. → 개발자는 핵심 비즈니스 로직에만 집중하여 개발하자!
- 선택이 아닌 필수다! 실무에 무조건 적용된다.
- JPA를 너무 추상화 해버린다.
- JPA를 몰라도 사용할 수 있다.
- 문제는 문제가 생겨 해결할때 JPA의 기본 원리를 모르면 해결할 수가 없다.
- 결론은 JPA부터 공부하자.
Spring initializer를 통해 실습 환경을 생성한다.
실습 환경 공유 ← 링크를 타고들어가면 똑같은 필자와 똑같은 환경제공
- Gradle
- Spring Web
- Spring Data JPA
- H2 Database - 2mb의 메모리를 사용하는 가장 좋은 실습용 DB
- Lombok - Getter, Setter와 같은것을 어노테이션으로 생성을 해주는 의존성
./gradlew dependencies --configuration compileClasspath
프로젝트폴더에서 위와같은 명령어를 사용하면 자신이 사용한 dependencies를 확인할 수 있다.
-
현재 추가된 Dependency 버전에 맞는 H2DB를 설치한다.
window유저는 window를 사용하면 되고, mac이나 linux환경을 사용하면 All Platform 을 선택해서 다운로드한 후 압축을 풀면된다.
h2DB의 Dependency는 intellij ultimate 기준 오른쪽에 다음과 같이 확인할 수 있다.
-
압축 해제후
/src/bin/
경로로 이동후./h2.sh
를 실행한다.
만약 permission denied로 실행을 못하면chmod 755 ./h2.sh
를 쉘에 입력한다. -
실행후 H2 콘솔에 JDBC URL에
jdbc:h2:~/DBname
과 같이 입력한다.
이는 DB파일을 생성하기 위해 최초 1번만 실행한다.DBname은 자신이 원하는 이름으로 입력해라
-
그후 접속은
jdbc:h2:tcp://localhost/~/DBname
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 # 파라미터 바인딩된 부분까지 나온다.
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;
}
}
MemberRepository
- Repository는 interface로
JpaRepository<Entity, EntityIdType>
를 상속 받는다.
@Repository
public interface MemberRepository extends JpaRepository<Member, Long>
- 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밑 빌드를 하기 떄문에 속도가 느리다.
다음과 같이 설정한다
Perference
에 들어가서build tool
를 검색한다.- 왼쪽 네비게이션 바에서 Build Tool 하위에 Gradle을 선택후
- Build and run 에서
Build and run using
과Run tests using
를 Intllij IDEA로 선택한다.
dependency를 build.gradle
에 dependencies
안에 다음과 같이 추가한다.
build.gradle
dependencies {
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
}