티스토리 뷰

활동/교육과정 중 기록

200316 Spring Boot

Stolen Moments 2020. 3. 16. 20:00

Spring Boot




스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 3




1. 프로젝트에 Spring Data JPA 적용하기


- build.gradle 의존성 등록

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('com.h2database:h2')


- domain 패키지에 posts 패키지, Posts 클래스 생성


Posts.java


package com.springboot.domain.posts;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity // 카멜 케이스 -> 언더스코어 네이밍으로 테이블 이름 매칭
public class Posts {

@Id // 해당 테이블의 PK
@GeneratedValue(strategy = GenerationType.IDENTITY)
// PK 생성 규칙. GenerationType.IDENTITY 를 넣어줘야 auto_increment
private Long id;

@Column(length = 500, nullable = false)
private String title;

@Column(columnDefinition = "TEXT", nullable = false)
private String content;

private String author;

@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}


* Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다.


해당 필드의 값 변경이 필요한 경우 따로 메소드를 추가해야한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
// 잘못된 사용 예
public class Order {
    public void setStatus(boolean status) {
        this.status = status;
    }
}
 
// 올바른 사용 예
public class Order {
    public void cancelOrder(){
        this.status = false;
    }
}
cs




- 빌드 클래스를 사용하는 이유


1
2
3
4
5
6
7
8
9
10
11
// a와 b의 위치를 바꾸면 어떤 문제가 발생하는지 모름
public Example(String a, String b) {
    this.a = a;
    this.b = b;
}
 
// 어느 필드에 어떤 값을 채워야 할지 명확
Example.builder()
    .a(a)
    .b(b)
    .build();
cs




- Post 클래스로 DB 접근하게 하는 JpaRepository 생성


PostsRepository.java

package com.springboot.domain.posts;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Posts, Long> {}



2. Spring Data JPA 테스트 코드 작성


- PostRepository 테스트 코드 작성


PostsRepositoryTest.java


package com.springboot.domain.posts;

import org.junit.After;
import org.junit.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 java.util.List;

import static org.assertj.core.api.Java6Assertions.assertThat;


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

@Autowired
PostRepository postRepository;

@After
public void cleanup(){
postRepository.deleteAll();
}

@Test
public void 게시글저장_불러오기() {
//given
String title = "테스트 게시글";
String content = "테스트 본문";

// 테이블 posts insert/update 쿼리 실행
postRepository.save(Posts.builder()
.title(title)
.content(content)
.author("unknown9732")
.build());

//when
List<Posts> postsList = postRepository.findAll();

//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}

}


- src/main/resource 디렉토리에 application.properties 파일 생성


spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

참고 : https://github.com/jojoldu/freelec-springboot2-webservice/issues/158

반응형

'활동 > 교육과정 중 기록' 카테고리의 다른 글

200319 Spring Boot  (0) 2020.03.19
200318 Spring Boot  (0) 2020.03.18
200315 Spring Boot  (0) 2020.03.15
200314 Spring Boot  (0) 2020.03.14
200211 React  (0) 2020.02.11
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함