2 분 소요

프로젝트 생성

https://start.spring.io/에서 아래와 같이 설정한 뒤에 프로젝트를 생성한다.
스크린샷 2022-07-08 오전 12 40 32

build.gradle 변경

아래 build.gradle 내용을 그대로 복사해서 사용하자.

plugins {
	id 'org.springframework.boot' version '2.4.1'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'jpabook'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'

  implementation 'org.springframework.boot:spring-boot-devtools'
  implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'

	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	//JUnit4 추가
	testImplementation("org.junit.vintage:junit-vintage-engine") {
		exclude group: "org.hamcrest", module: "hamcrest-core"
	}
}

test {
	useJUnitPlatform()
}

spring-boot-devtools

implementation 'org.springframework.boot:spring-boot-devtools'

spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.

인텔리J 컴파일 방법
상단바 -> Build -> Recompile ...

p6spy-spring-boot-starter

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

p6spy-spring-boot-starter 라이브러리를 추가하면, 아래와 같이 쿼리 파라미터의 로그를 남길 수 있다.
스크린샷 2022-07-08 오전 2 35 28

외부 라이브러리를 사용한 것이다.
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

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

lombok 적용

  1. Prefrences -> plugin -> lombok 검색 실행 (재시작)
  2. Prefrences -> Annotation Processors 검색 -> Enable annotation processing 체크 (재시작)

IntelliJ Gradle 대신에 자바 직접 실행

  • Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle (혹은 gradle 검색)
  • Build and run using: Gradle -> IntelliJ IDEA
  • Run tests using: Gradle -> IntelliJ IDEA

H2 데이터베이스 사용

H2 데이터베이스는 Version 1.4.200을 설치해야한다.

파일 생성 (최초 한번)

  1. JDBC URLjdbc:h2:~/jpashop을 입력한 뒤 연결한다.
  2. ~/jpashop.mv.db 파일이 생성되었는지 확인한다. (터미널의 home(~)에서..)

접속

이후 부터는 JDBC URLjdbc:h2:tcp://localhost/~/jpashop을 입력하여 연결한다.

JPA와 DB 설정 & 동작 확인

application.yml

main/resources/application.yml

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
  • spring.jpa.hibernate.ddl-auto: create
    - 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.

참고
모든 로그 출력은 가급적 로거를 통해 남겨야 한다.

  • show_sql : 옵션은 System.out 에 하이버네이트 실행 SQL을 남긴다.
  • org.hibernate.SQL : 옵션은 logger를 통해 하이버네이트 실행 SQL을 남긴다.

주의 🚨
application.yml 같은 yml 파일은 띄어쓰기(스페이스) 2칸으로 계층을 만든다.
따라서 띄어쓰기를 주의해야 한다!

동작 확인

회원 엔티티

src/main/java/jpabook/jpashop/Member.java

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue // 자동으로 생성된다.
    private Long id;
    private String username;
}

회원 리포지토리

src/main/java/jpabook/jpashop/MemberRepository.java

@Repository
public class MemberRepository {

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

테스트

src/test/java/jpabook/jpashop/MemberRepositoryTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(false)
    public void testMember() throws Exception {
        // given
        Member member = new Member();
        member.setUsername("memberA");

        // when
        Long savdId = memberRepository.save(member);
        Member findMember = memberRepository.find(savdId);

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

테스트 코드에 @Transactional 애노테이션을 붙이면 자동으로 롤백하기 때문에 변경 사항을 db에서 확인할 수 없다.
변경 사항을 확인하기 위해서 @Rollback(false) 애노테이션을 붙였다.

주의 🚨
@Test는 JUnit4를 사용하면 org.junit.Test를 사용해야 한다.
만약 JUnit5 버전을 사용하면 그 것에 맞게 사용하면 된다.

Live Templates 생성

tdd를 입력한 뒤에 tab을 누르면 테스트 코드 템플릿이 나오도록 커스텀 설정할 수 있다.

  1. Preference -> template 검색 후 Live Templates을 클릭한다.
    (Editor -> Code Style -> Live Templates)
  2. 우측에 +를 클릭 -> Template Group 선택
  3. custom 이라는 이름으로 그룹 생성
  4. custom에 커서 올리고 + 다시 클릭 -> Live Templates 선택
  5. <abbreviation>tdd 입력
  6. Template text에 코드 작성 (Description은 작성해도 되고 안해도 된다.)
    template text:
    @Test
    public void $NAME$() throws Exception {
     // given
     $END$
     // when
        
     // then
    }
    
  7. 맨 하단에서 Define 클릭 후 Java 전체를 선택한다.

아래와 같이 설정하면 된다.
스크린샷 2022-07-08 오전 1 41 57



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기