Spring

Spring Boot 게시판 만들기

voider 2020. 9. 14. 21:26

참고 도서 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

Spring Boot 게시판 만들기

요구사항 분석

기능

  • 조회
  • 등록
  • 수정
  • 삭제

회원

  • 구글 / 네이버 로그인
  • 로그인한 사용자만 글 작성
  • 본인이 작성한 게시물 권한 관리

사용 기술

  • Spring 2.3.3
  • H2
  • JPA Hibernate

Entity를 만들 때 참고 사항

PK는 Long타입으로 잡고 Auto_increament로 잡는 게 좋다.

복합 키나, 유니크 키 기타 다른 키를 PK로 잡을 경우 아래와 같은 문제가 발생할 수 있다.

  1. FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황이 발생한다.
  2. 인덱스에 좋은 영향을 끼치지 못한다.
  3. 유니크한 조건이 변경될 경우, 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