🕶 들어가기 앞서...
웹 개발을 운영시에 데이터베이스를 다루는 일이 많습니다. 기능 개발을 하여도 데이터베이스와 연동하는 것을 피할 수 없습니다.
자바에서는 객체지향 프로그래밍을 지향하고 있고 데이터베이스는 관계형 데이터베이스를 지향하고 있습니다. 이둘의 차이를 극복하게 해주는 기술이 바로 JPA 라는 자바 표준 ORM 기술입니다.
JPA 라는 자바 표준 ORM 은 자바에서의 객체의 멤버들을 데이터베이스와 매핑(Mapping) 을 시켜주어 간단하게 관계를 맷어줄 수 있고 자바와 데이터베이스의 패러다임 불일치 문제, 즉 객체지향 프로그래밍과 관계형 데이터베이스의 관계 불일치 문제점을 해결 해주는 기술입니다.
🕶 JPA를 사용시 좋은점..
자바 개발을 할 때 객체지향 프로그래밍을 할 수 있게 도와주고 JPA 가 관계형 데이터베이스에 맞게 테이블을 자동으로 생성해주며 더 이상 SQL 에 종속적이지 않게 도와줍니다.
🕶 Spring Data JPA
JPA는 인터페이스로서 자바 표준 명세서입니다. 인터페이스인 JPA를 사용하려면 구현체 필요한데 대표적인 구현체가 Hibernate와 Eclipse Link 등이 있습니다.
하지만 spring에서 JPA를 사용할 때 이 구현체들을 직접 사용하지 않고 JPA 와 hibernate를 사용하기 편하게 추상화 시킨 Spring Data JPA라는 모듈을 사용하여 JPA 기술을 다룹니다.
Spring Data JPA 의 구현체의 교체 용이성과 저장소 교체의 용이성이 장점이라고 할 수 있습니다.
또한 CRUD 의 기능을 매번 만들고 하는 번거로움을 하나의 인터페이스로 정의 해놓은 것이 장점이라고 할 수 있습니다.
🕶 게시판의 요구사항 적어보기!
게시판의 기본 기능과 기본 회원 기능을 구현하기 전에 리스트를 작성 해봅시다.
게시판 기능
- 게시글 조회
- 게시글 등록
- 게시글 수정
- 게시글 삭제
회원 기능
- 구글 / 네이버 로그인
- 로그인한 사용자 글 작성 권한
- 본인 작성 글에 대한 권한 관리
🕶 Spring Data JPA / H2 data base 의존성 추가하기!
build.gradle 에 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 의존성을 추가해 줍니다.
다음으로 implementation 'com.h2database:h2' 의존성을 추가해 줍니다.
🕶 Domain 을 만들어보자!.
@Getter // getter() 를 생성해 줍니다.
@NoArgsConstructor // 기본 생성자를 생성해 줍니다.
@Entity // 관계형 테이블과 링크될 클래스임을 정의합니다.
public class Posts {
@Id // 엔티티의 PK를 설정해줍니다.
@GeneratedValue(strategy = GenerationType.IDENTITY)// PK의 생성 규칙을 설정 힙니다. 자동으로 id 값이 올라갑니다.
private Long id; // id
@Column(length = 500, nullable = false)// 해당 컬럼의 데이터 타입 길이를 500으로 설정하고 not null 제약을 설정합니다.
private String title; // 제목
@Column(columnDefinition = "TEXT", nullable = false)// 해당 컬럼의 데이터 타입을 TEXT 로 설정하고 not null 제약을 설정합니다.
private String content; // 내용
private String author; // 작성자
@Builder // 빌더 패턴으로 생성
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
Lombok 기능을 추가하여 domain을 생성해줍니다.
다음으로 생성자는 builder pattern 으로 생성해줍니다.
builder pattern 란 무엇인가요??
https://codingcho.tistory.com/118?category=958402
위의 링크에 effective java 편을 보시면 이해가 가실겁니다!.
domain 클래스에는 setter()를 추가 하지 않습니다.
추가 하지 않는 이유는 해당 인스턴스 값들이 언제 어디서든 변경이 되면 안되기 때문에 setter()가 있으면 혼란을 줍니다.
그러면 domain의 값들은 어떻게 설정해야하나요??
builder pattern 을 사용하여 명확하게 설정값들을 넣어줍니다. 자세한 내용은 Book 정리에서....
🕶 domain 클래스 테스트를 해보자!.
class PostsTest {
@Test
@DisplayName("Posts_Domain_TEST")
void PostsTest() {
// given
String title = "테스트";
String content = "테스트 중 입니다.";
String author = "홍길동";
// when
Posts domain = Posts.builder()
.title(title)
.content(content)
.author(author)
.build();
// then
assertThat(domain.getTitle()).isEqualTo(title);
assertThat(domain.getContent()).isEqualTo(content);
assertThat(domain.getAuthor()).isEqualTo(author);
}
}
테스트 코드를 습관처럼 작성해봅시다!!
🕶 Repository 를 생성해보자!.
// JpaRepository 를 상속하여 인터페이스를 생성해줍니다. 제네릭 타입으로는 <T, ID> 넣어주면 됩니다.
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
생성한 Repoistory 는 에노테이션 @Repository 를 붙이지 않아도 Spring 이 자동으로 bean 설정을 해줍니다.
🕶 Repository 를 테스트 해보자!.
@SpringBootTest
class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository; // bean 주입을 받아 사용 합니다.
@Test
@DisplayName("Repository_TEST")
void PostsRepositoryTest() {
// given
String title = "테스트";
String content = "테스트 중 입니다.";
String author = "홍길동";
postsRepository.save(
Posts.builder()
.title(title)
.content(content)
.author(author)
.build()
);
// when
List<Posts>postsRepositoryAll = postsRepository.findAll(); // 저장된 인스턴스의 값들을 List 타입으로 받습니다.
// then
assertThat(postsRepositoryAll.get(0).getTitle()).isEqualTo(title);
assertThat(postsRepositoryAll.get(0).getContent()).isEqualTo(content);
assertThat(postsRepositoryAll.get(0).getAuthor()).isEqualTo(author);
}
}
Posts 의 설정 값을 Repository에 저장 후 저장된 값을 찾아와 검증을 합니다!!.
JpaRepository 를 사용 시 @SpringBootTest 를 붙여서 테스트를 해야합니다.
h2 database 를 실행을 시켜야 하기 때문에 @SpringBootTest 를 붙입니다.
'Book > Spring boot 와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
[Book] 10) API 만들어보기! -3 (0) | 2022.03.31 |
---|---|
[Book] 9) API 만들어보기! - 2 (0) | 2022.03.30 |
[Book] 8) API 만들어보기! - 1 (0) | 2022.03.30 |
[Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈 (0) | 2022.03.30 |
[Book] 5) 롬복(Lombok) 을 사용해보자! (0) | 2022.03.28 |
[Book] 4) HelloController 생성과 테스트를 해보자! (0) | 2022.03.27 |
[Book] 3) 테스트 코드를 작성해보자! (0) | 2022.03.27 |
[Book] 2) 인텔리제이에서 깃허브와 연동해보자! (0) | 2022.03.27 |