참고 도서 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
Spring Boot 게시판 만들기
요구사항 분석
기능
- 조회
- 등록
- 수정
- 삭제
회원
- 구글 / 네이버 로그인
- 로그인한 사용자만 글 작성
- 본인이 작성한 게시물 권한 관리
사용 기술
- Spring 2.3.3
- H2
- JPA Hibernate
Entity를 만들 때 참고 사항
PK는 Long타입으로 잡고 Auto_increament로 잡는 게 좋다.
복합 키나, 유니크 키 기타 다른 키를 PK로 잡을 경우 아래와 같은 문제가 발생할 수 있다.
- FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황이 발생한다.
- 인덱스에 좋은 영향을 끼치지 못한다.
- 유니크한 조건이 변경될 경우, PK전체를 수정해야 할 수도 있다.
다른 중복되어서는 안 될 키는 유니크 키로 잡는 것이 좋다.
Posts Entity
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
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;
}
}
Setter가 없는 이유
자바빈 규약에 따라 getter/setter를 무작정 생성하면, 인스턴스 값이 언제 어디서 변해야 하는지 코드상으로 명확하게 구분할 수 없다. 차후 기능을 변경할 때 (매우)복잡해진다.
따라서 엔티티 클래스를 만들 때는 절대 Setter를 만들지 않는다.
만약 수정이 필요한 필드는 명확하게 목적과 의도를 나타낼 수 있는 메소드(일종의 setter)를 추가해야 한다.
그렇다면, Setter가 없는 상황에서 어떻게 값을 삽입할까? 기본적으로 생성자로 값을 입력하고, DB에 삽입한다. 변경이 필요한 경우 해당 이벤트에 맞는 public메소드를 호출하여 변경하는 것을 전제로 한다.
@Builder를 통해 제공되는 빌더 클래스를 사용하기도 한다. 역할은 똑같다. 생성자는 지금 채워야 할 필드를 명확하게 지정할 수 없는 반면, 빌더 클래스를 이용하면 지정할 수 있다.
JpaRepository
JDBC의 DAO. MyBatis의 Mapper 같이 엔티티 클래스로 데이터베이스에 접근할 수 있게 해준다.
인터페이스로 선언하고, JpaRepository클래스를 상속 받는다.(extends JpaRepository<엔티티 클래스, PK>)
엔티티 클래스와 엔티티 리포지토리는 둘 중 하나가 없다면 작동하지 않는다. 따라서 도메인 패키지에서 함께 관리한다.
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
테스트
@Test
public void getPosts() {
//저장
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(
Posts.builder()
.title(title)
.content(content)
.author("coco@coco.com")
.build());
//게시글 불러오기
List<Posts> postsList = postsRepository.findAll();
//테스트
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
'Spring' 카테고리의 다른 글
[Security] 현재 로그인한 사용자 정보 가져오기 (0) | 2021.01.23 |
---|---|
머스태치Mustache (0) | 2020.09.16 |
JPA Auditing으로 생성 시간/수정시간 자동화 (0) | 2020.09.15 |
등록/수정/조회 API (0) | 2020.09.14 |
Spring Data JPA (0) | 2020.09.14 |