이 글은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 참고하여 작성되었습니다.

1. JPA

JPA는 관계형 데이터베이스를 이용하는 프로젝트에서 객체지향 프로그래밍을 가능케한 java의 표준 ORM 기술이다. 현대의 웹 어플리케이션에서는 관계형 데이터 베이스가 빠질 수 없는데, 오히려 이것이 애플리케이션 코드보다 많아졌다. 그래서 중간에서 패러다임 일치를 위해 등장하여 SQL에 종속된 개발에서 해방 시켜주었다.

2. Spring Data JPA

Spring Data JPA는 JPA를 구현한 Hibernate를 한번 더 구현한 형태이다. 이를 통해 나중에 Hibernate가 수명을 다 하더라도 쉽게 구현체와 저장소를 의존성 교체를 통해 바꿀 수 있다.
다음 코드를 build.gradle에 입력하여 의존성을 등록한다.

dependencies {
...

	implementation('org.springframework.boot:spring-boot-starter-data-jpa')
	implementation('com.h2database:h2')
    
...
}
  • h2 : 인메모리 관계형 데이터베이스이며 재시작 시마다 초기화되어 테스트용도로 사용된다.

3. Posts.java

먼저 domain 패키지를 생성한다. 도메인은 소프트웨어에 대한 요구사항 혹은 문제 영역이라고 한다. 쿼리를 와 그 결과를 함께 담는다고 한다.


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

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

  • @Entity: JPA의 annotation이다. 테이블과 링크될 클래스임을 나타낸다.
  • @Id: 해당 테이블의 PK 필드를 나타낸다.
  • @GeneratedValue: PK의 생성 규칙을 나타내며 Generation.IDENTITY 옵션을 추가하면 auto_increment가 된다.
  • @Column: 테이블의 칼럼을 나타낸다. 기본적으로 해당 클래스의 모든 필드는 칼럼이며 기본 값외 추가로 변경이 필요한 옵션이 있으면 사용한다. 문자열의 기본값은 VARCHAR(255)이다.
  • @NoArgsConstructor: 기본생성자를 자동추가한다.
  • @Getter: 모든 필드 getter 메서드 자동추가한다.
  • @Builder: 해당 클래스의 빌더 패턴 클래스를 생성한다. 생성자에 선언시 해당 생성자의 필드만 포함한다.

4. Entity(Posts.java) 설계 시 유의사항

  1. setter 메서드를 만들지 않음

    • Entity의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 구분 불가
    • 기능 변경 시 매우 복잡
    • 변경 필요 시 목적과 의도가 명확한 메서드를 추가
  2. @Builder로 빌더 클래스 사용

    • 생성자와 역할은 같으나 현재 채워야할 필드를 명확히 지정가능
    Exmaple.builder()
    	.a(a)
        .b(b)
        .build();
profile
여러가지를 시도하는 학생입니다

0개의 댓글