섹션 1. 프로젝트 환경설정

김슬기·2022년 10월 7일
0

프로젝트 생성

  • Gradle
  • Spring Boot 2.7.4 (강의는 2.1.7)
  • Group = jpabook
  • Artifact = jpashop
  • Dependencies ⇒ Spring web, Tymeleaf, Spring Data JPA, H2 Database , Lombok이렇게 5개의 라이브러리 사용
    • Lombok 은 애노테이션으로 반복되는 자바코드를 줄여준다~~
    • Spring Data JPA 요것은 그냥 도움받는 용도이지 JPA 를 깊게 공부하길 권장함
    • 라이브러리가 양이 굉장히 많은이유 = 의존관계에 있는 라이브러리를 스프링이 전부 끌어오기 때문이다.
  • 추가한 라이브러리는 build.gradle들어가면 있다.
    • 이렇게 dependencies안에 적혀있음

      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'
      }
      
  • Lombok을 사용할 때는 IntelliJ IDEA > preferences > annotation Processors> Enable annotation processing 을 체크해주기
    • lombok은 애노테이션으로 함수들을 만들어준다.
      • ex) @Getter, @Setter을 클래스 위에 작성하면 끝 >다 만들어줌
  • 모르는것이 있을 때는 spring.io>> guides들어가서 보고 따라해보기

view 환경 설정

  • HelloController
package jpabook.jpashop;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;

@Controller
public class HelloController {

    public String hello(Model model){
        model.addAttribute("data","hello!!");
        return "hello"; // return 은 화면 이름 즉 hello.html을 렌더링함
    }
}
  • hello.html
<!DOCTYPE HTML>
<!DOCTYPE HTML>
  <html xmlns:th="http://www.thymeleaf.org">
  <head>
      <title>Hello</title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
  </body>
  </html>
  • 이렇게 ${}로 전달한 속성에 접근하여 값불러오기 가능
  • 대신 p태그 안에 있는 “안녕하세요. 손님” 은 사라짐

H2 데이터베이스 설치

  • 그 전처럼 진행
  • jdbc:h2:~/jpashop 처음엔 이 경로로 만들고
  • 두번째부턴 jdbc:h2:tcp://localhost/~/jpashop 이경로로 들어가기

JPA 와 DB설정, 동작확인

  • resources에 있는 application.property를 지우고 application.yml생성
  • 내용이 많아지면 yml이 편하다고함 (취향차이)
  • main/resources/application.yml
spring:
  datasource:
#
url: jdbc:h2:tcp://localhost/~/jpashop //db접근경로
  username: sa
  password:
  driver-class-name: org.h2.Driver
jpa:
  hibernate:
    ddl-auto: create //자동으로 테이블을 만들어주는 옵션
  properties:
    hibernate:
      #show_sql: true   //SYSTEM.OUT으로 찍음
      format_sql: true  
logging:
	level:
	  org.hibernate.SQL: debug  //로그를 통해 출력 이녀석 쓸거면 위에 show_sql지우기
#  org.hibernate.type: trace
  • ddl-auto: create 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.
  • 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
    • org.hibernate.SQL : 옵션은 logger를 통해 하이버네이트 실행 SQL을 남긴다
  • 확인해보기
# Member클래스
package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String username;
}
  • 레포지토리는 엔티티를 찾아주는 용도
  • MemberRepositoryTest
package jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.jupiter.api.Assertions.*;

@RunWith(SpringRunner.class) //스프링 러너와 함께 돌리겠다.
@SpringBootTest
class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional //무조건 트랜젝션 안에 있어함
    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());
		    Assertions.assertThat(findMember).isEqualTo(member); //이건 true가 나옴 판단기준은 같은 id면 같다고 판단
    }

}
  • @Tranctional 어노테이션은 테스트를 돌리고 데이터를 롤백시켜서 없애버린다.
    • 보고싶으면 @Rollback(false)넣어주면 확인가능
  • 쿼리 파라미터 로그남기기
    • 로그에 values(?,?) 이렇게 물음표가 남는것이 답답할 때가 있다.
    • p6spy사용하기
      • build.gradle/dependencies에 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6’ 적고 임폴트
profile
낭만그리고김슬기

0개의 댓글