프로젝트에 Spring Data Jpa 적용하기

박지운·2023년 2월 13일
0

'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 읽고 공부하며 정리한 내용입니다. 오류 해결부분은 틀린 내용이 있을 수 있습니다.😂

JPA

관계형 데이터베이스와 객체지향 프로그래밍 패러다임 불일치로 여러 문제가 발생한다.
서로 지향하는 바가 다른 2개 영역을 중간에서 일치시켜주는 것 ➡ JPA

즉 개발자는 객체지향적으로 프로그래밍하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행

Spring Data JPA

jpa는 인터페이스로서 자바 표준 명세서이다.
인터페이스 구현체로는 Hibernate, Eclipse등이 있지만
1. 구현체 교체 용이
2. 저장소 교체 용이
두 가지 이유로 Spring Data JPA라는 모듈을 이용


게시판 실습 요구사항 분석

  • 게시판 기능
    - 게시글 조회
    - 게시글 등록
    - 게시글 수정
    - 게시글 삭제
  • 회원 기능
    - 구글 / 네이버 로그인
    - 로그인한 사용자 글 작성권한
    - 본인 작성 글에 대한 권한 관리

의존성 등록

  1. spring-boot-starter-data-jpa
    : 스프링 부트용 Spring Data Jpa 추상화 라이브러리
  2. h2
    • 인메모리 관계형 데이터베이스
    • 별도의 설치가 필요없고 의존성만으로 관리 가능
    • 메모리에서 실행되기 때문, 어플리케이션 재시작마다 초기화 -> 테스트용도로 많이 사용

Posts 클래스 작성


@Getter
@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;
    }
}

Entity의 PK는 Long타입의 Auto_increment를 추천(MySQL 기준 bigint타입)

Entity 클래스에서는 Setter 메소드는 절대 만들지 않는다. 해당 클래스의 인스턴스 값들이 언제 어디서 변하는지 코드상으로 명확히 구분이 힘들어 차후 기능 변경 시 복잡해지기 때문이다.

대신 해당 필드의 값 변경이 필요하면 명확히 목적과 의도를 나타낼 수 있는 메소드를 추가해야한다.

생성자 대신 빌더를 사용하면 어느 필드에 어떤 값을 채워야하는지 명확하게 인지 가능하다.


어노테이션 정리

JPA제공

@Entity : 테이블과 링크될 클래스 , 기본값으로 카멜케이스 이름을 언더스코어 네이밍으로 테이블이름 매칭
ex) SalesManager.java -> sales_manager table
@Id : 해당 테이블의 PK 필드를 나타냄
@GeneratedValue : PK의 생성 규칙을 나타냄
@Column : 테이블의 칼럼을 나타냄 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼임. 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용
(문자열의 사이즈를 500으로 늘리거나 타입을 TEXT로 변경)

롬복 제공

@NoArgsConstructor : 기본 생성자 자동 추가, public Posts() {}와 같음
@Getter : 클래스 내 모든 Getter메소드 생성
@Builder : 해당 클래스의 빌더 패턴 클래스 생성

profile
앞길막막 전과생

0개의 댓글