@Entity DTO에 JPA설정
@id 기본키 설정
@GeneratedValue 기본키 자동 생성(자동 증가)

사이트 참고

https://ithub.tistory.com/24

 

Spring Data JPA 기본키 매핑하는 방법

오늘은 Spring Data JPA 기본키 매핑하는 방법에 대해서 알아보겠습니다. Spring Data JPA 에서는 엔티티의 기본키를 @Id 어노테이션을 사용하여 설정합니다. @Entity public class Team { @Id @Column(name = "te..

ithub.tistory.com

https://data-make.tistory.com/610

 

[JPA] 엔티티와 매핑. @Entity, @Table, @Id, @Column..

| 엔티티와 매핑 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23..

data-make.tistory.com

 

JPA 명령어

https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0

 

[Spring Data Jpa] JPA..그래 알겠어.. 그래서 스프링 데이터 JPA는 어떻게 쓰는데..

김영한님의 실전 Spring Data Jpa를 수강하고 정리한 문서 입니다. 강추! 최고최고. 인프런 김영한님 실전 스프링 데이터 JPA 링크딴거는 다 모르겠고, 기록할 부분만 기록해야겠다.\-h2 데이터베이스

velog.io

@NoArgsConstructor 매개변수를 갖지 않는 생성자를 생성
@AllArgsConstructor 모든 매개변수를 갖는 생성자를 생성
@RequiredArgsConstructor 필수값으로 설정된 매개변수를 갖는 생성자를 생성
@NonNull 어노테이션으로 구분
@Data 모든 변수의 getter, setter를 설정한다.
@Builder 빌더를 자동으로 생성해주는 어노테이션
@NonNull 필수값으로 설정할 때 사용하는 어노테이션

DTO 생성

package com.example.bookmanager.domain;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
@Entity
public class User {
    @Id
    @GeneratedValue
//    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;

    public User(String name, String email, LocalDateTime creDate, LocalDateTime upDate) {
        this.name = name;
        this.email = email;
        this.createdAt = creDate;
        this.updatedAt = upDate;
    }
}

 

ctrl + shift + t 키를 이용하여 테스트 코드 작성

package com.example.bookmanager.domain;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

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

class UserTest {

    @Test
    void test() {
        User user = new User();
        user.setEmail("martin@fastcampus.com");
        user.setName("martin");
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdatedAt(LocalDateTime.now());

        // User user1 = new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now());
        User user1 = new User(null, "martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now());
        User user2 = new User("martin", "martin@fastcampus.com");

        // 빌더 사용 예제
        User user3 = User.builder()
                .name("martin")
                .email("martin@fastcampus.com")
                .build();
        System.out.println(">>> " + user.toString());
        System.out.println(">>> " + user1.toString());
        System.out.println(">>> " + user2.toString());
        System.out.println(">>> " + user3.toString());

    }
}

실행 화면

 

JPA 사용을 위한 Repository 설정

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

// JPA를 사용하기 위해서 반드시 설정해줘야하는 인터페이스(User 테이블과 연결)
// Entity, id 값
public interface UserRepository extends JpaRepository<User, Long> {

}

참고 사이트

https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%99%9C%EC%9A%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8

 

[Spring Boot] 스프링부트 활용 - 테스트

「스프링부트 개념과 활용」 - 3부

velog.io

 

sql문을 직관적으로 확인하기 위해서 application.yml 파일을 수정

참고 사이트

https://lannstark.tistory.com/14

 

Spring Boot SQL 보기 옵션 총 정리

Spring Boot에서 query DSL을 사용하건 spring boot JPA를 사용하건, 쿼리를 튜닝할 때 SQL을 봐야할 때가 있다. 그럴 때 사용할 수 있는 몇 가지 옵션을 조사해 보았다. 환경 : Spring boot 2.* + hibernate 5.3...

lannstark.tistory.com

spring:
  h2:
    console:
      enabled: true
#  sql문을 확인하기 위해서 추가 설정
  jpa:
    show-sql: true
    properties:
      hibernate:
#        깔끔하게 보기 위해서 설정
        format_sql: true
        show_sql: true
#        주석 확인
        use_sql_comments: true

# 로그에 파라미터를 확인하기 위해서 설정
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

server:
  port: 8080

Test 코드 작성

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Sort;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;

// @SpringBootTest: 통합 테스트를 진행하기 위해서 설정
@SpringBootTest
class UserRepositoryTest {

    // UserRepository를 의존성 추가
    @Autowired
    private UserRepository userRepository;

    // test를 진행할 코드
    @Test
    void crud() {  // create, read, update, delete
        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));
        
        // User 테이블의 모든 데이터 리스트를 가지고 온다.
        System.out.println(">>> " + userRepository.findAll());
        

    }

}

save(): 데이터를 JPA를 이용해서 저장하는 기능

findAll(): JPA를 이용하여 저장소안에 모든 데이터를 출력

 

 

추가 사항으로 Test를 진행할때 미리 쿼리를 넣어주고 싶을경우 

test폴더 하위에 resources 폴더를 생성하고 data.sql, schema.sql을 생성하여 JPA가 동작하기 전에 해당 SQL문이 동작하도록 설정할 수 있다.

 

동작순서는 schema.sql이 동작한 후 data.sql이 동작한다.

 

참고 사이트

https://leveloper.tistory.com/38

 

[스프링] 배포용 서버에 데이터베이스 Schema 및 Data 초기 설정하기

스프링 부트로 개발을 할 때 보통 개발단계에서는 h2를 많이 사용한다. 또한 JPA를 사용하면 하이버네이트가 자동으로 테이블을 생성해주기 때문에 개발 단계에서는 DDL을 신경 쓸 필요가 없다.

leveloper.tistory.com

findAll().forEach(System.out::println);: 여러 라인의 생성자 데이터를 반복하여 한 줄씩 출력하도록 도와준다.

    @Test
    void crud() {  // create, read, update, delete

        // 기본 데이터 생성
        userRepository.save(new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("dennis", "dennis@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("sophia", "sophia@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("james", "james@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("martin2", "martin2@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));

        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));

        // User 테이블의 모든 데이터 리스트를 가지고 온다.
        // 한 줄로 출력
//        System.out.println(">>> " + userRepository.findAll());
        // >>> [User(id=1, name=null, email=null, createdAt=null, updateAt=null)]
        // 여러줄로 나뉘어서 줄력
        userRepository.findAll().forEach(System.out::println);

 

내림차순으로 List에 저장하고 출력하는 예제

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Sort;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;

// @SpringBootTest: 통합 테스트를 진행하기 위해서 설정
@SpringBootTest
class UserRepositoryTest {

    // UserRepository를 의존성 추가
    @Autowired
    private UserRepository userRepository;

    // test를 진행할 코드
    @Test
    void crud() {  // create, read, update, delete

        // 기본 데이터 생성 jpa를 이용하여 insert 된다.
        userRepository.save(new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("dennis", "dennis@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("sophia", "sophia@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("james", "james@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("martin2", "martin2@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));

        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));

        // name을 기준으로 내리차순 정렬 하여 List에 저장
        List<User> users = userRepository.findAll(Sort.by(Sort.Direction.DESC, "name"));
        // list에 저장된 내용을 출력
        users.forEach(System.out::println);

    }

}

findAll(Sort.by(Sort.Direction.DESC, "name")): name이라는 컬럼을 기준으로 내림차순 정렬

쿼리 확인

 

본인이 원하는 데이터만 뽑아와서 출력하는 예제 코드

        // 본인이 정한 ID값의 해당하는 값들만 골라서 List에 저장
        List<User> users = userRepository.findAllById(Lists.newArrayList(1L, 2L, 3L));
        // List에 저장된 데이터를 반복하여 출력
        users.forEach(System.out::println);

where 절이 추가된 것을 확인

 

원하는 생성자를 선택하여 JPA를 이용하여 저장하는 쿼리

// 테스트를 진행할 생성자 추가
        User user1 = new User("jack", "jack@naver.com");
        User user2 = new User("steve", "steve@naver.com");
        User user3 = new User("steve2", "steve22@naver.com");
        // 원하는 생성자를 선택하여 JPA를 이용하여 저장
        userRepository.saveAll(Lists.newArrayList(user1, user2));
        // List에 데이터를 저장
        List<User> users = userRepository.findAll();
        // 출력
        users.forEach(System.out::println);

본인이 선택한 생성자 데이터만이 추가된것을 확인 할 수 있다.

 

getOne(1L);: 사용자가 선택한 id값에 해당하는 데이터를 새로운 생성자에 값을 넣어주는 기능

// getOne(1L);: 사용자가 선택한 id값에 해당하는 데이터를 새로운 생성자에 값을 넣어주는 기능
        User user = userRepository.getOne(1L);
        System.out.println(user);

그냥 실행하게 되면 아래와 같은 에러가 발생한다.

따라서 테스트를 진행하는 함수 위에 @Transactional 어노테이션을 추가해 준다.

    // test를 진행할 코드
    @Test
    // 세션 유지를 하기 위한 설정
    @Transactional
    void crud() {  // create, read, update, delete

 

findById(): 세션연결이 없어도 본인이 원하는 ID값에 해당하는 데이터를 찾아서 가져올 수 있다.

테스트를 진행할 때 test부분에 @Transactional 어노테이션을 지워주고 진행한다.

// findById를 이용하여 해당 id에 해당하는 값을 가져오고, 아닐 경우 null을 반환
        User user = userRepository.findById(1L).orElse(null);
        System.out.println(user);

 

ORM: 데이터베이스와 어플리케이션을 연결해주는 것

 

JPA: JAVA에서 ORM의 기능을 해주는 인터페이스

 

실습에 필요한 추가 요소

dependency 확인 (build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    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'
}

 

기본 예제 생성

controller

package com.example.bookmanager.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
    @GetMapping("/hello-world")
    public String helloWorld(){
        return "hello-world";
    }
}

 

controller를 테스트 하기 위해 테스트 코드 생성(단축키 ctrl + shift + T)

 

MVC Test 코드 작성

package com.example.bookmanager.controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;


// MVC TEST 진행
@WebMvcTest
class HelloWorldControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void helloWorld() throws Exception{
        mockMvc.perform(MockMvcRequestBuilders.get("/hello-world"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string("hello-world"));
    }
}

 

결과 확인

 

lombok을 이용해서 DTO 작성(어노테이션의 대한 내용은 아래 사이트 참고)

롬복(Lombok)의 어노테이션들 - (EqaulsAndHashCode, XArgsConstructor, Data, Value, Builder) :: 간단한 블로그 (tistory.com)

 

롬복(Lombok)의 어노테이션들 - (EqaulsAndHashCode, XArgsConstructor, Data, Value, Builder)

6. @EqualsAndHashCode equals(Object) 메소드와 hashCode() 메소드를 오버라이드한다.  @ToString 어노테이션과 마찬가지로 exclude 파라미터로 필드를 제외하거나 callSuper 파라미터로 부모 객체를 생략하거나..

partnerjun.tistory.com

DTO 예제

package com.example.bookmanager.domain;

import lombok.*;

import java.time.LocalDateTime;

@RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class User {
    @NonNull
    private String name;
    @NonNull
    private String email;
    private LocalDateTime createdAt;
    private LocalDateTime updateAt;

}

위와 같은 방식으로 Test 코드 작성

package com.example.bookmanager.domain;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

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

class UserTest {

    @Test
    void test(){
        User user = new User();
        user.setEmail("aaaa@naver.com");
        user.setName("aaaa");
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdateAt(LocalDateTime.now());
        System.out.println(">>>> " + user.toString());
    }
}

 

h2 데이터 베이스 설정 (properties 대신 yml을 사용하였다.)

resources 폴더 및에 application.properties 파일을 삭제하고 application.yml을 생성한다.

yml을 사용하는 이유

https://hyunsangwon93.tistory.com/22

 

Spring boot yaml 파일 사용법

YAML을 사용하는 이유(장점)  1. 프로퍼티스 파일같은 경우는 중복된 코드 삽입  2. --- 신택스로 파일을 분리할 필요가 없이 한파일내에서 마치 분리해서 사용가능  3. 보기 편하다 Spring Boot 에서

hyunsangwon93.tistory.com

yml과 properties의 차이점

https://recordsoflife.tistory.com/434

 

Spring Boot에서 application.yml vs application.properties 차이점

1. 개요 Spring Boot의 일반적인 관행은 외부 구성을 사용하여 속성을 정의하는 것 입니다. 이를 통해 다른 환경에서 동일한 애플리케이션 코드를 사용할 수 있습니다. 속성 파일, YAML 파일, 환경 변

recordsoflife.tistory.com

 

application.yml

spring:
  h2:
    console:
      enabled: true
server:
  port: 8080

 

설정 후 spring boot 실행

 

web에서 h2 접속하는 방법

주소창에 입력: http://localhost:8080//h2-console/login.jsp 

 

아래 화면이 나오면 URL 입력하는 란에 위 캡쳐에서 처럼 생성된 코드를 입력해준다. 그 후 connect

접속 후 show databases 명령을 입력하면 실행되는 것을 확인할 수 있다.

 

인텔리제이에서 확인하는 방법

우측 데이터 베이스 클릭

h2 데이터 베이스를 추가해준다.

 

URL에 생성된 코드를 입력해주고 연결테스트를 진행하여 성공하면 끝(처음에는 드라이브를 설치해야 한다. 하단에 띄워진다.)

 

확인을 클릭하면 console파일이 나오고 show databases 명령어를 입력하면 정상적으로 출력된다.

'Spring > JPA' 카테고리의 다른 글

QueryMethod 예제 2  (0) 2021.07.17
Query Method 구현 1  (0) 2021.07.17
JPA 메소드 예제 3 - update  (0) 2021.07.11
JPA TEST 코드 예제 2  (0) 2021.07.11
JPA 설정 및 테스트코드 예제 1  (0) 2021.07.04

+ Recent posts